#java #eclipse-plugin #eclipse-cdt
#java #eclipse-плагин #eclipse-cdt
Вопрос:
После получения некоторого понимания мне пришлось отредактировать весь вопрос.
В моем плагине eclipse я использую CDT CEditor
и CContentOutlinePage
для файлов с языками, близкими к C. Структура имеет много функций, которые я не хочу пропустить. Но это также приводит к нежелательному поведению. Когда я открываю два файла с одинаковым именем, в представлении структуры всегда отображаются функции исходного файла, который был открыт первым.
Скажем, у меня есть файл /subdir1/file.extension
и /subdir2/file.extension
с разным содержимым, я могу переключаться между ними без изменения представления структуры.
В моем редакторе я скопировал метод getOutlinePage()
из суперкласса CEditor
:
public class MyEditor extends CEditor {
private final String id = "de.blub.ide.myeditor";
private MyOutlinePage outlinePage;
/**
* Default constructor.
*/
public MyEditor() {
super();
outlinePage = new MyOutlinePage(this);
System.out.println("Working example");
}
/**
* Returns the outline page of the C/C editor.
* @return Outline page.
*/
public CContentOutlinePage getOutlinePage() {
if (outlinePage == null) {
outlinePage = new MyOutlinePage(this);
outlinePage.addSelectionChangedListener(this);
}
IEditorInput input = getEditorInput();
IWorkingCopyManager manager = CUIPlugin.getDefault().getWorkingCopyManager();
IWorkingCopy workingCopy = manager.getWorkingCopy(input);
if (workingCopy != outlinePage.getRoot()) {
outlinePage.setInput(workingCopy);
}
return outlinePage;
}
@SuppressWarnings("unchecked")
@Override
public <T> T getAdapter(Class<T> adapterClass) {
if (adapterClass.isAssignableFrom(IContentOutlinePage.class)) {
return (T) getOutlinePage();
}
return super.getAdapter(adapterClass);
}
}
Этот класс имеет точно такое же поведение, что и supeclass, но это дает мне возможность изменить поведение. Я могу проверить, что workingCopy
имеет неправильное значение, даже если input
оно правильное. Хотя путь к input
является /project/subdir1/file.extension
, workingCopy
имеет ресурс, указывающий на `/project/subdir2/file.extension.
Комментарии:
1. Стандартное представление структуры отвечает текущему редактору. Содержимое изменяется, даже если имена файлов совпадают. Итак, я не понимаю вашего вопроса.
2. Спасибо. Тогда проблема может быть в редакторе?
3. Ну, что такое редактор? Все стандартные редакторы Eclipse должны работать правильно.
4. Это редактор. На данный момент я не могу его расширить, поэтому я использую стандарт. Если вы уверены, что этот редактор должен работать правильно, ошибка должна быть где-то в другом месте. Но где?
5. У меня не установлен Eclipse CDT, поэтому я не знаю, работают ли редакторы должным образом или нет.
Ответ №1:
Это связано с ошибкой в ядре CDT. Метод equals в CElement проверяет тип, имя и родительский элемент, но не ресурс:
public static boolean equals(ICElement lhs, ICElement rhs) {
if (lhs == rhs) {
return true;
}
if (lhs.getElementType() != rhs.getElementType()) {
return false;
}
String lhsName = lhs.getElementName();
String rhsName = rhs.getElementName();
if (lhsName == null || rhsName == null || lhsName.length() != rhsName.length() || !lhsName.equals(rhsName)) {
return false;
}
if (lhs instanceof ISourceReference amp;amp; rhs instanceof ISourceReference) {
if (((ISourceReference) lhs).getIndex() != ((ISourceReference)rhs).getIndex()) {
return false;
}
}
ICElement lhsParent = lhs.getParent();
ICElement rhsParent = rhs.getParent();
if (lhsParent == rhsParent) {
return true;
}
return lhsParent != null amp;amp; lhsParent.equals(rhsParent);
}
Поскольку getParent() возвращает проект, метод возвращает true, если два файла расположены внутри одного проекта.
Чтобы следить за обновлениями для этой ошибки, смотрите Здесь:https://bugs.eclipse.org/bugs/show_bug.cgi?id=546295