【问题标题】:Xtext, multi-file Cross-referenceXtext,多文件交叉引用
【发布时间】:2019-06-03 23:13:28
【问题描述】:

我想调用另一个文件中声明的变量。 文件的包含是使用交叉引用完成的。以及声明的调用。这是语法:

Script:
includes+=(Include)* assignments+=(Assignment)* g=GetLog?  clock=Clock? tests+=Test*
;

Assignment:
    Config |Cosem ;

Include:
    'INCLUDE' includedScript=[Script|STRING];

Cosem:
name=ID '=' 'COSEM' '(' classid=INT ',' version=INT ','  obis=STRING ')' ;

AttributeRef:
     name=[Cosem] "." attributeRef =IDValue

;

声明是Cosem 规则。

从文档中我了解到我必须在 IResourceDescription 中做一些事情,但我不知道具体是什么

编辑

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider {

    QualifiedName qualifiedName(Script script) {
        return QualifiedName.create(script.eResource().getURI().trimFileExtension().lastSegment(), script.eResource().getURI().fileExtension());
    }

}

【问题讨论】:

  • 哪个不工作?属性参考?如果是,范围界定是您正在寻找的
  • 包含规则包括包含 Cosem 声明的文件。但是,这些声明不能从“主”文件中访问
  • 这是你的完整语法吗?如果是,您的名称提供者是什么样的
  • 我编辑了问题

标签: java xtext xtend


【解决方案1】:

您正在寻找的内容称为“范围界定”xtext。它在YourDslScopeProvider中实现

这可能看起来像

class MyDslScopeProvider extends AbstractMyDslScopeProvider {

    override getScope(EObject context, EReference reference) {
        if (reference === MyDslPackage.Literals.ATTRIBUTE_REF__NAME) {
            // we are scoping the AttributeRef.name cross reference
            val script = EcoreUtil2.getContainerOfType(context, Script)
            if (script !== null) {
                val allImportedCosems = script.includes.map[includedScript.assignments.filter(Cosem)].flatten
                // put the imported cosems into scope
                return Scopes.scopeFor(allImportedCosems)
            }
        }
        super.getScope(context, reference)
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多