2014-10-07 4 views
1

У меня есть DSL, который выглядит следующим образом:Groovy DSL получения анонимной Строка заданий

aMethod { 
    "a name" 
    "another name" 
    "and a third name" 
} 

Моя проблема в том, что я не могу получить доступ к трем строку, так как вызов закрытия возвращает только последнее утверждение. Я попытался переопределить конструктор String (символ [] значение), которое вызывается, когда происходит анонимный Стринг-оператор:

def original 

// primitive way to get the String(char[])-constructor 
String.class.constructors.each { 
    if(it.toString() == "public java.lang.String(char[])") { 
     original = it 
    } 
} 
// overriding the constructor 
String.metaClass.constructor = { char[] value -> 
    def instance = original.newInstance(value) 
    // ... do some further stuff with the instance ... 
    println "Created ${instance}" 
    instance 
} 
// teststring to call String(char[] value) 
"teststring" 

К сожалению, это не сработало, и я все равно думал, что это довольно сложно.

+2

я сомневаюсь, что это работает без какого-либо НРХА. Можете ли вы изменить DSL? Передача строки в качестве аргумента вызову метода может решить эту проблему или не рассматривать их как строку, а как чистый код: 'aMethod {a name}' – Will

+0

+1 Я думаю, вам понадобится ast –

+0

Я попробовал решение с чистым кодом, но в закрытии я также разрешаю вызовы методов с String-params, например: aMethod {forView (другое имя)}. этот шаблон не допускается, я думаю, и я не хотел его смешивать. Nevermind, я думал, что существует очевидное решение, например, обертывание каждого оператора замыкания методом – user3060729

ответ

0

Благодарим вас за комментарии. На самом деле было бы здорово определить все без кавычек. Но: после использования dsl, который можно перевести на объекты Java, мне понравилось иметь дополнительные аннотации на моем языке во время разработки. Я хочу аннотировать повторяющиеся имена и так далее. IDE я знаю лучше, Intellij и Eclipse обрабатывают строки «имя» как один PSI-Elements. Разделение этих элементов может быть очень неудобным ... Думаю. Я думаю, что утверждения в закрытии, подобные aMethod {имя}, приведут к интерпретации как aMethod {a.name}. Это означало бы, что вместо того, чтобы иметь StringLiteral Psi «имя», у меня были бы Object-Psi и MethodCall-Psi или что-то в этом роде. Я не знаю, и моя следующая цель - просто «разобрать/создать» мои объекты Java. Вы уверены, что невозможно переопределить String-Constructor?

ли какой-либо конструктор вызывается, когда у вас есть заводной скрипт с таким содержимым:

"hello World" 
Смежные вопросы