mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-07-24 01:15:29 +02:00
Correct type-strings for function and array types, bug 277320.
This commit is contained in:
parent
6bc28a4959
commit
fc4e49794c
4 changed files with 82 additions and 45 deletions
|
@ -797,7 +797,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
|||
assertNull(newExpr.getNewPlacement());
|
||||
assertNull(newExpr.getNewInitializer());
|
||||
IASTTypeId typeid= newExpr.getTypeId();
|
||||
isTypeEqual(CPPVisitor.createType(typeid), "int () * []");
|
||||
isTypeEqual(CPPVisitor.createType(typeid), "int (* [])()");
|
||||
}
|
||||
|
||||
// typedef int T;
|
||||
|
@ -1858,7 +1858,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
|||
|
||||
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
|
||||
IFunction f= ba.assertNonProblem("f", 1, IFunction.class);
|
||||
isTypeEqual(f.getType(), "void (int (C) *)");
|
||||
isTypeEqual(f.getType(), "void (int (*)(C))");
|
||||
}
|
||||
|
||||
// class C { };
|
||||
|
@ -1869,7 +1869,7 @@ public class AST2CPPSpecTest extends AST2SpecBaseTest {
|
|||
parse(code, ParserLanguage.CPP, true, 0);
|
||||
BindingAssertionHelper ba= new BindingAssertionHelper(code, true);
|
||||
IFunction f= ba.assertNonProblem("h", 1, IFunction.class);
|
||||
isTypeEqual(f.getType(), "void (int * (C *) *)");
|
||||
isTypeEqual(f.getType(), "void (int * (*)(C *))");
|
||||
}
|
||||
|
||||
// namespace A {
|
||||
|
|
|
@ -1089,7 +1089,7 @@ public class AST2CPPTests extends AST2BaseTest {
|
|||
IFunction g = (IFunction) collector.getName(8).resolveBinding();
|
||||
isTypeEqual(g.getType(), "void (char *)");
|
||||
IFunction h = (IFunction) collector.getName(12).resolveBinding();
|
||||
isTypeEqual(h.getType(), "void (int () *)");
|
||||
isTypeEqual(h.getType(), "void (int (*)())");
|
||||
|
||||
assertInstances(collector, f, 3);
|
||||
assertInstances(collector, g, 2);
|
||||
|
@ -5746,10 +5746,10 @@ public class AST2CPPTests extends AST2BaseTest {
|
|||
checkNewExpression(fdef, 10, IASTIdExpression.class, "int", IASTExpressionList.class);
|
||||
checkNewExpression(fdef, 11, IASTIdExpression.class, "int", IASTIdExpression.class);
|
||||
|
||||
checkNewExpression(fdef, 12, null, "int [] []", null);
|
||||
checkNewExpression(fdef, 13, IASTIdExpression.class, "int [] []", null);
|
||||
checkNewExpression(fdef, 14, null, "int [] []", null);
|
||||
checkNewExpression(fdef, 15, IASTIdExpression.class, "int [] []", null);
|
||||
checkNewExpression(fdef, 12, null, "int [][]", null);
|
||||
checkNewExpression(fdef, 13, IASTIdExpression.class, "int [][]", null);
|
||||
checkNewExpression(fdef, 14, null, "int [][]", null);
|
||||
checkNewExpression(fdef, 15, IASTIdExpression.class, "int [][]", null);
|
||||
}
|
||||
|
||||
private void checkNewExpression(IASTFunctionDefinition fdef, int i_expr, Class<?> placement, String type, Class<?> init) {
|
||||
|
|
|
@ -4008,7 +4008,7 @@ public class AST2Tests extends AST2BaseTest {
|
|||
// for plain C this is actually not a problem, the second J has to be interpreted as a (useless)
|
||||
// parameter name.
|
||||
assertInstance(typedef, ITypedef.class);
|
||||
isTypeEqual(((ITypedef) typedef).getType(), "int (int) *");
|
||||
isTypeEqual(((ITypedef) typedef).getType(), "int (*)(int)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5123,19 +5123,19 @@ public class AST2Tests extends AST2BaseTest {
|
|||
BindingAssertionHelper ba= new BindingAssertionHelper(comment, isCpp);
|
||||
|
||||
IFunction f= ba.assertNonProblem("f1", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int (int (int) *)");
|
||||
isTypeEqual(f.getType(), "int (int (*)(int))");
|
||||
|
||||
f= ba.assertNonProblem("f2", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int (int (int) *)");
|
||||
isTypeEqual(f.getType(), "int (int (*)(int))");
|
||||
|
||||
f= ba.assertNonProblem("f3", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int (int (int) *)");
|
||||
isTypeEqual(f.getType(), "int (int (*)(int))");
|
||||
|
||||
f= ba.assertNonProblem("f4", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int (int)");
|
||||
|
||||
f= ba.assertNonProblem("f5", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int (int * (int *) *)");
|
||||
isTypeEqual(f.getType(), "int (int * (*)(int *))");
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -5145,7 +5145,7 @@ public class AST2Tests extends AST2BaseTest {
|
|||
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), true);
|
||||
|
||||
IFunction f= ba.assertNonProblem("f1", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "void (int (C) *)");
|
||||
isTypeEqual(f.getType(), "void (int (*)(C))");
|
||||
}
|
||||
|
||||
// int (*f1(int par))[5] {};
|
||||
|
@ -5157,10 +5157,10 @@ public class AST2Tests extends AST2BaseTest {
|
|||
BindingAssertionHelper ba= new BindingAssertionHelper(getAboveComment(), isCpp);
|
||||
|
||||
IFunction f= ba.assertNonProblem("f1", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int [] * (int)");
|
||||
isTypeEqual(f.getType(), "int (* (int))[]");
|
||||
|
||||
f= ba.assertNonProblem("f1 ", 2, IFunction.class);
|
||||
isTypeEqual(f.getType(), "int [] * (int)");
|
||||
isTypeEqual(f.getType(), "int (* (int))[]");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -13,7 +13,10 @@ package org.eclipse.cdt.core.dom.ast;
|
|||
|
||||
import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.BitSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICArrayType;
|
||||
import org.eclipse.cdt.core.dom.ast.c.ICBasicType;
|
||||
|
@ -379,23 +382,13 @@ public class ASTTypeUtil {
|
|||
result.append(SPACE);
|
||||
result.append(getNameForAnonymous((IEnumeration) type));
|
||||
} else if (type instanceof IFunctionType) {
|
||||
try {
|
||||
String temp = getType(((IFunctionType) type).getReturnType(), normalize);
|
||||
if (temp != null && !temp.equals(EMPTY_STRING)) {
|
||||
result.append(temp); needSpace = true;
|
||||
}
|
||||
if (needSpace) {
|
||||
result.append(SPACE); needSpace = false;
|
||||
}
|
||||
temp = getParameterTypeString((IFunctionType) type);
|
||||
if (temp != null && !temp.equals(EMPTY_STRING)) {
|
||||
result.append(temp); needSpace = false;
|
||||
}
|
||||
if (type instanceof ICPPFunctionType) {
|
||||
ICPPFunctionType ft= (ICPPFunctionType) type;
|
||||
needSpace= appendCVQ(result, needSpace, ft.isConst(), ft.isVolatile());
|
||||
}
|
||||
} catch (DOMException e) {
|
||||
String temp = getParameterTypeString((IFunctionType) type);
|
||||
if (temp != null && !temp.equals(EMPTY_STRING)) {
|
||||
result.append(temp); needSpace = false;
|
||||
}
|
||||
if (type instanceof ICPPFunctionType) {
|
||||
ICPPFunctionType ft= (ICPPFunctionType) type;
|
||||
needSpace= appendCVQ(result, needSpace, ft.isConst(), ft.isVolatile());
|
||||
}
|
||||
} else if (type instanceof IPointerType) {
|
||||
if (type instanceof ICPPPointerToMemberType) {
|
||||
|
@ -515,26 +508,70 @@ public class ASTTypeUtil {
|
|||
} catch (DOMException e) {
|
||||
type= null;
|
||||
}
|
||||
} else if (type instanceof IFunctionType) {
|
||||
try {
|
||||
type= ((IFunctionType) type).getReturnType();
|
||||
} catch (DOMException e) {
|
||||
type= null;
|
||||
}
|
||||
} else {
|
||||
type= null;
|
||||
}
|
||||
}
|
||||
|
||||
// pop all of the types off of the stack, and build the string representation while doing so
|
||||
List<IType> postfix= null;
|
||||
BitSet parenthesis= null;
|
||||
boolean needParenthesis= false;
|
||||
for (int j = types.length - 1; j >= 0; j--) {
|
||||
if (types[j] != null && result.length() > 0)
|
||||
result.append(SPACE); // only add a space if this is not the first type being added
|
||||
IType tj = types[j];
|
||||
if (tj != null) {
|
||||
if (j > 0 && types[j - 1] instanceof IQualifierType) {
|
||||
if (result.length() > 0)
|
||||
result.append(SPACE); // only add a space if this is not the first type being added
|
||||
result.append(getTypeString(types[j - 1], normalize));
|
||||
result.append(SPACE);
|
||||
result.append(getTypeString(tj, normalize));
|
||||
--j;
|
||||
} else {
|
||||
// handle post-fix
|
||||
if (tj instanceof IFunctionType || tj instanceof IArrayType) {
|
||||
if (j == 0) {
|
||||
if (result.length() > 0)
|
||||
result.append(SPACE); // only add a space if this is not the first type being added
|
||||
result.append(getTypeString(tj, normalize));
|
||||
} else {
|
||||
if (postfix == null) {
|
||||
postfix= new ArrayList<IType>();
|
||||
}
|
||||
postfix.add(tj);
|
||||
needParenthesis= true;
|
||||
}
|
||||
} else {
|
||||
if (result.length() > 0)
|
||||
result.append(SPACE); // only add a space if this is not the first type being added
|
||||
if (needParenthesis && postfix != null) {
|
||||
result.append('(');
|
||||
if (parenthesis == null) {
|
||||
parenthesis= new BitSet();
|
||||
}
|
||||
parenthesis.set(postfix.size()-1);
|
||||
}
|
||||
result.append(getTypeString(tj, normalize));
|
||||
needParenthesis= false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (types[j] != null) {
|
||||
if (j > 0 && types[j - 1] instanceof IQualifierType) {
|
||||
result.append(getTypeString(types[j - 1], normalize));
|
||||
result.append(SPACE);
|
||||
result.append(getTypeString(types[j], normalize));
|
||||
--j;
|
||||
} else {
|
||||
result.append(getTypeString(types[j], normalize));
|
||||
}
|
||||
}
|
||||
if (postfix != null) {
|
||||
for (int j = postfix.size() - 1; j >= 0; j--) {
|
||||
if (parenthesis != null && parenthesis.get(j)) {
|
||||
result.append(')');
|
||||
}
|
||||
IType tj = postfix.get(j);
|
||||
result.append(getTypeString(tj, normalize));
|
||||
}
|
||||
}
|
||||
|
||||
return result.toString();
|
||||
|
|
Loading…
Add table
Reference in a new issue