簡體   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