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
。)
问题 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
。)