Groovy DSL, передача свойств с DELEGATE_ONLY - PullRequest
0 голосов
/ 27 ноября 2018

У меня есть свой пользовательский DSL, он выглядит так:

topElement {
  first {
    name "${nameProperty}"
    address "${addressProperty}"
  }

  second {
    something "something"
  }
}

Вопрос касается свойств, например ${nameProperty}.

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

Script dslScript = new GroovyShell().parse(dsl.text)
dslScript.setProperty("nameProperty", "value")
dslScript.setProperty("addressProperty", "addressValue")

ExpandoMetaClass emc = new ExpandoMetaClass(dslScript.class, false)
emc.initialize()

dslScript.metaClass = emc
dslScript.run()

Раньше каждое закрытие, которое я имел в этом DSL, было DELEGATE_FIRST, и свойства работали.Я изменил все на DELEGATE_ONLY (хотел избежать ситуации, когда кто-то вложит firsts 10 раз), и свойства перестали работать (No such property nameProperty for class FirstElementDelegate).

Я думал, что просто сделаю closure.setProperty("nameProperty", "value"),но это не работаетЯ пробовал closure.properties.put(...) и многие другие вещи, но ничего не работает.

Есть ли способ добавить свойства в сценарий, чтобы они работали в каждой части сценария, независимо от контекста?

Уродливое решение, которое будет работать, но ужасно (просто чтобы проиллюстрировать, что я хочу): dsl.text.replace('${nameProperty}', 'value')

...