GDSL вложенные замыкания - PullRequest
0 голосов
/ 23 января 2019

Моя проблема выглядит следующим образом: я написал DSL в Groovy, и теперь я хочу, чтобы код завершался в IntelliJ.То, чего я хочу достичь, это что-то вроде этого:

foo("aa").is {
    bar("bb").is {
        foobar("cc")
    }
}

Итак, я написал файл .gdsl

def globalContext = context(scope: scriptScope())
contributor(globalContext) {
method name: "foo", type: "A",  params: [name:"java.lang.String"]
}

def aContext = context(ctype:"A")
contributor(aContext) {
    method name: "is", type: "A", params: [closure:"groovy.lang.Closure"]
}

def bContext = context(ctype:"B")
contributor(bContext) {
    method name: "is", type: "B", params: [closure:"groovy.lang.Closure"]
}


def closureContext = context(scope: closureScope())

contributor(closureContext, {
    def call = enclosingCall("is")
    if (call) {
        def callingMethod = call.bind()
        if ("A".equals(callingMethod?.returnType?.name)) {
            method name: "bar", type: "B",  params: 
[name:"java.lang.String"]
        }
        else if ("B".equals(callingMethod?.returnType?.name)) {
            method name: "foobar", type: "C",  params: 
[name:"java.lang.String"]
        }

    }

})

Кажется, все работает, пока я не завершу закрывающие скобки до bar.is, когдавнезапно Intellij перестает понимать ключевое слово bar.Не могли бы вы, пожалуйста, совет?

...