получить корень дерева другого файла DSL в том же проекте для проверки xtend - PullRequest
0 голосов
/ 04 ноября 2019

У меня есть 2 разных DSL. Они связаны в своей грамматике таким образом, что на «хобби», определенные в 1 DSL, можно ссылаться во 2-м DSL. Я хочу иметь правило проверки, что все хобби упоминаются во 2-м DSL.

Как я могу получить все определенные хобби первого DSL в файле проверки 2-го DSL?

Первый DSL с именем "MyDsl.xtext" выглядит следующим образом:

    'I' 'am' name=ID
    greetings+=HelloGreeting* 'Hobbies' hobbies+=Hobbie+
    ('I_dont_like' detests+=[Hobbie|QualifiedName])?
;

Hobbie:
    'eg' name=ID
;

HelloGreeting:
    'Hello' person=[Person] '!'
;

Второй DSL под названием «MyDsl1.xtext» выглядит следующим образом:


JustGreetings:
    greetings+=HiGreeting* stuff=Stuff
;

HiGreeting:
    'Hi' person=[imported::Person] '!'
;

Stuff:
    'I_also_like_to_do:' hobbies+=[imported::Hobbie|QualifiedName]+
;

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


import org.eclipse.xtext.validation.Check;

import org.xtext.example.mydsl.myDsl.Person
import org.xtext.example.mydsl1.myDsl1.Stuff

class MyDsl1Validator extends AbstractMyDsl1Validator {

    public static val INVALID_NAME = 'invalidName'

        boolean found

    @Check
    def checkWalking(Stuff stuffs) {
        var myHobbies = stuffs.hobbies
        var definedHobbies = getPersons().hobbies
        for (i: 0..definedHobbies.size) {
            found = false
            for (j: 0..myHobbies.size) {
                if (definedHobbies.get(i).name == myHobbies.get(j).name) {
                    found = true
                }
            }
            if (found == false) {
                error("you are missing hobbie" + myHobbies.get(i).name + '.', null)
            }
        }
    }
}

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

Ожидаемый результат: я могу получить список лиц, определенных в другомDSL и используйте его для сравнения.

Редактировать:

Пример ввода:

definition.mydsl

I am A
Hello B !
Hobbies eg walking

использование.mydsl1

Hi A!
I_also_like_to_do: A.walking
...