文本。通过字符串名称获取对象

Xtext. Get object by string name

有这样的语言。

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")
}

需要检查的是实体,我试图从其他一些已弃用或未弃用的实体中 "create"。不能通过交叉引用来完成,因为我必须通过字符串指定名称。这种情况怎么写检查器?

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

正如 Christian Dietrich 在对此类任务的评论中所建议的,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 Project Puilder
  3. 启用项目 - 自动构建

对于 Intellj Idea 你需要:

  1. 你在模块上的 dsl 语言方面
  2. 仅在标记为源的文件夹下工作