这是我的语法:
A: field=[B]
B: C | D
当C / D位于同一文件中时以及当C / D位于另一个文件中时(使用导入),交叉引用效果非常好。
问题在于我的函数将Model(EObject,AST的根)作为输入并提取C / D EObject。
当C / D位于同一个文件中时,我可以这样做以获得C / D EObjects:
A a = ...
if (a.getField() instanceof C)
{
C c = (C)a.getField();
//do something with c
}
else if (a.getField() instanceof D)
{
D d = (D)a.getField();
//do something with d
}
但是,当C / D位于另一个文件中时,交叉引用有效,但上述方法不起作用:a.getField()不为null但它也不是C而不是D的实例。
提供模型(导入许多其他模型),如何访问位于其他模型中的C / D?
更新
这是我获取资源的代码:
XtextResourceSetProvider rsp = (XtextResourceSetProvider)IResourceServiceProvider.Registry.INSTANCE.getResourceServiceProvider(uri).get(IResourceSetProvider.class);
XtextResourceSet rs = (XtextResourceSet) rsp.get(project);
Resource r = rs.getResource(uri, true);
答案 0 :(得分:1)
看起来过于复杂,你正在做什么
IWorkspace workspace = ResourcesPlugin.getWorkspace();
IWorkspaceRoot root = workspace.getRoot();
IFile file = root.getFile(new Path(inputFilePath));
URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true);
IProject project = file.getProject();
XtextResourceSetProvider rsp = (XtextResourceSetProvider) IResourceServiceProvider.Registry.INSTANCE
.getResourceServiceProvider(uri)
.get(IResourceSetProvider.class);
XtextResourceSet rs = (XtextResourceSet) rsp.get(project);
Resource r = rs.getResource(uri, true);
Model m = (Model) r.getContents().get(0);