Генерация кода Java с помощью XPAND (вложенные пакеты)

Я работаю над созданием кода из существующей модели с XPAND. Эта модель содержит вложенные пакеты, известные, например, по Java.

Насколько я понимаю, нет циклов или чего-то еще, чтобы я мог объединить, например, строку объявления пакета.

Я хотел бы сделать что-то вроде этого:

model:
package kitchen
--package electronics
--package food
----class tomatoe

желаемый результат:

package kitchen.food;
class tomatoe{}

Я должен добавить, что у него должна быть возможность запрашивать у классов их родительские классы. Как сгенерировать строку импорта для вложенных пакетов?


person Asamandra    schedule 07.01.2012    source источник
comment
Собственно в чем вопрос?   -  person Jasonw    schedule 09.01.2012
comment
вопрос заключался в том, как сгенерировать строку импорта для вложенных пакетов   -  person Asamandra    schedule 27.01.2012


Ответы (1)


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

+---------+
|Package  |
|         |<>--+
`---------+    | 0..* containedPackages
        |      |
        +------+ 0..1 parentPackage

В Xpand вы бы сделали (не проверено, но должно быть достаточно, чтобы понять идею):

«DEFINE class FOR Class»
  import «EXPAND packagename FOR this.package»;
  class «this.name»{}
«ENDDEFINE»

«DEFINE packagename FOR Package»
  «FOREACH this.packageHierarchy() as p SEPARATOR '.' -»«p»«ENDFOREACH»
«ENDDEFINE»

Расширить - рекурсивно найти родителей, добавить их в список и изменить порядок списка. Вероятно, есть более чистый способ, которому не нужен метод flatten():

List[Package] packageHierarchy(Package p):
    let list = {}:
    p.parentPackage == null ? list.add(p) : list.add(packageHierarchy(p.parentPackage)) ->
    list.flatten().reverse()
;  

Я надеюсь, что фрагменты кода не слишком сломаны :)

person jham    schedule 01.02.2012
comment
Спасибо за помощь. я согласен, что это более простой способ. у меня не было выбора сделать это, так как моя ситуация была предопределена, но я уверен, что это решение может быть полезно для других. (до сих пор у меня нет решения моей проблемы, поэтому я не могу опубликовать его на случай, если кто-то заинтересуется) - person Asamandra; 27.02.2012