我正在研究我的第一个T4代码生成工具,为我的项目添加一些存储过程帮助程序代码.我已经创建了自定义类型(例如StoredProcedure,StoredProcedureParameter以帮助我生成代码,并在我的代码中包含了程序集和命名空间引用:
<#@ template debug="false" hostspecific="false" language="VB" #>
<#@ output extension=".generated.vb" #>
<#@ assembly name="$(TargetPath)" #>
<#@ import namespace="StoredProcCodeGenerator" #>
Run Code Online (Sandbox Code Playgroud)
这允许我在我的T4模板代码中使用我的自定义类型.但是,因为我的自定义类型与T4模板代码存在于同一个项目中,所以在运行模板代码而不重新启动Visual Studio时,我无法重新编译项目.这不是很有趣.
我读了一篇很棒的文章,通过使用T4工具箱解决了这个问题,但是它没有用.要么我执行VolatileAssembly指令错误,要么T4工具箱根本没有安装.我不确定工具箱是否正确安装(我在Win XP上使用VS 2010).
有什么方法可以解决这个问题?
我需要工具来:
方便地解析Java源代码并轻松访问给定元素.
轻松生成源代码文件,轻松将数据结构转换为代码
任何好的技巧,库,框架,工具?谢谢你的帮助.
在Haskell中定义类型类的实例,您需要提供类型类所需的函数字典.即定义一个实例Bounded,你需要为minBound和提供一个定义maxBound.
出于这个问题的目的,让我们将这个字典vtbl称为类型类实例.如果这是一个很糟糕的类比,请告诉我.
我的问题在于当我调用类型类函数时,我可以从GHC期望什么样的代码生成.在这种情况下,我看到三种可能性:
我想了解每一个发生的时间 - 或者是否有其他可能性.
另外,如果类型类是在单独编译的模块中定义而不是作为"主"编译单元的一部分,那有关系吗?
在一个可运行的程序中,似乎Haskell知道程序中所有函数和表达式的类型.因此,当我调用类型类函数时,编译器应该知道vtbl是什么以及确切调用哪个实现函数.我希望编译器至少生成对实现函数的直接调用.这是真的?
(我在这里说"runnable program",以区别于编译你没有运行的模块.)
问题
现有的不合标准解决方案
在每个文件上,每次添加它时,我都可以转到文件设置,将项目类型设置为自定义构建工具,然后在自定义构建工具对话框中,设置命令行参数,设置(硬编码)输出,以及设置(硬编码)其他依赖项.
显然,这是一个糟糕的解决方案,因为每次添加自定义类型的新文件时,这都是一项非常重要且容易出错的工作量.
理想的解决方案
我设置了visual studio,无论扩展名为.foo,它都会在.foo文件发生变化时运行工具bar.exe,然后再编译CPP代码.
我尝试过的事情
基于此:http://msdn.microsoft.com/en-us/library/3e889s84( v=vs.100) .aspx我试图设置.targets和.xml文件.但是,我无法找到如何创建一个新的项目类型,使其显示在visual studio中,我也无法弄清楚如何使它神奇地应用于.foo类型的每个文件.最重要的是,我还没有想到如何链接任何描述调用我的bar.exe工具的行为.
我试图搜索所有visual studio的xml /目标文件,以便跟踪现有的项类型并确定它们如何转换为实际的构建操作.它始终在ItemType的墙上结束,其中有一些在ProjectItemsSchema中描述,但我无法找到它们的实现位置,或者我自己如何实现它们.
MSDN的文档已经彻底失败了,我想我已经十次阅读每个可能相关的页面,但无济于事.
在visual studio 2008中,我有一个使用.rules文件的东西,看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<VisualStudioToolFile
Name="Foo Build Rules"
Version="8.00"
>
<Rules>
<CustomBuildRule
Name="FooBuild"
DisplayName="FooGen"
CommandLine="..\..\tools\FooGen.exe [inputs]"
Outputs="$(InputName).h"
AdditionalDependencies="*.foo"
FileExtensions="*.foo"
ExecutionDescription="Generating Foos..."
>
<Properties>
</Properties>
</CustomBuildRule>
</Rules>
</VisualStudioToolFile>
Run Code Online (Sandbox Code Playgroud)
然而,这个功能在2010年已被弃用,我一直无法弄清楚如何使用新系统复制它.
救命?
msbuild build-process code-generation visual-studio-2010 customtool
类似于如何更改"生成方法存根"以在VS中抛出NotImplementedException?,但对于Eclipse而不是Visual Studio
NetBeans和Eclipse都有一个函数,如果您声明Java类来实现接口但省略一个或多个方法,则会自动为您生成存根方法.
区别在于Eclipse版本什么都不做,并返回零或null,例如
public String munge(String foo) {
// TODO Auto-generated method stub
return null;
}
Run Code Online (Sandbox Code Playgroud)
NetBeans版本将引发异常:
public String munge(String foo) {
throw new UnsupportedOperationException("Not supported yet.");
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢.
是否可以配置Eclipse来执行此操作?
我正在开发一个非常复杂的DSL,我想将其编译成几种高级语言.整个过程一直是学习的经历.编译器是用java编写的.
我想知道是否有人知道代码生成器部分的设计的最佳实践.我目前已将所有内容解析为抽象语法树.
我正在考虑使用模板系统,但我还没有研究过这个方向,因为我希望首先从堆栈溢出中听到一些智慧.
谢谢!
我为我的VS项目打开了"将警告视为错误",这意味着我因错过的文档而出错(这个特定项目的提醒很好).
但是,部分代码是由自定义工具生成的,该工具不会插入xml文档,因此我正在寻找仅忽略生成代码的缺失xml文档,而不是整个项目.我对生成的实际文件没有任何影响,也无法在文件中插入任何内容(因为它经常被工具重新生成)所以我在生成的文件外面寻找存在的东西(生成的类是部分的,如果有帮助的话)
我想创建一个类的对象,然后使用setter方法设置其中的所有属性.有超过150个setter方法,我确实想要输入每个方法,甚至Object instance在dot中键入对象实例名称类型.,然后点击Eclipse的空格键给我建议,然后选择setter方法.我不想这样做150次.
因此,我在Eclipse中寻找某种快捷方式,允许您调用方法上的所有setter.就像你输入实例名称一样,Eclipse会调用所有的setter方法,例如
我不能在类中创建另一个构造函数,我不允许这样做
我正在尝试编写一个注释处理器来在类上插入方法和字段......而且文档非常稀疏.我没有走得太远,我不知道我是否正确接近它.
处理环境提供了一个Filer对象,该对象具有用于创建新源和类文件的方便方法.那些工作正常,但后来我试图弄清楚如何读取现有的源文件,它提供的只是"getResource".所以在我的处理器实现中我做到了:
@Override
public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) {
try {
for (TypeElement te : annotations) {
for (Element element : roundEnv.getElementsAnnotatedWith(te)) {
FileObject in_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_PATH, "",
element.asType().toString().replace(".", "/") + ".java");
FileObject out_file = processingEnv.getFiler().getResource(
StandardLocation.SOURCE_OUTPUT, "",
element.asType().toString().replace(".", "/") + ".java");
//if (out_file.getLastModified() >= in_file.getLastModified()) continue;
CharSequence data = in_file.getCharContent(false);
data = transform(data); // run the macro processor
JavaFileObject out_file2 = processingEnv.getFiler().createSourceFile(
element.asType().toString(), element);
Writer w = out_file2.openWriter();
w.append(data);
w.close();
} …Run Code Online (Sandbox Code Playgroud) 是否有任何方法AppCode 3.0可以生成文档注释IntelliJ?
例如,IntelliJ我可以输入一个方法:
public int method(float number){
// magic
}
Run Code Online (Sandbox Code Playgroud)
当它高于它时,我将输入:/**,IDE将生成如下代码:
/**
*
* @param number
* @return
*/
public int method(float number){
// magic
}
Run Code Online (Sandbox Code Playgroud)
在AppCode 3.0做了类似的技巧后,我只得到这样的东西:
/**
*
*/
- (int)method:(float)number;
Run Code Online (Sandbox Code Playgroud)
我已经检查过Preferences/Smart Keys/Insert documentation comment stub并且已经过检查.