使用 ReadOnlyPDOMProvider 导入索引内容

Import of Index content with ReadOnlyPDOMProvider

本文介绍了如何生成和导入 PDOM 索引。 调用生成应用程序 GeneratePDOM 后,我得到了一个 pdom 文件 /home/sadik/eclipse-2019-06/eclipse/pdomExample.pdom。但是我在导入文件时遇到问题。

生成的命令是这样的:

 java -jar plugins/org.eclipse.equinox.launcher_1.5.400.v20190515-0925.jar -application "org.eclipse.cdt.core.GeneratePDOM" -target /home/sadik/eclipse-2019-06/eclipse/pdomExample.pdom -source /home/sadik/my-plugin-runtime-2019-06/CDTTest_Local/ -id cdttest_01 -indexer org.eclipse.cdt.core.myfastIndexer

注意 targetsource 参数。

为了测试导入,我写了一个 class 来实现 IReadOnlyPDOMProvider

public class MyReadOnlyPDOMProvider implements IReadOnlyPDOMProvider {

    public MyReadOnlyPDOMProvider() {
        System.out.println("PDOMProvider");
    }

    @Override
    public boolean providesFor(ICProject project) throws CoreException {
        return true;
    }

    @Override
    public IPDOMDescriptor[] getDescriptors(ICConfigurationDescription config) {
        final IPath fileBase = Path.fromOSString("/home/sadik/eclipse-2019-06/eclipse/");
        final IPath projectBase = Path.fromOSString("/home/sadik/my-plugin-runtime-2019-06/CDTTest_Local/");
        return new IPDOMDescriptor[] { new IPDOMDescriptor() {
            public IIndexLocationConverter getIndexLocationConverter() {
                return new URIRelativeLocationConverter(URIUtil.toURI(projectBase));
            }
            public IPath getLocation() {
                IPath path = fileBase.append("pdomExample.pdom");
                return path;
            }
        }};
    }

路径是否正确?我其实不知道这里应该返回什么位置。

我在我的插件 plugin.xml 的 CDT 扩展点 CIndex 中定义了 class:

<extension
     point="org.eclipse.cdt.core.CIndex">
  <ReadOnlyPDOMProvider
        class="de.blub.plugin.MyReadOnlyPDOMProvider">
  </ReadOnlyPDOMProvider>
</extension>

我正在测试这个文件 (/home/sadik/my-plugin-runtime-2019-06/CDTTest_Local/tests/indexer/usage.cc):

#include <declaration.h>

int main() {
    int a = testThis();
}

当我右键单击 testThis() 并选择转到声明时,我希望转到 /home/sadik/my-plugin-runtime-2019-06/CDTTest_Local/tests/indexer/declaration.h 中的函数声明。这两个文件位于同一目录中。

但是会发生这样的情况,即打开一个带有空文件的编辑器。小编还告诉我路径:/home/soezoguz/rtt-plugin-runtime-2019-06/tests/indexer/declaration.h.

路径中缺少项目名称。所以我猜 pdom 文件存储在指定源目录下的位置。我如何告诉 PDOMProvider 查看索引文件的正确目录?

出于某种原因,尾随的“/”已被 URIUtil.toURI(...) 省略。但是在 URIRealtiveLocationConverter 的描述中说

Note: The supplied base URI must end with a forward slash

所以我从字符串创建了一个 URI 实例,并在字符串中附加了一个“/”。

@Override
public IPDOMDescriptor[] getDescriptors(ICConfigurationDescription config) {
    final IPath fileBase = Path.fromOSString("/home/sadik/eclipse-2019-06/eclipse/");
    final IPath projectBase = config.getProjectDescription().getProject().getFullPath();
    return new IPDOMDescriptor[] { new IPDOMDescriptor() {
        public IIndexLocationConverter getIndexLocationConverter() {
            URI baseURI;
            try {
                baseURI = new URI(projectBase.toString()+"/");
                return new URIRelativeLocationConverter(baseURI);
            } catch (URISyntaxException e) {
                e.printStackTrace();
            }
            baseURI = URIUtil.toURI(projectBase);
            return new URIRelativeLocationConverter(URIUtil.toURI(projectBase));
        }
        public IPath getLocation() {
            IPath path = fileBase.append("pdomExample.pdom");
            return path;
        }
    }};
}