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:
parent
8fa32c98e8
commit
44ca9f0cc5
9 changed files with 177 additions and 34 deletions
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
/**
|
|
@ -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 "";
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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!");
|
||||
|
|
|
@ -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][];
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue