我使用内置的AstBuilder
解析Groovy源。在下面的示例中,def f
变量是通过产生的AST被发现为Object
的,尽管很明显这里是File
。
是否可以重用groovy的大型代码库来解析与静态分析尽可能精确的var类型?
import org.codehaus.groovy.ast.builder.AstBuilder
String source = """def f = new File("."); return f"""
def nodes = new AstBuilder().buildFromString(source)
def expr = nodes[0].statements[1].expression as VariableExpression
assert(expr.variable == 'f')
assert(expr.type.toString() == 'java.lang.Object') // 'File' wanted
assert(expr.originType.toString() == 'java.lang.Object')
P.S。在源中将f
的类型从def
更改为File
会使AST节点具有类型File
,但这不是解决方案。
Groovy 2.5.8,JDK 1.8