Генерация Java-кода с помощью XPAND (вложенные пакеты) - PullRequest
1 голос
/ 08 января 2012

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

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

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

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

хотел вывода:

package kitchen.food;
class tomatoe{}

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

1 Ответ

0 голосов
/ 01 февраля 2012

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

+---------+
|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»

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

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

Надеюсь, фрагменты кода не слишком повреждены:)

...