有一些像这样的郎。
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) {
/*???*/
}
答案 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,您需要:
对于Intellj Idea,您需要: