2016-03-22 9 views
1

Ich baue eine DSL in Groovy, die String-Interpolation innerhalb des DSL erlauben sollte zu verwenden:Wie für den Zugriff auf Variablen in String-Interpolation in einem starken DSL

def dsl = """ 
    def projectName = "test" 
    project("${projectName}/123") { 
     task { 

     } 
    } 
""" 

Leider, wenn Sie den folgenden Code unter Verwendung der interpretieren über DSL, ist der Groovy Interpreter nicht bewusst projectName (und ergibt ein MissingPropertyException):

class ProjectSpec { 
    def name 

    void task(closure) { 
    } 
} 
binding.project = { name, closure -> 
    def project = new ProjectSpec() 
    project.name = name 
    def code = closure.rehydrate(project, this, this) 
    code.resolveStrategy = Closure.DELEGATE_ONLY 
    code() 
    project 
} 
def shell = new GroovyShell(binding) 
Script script = shell.parse(dsl) 
project = script.run() 
println project.name 

Wie kann ich das erreichen? Ich denke, ich muss die Auswertung des GString verschieben. Muss ich dafür eine ASTTransformation verwenden?

Danke,

Michael

Antwort

1

kommt dieser Fehler aus, wie Sie Ihren dsl testen. Sie verwenden ein dreifaches Anführungszeichen, um Ihre dsl-Zeichenfolge zu definieren: Die Variable wird hier interpoliert. Wenn Sie diese Variable aus einer Datei lesen, wird Ihr Code funktionieren.

Definieren Sie Ihre DSL-String mit einem dreifachen einfachen Zitat ('''): Es sollte funktionieren.

Verwandte Themen