Преобразование AST автоматически завершается сбоем в приложении, но работает при компиляции через GroovyShell - PullRequest
0 голосов
/ 23 сентября 2018

То же преобразование 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)
    }
}
...