我从maven-jaxb2-pluginmaven 插件生成我的代码。它将代码放入目标/生成源。现在,我必须手动左键点击到项目- >属性- > Java构建路径- >添加文件夹...。对于从 SVN 下载它的人来说,这有点烦人。
有没有办法通过我的 pom 自动获得那个圆顶?
我正在尝试做一些相对简单的事情,我想。以 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) 是否有“如何构建 ANTLR 代码生成目标”的 ANTLR4 版本。我知道有一个 ANTLR3 版本,但它似乎已经过时了。
给一个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) 我使用代码生成器插件根据 OpenAPI 规范生成服务器存根。
我想知道是否应该将生成的代码提交给版本控制。
如何使用 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) 我正在创建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) 我正在尝试开发一个源生成器,以使用该接口在部分类上自动实现接口。
我相信这一定是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
我用来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没有正确生成该函数?我缺少什么?