我是 golang AST 包和相关 go 工具(如 astutils)的新手。目前,我有点困于理解 Stringer 示例并根据自己的目的对其进行修改。
https://github.com/golang/tools/blob/master/cmd/stringer/stringer.go
是否有一个简单地提取包路径中所有已定义类型名称的列表的工作示例?
我一直在努力将新对象添加到对象数组中jscodeshift。我的问题是我无法弄清楚在获得VariableDeclarator. 我需要获取数组中的最后一个元素,然后才能插入新节点。这是代码:
export default function transformer(file, api) {
const j = api.jscodeshift;
const root = j(file.source);
const changeList = root.find(j.VariableDeclarator, {
id: {name: 'list'},
}).closest(j.ArrayExpression, {
elements: [""]
}).replaceWith(p => {
console.log(p);
}).toSource();
};
Run Code Online (Sandbox Code Playgroud)
我正在AST 浏览器上玩它
我有字符串,它描述数学公式,我想将其转换为有意义部分的列表。该函数ast_确实知道如何解析它,将其显示为抽象语法树,但不返回 AST。我正在寻找一个返回树的函数。
bb <- "(media.urin_A + media.urin_B)/2"\nlazyeval::ast_(rlang::parse_expr(bb))\nRun Code Online (Sandbox Code Playgroud)\n\n> lazyeval::ast_(rlang::parse_expr(bb))\n\xe2\x94\x97 ()\n \xe2\x94\x97 `/\n \xe2\x94\x97 ()\n \xe2\x94\x97 `(\n \xe2\x94\x97 ()\n \xe2\x94\x97 `+\n \xe2\x94\x97 `media.urin_A\n \xe2\x94\x97 `media.urin_B\n \xe2\x94\x97 2 \nRun Code Online (Sandbox Code Playgroud)\n 尝试使用 babel 变换,我编写了这段代码以VariableDeclaration在我的之后插入一个path
export default function (babel) {
const { types: t } = babel;
return {
name: "ast-transform", // not required
visitor: {
VariableDeclaration (path) {
if (path.node.kind !== 'var') {
return;
}
const _id = t.Identifier('qwe');
const _init = t.numericLiteral(42);
console.log(_id, _init);
const _node = t.variableDeclaration('var', [
t.variableDeclarator(
t.identifier("uid"),
t.numericLiteral(42)
)
]);
path
.unshiftContainer(
'body',
_node
)
}
}
};
}
Run Code Online (Sandbox Code Playgroud)
得到以下错误,
未知:无法读取未定义的属性“body”
编辑:
如果我执行以下操作而不是unshiftContainer有效,
const _program = path.findParent(p => p.isProgram());
_program.node.body.unshift(_node);
Run Code Online (Sandbox Code Playgroud)
为什么不起作用 …
我有这个数学表达式:
\ntree = ast.parse(\'1 + 2 + 3 + x\')\nRun Code Online (Sandbox Code Playgroud)\n对应于这个抽象语法树:
\nModule(body=[Expr(value=BinOp(left=BinOp(left=BinOp(left=Num(n=1), op=Add(), right=Num(n=2)), op=Add(), right=Num(n=3)), op=Add(), right=Name(id=\'x\', ctx=Load())))])\nRun Code Online (Sandbox Code Playgroud)\n我想简化它 - 也就是说,得到这个:
\nModule(body=[Expr(value=BinOp(left=Num(n=6), op=Add(), right=Name(id=\'x\', ctx=Load())))])\nRun Code Online (Sandbox Code Playgroud)\n根据文档,我应该使用 NodeTransformer 类。文档中的建议如下:
\n\n\n请记住,如果您正在操作的节点\xe2\x80\x99 有子节点,您必须自己转换子节点或首先调用该节点的generic_visit() 方法。
\n
我尝试实现我自己的变压器:
\nclass Evaluator(ast.NodeTransformer):\n def visit_BinOp(self, node):\n print(\'Evaluating \', ast.dump(node))\n for child in ast.iter_child_nodes(node):\n self.visit(child)\n\n if type(node.left) == ast.Num and type(node.right) == ast.Num:\n print(ast.literal_eval(node))\n return ast.copy_location(ast.Subscript(value=ast.literal_eval(node)), node)\n else:\n return node\nRun Code Online (Sandbox Code Playgroud)\n在这种特定情况下,它应该做的是将 1+2 简化为 3,然后将 3 …
仅通过源代码(无需运行时检查)从文件位置获取周围函数名称的最佳方法是什么?
例如说我有一些代码:
func MyFunc() {
doSomething() // package/file.go:215:15
}
Run Code Online (Sandbox Code Playgroud)
而我有doSomething的位置,at package/file.go:215:15,有没有办法轻松获取MyFunc?
我正在尝试创建一个HQL查询,如下所示:
List<Task> results = session.createQuery("FROM Task where ProcessID = :procId " +
"and Role = :role and completed = 0 " +
"group by TaskID " +
"having min(chronology)")
.setParameter("procId", procId)
.setParameter("role", role).list();
Run Code Online (Sandbox Code Playgroud)
发生以下错误:
<AST>:1:114: unexpected AST node: min
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1943)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.groupClause(HqlSqlBaseWalker.java:1521)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:618)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:299)
at org.hibernate.hql.internal.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:247)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:248)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:105)
at org.hibernate.engine.query.spi.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.spi.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:168)
at org.hibernate.internal.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:219)
at org.hibernate.internal.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:197)
at org.hibernate.internal.SessionImpl.createQuery(SessionImpl.java:1736)
at de.arvato.icssa.db.worker.TaskWorker.getTask(TaskWorker.java:90)
at de.arvato.icssa.endpoints.TestServiceImpl.sendMail(TestServiceImpl.java:84)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597) …Run Code Online (Sandbox Code Playgroud) 我有一段代码接收格式化为python字典的字符串
"{'a':'1','b':'2',...}"
Run Code Online (Sandbox Code Playgroud)
我需要转换为正确的字典.
我尝试了两种方法,使用json.loads(s)和ast.literal_eval(s)
ast似乎更健壮,接受字符串中的任何形式的引号和"只是工作",而json似乎对引用细节非常挑剔,并且不会仅在单个表单上失败报价格式.我真的希望尽可能灵活地使用输入,因此更喜欢使用ast,但是,我的一些同事声称它可能不是一个"安全"的模块和功能.
任何人都可以建议ast和ast.literal_eval()安全,特别是与json.loads()相比?
谢谢
我有一个包含以下内容的IFile:
package com.example;
//@SimpleAnnotation(Blab.ckass)
//@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)
public class SimpleClassWithAnnotation {
}
Run Code Online (Sandbox Code Playgroud)
如何在类中添加注释(注释的注释)?我试图使用这个线程的解决方案,但源不会改变.这是我使用的代码片段:
final ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(this.cu);
ICompilationUnit cu = JavaCore.createCompilationUnitFrom(this.ifile);
final CompilationUnit astRoot = (CompilationUnit) parser.createAST(null);
final AST ast = astRoot.getAST();
astRoot.recordModifications();
final NormalAnnotation newNormalAnnotation = astRoot.getAST().newNormalAnnotation();
newNormalAnnotation.setTypeName(astRoot.getAST().newName("AnnotationTest"));
Run Code Online (Sandbox Code Playgroud)
这是尝试添加一个简单的注释@AnnotationTest.但是我需要这样的东西:@CustomAnnotation(arg1 = Blup.class , arg2 = Blup.Row.class)
提前致谢 !
java annotations eclipse-plugin abstract-syntax-tree eclipse-jdt
go ×2
java ×2
javascript ×2
annotations ×1
antlr ×1
babeljs ×1
eclipse-jdt ×1
hibernate ×1
hql ×1
jscodeshift ×1
json ×1
list ×1
lua ×1
parsing ×1
python ×1
python-3.x ×1
r ×1
recursion ×1