1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-06 01:06:01 +02:00

Patch for Hoda Amer.

Fix for bug 36797: Templates of Variables and structs + JUnit test
This commit is contained in:
John Camelon 2003-05-01 19:46:42 +00:00
parent 8fa32c98e8
commit 44ca9f0cc5
9 changed files with 177 additions and 34 deletions

View file

@ -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
*/

View file

@ -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;
}
/**

View file

@ -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 "";
}

View file

@ -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();
}
}

View file

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

View file

@ -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<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 @@ public class CModelElementsTests extends TestCase {
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 @@ 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!");

View file

@ -109,17 +109,25 @@ namespace MyPackage
// 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][];

View file

@ -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:

View file

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