Eclipse Plugin: JS Editor с не-файловым IEditorInput - PullRequest
1 голос
/ 08 февраля 2011

Я использую Helios.

Мы пишем плагин, который содержит FormEditor.В одной из вкладок этого редактора находится вложенный редактор JS.В этом редакторе JS мы бы хотели, чтобы наша объектная модель отображалась в режиме автозаполнения.

Я выяснил, как автоматически добавить JS Nature и нашу библиотеку в путь сборки JS текущего проекта.когда открывается один из наших файлов (это поведение можно отключить).

У нас есть заглушки JSDoc, a, IJsGlobalScopeContainerInitializer, a SystemLibraryLocation и т. д.

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 nature и JS include path являются настройками уровня проекта), если я создаю JS-файл, вся информация о завершении кода будет присутствовать в любой и всех библиотеках в пути include, включая нашу.Но в нашем редакторе я не вижу информации о завершении кода.Не из нашей библиотеки.Не из каких-либо других стандартных библиотек.Даже не «встроенная библиотека ECMAScript».

Так что, похоже, единственный способ добиться этого - использовать файл.Это также привело бы к работе маркеров проблем в нашем редакторе: ни один файл не означает отсутствие списка на вкладке проблем.

Так что это похоже на проблему IEditorInput, а не на проблему с библиотекой JS.

1 Ответ

0 голосов
/ 08 февраля 2011

Похоже, мне придется поместить свой скрипт в файл и использовать его для получения нормального поведения.

Да. Это сработало. Я создал файл так:

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 файл никогда не отображается в представлении ресурсов. Он по-прежнему хорошо виден в самой папке из ОС, но я не слишком беспокоюсь об этом.

...