From dd2d2f9a52db3f3bdb4053be6286f0e185ffad86 Mon Sep 17 00:00:00 2001 From: Alain Magloire Date: Sat, 25 Jun 2005 16:42:26 +0000 Subject: [PATCH] 2005-06-25 Alain Magloire Fix PR 98788: Dealing with templates * model/org/eclipse/cdt/core/model/ICElement.java + model/org/eclipse/cdt/core/model/IFunctionTemplate.java + model/org/eclipse/cdt/core/model/IFunctionTemplateDeclaration.java + model/org/eclipse/cdt/core/model/IMethodTemplate.java + model/org/eclipse/cdt/core/model/IMethodTemplateDeclaration.java + model/org/eclipse/cdt/core/model/IStructureTemplate.java + model/org/eclipse/cdt/core/model/IStructureTemplateDeclaration.java * model/org/eclipse/cdt/core/model/ITemplate.java * model/org/eclipse/cdt/internal/core/model/CModelBuilder.java * model/org/eclipse/cdt/internal/core/model/Funtion.java * model/org/eclipse/cdt/internal/core/model/FunctionTemplate.java * model/org/eclipse/cdt/internal/core/model/Method.java * model/org/eclipse/cdt/internal/core/model/MethodTemplate.java + model/org/eclipse/cdt/internal/core/model/MethodTemplateDeclaration.java * model/org/eclipse/cdt/internal/core/model/StructureTemplate.java + model/org/eclipse/cdt/internal/core/model/StructureTemplateDeclaration.java * model/org/eclipse/cdt/internal/core/model/Template.java --- core/org.eclipse.cdt.core/ChangeLog | 21 ++ .../org/eclipse/cdt/core/model/ICElement.java | 239 ++++++++++-------- .../cdt/core/model/IFunctionTemplate.java | 22 ++ .../model/IFunctionTemplateDeclaration.java | 21 ++ .../cdt/core/model/IMethodTemplate.java | 21 ++ .../model/IMethodTemplateDeclaration.java | 21 ++ .../cdt/core/model/IStructureTemplate.java | 21 ++ .../model/IStructureTemplateDeclaration.java | 22 ++ .../org/eclipse/cdt/core/model/ITemplate.java | 12 +- .../internal/core/model/CModelBuilder.java | 170 ++++++------- .../cdt/internal/core/model/Function.java | 7 +- .../internal/core/model/FunctionTemplate.java | 41 +-- .../model/FunctionTemplateDeclaration.java | 59 +++++ .../cdt/internal/core/model/Method.java | 8 +- .../internal/core/model/MethodTemplate.java | 34 +-- .../core/model/MethodTemplateDeclaration.java | 60 +++++ .../core/model/StructureTemplate.java | 34 +-- .../model/StructureTemplateDeclaration.java | 43 ++++ .../cdt/internal/core/model/Template.java | 72 ++++++ 19 files changed, 647 insertions(+), 281 deletions(-) create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplate.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplateDeclaration.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplate.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplateDeclaration.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplate.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplateDeclaration.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplateDeclaration.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplateDeclaration.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplateDeclaration.java create mode 100644 core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Template.java diff --git a/core/org.eclipse.cdt.core/ChangeLog b/core/org.eclipse.cdt.core/ChangeLog index dbfc6e794a7..d7d9465015a 100644 --- a/core/org.eclipse.cdt.core/ChangeLog +++ b/core/org.eclipse.cdt.core/ChangeLog @@ -1,3 +1,24 @@ +2005-06-25 Alain Magloire + Fix PR 98788: Dealing with templates + * model/org/eclipse/cdt/core/model/ICElement.java + + model/org/eclipse/cdt/core/model/IFunctionTemplate.java + + model/org/eclipse/cdt/core/model/IFunctionTemplateDeclaration.java + + model/org/eclipse/cdt/core/model/IMethodTemplate.java + + model/org/eclipse/cdt/core/model/IMethodTemplateDeclaration.java + + model/org/eclipse/cdt/core/model/IStructureTemplate.java + + model/org/eclipse/cdt/core/model/IStructureTemplateDeclaration.java + * model/org/eclipse/cdt/core/model/ITemplate.java + + * model/org/eclipse/cdt/internal/core/model/CModelBuilder.java + * model/org/eclipse/cdt/internal/core/model/Funtion.java + * model/org/eclipse/cdt/internal/core/model/FunctionTemplate.java + * model/org/eclipse/cdt/internal/core/model/Method.java + * model/org/eclipse/cdt/internal/core/model/MethodTemplate.java + + model/org/eclipse/cdt/internal/core/model/MethodTemplateDeclaration.java + * model/org/eclipse/cdt/internal/core/model/StructureTemplate.java + + model/org/eclipse/cdt/internal/core/model/StructureTemplateDeclaration.java + * model/org/eclipse/cdt/internal/core/model/Template.java + 2005-06-22 Vladimir Hirsl Fix for PR 93573: "[Indexer] endl references are not added to the DOM index" Fixed different encoding of functions references vs. declarations in the index. 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 28e53e11da9..4f3e5b2bdb2 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 @@ -71,134 +71,159 @@ public interface ICElement extends IAdaptable { */ static final int C_ENUMERATION = 63; + /** + * Declaration of a class without the definition. + * class C; + */ + static final int C_CLASS_DECLARATION = 64; + /** * Constant representing a class structure. */ - static final int C_CLASS = 64; - - /** - * Constant representing a struct structure. - */ - static final int C_STRUCT = 65; - - /** - * Constant representing a union structure. - */ - static final int C_UNION = 66; - - /** - * A method definition part of a structure(class, struct, union). - */ - static final int C_METHOD = 67; - - /** - * A method declaration part of a structure(class, struct, union). - */ - static final int C_METHOD_DECLARATION = 68; - - /** - * A Field definition part of a structure(class, struct, union). - */ - static final int C_FIELD = 69; - - /** - * a C/C++ function prototype. - */ - static final int C_FUNCTION_DECLARATION = 70; - - /** - * a C/C++ function. - */ - static final int C_FUNCTION = 71; - - /** - * Preprocessor #include directive. - */ - static final int C_INCLUDE = 72; - - /** - * C++ template class. - */ - static final int C_TEMPLATE_CLASS = 73; - - /** - * Global variable. - */ - static final int C_VARIABLE = 74; - - /** - * variable Declaration. - */ - static final int C_VARIABLE_DECLARATION = 75; - - /** - * Local Variable. - */ - static final int C_VARIABLE_LOCAL = 76; - - /** - * A preprocessor macro. - */ - static final int C_MACRO = 77; - - /** - * a Typedef. - */ - static final int C_TYPEDEF = 78; - - /** - * Enumerator. - */ - static final int C_ENUMERATOR = 79; - - /** - * C++ template function. - */ - static final int C_TEMPLATE_FUNCTION = 80; - - /** - * C++ template method. - */ - 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; + static final int C_CLASS = 65; /** * Declaration of a structure without the definition. * struct C; */ - static final int C_STRUCT_DECLARATION = 85; + static final int C_STRUCT_DECLARATION = 66; /** - * Declaration of a class without the definition. - * class C; + * Constant representing a struct structure. */ - static final int C_CLASS_DECLARATION = 86; + static final int C_STRUCT = 67; /** * Declaration of a union without the definition. * struct C; */ - static final int C_UNION_DECLARATION = 87; + static final int C_UNION_DECLARATION = 68; + /** + * Constant representing a union structure. + */ + static final int C_UNION = 69; + + /** + * A method definition part of a structure(class, struct, union). + */ + static final int C_METHOD = 70; + + /** + * A method declaration part of a structure(class, struct, union). + */ + static final int C_METHOD_DECLARATION = 71; + + /** + * A Field definition part of a structure(class, struct, union). + */ + static final int C_FIELD = 72; + + /** + * a C/C++ function prototype. + */ + static final int C_FUNCTION_DECLARATION = 73; + + /** + * a C/C++ function definition. + */ + static final int C_FUNCTION = 74; + + /** + * Preprocessor #include directive. + */ + static final int C_INCLUDE = 75; + + /** + * Global variable. + */ + static final int C_VARIABLE = 76; + + /** + * variable Declaration. + */ + static final int C_VARIABLE_DECLARATION = 77; + + /** + * Local Variable. + */ + static final int C_VARIABLE_LOCAL = 78; + + /** + * A preprocessor macro. + */ + static final int C_MACRO = 79; + + /** + * a Typedef. + */ + static final int C_TYPEDEF = 80; + + /** + * Enumerator. + */ + static final int C_ENUMERATOR = 81; + + /** + * C++ template class declaration without a definiton. + */ + static final int C_TEMPLATE_CLASS_DECLARATION = 82; + + /** + * C++ template class with definition. + */ + static final int C_TEMPLATE_CLASS = 83; + + /** + * C++ template struct. + */ + static final int C_TEMPLATE_STRUCT_DECLARATION = 84; + + /** + * C++ template struct. + */ + static final int C_TEMPLATE_STRUCT = 85; + + /** + * C++ template union. + */ + static final int C_TEMPLATE_UNION_DECLARATION = 86; + + /** + * C++ template union. + */ + static final int C_TEMPLATE_UNION = 87; + + /** + * C++ template function declaration. + */ + static final int C_TEMPLATE_FUNCTION_DECLARATION = 88; + + /** + * C++ template function. + */ + static final int C_TEMPLATE_FUNCTION = 89; + + /** + * C++ template method. + */ + static final int C_TEMPLATE_METHOD_DECLARATION = 90; + + /** + * C++ template method. + */ + static final int C_TEMPLATE_METHOD = 91; + + /** + * C++ template variable. + */ + static final int C_TEMPLATE_VARIABLE = 92; + /** * An unknown ICElement. Mainly used to determine what elements are not yet implemented. * i.e. the new DOM Parser supports open declaration on labels, while the old parser did not */ - static final int C_UNKNOWN_DECLARATION = 88; + static final int C_UNKNOWN_DECLARATION = 93; /** * Modifier indicating a class constructor diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplate.java new file mode 100644 index 00000000000..e5e27b7cd25 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplate.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.core.model; + + +/** + * + * Function template definition. + * + */ +public interface IFunctionTemplate extends IFunctionTemplateDeclaration, IFunction { + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplateDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplateDeclaration.java new file mode 100644 index 00000000000..ffc1cc37f16 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IFunctionTemplateDeclaration.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.core.model; + +/** + * + * Function template declaration. + * + */ +public interface IFunctionTemplateDeclaration extends ITemplate, IFunctionDeclaration { + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplate.java new file mode 100644 index 00000000000..060637eaada --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplate.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.core.model; + +/** + * Member template definition. + * IMethodTemplate + * + */ +public interface IMethodTemplate extends IMethodTemplateDeclaration, IMethod { + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplateDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplateDeclaration.java new file mode 100644 index 00000000000..a8ef2bc01cd --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IMethodTemplateDeclaration.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.core.model; + +/** + * Member template declaration. + * IMethodTemplateDeclaration + * + */ +public interface IMethodTemplateDeclaration extends ITemplate, IMethodDeclaration { + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplate.java new file mode 100644 index 00000000000..20f8bc97b2e --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplate.java @@ -0,0 +1,21 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.core.model; + +/** + * Class template definition. + * IStructureTemplate + * + */ +public interface IStructureTemplate extends IStructureTemplateDeclaration, IStructure { + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplateDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplateDeclaration.java new file mode 100644 index 00000000000..0c1612f5f81 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/IStructureTemplateDeclaration.java @@ -0,0 +1,22 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.core.model; + +/** + * Class template declaration. + * + * IStructureTemplateDeclaration + * + */ +public interface IStructureTemplateDeclaration extends ITemplate, IStructureDeclaration { + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITemplate.java index 6023e0c694a..bc277bbccaf 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITemplate.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ITemplate.java @@ -9,17 +9,13 @@ package org.eclipse.cdt.core.model; * Contributors: * Rational Software - initial implementation ******************************************************************************/ -public interface ITemplate extends IDeclaration { +public interface ITemplate { /** * Returns the template parameter types. * @return String */ String[] getTemplateParameterTypes(); - /** - * Sets the template parameter types. - * @param paramTypes - */ - void setTemplateParameterTypes(String[] templateParameterTypes); + /** * Returns the template signature * The signature depends on the type of template. @@ -29,9 +25,9 @@ public interface ITemplate extends IDeclaration { * name, its template parameters, followed by its normal parameters. * @return String * @throws CModelException - */ - + */ String getTemplateSignature() throws CModelException; + /** * Returns the number of template parameters * @return int diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java index b5f75414cc3..30d3b04326f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CModelBuilder.java @@ -19,7 +19,6 @@ import org.eclipse.cdt.core.model.CoreModel; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IParent; import org.eclipse.cdt.core.model.IProblemRequestor; -import org.eclipse.cdt.core.model.ITemplate; import org.eclipse.cdt.core.parser.CodeReader; import org.eclipse.cdt.core.parser.IParser; import org.eclipse.cdt.core.parser.IProblem; @@ -111,12 +110,11 @@ public class CModelBuilder { currentProject = translationUnit.getCProject().getProject(); } // check the project's nature - if( currentProject != null ) - { + if (currentProject != null) { hasCppNature = CoreModel.hasCCNature(currentProject); } // get the code to parse - try{ + try { code = translationUnit.getBuffer().getCharacters(); } catch (CModelException e) { @@ -143,8 +141,7 @@ public class CModelBuilder { // create the parser IParser parser = null; - try - { + try { IScannerInfo scanInfo = new ScannerInfo(); IScannerInfoProvider provider = CCorePlugin.getDefault().getScannerInfoProvider(currentProject); if (provider != null){ @@ -179,9 +176,7 @@ public class CModelBuilder { mode, language, ParserUtil.getParserLogService() ); - } - catch( ParserFactoryError pfe ) - { + } catch(ParserFactoryError pfe) { throw new ParserException( CCorePlugin.getResourceString("CModelBuilder.Parser_Construction_Failure")); //$NON-NLS-1$ } // call parse @@ -200,27 +195,20 @@ public class CModelBuilder { public Map parse(boolean quickParseMode) throws Exception { long startTime = System.currentTimeMillis(); - try - { + try { parse(quickParseMode, true); - } - - catch( ParserException e ) - { + } catch( ParserException e ) { Util.debugLog( "Parse Exception in CModelBuilder", IDebugLogConstants.MODEL ); //$NON-NLS-1$ //e.printStackTrace(); } Util.debugLog("CModel parsing: "+ ( System.currentTimeMillis() - startTime ) + "ms", IDebugLogConstants.MODEL); //$NON-NLS-1$ //$NON-NLS-2$ startTime = System.currentTimeMillis(); - try - { + try { generateModelElements(); // important to know if the unit has parse errors or not translationUnit.getElementInfo().setIsStructureKnown(hasNoErrors && quickParseCallback.hasNoProblems()); - } - catch( NullPointerException npe ) - { + } catch( NullPointerException npe ) { Util.debugLog( "NullPointer exception in CModelBuilder", IDebugLogConstants.MODEL); //$NON-NLS-1$ } @@ -314,47 +302,70 @@ public class CModelBuilder { private void generateModelElements (Parent parent, IASTTemplateDeclaration templateDeclaration) throws CModelException, ASTNotImplementedException { + CElement element = null; // Template Declaration IASTDeclaration declaration = templateDeclaration.getOwnedDeclaration(); if (declaration instanceof IASTAbstractTypeSpecifierDeclaration){ + // Class Template Declation ? IASTAbstractTypeSpecifierDeclaration abstractDeclaration = (IASTAbstractTypeSpecifierDeclaration)declaration ; - CElement element = createAbstractElement(parent, abstractDeclaration , true, true); - if (element instanceof SourceManipulation) { - SourceManipulation sourceRef = (SourceManipulation)element; - // set the element position - sourceRef.setPos(templateDeclaration.getStartingOffset(), templateDeclaration.getEndingOffset() - templateDeclaration.getStartingOffset()); - sourceRef.setLines( templateDeclaration.getStartingLine(), templateDeclaration.getEndingLine() ); + element = createAbstractElement(parent, abstractDeclaration , true, true); + String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); + if (element instanceof StructureTemplate) { // set the template parameters - String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); - ITemplate classTemplate = (ITemplate) element; + StructureTemplate classTemplate = (StructureTemplate) element; + classTemplate.setTemplateParameterTypes(parameterTypes); + } else if (element instanceof StructureTemplate) { + // set the template parameters + StructureTemplateDeclaration classTemplate = (StructureTemplateDeclaration) element; classTemplate.setTemplateParameterTypes(parameterTypes); } } else if (declaration instanceof IASTClassSpecifier){ // special case for Structural parse + // Class template definiton ? IASTClassSpecifier classSpecifier = (IASTClassSpecifier)declaration ; - CElement element = createClassSpecifierElement(parent, classSpecifier , true); - if (element instanceof SourceManipulation) { - SourceManipulation sourceRef = (SourceManipulation)element; - // set the element position - sourceRef.setPos(templateDeclaration.getStartingOffset(), templateDeclaration.getEndingOffset() - templateDeclaration.getStartingOffset()); - sourceRef.setLines( templateDeclaration.getStartingLine(), templateDeclaration.getEndingLine() ); + element = createClassSpecifierElement(parent, classSpecifier , true); + String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); + if (element instanceof StructureTemplate) { // set the template parameters - String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); - ITemplate classTemplate = (ITemplate) element; + StructureTemplate classTemplate = (StructureTemplate) element; + classTemplate.setTemplateParameterTypes(parameterTypes); + } else if (element instanceof StructureTemplate) { + // set the template parameters + StructureTemplateDeclaration classTemplate = (StructureTemplateDeclaration) element; classTemplate.setTemplateParameterTypes(parameterTypes); } + } else if (declaration instanceof IASTVariable) { + // Template variable + element = createSimpleElement(parent, declaration, true); + // set the template parameters + String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); + VariableTemplate varTemplate = (VariableTemplate) element; + varTemplate.setTemplateParameterTypes(parameterTypes); + } else if (declaration instanceof IASTFunction) { + // Function template declaration/Definition + element = createSimpleElement(parent, declaration, true); + String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); + if (element instanceof FunctionTemplate) { + // set the template parameters + FunctionTemplate functionTemplate = (FunctionTemplate) element; + functionTemplate.setTemplateParameterTypes(parameterTypes); + } else if (element instanceof FunctionTemplateDeclaration) { + // set the template parameters + FunctionTemplateDeclaration functionTemplate = (FunctionTemplateDeclaration) element; + functionTemplate.setTemplateParameterTypes(parameterTypes); + } else if (element instanceof MethodTemplate) { + MethodTemplate methodTemplate = (MethodTemplate) element; + methodTemplate.setTemplateParameterTypes(parameterTypes); + } else if (element instanceof MethodTemplateDeclaration) { + MethodTemplateDeclaration methodTemplate = (MethodTemplateDeclaration) element; + methodTemplate.setTemplateParameterTypes(parameterTypes); + } } - ITemplate template = null; - template = (ITemplate) createSimpleElement(parent, declaration, true); - - if (template instanceof SourceManipulation){ - SourceManipulation sourceRef = (SourceManipulation)template; + if (element instanceof SourceManipulation){ + SourceManipulation sourceRef = (SourceManipulation)element; // set the element position sourceRef.setPos(templateDeclaration.getStartingOffset(), templateDeclaration.getEndingOffset() - templateDeclaration.getStartingOffset()); sourceRef.setLines( templateDeclaration.getStartingLine(), templateDeclaration.getEndingLine() ); - // set the template parameters - String[] parameterTypes = ASTUtil.getTemplateParameters(templateDeclaration); - template.setTemplateParameterTypes(parameterTypes); } } @@ -388,16 +399,15 @@ public class CModelBuilder { IASTEnumerationSpecifier enumSpecifier = (IASTEnumerationSpecifier) typeSpec; IParent enumElement = createEnumeration (parent, enumSpecifier); element = (CElement) enumElement; - } - // IASTClassSpecifier - else if (typeSpec instanceof IASTClassSpecifier) { + } else if (typeSpec instanceof IASTClassSpecifier) { + // IASTClassSpecifier IASTClassSpecifier classSpecifier = (IASTClassSpecifier) typeSpec; element = createClassSpecifierElement (parent, classSpecifier, isTemplate); } else if (isDeclaration && typeSpec instanceof IASTElaboratedTypeSpecifier) { // This is not a model element, so we don't create anything here. // However, do we need to do anything else? IASTElaboratedTypeSpecifier elabSpecifier = (IASTElaboratedTypeSpecifier) typeSpec; - element = createElaboratedTypeSpecifier(parent, elabSpecifier); + element = createElaboratedTypeSpecifier(parent, elabSpecifier, isTemplate); } } return element; @@ -418,21 +428,27 @@ public class CModelBuilder { return element; } - private StructureDeclaration createElaboratedTypeSpecifier(Parent parent, IASTElaboratedTypeSpecifier typeSpec) throws CModelException{ + private StructureDeclaration createElaboratedTypeSpecifier(Parent parent, IASTElaboratedTypeSpecifier typeSpec, boolean isTemplate) throws CModelException{ // create element ASTClassKind classkind = typeSpec.getClassKind(); int kind = -1; if (classkind == ASTClassKind.CLASS) { - kind = ICElement.C_CLASS_DECLARATION; + kind = (isTemplate) ? ICElement.C_TEMPLATE_CLASS_DECLARATION : ICElement.C_CLASS_DECLARATION; } else if (classkind == ASTClassKind.STRUCT) { - kind = ICElement.C_STRUCT_DECLARATION; + kind = (isTemplate) ? ICElement.C_TEMPLATE_STRUCT_DECLARATION : ICElement.C_STRUCT_DECLARATION; } else if (classkind == ASTClassKind.UNION) { - kind = ICElement.C_UNION_DECLARATION; + kind = (isTemplate) ? ICElement.C_TEMPLATE_UNION_DECLARATION : ICElement.C_UNION_DECLARATION; } String className = (typeSpec.getName() == null) ? "" //$NON-NLS-1$ - : typeSpec.getName().toString(); - StructureDeclaration element = new StructureDeclaration(parent, className, kind); + : typeSpec.getName().toString(); + + StructureDeclaration element; + if (isTemplate) { + element = new StructureTemplateDeclaration(parent, kind, className); + } else { + element = new StructureDeclaration(parent, className, kind); + } // add to parent parent.addChild(element); @@ -539,36 +555,18 @@ public class CModelBuilder { int kind = ICElement.C_CLASS; ASTClassKind classkind = classSpecifier.getClassKind(); if(classkind == ASTClassKind.CLASS){ - if(!isTemplate) - kind = ICElement.C_CLASS; - else - kind = ICElement.C_TEMPLATE_CLASS; + kind = (isTemplate) ? ICElement.C_TEMPLATE_CLASS : ICElement.C_CLASS; type = "class"; //$NON-NLS-1$ - className = (classSpecifier.getName() == null ) - ? "" //$NON-NLS-1$ - : classSpecifier.getName().toString(); - } - if(classkind == ASTClassKind.STRUCT){ - if(!isTemplate) - kind = ICElement.C_STRUCT; - else - kind = ICElement.C_TEMPLATE_STRUCT; + } else if(classkind == ASTClassKind.STRUCT){ + kind = (isTemplate) ? ICElement.C_TEMPLATE_STRUCT : ICElement.C_STRUCT; type = "struct"; //$NON-NLS-1$ - className = (classSpecifier.getName() == null ) - ? "" //$NON-NLS-1$ - : classSpecifier.getName().toString(); - } - if(classkind == ASTClassKind.UNION){ - if(!isTemplate) - kind = ICElement.C_UNION; - else - kind = ICElement.C_TEMPLATE_UNION; + } else if(classkind == ASTClassKind.UNION){ + kind = (isTemplate) ? ICElement.C_TEMPLATE_UNION : ICElement.C_UNION; type = "union"; //$NON-NLS-1$ - className = (classSpecifier.getName() == null ) - ? "" //$NON-NLS-1$ - : classSpecifier.getName().toString(); } + className = (classSpecifier.getName() == null ) ? "" : classSpecifier.getName().toString(); //$NON-NLS-1$ + Structure element; if(!isTemplate){ Structure classElement = new Structure( parent, kind, className ); @@ -640,19 +638,17 @@ public class CModelBuilder { newElement.setMutable(fieldDeclaration.isMutable()); newElement.setVisibility(fieldDeclaration.getVisiblity()); element = newElement; - } - else { - if(isTemplate){ + } else { + if (isTemplate) { // variable VariableTemplate newElement = new VariableTemplate( parent, variableName ); element = newElement; - }else { + } else { if(varDeclaration.isExtern()){ // variableDeclaration VariableDeclaration newElement = new VariableDeclaration( parent, variableName ); element = newElement; - } - else { + } else { // variable Variable newElement = new Variable( parent, variableName ); element = newElement; @@ -712,7 +708,7 @@ public class CModelBuilder { MethodDeclaration newElement = new MethodDeclaration( parent, name ); methodElement = newElement; }else { - MethodTemplate newElement = new MethodTemplate(parent, name); + MethodTemplateDeclaration newElement = new MethodTemplateDeclaration(parent, name); methodElement = newElement; } @@ -754,7 +750,7 @@ public class CModelBuilder { FunctionDeclaration newElement = new FunctionDeclaration( parent, name ); functionElement = newElement; } else { - FunctionTemplate newElement = new FunctionTemplate( parent, name ); + FunctionTemplateDeclaration newElement = new FunctionTemplateDeclaration( parent, name ); functionElement = newElement; } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Function.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Function.java index 412615193b9..8c24af9a078 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Function.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Function.java @@ -11,6 +11,11 @@ import org.eclipse.cdt.core.model.IFunction; public class Function extends FunctionDeclaration implements IFunction { public Function(ICElement parent, String name) { - super(parent, name, ICElement.C_FUNCTION); + this(parent, name, ICElement.C_FUNCTION); } + + public Function(ICElement parent, String name, int kind) { + super(parent, name, kind); + } + } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplate.java index cf72a900a86..f9889227cf0 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplate.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplate.java @@ -13,15 +13,15 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ITemplate; +import org.eclipse.cdt.core.model.IFunctionTemplate; -public class FunctionTemplate extends FunctionDeclaration implements ITemplate{ +public class FunctionTemplate extends Function implements IFunctionTemplate { - protected String[] templateParameterTypes; + protected Template fTemplate; public FunctionTemplate(ICElement parent, String name) { super(parent, name, ICElement.C_TEMPLATE_FUNCTION); - templateParameterTypes= fgEmptyStrings; + fTemplate = new Template(name); } /** @@ -30,7 +30,7 @@ public class FunctionTemplate extends FunctionDeclaration implements ITemplate{ * @return String[] */ public String[] getTemplateParameterTypes() { - return templateParameterTypes; + return fTemplate.getTemplateParameterTypes(); } /** @@ -38,13 +38,14 @@ public class FunctionTemplate extends FunctionDeclaration implements ITemplate{ * @param fParameterTypes The fParameterTypes to set */ public void setTemplateParameterTypes(String[] templateParameterTypes) { - this.templateParameterTypes = templateParameterTypes; + fTemplate.setTemplateParameterTypes(templateParameterTypes); } + /** * @see org.eclipse.cdt.core.model.ITemplate#getNumberOfTemplateParameters() */ public int getNumberOfTemplateParameters() { - return templateParameterTypes == null ? 0 : templateParameterTypes.length; + return fTemplate.getNumberOfTemplateParameters(); } /** @@ -59,32 +60,18 @@ public class FunctionTemplate extends FunctionDeclaration implements ITemplate{ * return type. */ public String getTemplateSignature() throws CModelException { - StringBuffer sig = new StringBuffer(getElementName()); - if(getNumberOfTemplateParameters() > 0){ - sig.append("<"); //$NON-NLS-1$ - String[] paramTypes = getTemplateParameterTypes(); - int i = 0; - sig.append(paramTypes[i++]); - while (i < paramTypes.length){ - sig.append(", "); //$NON-NLS-1$ - sig.append(paramTypes[i++]); - } - sig.append(">"); //$NON-NLS-1$ - } - else{ - sig.append("<>"); //$NON-NLS-1$ - } + StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature()); sig.append(this.getParameterClause()); - if(isConst()) + if (isConst()) { sig.append(" const"); //$NON-NLS-1$ - if(isVolatile()) + } + if (isVolatile()) { sig.append(" volatile"); //$NON-NLS-1$ - - if((this.getReturnType() != null) && (this.getReturnType().length() > 0)){ + } + if ((this.getReturnType() != null) && (this.getReturnType().length() > 0)) { sig.append(" : "); //$NON-NLS-1$ sig.append(this.getReturnType()); } - return sig.toString(); } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplateDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplateDeclaration.java new file mode 100644 index 00000000000..7892e7bb410 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/FunctionTemplateDeclaration.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IFunctionTemplateDeclaration; + +public class FunctionTemplateDeclaration extends FunctionDeclaration implements IFunctionTemplateDeclaration { + + protected Template fTemplate; + + public FunctionTemplateDeclaration(ICElement parent, String name) { + super(parent, name, ICElement.C_TEMPLATE_FUNCTION_DECLARATION); + fTemplate = new Template(name); + } + + public String[] getTemplateParameterTypes() { + return fTemplate.getTemplateParameterTypes(); + } + + public String getTemplateSignature() throws CModelException { + StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature()); + sig.append(this.getParameterClause()); + if(isConst()) + sig.append(" const"); //$NON-NLS-1$ + if(isVolatile()) + sig.append(" volatile"); //$NON-NLS-1$ + + if((this.getReturnType() != null) && (this.getReturnType().length() > 0)){ + sig.append(" : "); //$NON-NLS-1$ + sig.append(this.getReturnType()); + } + + return sig.toString(); + } + + public int getNumberOfTemplateParameters() { + return fTemplate.getNumberOfTemplateParameters(); + } + + /** + * Sets the fParameterTypes. + * @param fParameterTypes The fParameterTypes to set + */ + public void setTemplateParameterTypes(String[] templateParameterTypes) { + fTemplate.setTemplateParameterTypes(templateParameterTypes); + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Method.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Method.java index 145b60a1f14..93fdb9444f6 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Method.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Method.java @@ -8,9 +8,13 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.ICElement; import org.eclipse.cdt.core.model.IMethod; -public class Method extends MethodDeclaration implements IMethod{ +public class Method extends MethodDeclaration implements IMethod { public Method(ICElement parent, String name){ - super(parent, name, ICElement.C_METHOD); + this(parent, name, ICElement.C_METHOD); + } + + public Method(ICElement parent, String name, int kind) { + super(parent, name, kind); } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplate.java index 86c820de551..ca9a98c601c 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplate.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplate.java @@ -13,16 +13,15 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ITemplate; +import org.eclipse.cdt.core.model.IMethodTemplate; -public class MethodTemplate extends MethodDeclaration implements ITemplate{ - - protected static final String[] fgEmptyList= new String[] {}; - protected String[] templateParameterTypes; +public class MethodTemplate extends Method implements IMethodTemplate { + + protected Template fTemplate; public MethodTemplate(ICElement parent, String name) { super(parent, name, ICElement.C_TEMPLATE_METHOD); - templateParameterTypes= fgEmptyList; + fTemplate = new Template(name); } /** @@ -31,7 +30,7 @@ public class MethodTemplate extends MethodDeclaration implements ITemplate{ * @return String[] */ public String[] getTemplateParameterTypes() { - return templateParameterTypes; + return fTemplate.getTemplateParameterTypes(); } /** @@ -39,13 +38,14 @@ public class MethodTemplate extends MethodDeclaration implements ITemplate{ * @param fParameterTypes The fParameterTypes to set */ public void setTemplateParameterTypes(String[] templateParameterTypes) { - this.templateParameterTypes = templateParameterTypes; + fTemplate.setTemplateParameterTypes(templateParameterTypes); } + /** * @see org.eclipse.cdt.core.model.ITemplate#getNumberOfTemplateParameters() */ public int getNumberOfTemplateParameters() { - return templateParameterTypes == null ? 0 : templateParameterTypes.length; + return fTemplate.getNumberOfTemplateParameters(); } /** @@ -61,21 +61,7 @@ public class MethodTemplate extends MethodDeclaration implements ITemplate{ */ public String getTemplateSignature() throws CModelException { - StringBuffer sig = new StringBuffer(getElementName()); - if(getNumberOfTemplateParameters() > 0){ - sig.append("<"); //$NON-NLS-1$ - String[] paramTypes = getTemplateParameterTypes(); - int i = 0; - sig.append(paramTypes[i++]); - while (i < paramTypes.length){ - sig.append(", "); //$NON-NLS-1$ - sig.append(paramTypes[i++]); - } - sig.append(">"); //$NON-NLS-1$ - } - else{ - sig.append("<>"); //$NON-NLS-1$ - } + StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature()); sig.append(this.getParameterClause()); if(isConst()) sig.append(" const"); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplateDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplateDeclaration.java new file mode 100644 index 00000000000..6cc0b6df2a6 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/MethodTemplateDeclaration.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IMethodTemplateDeclaration; + +public class MethodTemplateDeclaration extends MethodDeclaration implements IMethodTemplateDeclaration { + + protected Template fTemplate; + + public MethodTemplateDeclaration(ICElement parent, String name) { + super(parent, name, ICElement.C_TEMPLATE_METHOD_DECLARATION); + fTemplate = new Template(name); + } + + public String[] getTemplateParameterTypes() { + return fTemplate.getTemplateParameterTypes(); + } + + public String getTemplateSignature() throws CModelException { + StringBuffer sig = new StringBuffer(fTemplate.getTemplateSignature()); + sig.append(this.getParameterClause()); + if(isConst()) + sig.append(" const"); //$NON-NLS-1$ + if(isVolatile()) + sig.append(" volatile"); //$NON-NLS-1$ + + if((this.getReturnType() != null) && (this.getReturnType().length() > 0)){ + sig.append(" : "); //$NON-NLS-1$ + sig.append(this.getReturnType()); + } + + return sig.toString(); + + } + + public int getNumberOfTemplateParameters() { + return fTemplate.getNumberOfTemplateParameters(); + } + + /** + * Sets the fParameterTypes. + * @param fParameterTypes The fParameterTypes to set + */ + public void setTemplateParameterTypes(String[] templateParameterTypes) { + fTemplate.setTemplateParameterTypes(templateParameterTypes); + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java index a99967b7840..698ccb16d1f 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplate.java @@ -11,16 +11,15 @@ package org.eclipse.cdt.internal.core.model; * Rational Software - Initial API and implementation ***********************************************************************/ import org.eclipse.cdt.core.model.ICElement; -import org.eclipse.cdt.core.model.ITemplate; +import org.eclipse.cdt.core.model.IStructureTemplate; -public class StructureTemplate extends Structure implements ITemplate{ - - protected static final String[] fgEmptyList= new String[] {}; - protected String[] templateParameterTypes; +public class StructureTemplate extends Structure implements IStructureTemplate { + + protected Template fTemplate; public StructureTemplate(ICElement parent, int kind, String name) { super(parent, kind, name); - templateParameterTypes= fgEmptyList; + fTemplate = new Template(name); } /** * Returns the parameterTypes. @@ -28,7 +27,7 @@ public class StructureTemplate extends Structure implements ITemplate{ * @return String[] */ public String[] getTemplateParameterTypes() { - return templateParameterTypes; + return fTemplate.getTemplateParameterTypes(); } /** @@ -36,36 +35,21 @@ public class StructureTemplate extends Structure implements ITemplate{ * @param fParameterTypes The fParameterTypes to set */ public void setTemplateParameterTypes(String[] templateParameterTypes) { - this.templateParameterTypes = templateParameterTypes; + fTemplate.setTemplateParameterTypes(templateParameterTypes); } /** * @see org.eclipse.cdt.core.model.ITemplate#getNumberOfTemplateParameters() */ public int getNumberOfTemplateParameters() { - return templateParameterTypes == null ? 0 : templateParameterTypes.length; + return fTemplate.getNumberOfTemplateParameters(); } /** * @see org.eclipse.cdt.core.model.ITemplate#getTemplateSignature() */ public String getTemplateSignature() { - StringBuffer sig = new StringBuffer(getElementName()); - if(getNumberOfTemplateParameters() > 0){ - sig.append("<"); //$NON-NLS-1$ - String[] paramTypes = getTemplateParameterTypes(); - int i = 0; - sig.append(paramTypes[i++]); - while (i < paramTypes.length){ - sig.append(", "); //$NON-NLS-1$ - sig.append(paramTypes[i++]); - } - sig.append(">"); //$NON-NLS-1$ - } - else{ - sig.append("<>"); //$NON-NLS-1$ - } - return sig.toString(); + return fTemplate.getTemplateSignature(); } } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplateDeclaration.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplateDeclaration.java new file mode 100644 index 00000000000..051aec7d60b --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/StructureTemplateDeclaration.java @@ -0,0 +1,43 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.CModelException; +import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.IStructureTemplateDeclaration; + +public class StructureTemplateDeclaration extends StructureDeclaration implements IStructureTemplateDeclaration { + + Template fTemplate; + + public StructureTemplateDeclaration(ICElement parent, int kind, String name) { + super(parent, name, kind); + fTemplate = new Template(name); + } + + public String[] getTemplateParameterTypes() { + return fTemplate.getTemplateParameterTypes(); + } + + public void setTemplateParameterTypes(String[] templateParameterTypes) { + fTemplate.setTemplateParameterTypes(templateParameterTypes); + } + + public String getTemplateSignature() throws CModelException { + return fTemplate.getTemplateSignature(); + } + + public int getNumberOfTemplateParameters() { + return fTemplate.getNumberOfTemplateParameters(); + } + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Template.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Template.java new file mode 100644 index 00000000000..f9277a79ac4 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Template.java @@ -0,0 +1,72 @@ +/******************************************************************************* + * Copyright (c) 2005 QnX Software Systems and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Qnx Software Systems - initial API and implementation + *******************************************************************************/ + +package org.eclipse.cdt.internal.core.model; + +import org.eclipse.cdt.core.model.ITemplate; + +public class Template implements ITemplate { + + protected static final String[] fgEmptyList= new String[] {}; + protected String[] templateParameterTypes; + protected String fName; + + public Template(String name) { + fName = name; + templateParameterTypes= fgEmptyList; + } + /** + * Returns the parameterTypes. + * @see org.eclipse.cdt.core.model.ITemplate#getParameters() + * @return String[] + */ + public String[] getTemplateParameterTypes() { + return templateParameterTypes; + } + + /** + * Sets the fParameterTypes. + * @param fParameterTypes The fParameterTypes to set + */ + public void setTemplateParameterTypes(String[] templateParameterTypes) { + this.templateParameterTypes = templateParameterTypes; + } + + /** + * @see org.eclipse.cdt.core.model.ITemplate#getNumberOfTemplateParameters() + */ + public int getNumberOfTemplateParameters() { + return templateParameterTypes == null ? 0 : templateParameterTypes.length; + } + + /** + * @see org.eclipse.cdt.core.model.ITemplate#getTemplateSignature() + */ + public String getTemplateSignature() { + StringBuffer sig = new StringBuffer(fName); + if(getNumberOfTemplateParameters() > 0){ + sig.append("<"); //$NON-NLS-1$ + String[] paramTypes = getTemplateParameterTypes(); + int i = 0; + sig.append(paramTypes[i++]); + while (i < paramTypes.length){ + sig.append(", "); //$NON-NLS-1$ + sig.append(paramTypes[i++]); + } + sig.append(">"); //$NON-NLS-1$ + } + else{ + sig.append("<>"); //$NON-NLS-1$ + } + return sig.toString(); + } + +}