本地AST转换可以使用非sdk类吗?

时间:2014-04-25 04:33:46

标签: groovy

我有一个本地Groovy AST转换,我在类级别应用。此转换为目标类添加了一种方法。

一旦我尝试在我正在作为构建的一部分导入的jar中使用转换代码中的类,我就会遇到“无法解析类”的异常。在下面的例子中,它是org.apache.commons.math3.analysis.function.Abs。

当我检查sourceUnit classLoader的url(URLClassLoader.getURLs())时,我只找到了编译源代码的路径,并没有看到编译所引入的jar列表(其中包括公共数学jar)。 / p>

本地AST转换是否可以在编译期间使用jar中的类?如果是这样,我如何获得转换来解决类(我尝试显式添加到sourceUnit classLoader的url而没有成功)?如果没有,全局AST转换会改变吗?

void visit(ASTNode[] astNodes, SourceUnit sourceUnit) {
    try {
        ClassNode annotatedClass = (ClassNode) astNodes[1]
        MethodNode newMethod = makeMethod(annotatedClass)
        annotatedClass.addMethod(newMethod)
    } catch (Exception e) {
        println 'Failed to apply transform'
        e.printStackTrace()
    }
}

MethodNode makeMethod(ClassNode source) {
    def ast = new AstBuilder().buildFromString(CompilePhase.INSTRUCTION_SELECTION, false, '''
        def added() {
            println new org.apache.commons.math3.analysis.function.Abs().value(-3.0)
            println 'Added'
        }
'''
    )
    return (MethodNode) ast[1].methods.find { it.name == 'added' }
}

完整示例适用于构建文件in a Github repository here

0 个答案:

没有答案