[
Date Prev][
Date Next][
Thread Prev][
Thread Next][
Date Index][
Thread Index]
[
List Home]
[cdt-patch] Fix for bug 36797: Templates of Variables and structs + JUnit tes t
|
Index: src/org/eclipse/cdt/internal/ui/CElementImageProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/CElementImageProvider.java,v
retrieving revision 1.14
diff -u -r1.14 CElementImageProvider.java
--- src/org/eclipse/cdt/internal/ui/CElementImageProvider.java 11 Apr 2003 14:36:52 -0000 1.14
+++ src/org/eclipse/cdt/internal/ui/CElementImageProvider.java 1 May 2003 18:30:46 -0000
@@ -204,6 +204,7 @@
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 @@
}
case ICElement.C_VARIABLE:
+ case ICElement.C_TEMPLATE_VARIABLE:
return CPluginImages.DESC_OBJS_FIELD;
case ICElement.C_METHOD:
Index: src/org/eclipse/cdt/ui/CElementLabelProvider.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/CElementLabelProvider.java,v
retrieving revision 1.13
diff -u -r1.13 CElementLabelProvider.java
--- src/org/eclipse/cdt/ui/CElementLabelProvider.java 11 Apr 2003 14:36:52 -0000 1.13
+++ src/org/eclipse/cdt/ui/CElementLabelProvider.java 1 May 2003 18:30:46 -0000
@@ -113,6 +113,9 @@
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);
Index: model/org/eclipse/cdt/core/model/ICElement.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java,v
retrieving revision 1.9
diff -u -r1.9 ICElement.java
--- model/org/eclipse/cdt/core/model/ICElement.java 21 Apr 2003 20:02:58 -0000 1.9
+++ model/org/eclipse/cdt/core/model/ICElement.java 1 May 2003 18:30:19 -0000
@@ -155,6 +155,21 @@
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
*/
static final int C_CLASS_CTOR = 0x100;
Index: model/org/eclipse/cdt/internal/core/model/ClassTemplate.java
===================================================================
RCS file: model/org/eclipse/cdt/internal/core/model/ClassTemplate.java
diff -N model/org/eclipse/cdt/internal/core/model/ClassTemplate.java
--- model/org/eclipse/cdt/internal/core/model/ClassTemplate.java 11 Apr 2003 14:36:51 -0000 1.1
+++ /dev/null 1 Jan 1970 00:00:00 -0000
@@ -1,71 +0,0 @@
-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 ClassTemplate 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);
- 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(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("<>");
- }
- return sig.toString();
- }
-
-}
Index: model/org/eclipse/cdt/internal/core/model/StructureTemplate.java
===================================================================
RCS file: model/org/eclipse/cdt/internal/core/model/StructureTemplate.java
diff -N model/org/eclipse/cdt/internal/core/model/StructureTemplate.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ model/org/eclipse/cdt/internal/core/model/StructureTemplate.java 1 May 2003 18:30:20 -0000
@@ -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 StructureTemplate extends Structure implements ITemplate{
+
+ protected static final String[] fgEmptyList= new String[] {};
+ protected String[] templateParameterTypes;
+
+ public StructureTemplate(ICElement parent, int kind, String name) {
+ super(parent, kind, 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(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("<>");
+ }
+ return sig.toString();
+ }
+
+}
Index: model/org/eclipse/cdt/internal/core/model/Variable.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/Variable.java,v
retrieving revision 1.4
diff -u -r1.4 Variable.java
--- model/org/eclipse/cdt/internal/core/model/Variable.java 8 Apr 2003 21:30:53 -0000 1.4
+++ model/org/eclipse/cdt/internal/core/model/Variable.java 1 May 2003 18:30:20 -0000
@@ -14,6 +14,10 @@
super(parent, name, CElement.C_VARIABLE);
}
+ public Variable(ICElement parent, String name, int kind) {
+ super(parent, name, kind);
+ }
+
public String getInitializer() {
return "";
}
Index: model/org/eclipse/cdt/internal/core/model/VariableTemplate.java
===================================================================
RCS file: model/org/eclipse/cdt/internal/core/model/VariableTemplate.java
diff -N model/org/eclipse/cdt/internal/core/model/VariableTemplate.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ model/org/eclipse/cdt/internal/core/model/VariableTemplate.java 1 May 2003 18:30:20 -0000
@@ -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();
+ }
+}
Index: parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java,v
retrieving revision 1.22
diff -u -r1.22 CModelBuilder.java
--- parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java 28 Apr 2003 17:36:24 -0000 1.22
+++ parser/org/eclipse/cdt/internal/core/model/CModelBuilder.java 1 May 2003 18:30:20 -0000
@@ -174,7 +174,7 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
// 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;
Index: model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java,v
retrieving revision 1.7
diff -u -r1.7 CModelElementsTests.java
--- model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java 22 Apr 2003 15:22:26 -0000 1.7
+++ model/org/eclipse/cdt/core/model/tests/CModelElementsTests.java 1 May 2003 18:31:10 -0000
@@ -39,10 +39,11 @@
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 @@
FunctionTemplate ft = (FunctionTemplate)functionTemplates.get(0);
assertEquals(ft.getElementName(), new String("aTemplatedFunction"));
assertEquals(ft.getTemplateSignature(), new String("aTemplatedFunction<A, B>(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 @@
MethodTemplate mt = (MethodTemplate)methodTemplates.get(0);
assertEquals(mt.getElementName(), new String("aTemplatedMethod"));
assertEquals(mt.getTemplateSignature(), new String("aTemplatedMethod<A, B>(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<T, Tibor>"));
- 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<T, Tibor>"));
+ 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<bool, int> : char*"));
+ checkLineNumbers((CElement)vt, 128, 129);
}
private void checkArrays(IParent tu){
@@ -438,14 +453,14 @@
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!");
Index: model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h
===================================================================
RCS file: /home/tools/org.eclipse.cdt.ui.tests/model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h,v
retrieving revision 1.3
diff -u -r1.3 CModelElementsTestStart.h
--- model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h 21 Apr 2003 16:16:58 -0000 1.3
+++ model/org/eclipse/cdt/core/model/tests/resources/cfiles/CModelElementsTestStart.h 1 May 2003 18:31:10 -0000
@@ -109,17 +109,25 @@
// check templates
// template function
- template<class A, typename B=C> A aTemplatedFunction( B bInstance );
+ template<class A, typename B=C>
+ A aTemplatedFunction( B bInstance );
// template method
class enclosing {
// public visibility
public:
- template<class A, typename B=C> A aTemplatedMethod( B bInstance );
+ template<class A, typename B=C>
+ A aTemplatedMethod( B bInstance );
};
// template class
- template<class T, typename Tibor = junk> class myarray { /* */ };
+ template<class T, typename Tibor = junk>
+ class myarray { /* */ };
+ // template struct
+ template<class T, typename Tibor = junk>
+ struct mystruct { /* */ };
+ // template variable
+ template <bool __threads, int __inst>
+ char* default_alloc_template<__threads, __inst>::_S_start_free = 0;
};
-
// check arrays
// arrays
int myArray [5][];