blob: 0641a9c6bb7b5bea02a2267d5faf343ada9e7705 [file] [log] [blame]
% 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}