Search code examples
eclipse-rcpxtext

Extend ProposalProvider in external Eclipse Project via Extension Point


I try to extend my MyDSLProposalProvider from an external Eclipse RCP Project. I created an extension point schema which requires a class property which extends my ProposalProvider. In the new project I extend the class an overrode some methods justs to give me some output so I can see that the external method is called. But this is currently not happening. Is there anything I have to consider?

Currently the hirachy looks like:

MyDSLProposalProvider extends AbstractMyDSLProposalProvider  
ExternalProposalProvider extends MyDSLProposalProvider

I rewrote a Method generated in the AbstractMyDSLProposalProvider but when its triggered the predefined Method in the AbstractMyDSLProposalProvider is called and not my new implementation.

    public class ExternalMyDSLProposalPovider extends MyDSLProposalProvider
    {
    @Override
   public void completeComponent_Name(EObject model, Assignment 
   assignment, ContentAssistContext context,
        ICompletionProposalAcceptor acceptor) {
    System.err.println("extern");
    if(model instanceof Component)
    {
        createProposal("foo", "foo", context, acceptor);
    }
    super.completeComponent_Name(model, assignment, context, acceptor);
    }
    }

This is the class in the external Eclipse Project. Thanks for the help.


Solution

  • When you declare an extension point using a schema that you have defined Eclipse puts that declaration in the extension point registry. That is all that is does, you must then write code to make uses of those declarations.

    You read the extension point registry using something like:

    IExtensionRegistry extRegistry = Platform.getExtensionRegistry();
    
    IExtensionPoint extPoint = extRegistry.getExtensionPoint("your extension point id");
    
    IConfigurationElement [] elements = extPoint.getConfigurationElements();
    

    elements is now an array of the declarations in the various plugins using the extension point.

    IConfigurationElement has various methods to get the values of the attributes of the declaration.

    If you have defined a class in one of the attributes you can create an instance of the class using:

    IConfigurationElement element =  .... a config element
    
    Object obj = element.createExecutableExtension("attribute name");
    

    In your case the result should be your ExternalMyDSLProposalPovider.

    You will then need to hook this object up with whatever is doing to proposals.