的Xtext。按字符串名称获取对象

时间:2016-05-30 11:46:43

标签: xtext xtend

有一些像这样的郎。

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 个答案:

答案 0 :(得分:1)

正如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. 启用项目 - 自动构建
  4. 对于Intellj Idea,您需要:

    1. 你的模块
    2. 的方面
    3. 仅在标记为来源的文件夹下工作