Xtext 多重 DSL 交叉引用:如何检索正确的代理解析资源集
Xtext Multiple DSL cross referencing: How to retrieve correct proxy-resolved resourceset
我 运行 在 Xtext 2.7.2 配置 2 DSL 语言一起工作时遇到问题:
我有 2 个 DSL,文件扩展名为:.model 和 .type,一个项目可以在 src/model/ 文件夹下包含 2 种类型的文件。
.type 文件示例
entity ent2{
name="avv"
}
.model 文件示例
block{
using ent2
}
只是一个关于链接如何工作的简单示例。现在的情况是,在块 dsl returns 的 IGenerator class 中,具有 dsl 类型值的完全解析资源:
class BlockGenerator implements IGenerator {
override void doGenerate(Resource resource, IFileSystemAccess fsa) {
(Block)resource.getContents().get(0); //correct with entity type
}
}
但是在 Model.UI 项目中,我们尝试实现一个函数以从用户在工作区中选择的 IProject 获取资源集,假设 IProject 将传递给下面的 class:
@Inject
IResourceSetProvider resourceSetProvider;
protected BlockModel loadModelResource(IProject project) {
ResourceSet rs = resourceSetProvider.get(project);
File srcModelDirectory = new File(project.getLocation().toFile()
.getAbsolutePath()
+ "/src/models/");
File[] files = srcModelDirectory.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".model");
}
});
File a = files[0];
Resource resource = rs.getResource(URI.createURI(a.toString()), true);
EcoreUtil.resolveAll(resource);
return (BlockModel) resource.getContents().get(0);
}
然而这次,如果我们按照我在上面提到的相同示例,ent2 的名称为空。像往常一样检索注入器 UI 由 :
生成的项目
public class BlockExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
@Override
protected Bundle getBundle() {
returnBlockActivator.getInstance().getBundle();
}
@Override
protected Injector getInjector() {
return BlockActivator.getInstance().getInjector(BlockActivator.ORG_BLOCK);
}
}
谁能帮我解决这个问题?我无法弄清楚 xtext 为 'entity' ent2
的所有值返回 null 背后的问题是什么
您应该使用 Eclipse 资源 API 而不是 java.io.File。像这样的东西应该可以找到所有文件。
IFolder folder = IProject.getFolder("src/model");
IResource[] members = folder.members();
for(IResource member: members) {
if (member instanceof IFile && member.getFileExtension().equalsIgnoreCase("model") {
file = (IFile)member;
break;
}
}
请查看 this 有关如何获取正确平台的常见问题解答条目:/Eclipse IFile 的资源 URI
我 运行 在 Xtext 2.7.2 配置 2 DSL 语言一起工作时遇到问题:
我有 2 个 DSL,文件扩展名为:.model 和 .type,一个项目可以在 src/model/ 文件夹下包含 2 种类型的文件。
.type 文件示例
entity ent2{
name="avv"
}
.model 文件示例
block{
using ent2
}
只是一个关于链接如何工作的简单示例。现在的情况是,在块 dsl returns 的 IGenerator class 中,具有 dsl 类型值的完全解析资源:
class BlockGenerator implements IGenerator {
override void doGenerate(Resource resource, IFileSystemAccess fsa) {
(Block)resource.getContents().get(0); //correct with entity type
}
}
但是在 Model.UI 项目中,我们尝试实现一个函数以从用户在工作区中选择的 IProject 获取资源集,假设 IProject 将传递给下面的 class:
@Inject
IResourceSetProvider resourceSetProvider;
protected BlockModel loadModelResource(IProject project) {
ResourceSet rs = resourceSetProvider.get(project);
File srcModelDirectory = new File(project.getLocation().toFile()
.getAbsolutePath()
+ "/src/models/");
File[] files = srcModelDirectory.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".model");
}
});
File a = files[0];
Resource resource = rs.getResource(URI.createURI(a.toString()), true);
EcoreUtil.resolveAll(resource);
return (BlockModel) resource.getContents().get(0);
}
然而这次,如果我们按照我在上面提到的相同示例,ent2 的名称为空。像往常一样检索注入器 UI 由 :
生成的项目 public class BlockExecutableExtensionFactory extends AbstractGuiceAwareExecutableExtensionFactory {
@Override
protected Bundle getBundle() {
returnBlockActivator.getInstance().getBundle();
}
@Override
protected Injector getInjector() {
return BlockActivator.getInstance().getInjector(BlockActivator.ORG_BLOCK);
}
}
谁能帮我解决这个问题?我无法弄清楚 xtext 为 'entity' ent2
的所有值返回 null 背后的问题是什么您应该使用 Eclipse 资源 API 而不是 java.io.File。像这样的东西应该可以找到所有文件。
IFolder folder = IProject.getFolder("src/model");
IResource[] members = folder.members();
for(IResource member: members) {
if (member instanceof IFile && member.getFileExtension().equalsIgnoreCase("model") {
file = (IFile)member;
break;
}
}
请查看 this 有关如何获取正确平台的常见问题解答条目:/Eclipse IFile 的资源 URI