| % Overview of Implementation of the CDT AdditionalLanguages Extension Point |
| |
| The following, from an e-mail to the CDT copied to photran-dev, is an |
| alternative description of how we modified the CDT to include this |
| extension point. |
| |
| \begin{verbatim} |
| 1. Add an AdditionalLanguages extension point to the Core's plugin.xml and AdditionalLanguages.exsd to the Core's schema folder |
| |
| Extend via <language class="my.plugin.XyzLanguage"> |
| where XyzLanguage implements IAdditionalLanguage (see below) |
| |
| 2. Add a package org.eclipse.cdt.core.addl_langs containing: |
| |
| IAdditionalLanguage |
| public interface IAdditionalLanguage { |
| public String getName(); |
| public boolean matchesSourceContentType(String contentTypeID); |
| public Collection/*<String>*/ getRegistedContentTypeIds(); |
| public IModelBuilder createModelBuilder(TranslationUnit tu, |
| Map newElements); |
| } |
| |
| AdditionalLanguagesExtension.java |
| Singleton; provides access to the extension point |
| Methods: |
| public Iterator/*<IAdditionalLanguage>*/ iterator() |
| public void processAdditionalLanguages( |
| IAdditionalLanguageCallback callback) |
| public boolean someAdditionalLanguageMatchesContentType( |
| String contentTypeID) |
| public IAdditionalLanguage getLanguageForContentType( |
| String contentTypeID) |
| |
| AdditionalLanguagesIterator.java -- see iterator() above |
| Implements Iterable/*<IAdditionalLanguage>*/ |
| |
| IAdditionalLanguageCallback -- see processAdditionalLanguages() above |
| Allows you to perform some arbitrary action on each contributed |
| IAdditionalLanguage |
| |
| IModelBuilder |
| Each extension language provides a model builder this way |
| Single method: |
| public abstract Map parse(boolean quickParseMode) |
| throws Exception; |
| |
| IAdditionalLanguageElement (extends ICElement) |
| Allows you to extend the ICElement hierarchy |
| Methods: |
| public abstract Object getBaseImageDescriptor(); |
| - The return type should really be ImageDescriptor, |
| but I don't want to make the Core depend on JFace |
| |
| 3. Change content type checking to use extension point... |
| i. CoreModel#getRegistedContentTypeIds |
| ii. CCorePlugin#getContentType |
| iii. TranslationUnit#isSourceUnit |
| iv. CoreModel#isValidSourceUnitName |
| v. CoreModel#isValidTranslationUnitName |
| |
| The change each of these is just a line or two -- usually a call to |
| AdditionalLanguagesExtension#someAdditionalLanguageMatchesContentType |
| |
| 4. Make CModelBuilder implement IModelBuilder (no substantive change) |
| |
| 5. Change the beginning of TranslationUnit#parse(Map): |
| IModelBuilder modelBuilder; |
| IAdditionalLanguage lang = AdditionalLanguagesExtension |
| .getInstance() |
| .getLanguageForSourceContentType(fContentTypeID); |
| if (lang != null) |
| modelBuilder = lang.createModelBuilder(this, newElements); |
| else |
| modelBuilder = new CModelBuilder(this, newElements); |
| |
| 6. Make CElementInfo public (rather than default) |
| |
| 7. Make CElementInfo#setIsStructureKnown public (rather than protected) |
| |
| 8. Add this to the top of CElementImageProvider#getBaseImageDescriptor: |
| if (celement instanceof IAdditionalLanguageElement) |
| return (ImageDescriptor) |
| ((IAdditionalLanguageElement)celement).getBaseImageDescriptor(); |
| \end{verbatim} |