Eclipse插件:带有非文件IEditorInput的JS编辑器

时间:2011-02-08 01:37:03

标签: java eclipse-plugin javascript

我正在使用Helios。

我们正在编写一个包含FormEditor的插件。在这个编辑器的一个选项卡中是一个嵌套的JS编辑器。在JS编辑器中,我们希望我们的对象模型显示在自动完成中。

当我们打开其中一个文件时,我已经想出如何将JS Nature和我们的库自动添加到当前项目的JS构建路径中(可以禁用此行为)。

我们有JSDoc存根,a,IJsGlobalScopeContainerInitializerSystemLibraryLocation,等等。

public class LibInitializer extends JsGlobalScopeContainerInitializer implements IJsGlobalScopeContainerInitializer {
  //...

  public int getKind() {
    return IJsGlobalScopeContainer.K_SYSTEM;
  }

  public boolean canUpdateJsGlobalScopeContainer(IPath containerPath, IJavaScriptProject project) {
    return true;
  }

  static class LibLocation extends SystemLibraryLocation {
    //...
    LibLocation() {
        super();
    }

    public char[][] getLibraryFileNames() {
        // what's plural of "chars"?
        return LibInitializer.LIBRARY_FILE_CHARSES;
    }

    public IPath getWorkingLibPath() {
        // stash our libraries in our state location for Easy Access.
        return WebFormsUIPlugin.getDefault().getStateLocation().append( "jsLib" ); //$NON-NLS-1$
  }

初始化JS编辑器时会调用代码。返回的所有路径都显示有效。

但我不能为我的生活弄清楚为什么我们的对象不会出现在自动完成或JSDoc或任何东西中。 JS Editor的调试选项并不是非常有用。日志或控制台输出中没有例外(我可以找到)。

如何确定我的库文件是否正确解析?有没有办法转储所有可用的JS类?


编辑更多详情:

JS编辑器正在使用ByteArrayStorageEditorInput(我们编写),而不是通常的FileEditorInput。

在这个项目中(JS性质和JS包含路径是项目级别设置),如果我创建一个JS文件,所有代码完成信息都来自包含路径中的任何和所有库,包括我们的。但在我们的编辑器中,我看到没有代码完成信息。不是我们的图书馆。不是来自任何其他标准库。甚至不是“ECMAScript内置库”。

所以看起来让这个工作的唯一方法就是使用一个文件。这也会在我们的编辑器中运行问题标记:没有文件意味着在问题选项卡中没有列表。

所以这看起来像是IEditorInput问题,而不是JS库问题。

1 个答案:

答案 0 :(得分:0)

看起来我将不得不将我的脚本放入文件中并使用它来获得正常行为。

是的。那很有效。我这样创建了文件:

private FileEditorInput buildJSInput() throws CoreException {
    FileEditorInput ourInput = (FileEditorInput)getEditorInput().getAdapter(FileEditorInput.class);
    IFile ourFile = ourInput.getFile();
    // keep our temp file in the same directory as the DFD to avoid collisions
    IContainer parent = ourFile.getParent();

    IPath tmpPath = new Path( ourFile.getName() + "_tmpServerSideJS.js" ); //$NON-NLS-1$
    jsFile = parent.getFile(tmpPath);

    byte jsBytes[] = model.getModel().getServerScript().getBytes();
    InputStream jsIn = new ByteArrayInputStream(jsBytes);
    if (!jsFile.exists()) {
        jsFile.create(jsIn, IResource.HIDDEN, null);
    } else {
        jsFile.setContents(jsIn, 0, null);
    }


    return new FileEditorInput(jsFile);
}

通过使用IResource.HIDDEN,该文件永远不会显示在资源视图中。它在操作系统的实际文件夹中仍然很明显,但我并不太担心那个。