Eclipse CDT:扩展点 CIndexer 存在问题

Eclipse CDT: Problems with extension point CIndexer

问题 1: 我找不到 org.eclipse.cdt.core.index.IIndexer

来自API:

API Information: Plug-ins that want to extend this extension point must implement org.eclipse.cdt.core.index.IIndexer interface.

API信息是incorrect/deprecated吗?如果不是IIndexer应该实现哪个接口?

问题 2:我可以在 CDT 6.8 版(eclipse 2019-06)中安装自己的索引器,但不能在 6.5 版(eclipse 2018-09)中安装,虽然我看不出插件代码有什么不同。

更多详情:

我的索引器class:

@SuppressWarnings("restriction")
public class MyIndexer extends PDOMFastIndexer {

    public static final String ID = "de.blub.MyIndexer";

    @Override
    public String getID() {
        return ID;
    }

    @Override
    public IPDOMIndexerTask createTask(ITranslationUnit[] added, ITranslationUnit[] changed,
        ITranslationUnit[] removed) {
    if (...) {
        return new MyIndexerTask(added, changed, removed, this, true);
    } else {
        return super.createTask(added, changed, removed);
    }

}

plugin.xml

<extension
     id="org.eclipse.cdt.core.fastIndexer"
     name="My Indexer"
     point="org.eclipse.cdt.core.CIndexer">
  <run
        class="de.blub.MyIndexer">
  </run>

MANIFEST.MF 文件在 Require-Bundle 部分列出了 org.eclipse.cdt.core,但没有 bundle-version。当然cdt插件有不同的版本:

在 Eclipse 2019-06 中:

Eclipse CDT C/C++ Development Tools Core 6.8.1.201907021957 org.eclipse.cdt.core

在 Eclipse 2018-09 中:

Eclipse CDT C/C++ Development Tools Core 6.5.0.201811180605 org.eclipse.cdt.core

此代码来自org.eclipse.cdt.internal.core.pdom.PDOMManager:

private IPDOMIndexer newIndexer(String indexerId, Properties props) throws CoreException  {
    IPDOMIndexer indexer = null;
    // Look up in extension point
    IExtension indexerExt = Platform.getExtensionRegistry().getExtension(CCorePlugin.INDEXER_UNIQ_ID, indexerId);
    if (indexerExt != null) {
        IConfigurationElement[] elements = indexerExt.getConfigurationElements();
        for (IConfigurationElement element : elements) {
            if ("run".equals(element.getName())) { //$NON-NLS-1$
                try {
                    indexer = (IPDOMIndexer) element.createExecutableExtension("class"); //$NON-NLS-1$
                    indexer.setProperties(props);
                } catch (CoreException e) {
                    CCorePlugin.log(e);
                }
                break;
            }
        }
    }

    // Unknown index, default to the null one
    if (indexer == null)
        indexer = new PDOMNullIndexer();

    return indexer;
}

两个 cdt 版本的代码相同。 indexer 在 eclipse 2018-09 中变为 PDOMFastIndexer,但在 2019-06 中变为 MyIndexer

我能看到的一个区别是 RegistryObjectManager

private Object basicGetObject(int id, byte type) {
    Object result = cache.get(id);
    if (result != null)
        return result;
    ...
}

一个 id 用于从 cache 对象中获取正确的 ConfigurationElement (result),我真的不明白它是如何构建的。但是,返回的 ConfigurationElement 包含一个字段 propertiesAnsValues,在一种情况下这是不正确的(org.eclipse.cdt.internal.core.pdom.indexer.PDOMFastIndexer 而不是 de.blub.MyIndexer)。

我该如何解决这个问题,以便在 eclipse 2018-09 中也拥有自己的索引器? 另请注意我的问题 1。因为如果 API 描述是正确的,这意味着我试图以错误的方式安装我的索引器并且需要对 'see' IIndexer 接口做一些事情。

根据 schema definition,您需要派生的 class 是 IPDOMIndexer(您已经在做)。您还可以从引用的 PDOMManager 代码中看出这一点,该代码将 createExecutableExtension() 的结果转换为 IPDOMIndexer

(说使用 org.eclipse.cdt.core.index.IIndexer 的评论确实已经过时了。根据简要的了解,该接口至少从 2005 年开始就不存在了。欢迎使用补丁来更新扩展点文档。)

至于你的第二个问题,我相信这是因为你正在使用 id="org.eclipse.cdt.core.fastIndexer" 作为你的扩展,CDT 的一个内置索引器已经在使用它。 id 需要唯一标识您的扩展(因此您可以将其设置为 myproject.MyIndexer。)