xtext中的跨文件引用

时间:2015-11-16 07:46:27

标签: grammar dsl xtext emf

我使用xtext创建了一个新的DSL,如下所示。 (实际上我将在RCP应用程序上访问DSL。)

grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"


Configuration:
components+=(Component)*;

Component:
'Component' name=ID
'{'
(('display' display=STRING) &
('dependency' dependency=[Component|ID])?)
'}'
;

我有两个文件: sample1.mydsl

Component comp1 {
    display "comp1"
    dependency comp2
}

sampl2.mydsl

Component comp2 {
     display "comp2"
}

要检查其他文件的引用, 我尝试将测试代码作为独立运行,但我无法准确地获得eobject。

测试代码

 public static final void main(String arg[]) {
    new org.eclipse.emf.mwe.utils.StandaloneSetup().setPlatformUri("../");
    Injector injector = new MyDslStandaloneSetup().createInjectorAndDoEMFRegistration();
    XtextResourceSet resourceSet = injector.getInstance(XtextResourceSet.class);
    resourceSet.addLoadOption(XtextResource.OPTION_RESOLVE_ALL, Boolean.TRUE);
    File file=new File("/Users/nuckee/Work/temp/mydsl/sample1.mydsl");
    Resource resource = resourceSet.getResource(
            URI.createURI(file.toURI().toString()), true);

    Configuration config = (Configuration) resource.getContents().get(0);
    Component comp1 = config.getComponents().get(0);
    if (comp1 != null) {
        System.out.println("configuration displayed name : " + comp1.getDisplay());
        Component dep = comp1.getDependency() ;
        if (dep != null) {
            System.out.println("dep : " + dep);
            System.out.println("dep displayed name : " + dep.getDisplay());
        }
    }
}

结果

  configuration displayed name : comp1
  dep : org.xtext.example.mydsl.myDsl.impl.ComponentImpl@61544ae6 (eProxyURI: file:/Users/nuckee/Work/temp/mydsl/sample1.mydsl#|0)
  dep displayed name : null

我怎么能从另一个文件中显示“comp2”?

我希望有人可以帮我解决。感谢。

1 个答案:

答案 0 :(得分:0)

您必须将所有模型文件加载到资源集中。 Xtext不执行自动文件发现