Search code examples
javaeclipse-plugineclipse-cdt

Import of Index content with ReadOnlyPDOMProvider


This articles describes how to generate and import a PDOM index. After invoking the generation application GeneratePDOM I got a pdom file /home/sadik/eclipse-2019-06/eclipse/pdomExample.pdom. But I have problem importing the file.

The command to generate is this:

 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

Note the target and source arguments.

To test the import I wrote a class that implements 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;
            }
        }};
    }

Are the paths correct? I actually don't know what location is supposed to be returned here.

I defined that class in the CDT extension point CIndex in my Plugin's plugin.xml:

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

I'm testing with this file (/home/sadik/my-plugin-runtime-2019-06/CDTTest_Local/tests/indexer/usage.cc):

#include <declaration.h>

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

When I right click testThis() and chose go to declaration, I expect to go to the function declaration in /home/sadik/my-plugin-runtime-2019-06/CDTTest_Local/tests/indexer/declaration.h. Both files are located in the same directory.

But what happens is that an editor is opened with an empty file. The editor even tells me the path: /home/soezoguz/rtt-plugin-runtime-2019-06/tests/indexer/declaration.h.

The path is missing the project name. So I guess the pdom file stores locations below the specified source directory. How can I tell the PDOMProvider to look into the correct directory for the indexed files?


Solution

  • For some reason the trailing "/" has been ommited by URIUtil.toURI(...). But in the description of URIRealtiveLocationConverter it says

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

    So I create an URI instance from String and append a "/" to the String.

    @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;
            }
        }};
    }