Groovy DSL, передача свойств с DELEGATE_ONLY

У меня есть свой 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')

0 ответов

Другие вопросы по тегам