标签: code-generation

Maven 在 Eclipse 中添加源目录

我从maven-jaxb2-pluginmaven 插件生成我的代码。它将代码放入目标/生成源。现在,我必须手动左键点击到项目- >属性- > Java构建路径- >添加文件夹...。对于从 SVN 下载它的人来说,这有点烦人。

有没有办法通过我的 pom 自动获得那个圆顶?

eclipse code-generation jaxb buildpath maven

4
推荐指数
1
解决办法
8546
查看次数

使用 Javassist 生成 Invokedynamic

我正在尝试做一些相对简单的事情,我想。以 doSomething(int) 方法的以下 Java 字节码为例:

public java.lang.String doSomething(int i);
0 iload_1 [i]
1 invokestatic MyHelper.doSomething(int) : Java.lang.String
4 areturn
Run Code Online (Sandbox Code Playgroud)

这个字节码几乎只将调用转发给静态助手。

我现在想要做的是使用 Javassist 将 invokestatic 替换为 invokedynamic。我知道如何使用 ASM 做到这一点,因此只是出于纯粹的好奇心假设我想知道它是如何工作的。以下是我的一些问题:

1) 以下是否正确:我不能使用 javassist CtMethod.instrument() 或 CtMethod.insertAt() 方法,因为这些方法需要包含有效 Java 表达式的字符串,而我不能用 Java 语法编写调用动态?

2) invokestatic 的参数就像 invokevirtual 或 invokestatic 的参数一样处理,对吗?我的意思是,您在调用动态之前将参数放入堆栈,就像对 invokevirtual 所做的一样?

3)是否有使用Javassist创建invokedynamic字节码的示例代码(或者你能想出一些)吗?

