2017-02-01 5 views
0

別のファイルで宣言された変数を呼び出したい。 ファイルのインクルードは相互参照を使用して行われます。宣言された人の呼び出しも。これは文法です:Xtext、マルチファイルクロスローズ

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で何かをする必要がありますが、私にはわからないことを理解ドキュメントから

まさに

EDIT

public class MyDslQNP extends DefaultDeclarativeQualifiedNameProvider { 

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

} 
+0

ようになりYourDslScopeProvider

に実装されていますか?属性ref?はいスコープがあなたが探している場合 –

+0

インクルードルールには、Cosem宣言を含むファイルが含まれています。 しかし、これらの宣言は "メイン"ファイルからアクセスできません –

+0

これは完全な文法ですか?はいの場合、ネームプロバイダは –

答えて

3

何を「スコーピング」XTEXTと呼ばれている探しています。動作していない

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

}