Определение динамического метода с GroovyDSL в IntelliJ - PullRequest
3 голосов
/ 04 сентября 2011

Я пытался определить динамический метод, используя возможности сценариев GroovyDSL в IntelliJ. Руководство по началу работы «Разработка сценариев для среды DSL» дает хорошее представление о том, как начать работу с этим. Определение динамического метода в моем DSL более сложное, чем в примере, и я не совсем уверен, как это сделать. Вы можете представить, что он работает как методы динамического поиска в Grails, за исключением того, что вы можете комбинировать произвольное количество критериев с логическим ключевым словом And в любом порядке. Все ключевые слова не определены в классе, для которого я вызываю метод, но могут быть определены в файле GDSL. Метод всегда начинается с submitTransactionWith. Вот пример:

clientDSL.submitTransactionWithCriteria1AndCriteria2AndCriteria3(arg1, arg2, arg3)

Я начал с этого, но он работает только для одного критерия и не учитывает, что вы можете комбинировать несколько критериев в любом порядке.

def ctx = context(ctype: "my.client.ClientDSL")

contributor(ctx) {
    ['Criteria1', 'Criteria2', 'Criteria3'].each {
        method name: "submitTransactionWith${it}",
               type: 'java.util.Map', 
               params: [args: 'java.util.Collection']
    }
}

Мне было интересно, есть ли специальная поддержка для такого динамического метода. Мне также было бы интересно узнать, как DSL для Grails внутренне моделируется в IntelliJ.

1 Ответ

1 голос
/ 05 сентября 2011

Grails DSL находится в ${idea.home}/plugins/GrailsGriffon/lib/standardDsls

Это, вероятно, поможет вам в вашей проблеме.Они заранее создают строковые массивы всех комбинаций имен методов, а затем просто перебирают их в своем вкладчике, создавая метод, используя массивы строк для имен.

...