我正在使用应用程序框架(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) 我在多目录(包)结构中使用了 swagger 模型(使用 Java JAX-RS)。
我的目标是使用 Swagger 代码生成器来创建客户端代码,同时将模型类放在不同的包中,使用目录(包)的名称或任何其他 swagger 特定的元数据(例如注释)。
我想要我的包裹
由于 Swagger codegen 输入是 JSON 或 YAML,它是从我的 Java 类生成的,因此包信息必须位于 openAPI 定义中,或者传递给 codegen。我找到了指定模型包的选项,该模型包对于所有类都相同,但我希望它们位于不同的包中。
该主题已发布到 Swagger github issues,但已关闭并建议修改 codegen 源: https: //github.com/swagger-api/swagger-codegen/issues/4634
如何在 .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
我使用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) 有一个 ESTree 规范描述了 JavaScript AST 格式,该格式在多个库中用于 JS 代码转换(重构、转译、缩小等)。
是否有任何具有 API 的工具/库专注于从头开始(而不是从现有的 JS 代码)生成ESTree AST 并对其进行操作?最好在 TypeScript 中获得 ESTree 节点静态类型的优势。
javascript compiler-construction code-generation abstract-syntax-tree typescript
根据Quarkus gRPC 文档,必须generate-code为quarkus-maven-plugin. 不过我还没有发现Quarkus Gradle插件是否实现了相应的功能。
问题:如何使用 Gradle 构建 Quarkus gRPC 项目?
我正在使用公共子表达式消除 (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) 我有两个 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
当我指定这样的枚举时:
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) 我们动态生成代码以生成 .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)
并尝试从那里运行它,我们得到以下异常: …
code-generation ×10
java ×4
c# ×2
typescript ×2
codegen ×1
compilation ×1
enums ×1
extends ×1
final ×1
go ×1
go-modules ×1
grpc ×1
javascript ×1
python ×1
python-3.x ×1
quarkus ×1
quarkus-grpc ×1
roslyn ×1
swagger ×1
sympy ×1