标签: code-generation

使用代码生成创建类似的 Java Action 类

我正在使用应用程序框架(Netbeans 平台)在 Java 中构建 GUI 应用程序,该框架需要大量几乎相同的类来实现极其相似的Action类。我花了很多时间尝试以编程方式生成这些操作。尽管我能够生成操作,但该框架在编译时利用注释来生成其他内部缓存/数据文件,而我无法使用编程方法重现这些文件。

我想知道代码生成工具是否是更好的解决方案,或者可能是一些包装框架注释的自定义注释。也许是类似的东西Lombok,或者也许是一个 Maven 插件。但不知道从哪里开始,也不确定这是否是一条很好的探索之路。理想情况下,我认为在数据文件中定义操作并在编译时生成 java 代码会很棒。

该项目是开源的,许多其他操作都在 github 上。这是模板的示例,我需要注入的部分替换为{{string}},{{code}}和{{int}}:

// imports omitted

@ActionID(
        category = {{string}},
        id = {{string}})
@ActionRegistration(
        iconBase = {{string}},
        displayName = "resources.MessagesBundle#" + {{string}},
        lazy = false)
@ActionReferences({
        @ActionReference(
                path = {{string}},
                position = {{int}})
})
public final class {{string}} extends AbstractAction implements UGSEventListener {

    public static final String ICON_BASE = {{string}};

    private BackendAPI backend;

