2016-04-13 7 views
0

ich eine groovige DSL mit Syntax schreiben wollen:Compilation Customizer nicht während der Kompilierung von groovy DSL-Skript namens

returnValue when booleanCondition 

Ich möchte Kompilation customizers verwenden diesen Ausdruck einer typischen zu transformieren, wenn return-Anweisung AST-Transformationen .

Für dieses Skript:

2 when 1 == 1 

ich Ausnahmemeldung:

MultipleCompilationErrorsException: startup failed: 
Script1.groovy: 1: expecting EOF, found '1' @ line 1, column 8. 

Ich verstehe nicht, warum meine Sammlung Customizer nicht aufgerufen wird? Ich brauche es vor der Kompilierung aufgerufen werden, damit ich es in einen gültigen groovy Code machen kann.

Wenn das Skript gültigen Groovy-Code enthält, wird mein Kompilierungs-Customizer aufgerufen.

Mein Code:

class MyDslTest { 

    public static void main(String[] args) { 
     String script = '''2 when 1 == 1 
''' 
     def compilerConfig = new CompilerConfiguration() 
     compilerConfig.addCompilationCustomizers(new MyCompilationCustomizer()) 
     GroovyShell groovyShell = new GroovyShell(compilerConfig) 
     groovyShell.evaluate(script) 
    } 
} 

class MyCompilationCustomizer extends CompilationCustomizer { 

    MyCompilationCustomizer() { 
     super(CompilePhase.CONVERSION) 
    } 

    @Override 
    void call(SourceUnit source, GeneratorContext context, ClassNode classNode) throws CompilationFailedException { 
     println 'in compilation customizer' 
    } 
} 

Antwort

2

Das Problem ist, dass der Code nicht syntaktisch gültig ist. Ein Kompilierungs-Customizer funktioniert nicht wie folgt: Um einen AST zu erhalten, auf dem der Customizer funktioniert, müssen Sie syntaktisch korrekten Code erzeugen. Eine Möglichkeit besteht darin, eine andere AntlrParserPlugin zu verwenden, aber im Allgemeinen empfehle ich es nicht, weil es die Quellen vor dem Parsen modifiziert und daher eine Diskrepanz zwischen der AST und der tatsächlichen Quelle erzeugt.