这就是我目前所知道的:您可以创建一个具有 addInvokedynamic() 方法的 Bytecode 对象。但这需要 BootstrapMethodsAttribute 中 BootstrapMethod 的索引。BootstrapMethod 反过来需要常量池中方法句柄信息的索引,该索引需要方法引用等。所以基本上你必须自己管理整个常量池条目。没关系,但我担心我没有做对,以后会引入奇怪的问题。有没有更简单的方法来做到这一点(辅助方法左右)?我的代码大致看起来像这样(我并没有真正“重写”上面的 invokestatic 但是:

void transform(CtMethod ctmethod, String originalCallDescriptor) {

    MethodInfo mInfo = ctmethod.getMethodInfo();
    ConstPool pool = ctmethod.getDeclaringClass().getClassFile().getConstPool();

    /* add info about the …
Run Code Online (Sandbox Code Playgroud)

java code-generation invokedynamic javassist

4
推荐指数
1
解决办法
1133
查看次数

如何构建 ANTLR 代码生成目标

是否有“如何构建 ANTLR 代码生成目标”的 ANTLR4 版本。我知道有一个 ANTLR3 版本,但它似乎已经过时了。

code-generation antlr4

4
推荐指数
1
解决办法
2254
查看次数

使用 Sethi-Ullman 算法的表达式代码生成器

给一个AST树,我想生成一个类似汇编的语言。我正在尝试使用Sethi-Ullman算法,但我在算法实现中有一些问题。

当我用完寄存器时我该怎么办?

目前我执行以下操作:

发出一个push REGwhereREG是右子树的寄存器,评估左子树,得到一个空闲的寄存器分配为右子树的寄存器,然后也发出一个POP REG操作 whereREG是右子树的寄存器。

我应该如何实现该功能以获得免费注册?目前我正在使用这样的实现而不是基于堆栈的:

enum Reg { Reg_r0, Reg_r1 };
Reg regs[] = { Reg_r0, Reg_r1 };
    Reg getreg() {
             static int c;
        if(c == sizeof(regs) / sizeof(int))
        c = 0;
        return regs[c++];
    }
Run Code Online (Sandbox Code Playgroud)

这是一个伪代码(来自 C 语言)如何从我未设置的内容(包括label()函数)中实现它

// K is the number of registers available
int K = 2;
void gen(AST ast) {
    if(ast.left != null && ast.right != null) {
        int …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction algorithm parsing code-generation

4
推荐指数
1
解决办法
1477
查看次数

开发人员应该提交 Go 生成的代码吗?

我使用代码生成器插件根据 OpenAPI 规范生成服务器存根。

我想知道是否应该将生成的代码提交给版本控制。

code-generation go

4
推荐指数
1
解决办法
653
查看次数

如何将 JSDoc 注释添加到使用 typescript AST api 生成的 typescript?

如何使用 typescript 的 AST api 和打印机创建带有文档注释的函数?

/**
 * foo function
 */
function foo () {}
Run Code Online (Sandbox Code Playgroud)

以下代码生成该函数。

function foo () {}
Run Code Online (Sandbox Code Playgroud)
import ts from 'typescript';
const fooFunction = ts.createFunctionDeclaration(
  undefined,
  undefined,
  undefined,
  ts.createIdentifier("foo"),
  undefined,
  [],
  undefined,
  ts.createBlock(
    [],
    false
  )
)

const printer = ts.createPrinter({    
  newLine: ts.NewLineKind.LineFeed,    
});    

const resultFile = ts.createSourceFile(    
  "example.ts",    
  "",    
  ts.ScriptTarget.Latest,    
  /*setParentNodes*/ false,    
  ts.ScriptKind.TS      
);

const result = printer.printNode(
  ts.EmitHint.Unspecified,
  fooFunction,
  resultFile
);

console.log(result);
Run Code Online (Sandbox Code Playgroud)

code-generation typescript

4
推荐指数
1
解决办法
364
查看次数

将 Rust 枚举转换为子枚举

我正在创建std::sync::atomic::Ordering的子集:

use std::sync::atomic::Ordering;

pub enum StoreOrdering {
    Relaxed,
    Release,
    SeqCst
}
impl Into<Ordering> for StoreOrdering {
    fn into(self) -> Ordering {
        match self {
            Self::Relaxed => Ordering::Relaxed,
            Self::Release => Ordering::Release,
            Self::SeqCst  => Ordering::SeqCst
        }
    }
}
impl std::convert::TryFrom<Ordering> for StoreOrdering {
    type Error = (); // HACK
    fn try_from(ord: Ordering) -> Result<Self, Self::Error> {
        match ord {
            Ordering::Relaxed => Ok(Self::Relaxed),
            Ordering::Release => Ok(Self::Release),
            Ordering::SeqCst  => Ok(Self::SeqCst),
            _ => Err(())
        }
    }
}

enum LoadOrdering {
    Acquire,
    Relaxed,
    SeqCst …
Run Code Online (Sandbox Code Playgroud)

enums code-generation casting reusability rust

4
推荐指数
1
解决办法
1773
查看次数

Roslyn 的 SyntaxReceiver - 获取实现接口的类

我正在尝试开发一个源生成器,以使用该接口在部分类上自动实现接口。

我相信这一定是Microsoft 新的 Source Generators 的常见用例,甚至在Roslyn Source Generator Cookbook中被列为用例,但没有示例实现。

我进行了搜索,但很难在 Roslyn 分析器中找到针对此场景的问题。

在说明书中,他们使用 SyntaxReceiver 类来过滤调用应处理哪些语法节点Execute:

        class SluggableSyntaxReceiver : ISyntaxReceiver
        {
            public List<ClassDeclarationSyntax> ClassesToAugment { get; } = new List<ClassDeclarationSyntax>();

            public void OnVisitSyntaxNode(SyntaxNode syntaxNode)
            {
                // Business logic to decide what we're interested in goes here
                if(syntaxNode is ClassDeclarationSyntax cds && cds.HasInterface("IChangeTracked"))
                    ClassesToAugment.Add(cds)
            }

        }
Run Code Online (Sandbox Code Playgroud)

查看食谱以了解生成器的实现细节。

我想要确定的是如何HasInterface在 ClassDeclarationSyntax 节点上实现我的扩展。

        public static bool HasInterface(this ClassDeclarationSyntax source, string interfaceName)
        {
            IEnumerable<TypeSyntax> baseTypes = source.BaseList.Types.Select(baseType=>baseType.Type);
            // Ideally …
Run Code Online (Sandbox Code Playgroud)

code-generation roslyn roslyn-code-analysis sourcegenerators

4
推荐指数
1
解决办法
2119
查看次数

未找到颤振冻结方法

我用来Freezed在我的 flutter 项目上生成数据类。

我所做的一切与包自述文件中提到的完全一样:

import 'package:freezed_annotation/freezed_annotation.dart';

part 'access_token.freezed.dart';

@freezed
class AccessToken with _$AccessToken {
  @JsonSerializable()
  const factory AccessToken(
    @JsonKey(name: 'access_token') String accessToken,
    @JsonKey(name: 'refresh_token') String refreshToken,
  ) = _AccessToken;

  factory AccessToken.fromJson(Map<String, Object?> json) =>
      _$AccessTokenFromJson(json);
}
Run Code Online (Sandbox Code Playgroud)

构建成功完成。

当我运行该应用程序时,我得到:

lib/services/models/access_token.freezed.dart:118:7:错误:找不到方法:'_$$_AccessTokenFromJson'。_$$ AccessTokenFromJson(json); ^^^^^^^^^^^^^^^^^^^^^^^^ lib/services/models/access_token.freezed.dart:157:12:错误:方法“ $$ AccessTokenToJson”不是“ t 为类“ $_AccessToken”定义。

  • “_$ AccessToken”来自“package:tenant_app/services/models/access_token.dart”(“lib/services/models/access_token.dart”)。尝试将名称更正为现有方法的名称,或定义名为“ $$_AccessTokenToJson”的方法。返回 _$$_AccessTokenToJson(

为什么Freezed没有正确生成该函数?我缺少什么?

code-generation flutter freezed

4
推荐指数
1
解决办法
3519
查看次数

Delphi代码生成

我需要加快编码速度,加快工作量,所以我需要能够生成代码.任何工具,任何想法?

delphi code-generation

3
推荐指数
2
解决办法
3944
查看次数