diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java
index 1ec026a8bcb..69ddb3e375c 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java
@@ -154,6 +154,21 @@ public interface ICElement extends IAdaptable {
*/
static final int C_TEMPLATE_METHOD = 81;
+ /**
+ * C++ template struct.
+ */
+ static final int C_TEMPLATE_STRUCT = 82;
+
+ /**
+ * C++ template union.
+ */
+ static final int C_TEMPLATE_UNION = 83;
+
+ /**
+ * C++ template variable.
+ */
+ static final int C_TEMPLATE_VARIABLE = 84;
+
/**
* Modifier indicating a class constructor
*/
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ClassTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java
similarity index 92%
rename from core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ClassTemplate.java
rename to core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java
index c02e1c2c0b0..dd6d387d411 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/ClassTemplate.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java
@@ -13,13 +13,13 @@ package org.eclipse.cdt.internal.core.model;
import org.eclipse.cdt.core.model.ICElement;
import org.eclipse.cdt.core.model.ITemplate;
-public class ClassTemplate extends Structure implements ITemplate{
+public class StructureTemplate extends Structure implements ITemplate{
protected static final String[] fgEmptyList= new String[] {};
protected String[] templateParameterTypes;
- public ClassTemplate(ICElement parent, String name) {
- super(parent, CElement.C_TEMPLATE_CLASS, name);
+ public StructureTemplate(ICElement parent, int kind, String name) {
+ super(parent, kind, name);
templateParameterTypes= fgEmptyList;
}
/**
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java
index 465659c20ee..f3cdc985349 100644
--- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java
@@ -14,6 +14,10 @@ public class Variable extends VariableDeclaration implements IVariable {
super(parent, name, CElement.C_VARIABLE);
}
+ public Variable(ICElement parent, String name, int kind) {
+ super(parent, name, kind);
+ }
+
public String getInitializer() {
return "";
}
diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableTemplate.java
new file mode 100644
index 00000000000..1649073ba91
--- /dev/null
+++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/VariableTemplate.java
@@ -0,0 +1,71 @@
+package org.eclipse.cdt.internal.core.model;
+/**********************************************************************
+ * Copyright (c) 2002,2003 Rational Software Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v05.html
+ *
+ * Contributors:
+ * Rational Software - Initial API and implementation
+***********************************************************************/
+import org.eclipse.cdt.core.model.ICElement;
+import org.eclipse.cdt.core.model.ITemplate;
+
+public class VariableTemplate extends Variable implements ITemplate {
+
+ protected static final String[] fgEmptyList= new String[] {};
+ protected String[] templateParameterTypes;
+
+ public VariableTemplate(ICElement parent, String name) {
+ super(parent, name, CElement.C_TEMPLATE_VARIABLE);
+ templateParameterTypes= fgEmptyList;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.model.ITemplate#getNumberOfTemplateParameters()
+ */
+ public int getNumberOfTemplateParameters() {
+ return templateParameterTypes == null ? 0 : templateParameterTypes.length;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.model.ITemplate#getTemplateParameterTypes()
+ */
+ public String[] getTemplateParameterTypes() {
+ return templateParameterTypes;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.model.ITemplate#setTemplateParameterTypes(java.lang.String[])
+ */
+ public void setTemplateParameterTypes(String[] templateParameterTypes) {
+ this.templateParameterTypes = templateParameterTypes;
+ }
+
+ /* (non-Javadoc)
+ * @see org.eclipse.cdt.core.model.ITemplate#getTemplateSignature()
+ */
+ public String getTemplateSignature() {
+ StringBuffer sig = new StringBuffer(getElementName());
+ if(getNumberOfTemplateParameters() > 0){
+ sig.append("<");
+ String[] paramTypes = getTemplateParameterTypes();
+ int i = 0;
+ sig.append(paramTypes[i++]);
+ while (i < paramTypes.length){
+ sig.append(", ");
+ sig.append(paramTypes[i++]);
+ }
+ sig.append(">");
+ }
+ else{
+ sig.append("<>");
+ }
+
+ sig.append(" : ");
+ sig.append(this.getTypeName());
+
+ return sig.toString();
+ }
+}
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
index 4fb9f7837a2..efb9f3be661 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
@@ -174,7 +174,7 @@ public class CModelBuilder {
TypeSpecifier typeSpec = simpleDeclaration.getTypeSpecifier();
if (typeSpec instanceof ClassSpecifier){
ClassSpecifier classSpecifier = (ClassSpecifier) typeSpec;
- ITemplate classTemplate = (ClassTemplate)createClass(parent, simpleDeclaration, classSpecifier, true);
+ ITemplate classTemplate = (StructureTemplate)createClass(parent, simpleDeclaration, classSpecifier, true);
CElement element = (CElement) classTemplate;
// set the element position
element.setPos(templateDeclaration.getStartingOffset(), templateDeclaration.getTotalLength());
@@ -211,7 +211,7 @@ public class CModelBuilder {
ParameterDeclarationClause pdc = declarator.getParms();
// variable or field
if (pdc == null){
- createVariableSpecification(parent, simpleDeclaration, declarator);
+ createVariableSpecification(parent, simpleDeclaration, declarator, false);
}
else{
// pointer to function
@@ -227,9 +227,16 @@ public class CModelBuilder {
protected void createTemplateElement(Parent parent, TemplateDeclaration templateDeclaration, SimpleDeclaration simpleDeclaration, Declarator declarator){
ParameterDeclarationClause pdc = declarator.getParms();
- if (pdc != null){
+ ITemplate template = null;
+ if (pdc == null){
+ template = (ITemplate) createVariableSpecification(parent, simpleDeclaration, declarator, true);
+ }
+ else{
// template of function or method
- ITemplate template = (ITemplate) createFunctionSpecification(parent, simpleDeclaration, declarator, pdc, true);
+ template = (ITemplate) createFunctionSpecification(parent, simpleDeclaration, declarator, pdc, true);
+ }
+
+ if(template != null){
CElement element = (CElement)template;
// set the element position
element.setPos(templateDeclaration.getStartingOffset(), templateDeclaration.getTotalLength());
@@ -338,13 +345,22 @@ public class CModelBuilder {
switch( classSpecifier.getClassKey() )
{
case ClassKey.t_class:
- kind = ICElement.C_CLASS;
+ if(!isTemplate)
+ kind = ICElement.C_CLASS;
+ else
+ kind = ICElement.C_TEMPLATE_CLASS;
break;
case ClassKey.t_struct:
- kind = ICElement.C_STRUCT;
+ if(!isTemplate)
+ kind = ICElement.C_STRUCT;
+ else
+ kind = ICElement.C_TEMPLATE_STRUCT;
break;
default:
- kind = ICElement.C_UNION;
+ if(!isTemplate)
+ kind = ICElement.C_UNION;
+ else
+ kind = ICElement.C_TEMPLATE_UNION;
break;
}
@@ -353,7 +369,7 @@ public class CModelBuilder {
Structure classElement = new Structure( (CElement)parent, kind, className );
element = classElement;
} else {
- ClassTemplate classTemplate = new ClassTemplate( (CElement)parent, className );
+ StructureTemplate classTemplate = new StructureTemplate( (CElement)parent, kind, className );
element = classTemplate;
}
@@ -408,7 +424,7 @@ public class CModelBuilder {
return element;
}
- protected VariableDeclaration createVariableSpecification(Parent parent, SimpleDeclaration simpleDeclaration, Declarator declarator){
+ protected VariableDeclaration createVariableSpecification(Parent parent, SimpleDeclaration simpleDeclaration, Declarator declarator, boolean isTemplate){
Name domName = ( declarator.getDeclarator() != null ) ?
declarator.getDeclarator().getName() :
declarator.getName();
@@ -425,15 +441,21 @@ public class CModelBuilder {
element = newElement;
}
else {
- if(declSpecifier.isExtern()){
- // variableDeclaration
- VariableDeclaration newElement = new VariableDeclaration( parent, variableName );
- element = newElement;
- }
- else {
+ if(isTemplate){
// variable
- Variable newElement = new Variable( parent, variableName );
- element = newElement;
+ VariableTemplate newElement = new VariableTemplate( parent, variableName );
+ element = newElement;
+ }else {
+ if(declSpecifier.isExtern()){
+ // variableDeclaration
+ VariableDeclaration newElement = new VariableDeclaration( parent, variableName );
+ element = newElement;
+ }
+ else {
+ // variable
+ Variable newElement = new Variable( parent, variableName );
+ element = newElement;
+ }
}
}
element.setTypeName ( getType(simpleDeclaration, declarator) );
@@ -445,9 +467,12 @@ public class CModelBuilder {
// set position
element.setIdPos( domName.getStartOffset(), domName.length() );
- element.setPos(simpleDeclaration.getStartingOffset(), simpleDeclaration.getTotalLength());
- // set the element lines
- element.setLines(simpleDeclaration.getTopLine(), simpleDeclaration.getBottomLine());
+ if(!isTemplate){
+ // set element position
+ element.setPos(simpleDeclaration.getStartingOffset(), simpleDeclaration.getTotalLength());
+ // set the element lines
+ element.setLines(simpleDeclaration.getTopLine(), simpleDeclaration.getBottomLine());
+ }
this.newElements.put(element, element.getElementInfo());
return element;
diff --git a/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java b/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
index 70212d2946d..4d2d21c0888 100644
--- a/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
+++ b/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
@@ -39,10 +39,11 @@ import org.eclipse.cdt.core.model.ITypeDef;
import org.eclipse.cdt.core.model.IVariable;
import org.eclipse.cdt.core.model.IVariableDeclaration;
import org.eclipse.cdt.internal.core.model.CElement;
-import org.eclipse.cdt.internal.core.model.ClassTemplate;
+import org.eclipse.cdt.internal.core.model.StructureTemplate;
import org.eclipse.cdt.internal.core.model.FunctionTemplate;
import org.eclipse.cdt.internal.core.model.MethodTemplate;
import org.eclipse.cdt.internal.core.model.TranslationUnit;
+import org.eclipse.cdt.internal.core.model.VariableTemplate;
import org.eclipse.cdt.testplugin.CProjectHelper;
import org.eclipse.cdt.testplugin.TestPluginLauncher;
import org.eclipse.core.resources.IFile;
@@ -411,7 +412,7 @@ public class CModelElementsTests extends TestCase {
FunctionTemplate ft = (FunctionTemplate)functionTemplates.get(0);
assertEquals(ft.getElementName(), new String("aTemplatedFunction"));
assertEquals(ft.getTemplateSignature(), new String("aTemplatedFunction(B) : A"));
- checkLineNumbers((CElement)ft, 112, 112);
+ checkLineNumbers((CElement)ft, 112, 113);
// template method
ArrayList nsClasses = namespace.getChildrenOfType(ICElement.C_CLASS);
@@ -421,15 +422,29 @@ public class CModelElementsTests extends TestCase {
MethodTemplate mt = (MethodTemplate)methodTemplates.get(0);
assertEquals(mt.getElementName(), new String("aTemplatedMethod"));
assertEquals(mt.getTemplateSignature(), new String("aTemplatedMethod(B) : A"));
- checkLineNumbers((CElement)mt, 117, 117);
+ checkLineNumbers((CElement)mt, 118, 119);
assertEquals(mt.getVisibility(), IMember.V_PUBLIC);
// template class
ArrayList classTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_CLASS);
- ClassTemplate ct = (ClassTemplate)classTemplates.get(0);
+ StructureTemplate ct = (StructureTemplate)classTemplates.get(0);
assertEquals(ct.getElementName(), new String("myarray"));
assertEquals(ct.getTemplateSignature(), new String("myarray"));
- checkLineNumbers((CElement)ct, 120, 120);
+ checkLineNumbers((CElement)ct, 122, 123);
+
+ // template struct
+ ArrayList structTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_STRUCT);
+ StructureTemplate st = (StructureTemplate)structTemplates.get(0);
+ assertEquals(st.getElementName(), new String("mystruct"));
+ assertEquals(st.getTemplateSignature(), new String("mystruct"));
+ checkLineNumbers((CElement)st, 125, 126);
+
+ // template variable
+ ArrayList variableTemplates = namespace.getChildrenOfType(ICElement.C_TEMPLATE_VARIABLE);
+ VariableTemplate vt = (VariableTemplate)variableTemplates.get(0);
+ assertEquals(vt.getElementName(), new String("default_alloc_template<__threads,__inst>::_S_start_free"));
+ assertEquals(vt.getTemplateSignature(), new String("default_alloc_template<__threads,__inst>::_S_start_free : char*"));
+ checkLineNumbers((CElement)vt, 128, 129);
}
private void checkArrays(IParent tu){
@@ -438,14 +453,14 @@ public class CModelElementsTests extends TestCase {
IVariable arrayVar = (IVariable) variables.get(0);
assertEquals(arrayVar.getElementName(), new String("myArray"));
assertEquals(arrayVar.getTypeName(), new String("int[][]"));
- checkLineNumbers((CElement)arrayVar, 125, 125);
+ checkLineNumbers((CElement)arrayVar, 133, 133);
// array parameter in function main
ArrayList functions = tu.getChildrenOfType(ICElement.C_FUNCTION);
IFunction mainFunction = (IFunction) functions.get(0);
assertEquals(mainFunction.getElementName(), new String("main"));
assertEquals(mainFunction.getReturnType(), new String("int"));
- checkLineNumbers((CElement)mainFunction, 126, 128);
+ checkLineNumbers((CElement)mainFunction, 134, 136);
int NumOfParam = mainFunction.getNumberOfParameters();
if(NumOfParam != 2)
fail("main should have two parameter!");
diff --git a/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h b/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h
index 368185b1557..4e29ffba657 100644
--- a/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h
+++ b/core/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h
@@ -109,17 +109,25 @@ namespace MyPackage
// check templates
// template function
- template A aTemplatedFunction( B bInstance );
+ template
+ A aTemplatedFunction( B bInstance );
// template method
class enclosing {
// public visibility
public:
- template A aTemplatedMethod( B bInstance );
+ template
+ A aTemplatedMethod( B bInstance );
};
// template class
- template class myarray { /* */ };
+ template
+ class myarray { /* */ };
+ // template struct
+ template
+ struct mystruct { /* */ };
+ // template variable
+ template
+ char* default_alloc_template<__threads, __inst>::_S_start_free = 0;
};
-
// check arrays
// arrays
int myArray [5][];
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CElementImageProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CElementImageProvider.java
index 4c931018d50..bd9dc9893e9 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CElementImageProvider.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CElementImageProvider.java
@@ -204,6 +204,7 @@ public class CElementImageProvider {
return DESC_OBJ_PROJECT_CLOSED;
case ICElement.C_STRUCT:
+ case ICElement.C_TEMPLATE_STRUCT:
return CPluginImages.DESC_OBJS_STRUCT;
case ICElement.C_CLASS:
@@ -234,6 +235,7 @@ public class CElementImageProvider {
}
case ICElement.C_VARIABLE:
+ case ICElement.C_TEMPLATE_VARIABLE:
return CPluginImages.DESC_OBJS_FIELD;
case ICElement.C_METHOD:
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java
index 6ffb975d17c..5e56f690a23 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java
@@ -113,6 +113,9 @@ public class CElementLabelProvider extends LabelProvider {
case ICElement.C_TEMPLATE_CLASS:
case ICElement.C_TEMPLATE_FUNCTION:
case ICElement.C_TEMPLATE_METHOD:
+ case ICElement.C_TEMPLATE_STRUCT:
+ case ICElement.C_TEMPLATE_UNION:
+ case ICElement.C_TEMPLATE_VARIABLE:
ITemplate template = (ITemplate) celem;
String signature = template.getTemplateSignature();
name.append(signature);