Java CDT:如果两个源文件具有相同的名称,则“我的源文件”的大纲视图错误

Java CDT:如果两个源文件具有相同的名称,则“我的源文件”的大纲视图错误,java,eclipse-plugin,eclipse-cdt,Java,Eclipse Plugin,Eclipse Cdt,在理解了一点之后,我不得不编辑整个问题 在我的eclipse插件中,我使用CDT的CEditor和CContentOutlinePage来处理语言接近C的文件。 大纲有很多我不想错过的特点。但它也伴随着不受欢迎的行为。当我打开两个同名文件时,Outline视图始终显示首先打开的源文件的功能 比如说,我有一个具有不同内容的文件/subdir1/file.extension和/subdir2/file.extension,我可以在它们之间切换,而无需更改大纲视图 在我的编辑器中,我从超类CEdito

在理解了一点之后,我不得不编辑整个问题

在我的eclipse插件中,我使用CDT的
CEditor
CContentOutlinePage
来处理语言接近C的文件。 大纲有很多我不想错过的特点。但它也伴随着不受欢迎的行为。当我打开两个同名文件时,Outline视图始终显示首先打开的源文件的功能

比如说,我有一个具有不同内容的文件
/subdir1/file.extension
/subdir2/file.extension
,我可以在它们之间切换,而无需更改大纲视图

在我的编辑器中,我从超类
CEditor
复制了方法
getOutlinePage()

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);
    }
}
公共类MyEditor扩展了CEditor{
私有最终字符串id=“de.blub.ide.myeditor”;
私人MyOutlinePage大纲页;
/**
*默认构造函数。
*/
公共MyEditor(){
超级();
outlinePage=新的MyOutlinePage(此);
System.out.println(“工作示例”);
}
/**
*返回C/C++编辑器的大纲页。
*@返回大纲页。
*/
公共CContentLinePage getOutlinePage(){
如果(outlinePage==null){
outlinePage=新的MyOutlinePage(此);
outlinePage.addSelectionChangedListener(此);
}
IEditorInput输入=getEditorInput();
IWorkingCopyManager=CUIPlugin.getDefault().getWorkingCopyManager();
IWorkingCopy workingCopy=manager.getWorkingCopy(输入);
if(workingCopy!=outlinePage.getRoot()){
outlinePage.setInput(工作副本);
}
回报率;
}
@抑制警告(“未选中”)
@凌驾
公共T getAdapter(类适配器类){
if(adapterClass.isAssignableFrom(IContentOutlinePage.class)){
return(T)getOutlinePage();
}
返回super.getAdapter(adapterClass);
}
}

这个类的行为与supeclass完全相同,但它给了我修改行为的机会。我可以验证
workingCopy
的值是否错误,即使
input
是正确的。虽然
输入
的路径是
/project/subdir1/file.extension
工作副本
有一个指向“/project/subdir2/file.extension”的资源。

这是由于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。
要跟踪此错误的更新,请参见此处:

标准大纲视图响应当前编辑器。即使文件名恰好相同,内容也会更改。所以我不明白你的问题,谢谢。那么问题可能出在编辑器中?那么编辑器是什么?所有标准的Eclipse编辑器都应该正常工作。它是一个CEditor。目前我无法扩展它,所以我使用标准。如果您确信此编辑器应能正常工作,则错误一定在其他地方。但是在哪里呢?我没有安装EclipseCDT,所以我不知道编辑器是否工作正常。