繁体   English   中英

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

[英]How to get resource from INode in Xtext?

我的XText语法的值转换器取决于eclipse首选项,所以我需要获取当前文件的项目。 我试过这个:

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
        }

    }
}

问题出在标有问号的行中。 我努力了:

assign.eContainer.eResource.URI
assign.eResource.URI
node.grammarElement.eResource.URI

所有这些都返回相同的URL: classpath:/my/Language.xtextbin

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

您可以向节点询问其父节点。 以及它们的语义元素。 这应该允许您检索所需的信息。 或者您也可以自定义DefaultEcoreElementFactory。

我到底做了什么:

我创建了一个范围在文件上的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在使用期间使用解析时,解析树实际上并没有与资源相关联。资源在调用链中的位置非常高,IResourceFactory似乎是放置范围的好地方,因为Injector设置在那里。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM