如何在Xtext中从INode获取资源?

时间:2019-06-04 15:36:16

标签: java xtext xtend

我的XText语法的值转换器取决于Eclipse偏好设置,因此我需要获取当前文件的项目。我已经尝试过了:

random.shuffle(x[, random])

问题在带有问号的行中。我尝试过:

class IStringValueConverter extends OtherIStringValueConverter {

    @Inject MyLanguageGrammarAccess grammarAccess

    // this is called in toValue(String string, INode node) if some conditions are fullfilled
    override correctAssignementValue(String path, INode node, AssignmentImpl assign) {

            try {
            val uri = assign.eContainer.eResource.URI //<<<<<< ?????

            val root = ResourcesPlugin.getWorkspace().getRoot();
            val file = root.getFile(new Path(uri.toPlatformString(true)));

            [do something for which I need the file]

                return super.correctAssignementValue(path, node, assign)
            } catch (Exception ex) {
                ex.printStackTrace
                return path
        }

    }
}

所有这些都返回相同的URL:assign.eContainer.eResource.URI assign.eResource.URI node.grammarElement.eResource.URI

这是XText生成的文件,而不是我的资源。我在做什么错,如何获取当前正在解析的资源?

2 个答案:

答案 0 :(得分:0)

您可以向节点询问其父节点。并为其语义元素。应该可以让您检索所需的信息。或者,您也可以自定义DefaultEcoreElementFactory。

答案 1 :(得分:0)

最后我做了什么:

我创建了一个以文件为范围的Guice范围,并扩展了IResourceFactory(不是DefaultEcoreElementFactory)实现以在正确的时间进入此范围:

public class UiResourceFactory extends MyResourceFactory {

  private FileScope scope;

  @Inject
  public UiResourceFactory(Injector injector) {
    super(injector);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public Resource createResource(URI uri) {
    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
    IFile file = root.getFile(new Path(uri.toPlatformString(true)));
    scope.enter(file);
    try {
      return super.createResource(uri);
    } finally {
      scope.exit();
    }
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void setInjector(Injector injector) {
    super.setInjector(injector);
    scope = getInjector().getInstance(FileScope.class);
  }

}

这样,我的ValueConverter可以获取正确注入作用域的对象(显然,它是为每个需要转换的值创建的,因此没有副作用。获取资源无效的原因是ValueConverter在解析过程中使用“解析器”树时,解析树实际上尚未与资源关联。资源信息在调用链中位于相当高的位置,由于在其中设置了Injector,因此IResourceFactory似乎是放置作用域的好地方。 / p>