标签: code-generation

使用与模板位于同一项目中的T4模板中的类型

我正在研究我的第一个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).

有什么方法可以解决这个问题?

.net c# vb.net t4 code-generation

21
推荐指数
1
解决办法
8418
查看次数

Java源代码解析器/生成器

我需要工具来:

  • 方便地解析Java源代码并轻松访问给定元素.

  • 轻松生成源代码文件,轻松将数据结构转换为代码

任何好的技巧,库,框架,工具?谢谢你的帮助.

java parsing code-generation

21
推荐指数
2
解决办法
2万
查看次数

类型类函数调用的GHC代码生成

在Haskell中定义类型类的实例,您需要提供类型类所需的函数字典.即定义一个实例Bounded,你需要为minBound和提供一个定义maxBound.

出于这个问题的目的,让我们将这个字典vtbl称为类型类实例.如果这是一个很糟糕的类比,请告诉我.

我的问题在于当我调用类型类函数时,我可以从GHC期望什么样的代码生成.在这种情况下,我看到三种可能性:

  1. 用于查找实现函数的vtbl查找在运行时关闭
  2. vtbl查找在编译时完成,并在生成的代码中发出对实现函数的直接调用
  3. vtbl查找在编译时完成,实现函数在调用站点内联

我想了解每一个发生的时间 - 或者是否有其他可能性.

另外,如果类型类是在单独编译的模块中定义而不是作为"主"编译单元的一部分,那有关系吗?

在一个可运行的程序中,似乎Haskell知道程序中所有函数和表达式的类型.因此,当我调用类型类函数时,编译器应该知道vtbl是什么以及确切调用哪个实现函数.我希望编译器至少生成对实现函数的直接调用.这是真的?

(我在这里说"runnable program",以区别于编译你没有运行的模块.)

haskell code-generation typeclass ghc

21
推荐指数
3
解决办法
1624
查看次数

一步一步,如何在Visual Studio 2010中为给定类型的每个文件添加自定义生成步骤?

问题

  1. 我在visual studio 2010项目中有一堆自定义文件.
  2. 我需要在这些自定义文件发生更改时运行该工具.
  3. 该工具生成现有.cpp文件包含的.h文件.
  4. 我希望该工具作为构建过程的一部分运行.
  5. 它需要在visual studio中运行,但理想情况下也可以作为msbuild进程的一部分运行.

现有的不合标准解决方案

在每个文件上,每次添加它时,我都可以转到文件设置,将项目类型设置为自定义构建工具,然后在自定义构建工具对话框中,设置命令行参数,设置(硬编码)输出,以及设置(硬编码)其他依赖项.

显然,这是一个糟糕的解决方案,因为每次添加自定义类型的新文件时,这都是一项非常重要且容易出错的工作量.

理想的解决方案

我设置了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

21
推荐指数
1
解决办法
2万
查看次数

自动生成抛出eclipse的存根方法

类似于如何更改"生成方法存根"以在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来执行此操作?

java eclipse code-generation

20
推荐指数
1
解决办法
1万
查看次数

从AST生成代码的最佳设计?

我正在开发一个非常复杂的DSL,我想将其编译成几种高级语言.整个过程一直是学习的经历.编译器是用java编写的.

我想知道是否有人知道代码生成器部分的设计的最佳实践.我目前已将所有内容解析为抽象语法树.

我正在考虑使用模板系统,但我还没有研究过这个方向,因为我希望首先从堆栈溢出中听到一些智慧.

谢谢!

java dsl code-generation abstract-syntax-tree

20
推荐指数
2
解决办法
5715
查看次数

禁止生成c#代码的警告

我为我的VS项目打开了"将警告视为错误",这意味着我因错过的文档而出错(这个特定项目的提醒很好).

但是,部分代码是由自定义工具生成的,该工具不会插入xml文档,因此我正在寻找仅忽略生成代码的缺失xml文档,而不是整个项目.我对生成的实际文件没有任何影响,也无法在文件中插入任何内容(因为它经常被工具重新生成)所以我在生成的文件外面寻找存在的东西(生成的类是部分的,如果有帮助的话)

c# code-generation suppress-warnings visual-studio

20
推荐指数
2
解决办法
7191
查看次数

在Eclipse中调用对象的所有setter方法的快捷方式?

我想创建一个类的对象,然后使用setter方法设置其中的所有属性.有超过150个setter方法,我确实想要输入每个方法,甚至Object instance在dot中键入对象实例名称类型.,然后点击Eclipse的空格键给我建议,然后选择setter方法.我不想这样做150次.

因此,我在Eclipse中寻找某种快捷方式,允许您调用方法上的所有setter.就像你输入实例名称一样,Eclipse会调用所有的setter方法,例如

  • instanceName.setterOne( "瓦隆");
  • instanceName.setterTwo( "瓦隆");
  • instanceName.setterThree( "瓦隆");

我不能在类中创建另一个构造函数,我不允许这样做

java eclipse setter code-generation

20
推荐指数
2
解决办法
2万
查看次数

使用注释处理器替换代码

我正在尝试编写一个注释处理器来在类上插入方法和字段......而且文档非常稀疏.我没有走得太远,我不知道我是否正确接近它.

处理环境提供了一个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)

java code-generation annotation-processing

20
推荐指数
1
解决办法
1万
查看次数

像在IntelliJ中一样在AppCode 3.0中生成文档注释

是否有任何方法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并且已经过检查.

documentation code-generation objective-c appcode

20
推荐指数
1
解决办法
2027
查看次数