COS ios sdk上传文件到CDN,发现上传的文件为0kb,确认本地文件大小不为0kb
您需要的似乎是您的语言的解析器(Java),以及名称和类型解析器。(“符号表生成器”)。
在解析源文本之后,编译器通常有一个名称解析器,它试图记录名称及其对应类型的定义,以及一个类型检查器,用于验证每个表达式是否有一个有效类型。
通常,名称/类型解析器在找不到定义时会发出抱怨。您希望它做的是找到导致问题的“未定义”的东西,并推断出它的类型。
为
IPerson p = new Person();
名称解析器知道没有定义“Person”和“IPerson”。如果是
Foo p = new Bar();
没有任何线索表明您想要一个接口,只是foo是Bar的某种抽象父级(例如,类或接口)。因此,工具必须知道它是哪一个(“每当您找到这样的构造时,假设foo是一个接口...”)。您可以使用启发式方法:Ifoo和foo意味着Ifoo应该是一个接口,而且在某个地方必须有人将foo定义为实现该接口的类。一旦工具做出了这一决定,它就需要更新其符号表,以便能够转到其他语句:
为
p.Name = "Sklivvz";
假设p必须是一个接口(根据前面的推断),那么name必须是一个字段成员,并且它的类型似乎是来自赋值的字符串。
在此基础上,声明:
Assert.AreEqual("Sklivvz", p.Name);
名称和类型无需进一步解决。
IFoo和Foo实体的内容取决于您;您不必使用get和set,但这是个人品味。
如果在同一个语句中有多个实体,这就不太好用了:
x = p.a + p.b ;
我们知道a和b可能是字段,但是如果它们确实是数字的,或者如果它们是字符串(在Java中是合法的,不知道C#),您就无法猜测它们是什么数字类型。对于C++,您甚至不知道“+”是什么意思;它可能是Bar类上的运算符。所以你要做的就是收集约束,例如,“a是一些不定数或字符串”等,当工具收集证据时,它缩小了一组可能的约束。(这就像那些词中的问题:“乔有七个儿子。杰夫比萨姆高。哈利不能躲在山姆后面。...杰夫的孪生兄弟是谁?“在那里你必须收集证据并排除不可能的可能性)。你还得担心你最终会遇到矛盾。
您可以排除p.a+P.B的情况,但这样就不能编写单元测试而不受惩罚。如果你想不受惩罚的话,有标准的约束求解者。(这是个概念)。
好的,我们有想法,现在,这能用实际的方式来做吗?
第一部分需要解析器和可弯曲的名称和类型解析器。您需要一个约束求解器,或者至少需要一个“定义值流到未定义值”操作(琐碎的约束解决程序)。
我们DMS软件重组工具图包与其Java前端很有可能会这么做。DMS是一个工具生成器的工具,对于那些想要构建以任意方式处理计算机语言的工具的人来说。(想想“用程序片段而不是数字计算”)。
DMS提供了通用的解析机制,可以为给定的任何前端(例如Java,还有C#前端)构建树。我之所以选择Java,是因为我们的Java前端拥有所有的名称和类型解析机制,并且它是以源代码形式提供的,因此可以弯曲。如果您坚持使用简单的约束解决程序,那么您可能会使用Java名称解析器来确定类型。DMS将允许您组装对应于代码片段的树,并将它们合并成更大的树;当您的工具为符号表收集事实时,它可以构建原始树。
在某个地方,你必须决定你已经完成了。在了解整个接口之前,工具需要查看多少个单元测试?(我想它吃掉了你提供的所有东西?)。完成后,它为各个成员组装片段,并为接口构建AST;DMS可以使用它的pretty打印机将该AST转换回源代码,如您所示。
我建议在这里使用Java,因为我们的Java前端有名称和类型解析。我们的C#前端没有。这是一个“纯粹”的野心问题;有人必须编写一个,但这是相当多的工作(至少对于Java和我无法想象C#是真的不同)。
但是这个想法在原则上使用DMS很好。
您可以使用其他基础结构来完成此操作,这些基础结构允许您访问解析器和可弯曲的名称和类型解析器。对于C#来说,这可能并不容易;我怀疑MS可能会给您提供一个解析器,并访问名称和类型解析,但无法更改它。也许莫诺就是答案?
您仍然需要一个WASS来生成代码片段并组装它们。您可能会尝试通过字符串黑客来实现这一点;我(长期)将程序比特粘合在一起的经验是,如果使用字符串,最终会使它变得一团糟。您确实需要表示已知类型的代码片段的片段,这些代码片段只能以语法允许的方式组合;DMS这样做不会造成混乱。
我发现,每当我需要这样的代码生成工具时,我可能会编写一些代码,这些代码可能会变得更加通用,所以我只需要编写一次。在您的示例中,这些getter和setter似乎没有为代码添加任何值--实际上,它实际上只是断言C#中的getter/setter机制有效。
在了解编写这类测试的动机之前,我会避免编写(甚至是)这样的工具。
顺便说一下,看看纳贝哈斯。
VisualStudio附带了一些功能,在这里可以对你有所帮助:
生成Stab方法.当你编写对不存在的方法的调用时,你将在方法名称上得到一个小的智能标记,可以使用该标记根据你传递的参数生成一个方法存根。
那么在输入括号后,你可以:
只有当IDE认为没有匹配的方法时,才会出现智能标记。如果要在智能标记未打开时生成,可以转到编辑->IntelliSense->GenerateMethod Stub...
片段。小代码模板,使生成公共代码的比特变得容易。有些很简单(尝试"if[TAB][TAB]")。有些是复杂的(‘开关’将生成一个枚举的情况)。你也可以自己写。对于你的情况,尝试“类”和“道具”。
亦见“如何将“GenerateMethod Stub”更改为在VS中抛出NotImplementedException?“关于GMS上下文中的信息片段。
自动道具属性可以简单得多:
public string Name { get; set; }
创建类在解决方案资源管理器中,单击项目名称或子文件夹,选择加号->类键入新类的名称。按ENTER.您将在正确的命名空间中得到一个类声明,等等。
实现接口当您希望类实现接口时,编写接口名称部分,激活智能标记,并选择任意选项为接口成员生成存根。
这些并不是您想要的100%自动解决方案,但我认为这是一个很好的缓解。