    public SoftResetAction() {
        this.backend …
Run Code Online (Sandbox Code Playgroud)

java code-generation netbeans-platform

5
推荐指数
1
解决办法
182
查看次数

是否可以使用 Swagger codegen 在多个目录中生成模型?

我在多目录(包)结构中使用了 swagger 模型(使用 Java JAX-RS)。

我的目标是使用 Swagger 代码生成器来创建客户端代码,同时将模型类放在不同的包中,使用目录(包)的名称或任何其他 swagger 特定的元数据(例如注释)。

我想要我的包裹

  • com.schema.model.common
  • com.schema.model.client
  • com.schema.model.shared

由于 Swagger codegen 输入是 JSON 或 YAML,它是从我的 Java 类生成的,因此包信息必须位于 openAPI 定义中,或者传递给 codegen。我找到了指定模型包的选项,该模型包对于所有类都相同,但我希望它们位于不同的包中。

该主题已发布到 Swagger github issues,但已关闭并建议修改 codegen 源: https: //github.com/swagger-api/swagger-codegen/issues/4634

java code-generation swagger swagger-codegen

5
推荐指数
0
解决办法
1821
查看次数

如何在 .NET Core 中卸载程序集/使其可收集?

如何在 .NET Core 中卸载程序集?

注意:
.NET Core 不支持 AppDomain。

背景:
我必须动态评估用户生成的 VisualBasic 表达式。
为此,我使用 Roslyn 动态编译表达式。
我从 Roslyn 编译器生成的字节数组加载生成的程序集。
然后我创建一个实现抽象类的实例(因此我不必使用反射)。然后我调用抽象类的方法EvaluateExpression。
完成此操作后,我想卸载已加载的程序集(否则,我将享受内存泄漏的乐趣)。
因此,我在计算表达式后立即卸载程序集:

Parameters.AbstractEvaluator x = RoslynExpressionEvaluator.CreateEvaluator(expression, report.Code);
object value = x.EvaluateExpression();
x.LoadContext.Unload();
Run Code Online (Sandbox Code Playgroud)

(loadContext在生成时保存在抽象类中)

到目前为止一切正常,但是在x.LoadContext.Unload();,我得到

System.InvalidOperationException:“无法卸载不可收集的 AssemblyLoadContext。”

有可能解决这个问题吗?
如何使组件成为收藏品?
另外,我注意到我可以加载具有相同类名的程序集(如您所见,代码中没有命名空间)
这在多线程环境(又名网络)中表现如何?
我可以无限地加载动态生成的类的不同版本,直到机器用完 RAM 而没有出现故障吗?
或者为什么当加载同一个类两次时这会起作用?

using Microsoft.CodeAnalysis.Operations;

namespace ReportTester
{


    public static class RoslynExpressionEvaluator
    {
        // a utility method that creates Roslyn compilation
        // for the passed code. 
        // The compilation references the collection of 
        // passed "references" arguments …
Run Code Online (Sandbox Code Playgroud)

c# code-generation expression-evaluation assembly-loading roslyn

5
推荐指数
1
解决办法
4961
查看次数

覆盖 GraphQL Schema 生成的 Typescript 类型

我使用graphql-code-generator从 GraphQL 架构中生成打字稿类型。在 GraphQL 中,您可以创建自定义标量类型,这将生成以下类型: /graphql.ts

export type Scalars = {
  String: string;
  Boolean: boolean;
  NodeDescription: any;
};

export type CodeResource = {
  ast: Scalars["NodeDescription"];
};
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,GraphQL 默认标量类型(如字符串、布尔值等)将映射到等效的 Typescript 类型。自定义标量类型NodeDescription将获得打字稿类型any。

在我的 Angular 客户端中,已经有一个NodeDescription类型(在 ../app/shared/syntaxtree 中),我想使用它来代替生成的any类型。有没有办法覆盖NodeDescription标量类型中的字段?所以最后我希望ast生成的 CodeResource 类型的字段具有 typeNodeDescription而不是any.

我的第一个想法是用 覆盖Scalars["NodeDescription"]类型NodeDescription。所以我尝试在新文件中导入所有类型并覆盖它们,例如: /types.ts

import {Scalars} from "./graphql";
import {NodeDescription} from "../app/shared/syntaxtree";
type Overwrite<T, U> = Pick<T, Exclude<keyof T, keyof U>> …
Run Code Online (Sandbox Code Playgroud)

code-generation typescript typescript-generics

5
推荐指数
1
解决办法
2748
查看次数

如何在 TypeScript 中生成和操作 JavaScript ESTree AST?

有一个 ESTree 规范描述了 JavaScript AST 格式,该格式在多个库中用于 JS 代码转换(重构、转译、缩小等)。

是否有任何具有 API 的工具/库专注于从头开始(而不是从现有的 JS 代码)生成ESTree AST 并对其进行操作?最好在 TypeScript 中获得 ESTree 节点静态类型的优势。

javascript compiler-construction code-generation abstract-syntax-tree typescript

5
推荐指数
0
解决办法
858
查看次数

如何在 Gradle 中使用 Quarkus gRPC 扩展?

根据Quarkus gRPC 文档,必须generate-code为quarkus-maven-plugin. 不过我还没有发现Quarkus Gradle插件是否实现了相应的功能。

问题:如何使用 Gradle 构建 Quarkus gRPC 项目?

java code-generation grpc quarkus quarkus-grpc

5
推荐指数
1
解决办法
765
查看次数

使用 Sympy 生成 C 代码。将 Pow(x,2) 替换为 x*x

我正在使用公共子表达式消除 (CSE) 例程和 ccode 打印机使用 sympy 生成 C 代码。

但是,我希望将幂表达式设置为 (x*x) 而不是 pow(x,2)。

无论如何要这样做吗?

例子:

import sympy as sp
a= sp.MatrixSymbol('a',3,3)
b=sp.Matrix(a)*sp.Matrix(a)

res = sp.cse(b)

lines = []
     
for tmp in res[0]:
    lines.append(sp.ccode(tmp[1], tmp[0]))

for i,result in enumerate(res[1]):
    lines.append(sp.ccode(result,"result_%i"%i))
Run Code Online (Sandbox Code Playgroud)

将输出:

x0[0] = a[0];
x0[1] = a[1];
x0[2] = a[2];
x0[3] = a[3];
x0[4] = a[4];
x0[5] = a[5];
x0[6] = a[6];
x0[7] = a[7];
x0[8] = a[8];
x1 = x0[0];
x2 = x0[1];
x3 = x0[3];
x4 = x2*x3;
x5 …
Run Code Online (Sandbox Code Playgroud)

python code-generation sympy codegen python-3.x

5
推荐指数
1
解决办法
1235
查看次数

如何获取 Go 模块依赖项的路径?

我有两个 Go 模块,我们将它们命名为example.com/a和example.com/b。

让这example.com/a是go.mod:

module example.com/a

go 1.12

require (
  example.com/b v0.4.2
)
Run Code Online (Sandbox Code Playgroud)

在example.com/b的根目录下有一个名为data.yaml. example.com/a需要自动生成一些代码作为其构建过程的一部分。这个自动生成需要阅读data.yaml。

如何在目录中查询读取该文件example.com/a的路径example.com/b?我知道下载后,该模块将位于其中的某个位置(go env GOPATH)/pkg/mod,但我不知道如何从那里构建路径,因为它包含一些!不属于导入路径的字符。我希望有一些go mod或 的子命令go list可以输出路径,但我在文档中没有找到它。

我考虑过通过(是的,我知道,但我现在不想要求 Go 1.16)包含data.yaml在 Go 代码中,但是只有在编译时需要时,我才能在运行时访问。go-bindata//go:embed

code-generation go go-modules

5
推荐指数
1
解决办法
7644
查看次数

枚举生成的类是 Final 还是 Not?

当我指定这样的枚举时:

enum Color { RED }
Run Code Online (Sandbox Code Playgroud)

生成的代码javap -p Color如下所示:

final class Color extends java.lang.Enum<Color> {
  public static final Color RED;
  private static final Color[] $VALUES;
  public static Color[] values();
  public static Color valueOf(java.lang.String);
  private Color();
  private static Color[] $values();
  static {};
}
Run Code Online (Sandbox Code Playgroud)

但是,当我添加自定义扩展(例如显式构造函数)时,例如:

enum Color {
  RED,

  Color() {}
}
Run Code Online (Sandbox Code Playgroud)

我明白了:

class Color extends java.lang.Enum<Color> {
  public static final Color RED;
  public static final Color Color;
  private static final Color[] $VALUES;
  public static Color[] values();
  public static Color …
Run Code Online (Sandbox Code Playgroud)

java enums extends code-generation final

5
推荐指数
1
解决办法
412
查看次数

System.TypeLoadException:无法从程序集“System.Private.CoreLib”加载类型“System.Object”,因为父级不存在

我们动态生成代码以生成 .NET Core 控制台应用程序,然后使用以下命令对其进行编译:

    var csharpParseOptions = new CSharpParseOptions(LanguageVersion.Latest);

    csharpParseOptions = csharpParseOptions.WithPreprocessorSymbols(new[] { "TRACE", "DEBUG" });

    var syntaxTree = CSharpSyntaxTree.ParseText(code, options: csharpParseOptions);
    var compilationUnitSyntax = syntaxTree.GetCompilationUnitRoot();

    var options = new CSharpCompilationOptions(OutputKind.ConsoleApplication, optimizationLevel: OptimizationLevel.Debug, platform: Platform.X64)
      .WithModuleName("TestConsole")
      .WithMetadataImportOptions(MetadataImportOptions.All)
      .WithDeterministic(true)
      .WithConcurrentBuild(true);

    var csharpCompilation = CSharpCompilation.Create(@"TestConsole", syntaxTrees: new[] { syntaxTree }, references: references, options: options);
Run Code Online (Sandbox Code Playgroud)

然后,我们可以毫无问题地使用以下方法获得的生成的程序集(在内存中):

    using (var memoryStream = new MemoryStream())
    {
      var emitResult = csharpCompilation.Emit(memoryStream);
      memoryStream.Position = 0; 
      _assembly = Assembly.Load(memoryStream.ToArray());
    }
Run Code Online (Sandbox Code Playgroud)

但是,当我们使用以下命令将 console.exe 写入磁盘时:

    csharpCompilation.Emit(fileNameOnDisk, Path.Combine(Path.GetDirectoryName(fileNameOnDisk), Path.GetFileNameWithoutExtension(fileNameOnDisk)) + ".pdb");
Run Code Online (Sandbox Code Playgroud)

并尝试从那里运行它,我们得到以下异常: …

c# code-generation compilation

5
推荐指数
1
解决办法
2197
查看次数