### Eclipse Workspace Patch 1.0
#P org.eclipse.cdt.ui
Index: src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java,v
retrieving revision 1.4
diff -u -r1.4 CElementImageProvider.java
--- src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java 22 Jul 2005 03:32:01 -0000 1.4
+++ src/org/eclipse/cdt/internal/ui/viewsupport/CElementImageProvider.java 27 Mar 2006 21:03:05 -0000
@@ -17,10 +17,11 @@
import org.eclipse.cdt.core.model.IBinaryModule;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ICProject;
+import org.eclipse.cdt.core.model.IContributedCElement;
import org.eclipse.cdt.core.model.IDeclaration;
import org.eclipse.cdt.core.model.IField;
-import org.eclipse.cdt.core.model.ILibraryReference;
import org.eclipse.cdt.core.model.IIncludeReference;
+import org.eclipse.cdt.core.model.ILibraryReference;
import org.eclipse.cdt.core.model.IMethodDeclaration;
import org.eclipse.cdt.core.model.ISourceRoot;
import org.eclipse.cdt.core.model.ITemplate;
@@ -267,6 +268,10 @@
* Returns an image descriptor for a C element. This is the base image, no overlays.
*/
public ImageDescriptor getBaseImageDescriptor(ICElement celement, int renderFlags) {
+ // Allow contributed languages to provide icons for their extensions to the ICElement hierarchy
+ if (celement instanceof IContributedCElement)
+ return (ImageDescriptor)((IContributedCElement)celement).getAdapter(ImageDescriptor.class);
+
int type = celement.getElementType();
switch (type) {
case ICElement.C_VCONTAINER:
#P org.eclipse.cdt.core
Index: parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java,v
retrieving revision 1.9
diff -u -r1.9 GCCLanguage.java
--- parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java 24 Jan 2006 18:23:53 -0000 1.9
+++ parser/org/eclipse/cdt/core/dom/ast/gnu/c/GCCLanguage.java 27 Mar 2006 21:03:07 -0000
@@ -17,7 +17,9 @@
import org.eclipse.cdt.core.dom.PDOM;
import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.model.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScanner;
@@ -129,5 +131,9 @@
public ASTCompletionNode getCompletionNode(IWorkingCopy workingCopy, int offset) {
return null;
}
-
+
+ public IContributedModelBuilder createModelBuilder(ITranslationUnit tu) {
+ // Use the default CDT model builder
+ return null;
+ }
}
Index: parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java,v
retrieving revision 1.12
diff -u -r1.12 GPPLanguage.java
--- parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java 24 Jan 2006 18:23:53 -0000 1.12
+++ parser/org/eclipse/cdt/core/dom/ast/gnu/cpp/GPPLanguage.java 27 Mar 2006 21:03:07 -0000
@@ -17,7 +17,9 @@
import org.eclipse.cdt.core.dom.PDOM;
import org.eclipse.cdt.core.dom.ast.ASTCompletionNode;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.model.IContributedModelBuilder;
import org.eclipse.cdt.core.model.ILanguage;
+import org.eclipse.cdt.core.model.ITranslationUnit;
import org.eclipse.cdt.core.model.IWorkingCopy;
import org.eclipse.cdt.core.parser.CodeReader;
import org.eclipse.cdt.core.parser.IScanner;
@@ -128,4 +130,9 @@
return null;
}
+
+ public IContributedModelBuilder createModelBuilder(ITranslationUnit tu) {
+ // Use the default CDT model builder
+ return null;
+ }
}
Index: src/org/eclipse/cdt/core/CCorePlugin.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/CCorePlugin.java,v
retrieving revision 1.88
diff -u -r1.88 CCorePlugin.java
--- src/org/eclipse/cdt/core/CCorePlugin.java 25 Nov 2005 22:01:47 -0000 1.88
+++ src/org/eclipse/cdt/core/CCorePlugin.java 27 Mar 2006 21:03:07 -0000
@@ -882,11 +882,13 @@
* @return
*/
public static IContentType getContentType(IProject project, String filename) {
+ // Always try in the workspace (for multi-language support)
// try with the project settings
if (project != null) {
try {
IContentTypeMatcher matcher = project.getContentTypeMatcher();
- return matcher.findContentTypeFor(filename);
+ IContentType ct = matcher.findContentTypeFor(filename);
+ if (ct != null) return ct;
} catch (CoreException e) {
// ignore.
}
Index: model/org/eclipse/cdt/core/model/CoreModel.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/CoreModel.java,v
retrieving revision 1.64
diff -u -r1.64 CoreModel.java
--- model/org/eclipse/cdt/core/model/CoreModel.java 6 Jul 2005 02:20:16 -0000 1.64
+++ model/org/eclipse/cdt/core/model/CoreModel.java 27 Mar 2006 21:03:07 -0000
@@ -11,6 +11,8 @@
package org.eclipse.cdt.core.model;
+import java.util.ArrayList;
+
import org.eclipse.cdt.core.CCProjectNature;
import org.eclipse.cdt.core.CCorePlugin;
import org.eclipse.cdt.core.CProjectNature;
@@ -41,6 +43,7 @@
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.content.IContentType;
import org.eclipse.core.runtime.jobs.ISchedulingRule;
@@ -185,13 +188,10 @@
* @return String[] ids
*/
public static String[] getRegistedContentTypeIds() {
- return new String[] {
- CCorePlugin.CONTENT_TYPE_ASMSOURCE,
- CCorePlugin.CONTENT_TYPE_CHEADER,
- CCorePlugin.CONTENT_TYPE_CSOURCE,
- CCorePlugin.CONTENT_TYPE_CXXHEADER,
- CCorePlugin.CONTENT_TYPE_CXXSOURCE
- };
+ ArrayList a = LanguageManager.getInstance().getAllContentTypes();
+ String[] result = new String[a.size()];
+ a.toArray(result);
+ return result;
}
/**
@@ -201,17 +201,12 @@
IContentType contentType = CCorePlugin.getContentType(project, name);
if (contentType != null) {
String id = contentType.getId();
- if (CCorePlugin.CONTENT_TYPE_CHEADER.equals(id)) {
- return true;
- } else if (CCorePlugin.CONTENT_TYPE_CXXHEADER.equals(id)) {
- return true;
- } else if (CCorePlugin.CONTENT_TYPE_CSOURCE.equals(id)) {
- return true;
- } else if (CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(id)) {
- return true;
- } else if (CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(id)) {
- return true;
- }
+ return CCorePlugin.CONTENT_TYPE_CHEADER.equals(id)
+ || CCorePlugin.CONTENT_TYPE_CXXHEADER.equals(id)
+ || CCorePlugin.CONTENT_TYPE_CSOURCE.equals(id)
+ || CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(id)
+ || CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(id)
+ || LanguageManager.getInstance().isContributedContentType(id);
}
return false;
}
@@ -239,13 +234,10 @@
IContentType contentType = CCorePlugin.getContentType(project, name);
if (contentType != null) {
String id = contentType.getId();
- if (CCorePlugin.CONTENT_TYPE_CSOURCE.equals(id)) {
- return true;
- } else if (CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(id)) {
- return true;
- } else if (CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(id)) {
- return true;
- }
+ return CCorePlugin.CONTENT_TYPE_CSOURCE.equals(id)
+ || CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(id)
+ || CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(id)
+ || LanguageManager.getInstance().isContributedContentType(id);
}
return false;
}
Index: model/org/eclipse/cdt/core/model/ILanguage.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ILanguage.java,v
retrieving revision 1.3
diff -u -r1.3 ILanguage.java
--- model/org/eclipse/cdt/core/model/ILanguage.java 24 Jan 2006 18:23:53 -0000 1.3
+++ model/org/eclipse/cdt/core/model/ILanguage.java 27 Mar 2006 21:03:07 -0000
@@ -95,4 +95,13 @@
*/
public ASTCompletionNode getCompletionNode(IWorkingCopy workingCopy, int offset);
+ /**
+ * Used to override the default model building behavior for a translation unit.
+ *
+ * @param tu the ITranslationUnit
to be parsed (non-null
)
+ * @return an IModelBuilder
, which parses the given translation unit and
+ * returns the ICElement
s of its model, or null
+ * to parse using the default CDT model builder
+ */
+ public IContributedModelBuilder createModelBuilder(ITranslationUnit tu);
}
Index: model/org/eclipse/cdt/core/model/ITranslationUnit.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITranslationUnit.java,v
retrieving revision 1.15
diff -u -r1.15 ITranslationUnit.java
--- model/org/eclipse/cdt/core/model/ITranslationUnit.java 21 Dec 2005 21:01:27 -0000 1.15
+++ model/org/eclipse/cdt/core/model/ITranslationUnit.java 27 Mar 2006 21:03:07 -0000
@@ -12,7 +12,6 @@
import java.util.Map;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
import org.eclipse.cdt.internal.core.model.IBufferFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
@@ -375,4 +374,12 @@
* @return
*/
ILanguage getLanguage() throws CoreException;
+
+ /**
+ * Used by contributed languages' model builders to indicate whether or
+ * not the parse of a translation unit was successful.
+ *
+ * @param wasSuccessful
+ */
+ public void setIsStructureKnown(boolean wasSuccessful);
}
Index: model/org/eclipse/cdt/core/model/LanguageManager.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/LanguageManager.java,v
retrieving revision 1.1
diff -u -r1.1 LanguageManager.java
--- model/org/eclipse/cdt/core/model/LanguageManager.java 21 Dec 2005 21:01:27 -0000 1.1
+++ model/org/eclipse/cdt/core/model/LanguageManager.java 27 Mar 2006 21:03:07 -0000
@@ -11,7 +11,10 @@
package org.eclipse.cdt.core.model;
+import java.util.ArrayList;
+
import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.internal.core.model.TranslationUnit;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtension;
@@ -70,4 +73,43 @@
}
return null;
}
+
+ public ArrayList/**/ getAllContentTypes() {
+ ArrayList/**/ allTypes = new ArrayList();
+ allTypes.add(CCorePlugin.CONTENT_TYPE_ASMSOURCE);
+ allTypes.add(CCorePlugin.CONTENT_TYPE_CHEADER);
+ allTypes.add(CCorePlugin.CONTENT_TYPE_CSOURCE);
+ allTypes.add(CCorePlugin.CONTENT_TYPE_CXXHEADER);
+ allTypes.add(CCorePlugin.CONTENT_TYPE_CXXSOURCE);
+
+ IContentTypeManager manager = Platform.getContentTypeManager();
+ IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CCorePlugin.PLUGIN_ID, ILanguage.KEY);
+ IExtension[] extensions = point.getExtensions();
+ for (int i = 0; i < extensions.length; ++i) {
+ IConfigurationElement[] languages = extensions[i].getConfigurationElements();
+ for (int j = 0; j < languages.length; ++j) {
+ IConfigurationElement language = languages[j];
+ IConfigurationElement[] contentTypes = language.getChildren("contentType"); //$NON-NLS-1$
+ for (int k = 0; k < contentTypes.length; ++k) {
+ IContentType langContType = manager.getContentType(contentTypes[k].getAttribute("id")); //$NON-NLS-1$
+ allTypes.add(langContType.getId());
+ }
+ }
+ }
+
+ return allTypes;
+ }
+
+ public boolean isContributedContentType(String contentTypeId) {
+ return getAllContentTypes().contains(contentTypeId);
+ }
+
+ public IContributedModelBuilder getContributedModelBuilderFor(TranslationUnit tu) {
+ try {
+ ILanguage lang = tu.getLanguage();
+ return lang == null ? null : lang.createModelBuilder(tu);
+ } catch (CoreException e) {
+ return null;
+ }
+ }
}
Index: model/org/eclipse/cdt/internal/core/model/TranslationUnit.java
===================================================================
RCS file: /cvsroot/tools/org.eclipse.cdt-core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/TranslationUnit.java,v
retrieving revision 1.44
diff -u -r1.44 TranslationUnit.java
--- model/org/eclipse/cdt/internal/core/model/TranslationUnit.java 18 Jan 2006 18:56:25 -0000 1.44
+++ model/org/eclipse/cdt/internal/core/model/TranslationUnit.java 27 Mar 2006 21:03:07 -0000
@@ -20,6 +20,7 @@
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.IBuffer;
import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.IContributedModelBuilder;
import org.eclipse.cdt.core.model.IInclude;
import org.eclipse.cdt.core.model.ILanguage;
import org.eclipse.cdt.core.model.INamespace;
@@ -279,7 +280,7 @@
return location;
}
- protected IFile getFile() {
+ public IFile getFile() {
IResource res = getResource();
if (res instanceof IFile) {
return (IFile)res;
@@ -580,10 +581,22 @@
/**
* Parse the buffer contents of this element.
*/
- private void parse(Map newElements){
+ private void parse(Map newElements) {
+ boolean quickParseMode = ! (CCorePlugin.getDefault().useStructuralParseMode());
+ IContributedModelBuilder mb = LanguageManager.getInstance().getContributedModelBuilderFor(this);
+ if (mb == null) {
+ parseUsingCModelBuilder(newElements, quickParseMode);
+ } else {
+ parseUsingContributedModelBuilder(mb, quickParseMode);
+ }
+ }
+
+ /**
+ * Parse the buffer contents of this element.
+ */
+ private void parseUsingCModelBuilder(Map newElements, boolean quickParseMode) {
try {
CModelBuilder modelBuilder = new CModelBuilder(this, newElements);
- boolean quickParseMode = ! (CCorePlugin.getDefault().useStructuralParseMode());
modelBuilder.parse(quickParseMode);
} catch (Exception e) {
// use the debug log for this exception.
@@ -591,6 +604,15 @@
}
}
+ private void parseUsingContributedModelBuilder(IContributedModelBuilder mb, boolean quickParseMode) {
+ try {
+ mb.parse(quickParseMode);
+ } catch (Exception e) {
+ // use the debug log for this exception.
+ Util.debugLog( "Exception in contributed model builder", IDebugLogConstants.MODEL); //$NON-NLS-1$
+ }
+ }
+
public IProblemRequestor getProblemRequestor() {
return problemRequestor;
}
@@ -613,6 +635,7 @@
CCorePlugin.CONTENT_TYPE_CSOURCE.equals(contentTypeId)
|| CCorePlugin.CONTENT_TYPE_CXXSOURCE.equals(contentTypeId)
|| CCorePlugin.CONTENT_TYPE_ASMSOURCE.equals(contentTypeId)
+ || LanguageManager.getInstance().isContributedContentType(contentTypeId)
);
}
@@ -695,4 +718,19 @@
}
super.closing(info);
}
+
+ /**
+ * Contributed languages' model builders need to be able to indicate whether or
+ * not the parse of a translation unit was successful without having access to
+ * the CElementInfo
object associated with the translation unit
+ *
+ * @param wasSuccessful
+ */
+ public void setIsStructureKnown(boolean wasSuccessful) {
+ try {
+ this.getElementInfo().setIsStructureKnown(wasSuccessful);
+ } catch (CModelException e) {
+ ;
+ }
+ }
}
Index: model/org/eclipse/cdt/core/model/IContributedModelBuilder.java
===================================================================
RCS file: model/org/eclipse/cdt/core/model/IContributedModelBuilder.java
diff -N model/org/eclipse/cdt/core/model/IContributedModelBuilder.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ model/org/eclipse/cdt/core/model/IContributedModelBuilder.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,26 @@
+package org.eclipse.cdt.core.model;
+
+/**
+ * Interface supported by model builders for contributed languages.
+ *
+ * Model builders parse a TranslationUnit
(i.e., a file) and
+ * return a hierarchy of ICElement
s which represent the high-level
+ * structure of that file (what modules, classes, functions, and similar
+ * constructs are contained in it, and on what line(s) the definition occurs).
+ *
+ * The translation unit to parse and the initial element map are given to
+ * IAdditionalLanguage#createModelBuilder
, which will presumably
+ * pass that information on to the model builder constructor.
+ *
+ * @author Jeff Overbey
+ */
+public interface IContributedModelBuilder {
+ /**
+ * Callback used when a TranslationUnit
needs to be parsed.
+ *
+ * The translation unit to parse is given to
+ * ILanguage#createModelBuilder
, which will presumably
+ * pass it on to the model builder constructor.
+ */
+ public abstract void parse(boolean quickParseMode) throws Exception;
+}
Index: model/org/eclipse/cdt/core/model/IContributedCElement.java
===================================================================
RCS file: model/org/eclipse/cdt/core/model/IContributedCElement.java
diff -N model/org/eclipse/cdt/core/model/IContributedCElement.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ model/org/eclipse/cdt/core/model/IContributedCElement.java 1 Jan 1970 00:00:00 -0000
@@ -0,0 +1,17 @@
+package org.eclipse.cdt.core.model;
+
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * Additions to the ICElement
hierarchy provided by
+ * contributed languages.
+ *
+ * Contributed elements are required to be adaptable to an
+ * ImageDescriptor
.
+ *
+ * @author Jeff Overbey
+ * @see ICElement
+ * @see IAdaptable
+ */
+public interface IContributedCElement extends ICElement {
+}