了解了一点之后,我不得不编辑整个问题。
在我的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。
答案 0 :(得分:2)
这是由于CDT核心中的错误所致。 CElement中的equals方法检查类型,名称和父对象,但不检查资源:
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 && 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 && lhsParent.equals(rhsParent);
}
由于getParent()返回项目,因此,如果两个文件位于同一项目内,则该方法返回true。 要跟踪此错误的更新,请参见此处:https://bugs.eclipse.org/bugs/show_bug.cgi?id=546295