То же преобразование AST прекрасно работает, когда вызывается в модульном тесте через GroovyShell, и завершается сбоем (из-за оператора import
) в приложении.Какие настройки можно сделать, чтобы он работал везде?
Базовый проект gradle состоит из 2 модулей: main и ast .Каждый модуль включает в себя зависимость через соответствующий build.gradle , например, compile('io.reactivex.rxjava2:rxjava:2.2.2')
.Модуль main определяет приветственный мир runner и unit-test для следующего преобразования AST из модуля ast .Обратите внимание: если оператор import
перед определением class X
будет удален, все будет работать как положено.
MethodNode makeMethod() {
def ast = new AstBuilder().buildFromString(
CompilePhase.INSTRUCTION_SELECTION,
false,
"""
import io.reactivex.BackpressureStrategy
class X {
def strategy() { return BackpressureStrategy.LATEST }
}
"""
)
return (MethodNode) ast[1].methods.find { it.name == 'strategy' }
}
unit-test равен
given:
String classString =
'''
import com.cholick.ast.*
@Marker
class Test { }
new Test()
'''
when:
def instance = new GroovyShell().evaluate(classString)
Method added = instance.class.declaredMethods.find { it.name == 'strategy' }
then:
added
Наконецбегун -
@Marker
class Main {
static void main(String[] args) {
new Main().run()
}
def run() {
println 'Running main'
// No signature of method: com.cholick.main.Main.strategy() ...
assert(strategy() == BackpressureStrategy.LATEST)
}
}