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);