2016-05-30 6 views
0

Имеет некоторый lang вот так.Xtext. Получить объект по имени строки

language sample.linking.SampleLang; 
generate SampleLang "http://sample/linking/samplelang/v1" 
Model: 
    entity_node = Entity 
; 

Entity: 
    type = ('blabla1' | 'blabla2') ':' name = ID (annotation = Annotation)? '{' 
    (parts += EntityPart)* 
    '}' 
; 

Annotation: 
    'deprecated' ('->' name = ID)? 
; 

//SomeOtherRools 
EntityPart: 
    'createNewEntity' '(' entity=STRING ')' 
; 

У меня есть несколько файлов, которые должны быть проверены

name1.ext 
blabla2:name1 
{ 
    ... 
} 

name2.ext 
blabla2:name2 deprecated -> name1 
{ 
    ... 
} 

name3.ext 
blabla1:name3 
{ 
    createNewEntity("name2") - show warning about deprecation 
    createNewEntity("name1") 
} 

нужно проверить, является лицо, которое я пытаюсь «создать» из какого-то другого объекта устаревшего или нет. Невозможно сделать это через перекрестную ссылку, потому что я должен указать имя по строке. Как я могу написать чекер для этой ситуации?

@Check 
def checkDeprecation(EntityPart entityPart) { 
    /*???*/ 
} 
+1

вы можете дать еще несколько советов? какова область поиска? тот же файл - все файлы? каковы критерии поиска? почему STRING запрещает вам перекрестные ссылки (https://christiandietrich.wordpress.com/2015/03/19/xtext-and-strings-as-cross-references/) –

+0

Добавить некоторые изменения для публикации ... Я попробуйте изменить правило EntityPart: 'createNewEntity' '(' entity = STRING ')'; to EntityPart: 'createNewEntity' '(' entity = [Entity | STRING] ')'; и он всегда показывает «Не удалось разрешить ссылку на Entity» (Также попытайтесь изменить правило Entity, чтобы использовать name = STRING с тем же результатом) – ArchCC

+0

Пожалуйста, поделитесь полной грамматикой и моделью выборки –

ответ

0

Как Christian Dietrich предложить в комментариях (и в своем блоге https://christiandietrich.wordpress.com/2015/03/19/xtext-and-strings-as-cross-references/) для такой задачи EntityPart может быть изменен на

EntityPart: 
    'createNewEntity' '(' entity=[Entity|STRING] ')' 
; 

и добавить * validator.xtend

@Check 
    def checkDeprecation(EntityPart entityPart) { 
     if(entityPart.getEntity().getAnnotation() != null) { 
      var warningString = "Usage of deprecated entity"; 
      if(entityPart.getEntity().getAnnotation().name != null) { 
       warningString = "Usage of deprecated entity, use "+entityPart.getEntity().getAnnotation().name+" instead" 
      } 
      warning(warningString, null); 
     } 
    } 

Почему это может не сработать ...

Для Eclipse вам необходимо:

  1. XText проект природа
  2. включен Проект - Свойства - Строители - XText Проект Puilder
  3. включен Project - Build Automatically

Для Intellj идеи вам нужно:

  1. грань you'r dsl lang on module
  2. Работает только под папками, отмеченными как источник
Смежные вопросы