mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-09-08 19:13:27 +02:00
Fixes a performance issue introduced by fix for 261417.
This commit is contained in:
parent
f18840cf49
commit
7812c51d4d
6 changed files with 30 additions and 27 deletions
|
@ -1756,7 +1756,7 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
IASTExpressionStatement expStatement = (IASTExpressionStatement) ((IASTCompoundStatement) def
|
IASTExpressionStatement expStatement = (IASTExpressionStatement) ((IASTCompoundStatement) def
|
||||||
.getBody()).getStatements()[0];
|
.getBody()).getStatements()[0];
|
||||||
assertTrue(expStatement.getExpression() instanceof IASTLiteralExpression);
|
assertTrue(expStatement.getExpression() instanceof IASTLiteralExpression);
|
||||||
IType type = CPPVisitor.getExpressionType(expStatement.getExpression());
|
IType type = expStatement.getExpression().getExpressionType();
|
||||||
|
|
||||||
assertTrue(type instanceof IPointerType);
|
assertTrue(type instanceof IPointerType);
|
||||||
assertSame(((IPointerType) type).getType(), A);
|
assertSame(((IPointerType) type).getType(), A);
|
||||||
|
@ -1765,7 +1765,7 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
expStatement = (IASTExpressionStatement) ((IASTCompoundStatement) def
|
expStatement = (IASTExpressionStatement) ((IASTCompoundStatement) def
|
||||||
.getBody()).getStatements()[0];
|
.getBody()).getStatements()[0];
|
||||||
IASTUnaryExpression ue = (IASTUnaryExpression) expStatement.getExpression();
|
IASTUnaryExpression ue = (IASTUnaryExpression) expStatement.getExpression();
|
||||||
type = CPPVisitor.getExpressionType(ue);
|
type = ue.getExpressionType();
|
||||||
|
|
||||||
assertTrue(type instanceof IQualifierType);
|
assertTrue(type instanceof IQualifierType);
|
||||||
assertSame(((IQualifierType) type).getType(), A);
|
assertSame(((IQualifierType) type).getType(), A);
|
||||||
|
@ -5556,7 +5556,7 @@ public class AST2CPPTests extends AST2BaseTest {
|
||||||
IASTDeclarator decltor= ((IASTSimpleDeclaration)tu.getDeclarations()[0]).getDeclarators()[0];
|
IASTDeclarator decltor= ((IASTSimpleDeclaration)tu.getDeclarations()[0]).getDeclarators()[0];
|
||||||
IASTInitializerExpression init= (IASTInitializerExpression) decltor.getInitializer();
|
IASTInitializerExpression init= (IASTInitializerExpression) decltor.getInitializer();
|
||||||
ICPPASTLiteralExpression exp= (ICPPASTLiteralExpression) init.getExpression();
|
ICPPASTLiteralExpression exp= (ICPPASTLiteralExpression) init.getExpression();
|
||||||
ICPPBasicType type= (ICPPBasicType) CPPVisitor.getExpressionType(exp);
|
ICPPBasicType type= (ICPPBasicType) exp.getExpressionType();
|
||||||
assertTrue(type.isLong());
|
assertTrue(type.isLong());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,6 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author aniefer
|
* @author aniefer
|
||||||
|
@ -1582,7 +1581,7 @@ public class AST2TemplateTests extends AST2BaseTest {
|
||||||
IASTName f = col.getName(6);
|
IASTName f = col.getName(6);
|
||||||
IASTFunctionDefinition fdef = (IASTFunctionDefinition) f.getParent().getParent();
|
IASTFunctionDefinition fdef = (IASTFunctionDefinition) f.getParent().getParent();
|
||||||
IASTExpressionStatement statement = (IASTExpressionStatement) ((IASTCompoundStatement)fdef.getBody()).getStatements()[0];
|
IASTExpressionStatement statement = (IASTExpressionStatement) ((IASTCompoundStatement)fdef.getBody()).getStatements()[0];
|
||||||
IType type = CPPVisitor.getExpressionType(statement.getExpression());
|
IType type = statement.getExpression().getExpressionType();
|
||||||
|
|
||||||
assertTrue(type.isSameType(p.getType()));
|
assertTrue(type.isSameType(p.getType()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@ public class CPPASTBinaryExpression extends ASTNode implements
|
||||||
private int op;
|
private int op;
|
||||||
private IASTExpression operand1;
|
private IASTExpression operand1;
|
||||||
private IASTExpression operand2;
|
private IASTExpression operand2;
|
||||||
|
private IType type;
|
||||||
|
|
||||||
public CPPASTBinaryExpression() {
|
public CPPASTBinaryExpression() {
|
||||||
}
|
}
|
||||||
|
@ -121,7 +122,9 @@ public class CPPASTBinaryExpression extends ASTNode implements
|
||||||
}
|
}
|
||||||
|
|
||||||
public IType getExpressionType() {
|
public IType getExpressionType() {
|
||||||
return CPPVisitor.getExpressionType(this);
|
if (type == null) {
|
||||||
|
type= CPPVisitor.getExpressionType(this);
|
||||||
|
}
|
||||||
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1908,7 +1908,7 @@ public class CPPSemantics {
|
||||||
IASTExpression[] exps = (IASTExpression[]) params;
|
IASTExpression[] exps = (IASTExpression[]) params;
|
||||||
IType[] result = new IType[exps.length];
|
IType[] result = new IType[exps.length];
|
||||||
for (int i = 0; i < exps.length; i++) {
|
for (int i = 0; i < exps.length; i++) {
|
||||||
result[i] = CPPVisitor.getExpressionType(exps[i]);
|
result[i] = exps[i].getExpressionType();
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
} else if (params instanceof IASTParameterDeclaration[]) {
|
} else if (params instanceof IASTParameterDeclaration[]) {
|
||||||
|
@ -2257,7 +2257,7 @@ public class CPPSemantics {
|
||||||
// target is the left side of an assignment
|
// target is the left side of an assignment
|
||||||
IASTBinaryExpression binaryExp = (IASTBinaryExpression) node.getParent();
|
IASTBinaryExpression binaryExp = (IASTBinaryExpression) node.getParent();
|
||||||
IASTExpression exp = binaryExp.getOperand1();
|
IASTExpression exp = binaryExp.getOperand1();
|
||||||
return CPPVisitor.getExpressionType(exp);
|
return exp.getExpressionType();
|
||||||
} else if (prop == IASTFunctionCallExpression.PARAMETERS ||
|
} else if (prop == IASTFunctionCallExpression.PARAMETERS ||
|
||||||
(prop == IASTExpressionList.NESTED_EXPRESSION &&
|
(prop == IASTExpressionList.NESTED_EXPRESSION &&
|
||||||
node.getParent().getPropertyInParent() == IASTFunctionCallExpression.PARAMETERS)) {
|
node.getParent().getPropertyInParent() == IASTFunctionCallExpression.PARAMETERS)) {
|
||||||
|
@ -2389,7 +2389,7 @@ public class CPPSemantics {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
IType type = CPPVisitor.getExpressionType(exp);
|
IType type = exp.getExpressionType();
|
||||||
type = getUltimateType(type, false);
|
type = getUltimateType(type, false);
|
||||||
if (type instanceof IFunctionType) {
|
if (type instanceof IFunctionType) {
|
||||||
result = new IFunctionType[] { (IFunctionType) type };
|
result = new IFunctionType[] { (IFunctionType) type };
|
||||||
|
|
|
@ -1601,7 +1601,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (node == null)
|
if (node == null)
|
||||||
return null;
|
return null;
|
||||||
if (node instanceof IASTExpression)
|
if (node instanceof IASTExpression)
|
||||||
return getExpressionType((IASTExpression) node);
|
return ((IASTExpression) node).getExpressionType();
|
||||||
if (node instanceof IASTTypeId)
|
if (node instanceof IASTTypeId)
|
||||||
return createType(((IASTTypeId) node).getAbstractDeclarator());
|
return createType(((IASTTypeId) node).getAbstractDeclarator());
|
||||||
if (node instanceof IASTParameterDeclaration)
|
if (node instanceof IASTParameterDeclaration)
|
||||||
|
@ -1864,7 +1864,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
final IASTBinaryExpression binary = (IASTBinaryExpression) expression;
|
final IASTBinaryExpression binary = (IASTBinaryExpression) expression;
|
||||||
|
|
||||||
// Check for overloaded operator.
|
// Check for overloaded operator.
|
||||||
IType type1 = getExpressionType(binary.getOperand1());
|
IType type1 = binary.getOperand1().getExpressionType();
|
||||||
IType ultimateType1 = SemanticUtil.getUltimateTypeUptoPointers(type1);
|
IType ultimateType1 = SemanticUtil.getUltimateTypeUptoPointers(type1);
|
||||||
if (ultimateType1 instanceof IProblemBinding) {
|
if (ultimateType1 instanceof IProblemBinding) {
|
||||||
return type1;
|
return type1;
|
||||||
|
@ -1879,7 +1879,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IType type2 = getExpressionType(binary.getOperand2());
|
IType type2 = binary.getOperand2().getExpressionType();
|
||||||
IType ultimateType2 = SemanticUtil.getUltimateTypeUptoPointers(type2);
|
IType ultimateType2 = SemanticUtil.getUltimateTypeUptoPointers(type2);
|
||||||
if (ultimateType2 instanceof IProblemBinding) {
|
if (ultimateType2 instanceof IProblemBinding) {
|
||||||
return type2;
|
return type2;
|
||||||
|
@ -1959,7 +1959,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
return get_type_info(expression);
|
return get_type_info(expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
IType type = getExpressionType(((IASTUnaryExpression) expression).getOperand());
|
IType type= ((IASTUnaryExpression) expression).getOperand().getExpressionType();
|
||||||
type = SemanticUtil.getUltimateTypeViaTypedefs(type);
|
type = SemanticUtil.getUltimateTypeViaTypedefs(type);
|
||||||
|
|
||||||
if (op == IASTUnaryExpression.op_star) {
|
if (op == IASTUnaryExpression.op_star) {
|
||||||
|
@ -2029,7 +2029,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
}
|
}
|
||||||
} else if (expression instanceof IASTExpressionList) {
|
} else if (expression instanceof IASTExpressionList) {
|
||||||
IASTExpression[] exps = ((IASTExpressionList) expression).getExpressions();
|
IASTExpression[] exps = ((IASTExpressionList) expression).getExpressions();
|
||||||
return getExpressionType(exps[exps.length - 1]);
|
return exps[exps.length - 1].getExpressionType();
|
||||||
} else if (expression instanceof ICPPASTTypeIdExpression) {
|
} else if (expression instanceof ICPPASTTypeIdExpression) {
|
||||||
ICPPASTTypeIdExpression typeidExp = (ICPPASTTypeIdExpression) expression;
|
ICPPASTTypeIdExpression typeidExp = (ICPPASTTypeIdExpression) expression;
|
||||||
switch (typeidExp.getOperator()) {
|
switch (typeidExp.getOperator()) {
|
||||||
|
@ -2040,7 +2040,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
}
|
}
|
||||||
return createType(typeidExp.getTypeId());
|
return createType(typeidExp.getTypeId());
|
||||||
} else if (expression instanceof IASTArraySubscriptExpression) {
|
} else if (expression instanceof IASTArraySubscriptExpression) {
|
||||||
IType t = getExpressionType(((IASTArraySubscriptExpression) expression).getArrayExpression());
|
IType t = ((IASTArraySubscriptExpression) expression).getArrayExpression().getExpressionType();
|
||||||
try {
|
try {
|
||||||
if (t instanceof ICPPReferenceType) {
|
if (t instanceof ICPPReferenceType) {
|
||||||
t = ((ICPPReferenceType) t).getType();
|
t = ((ICPPReferenceType) t).getType();
|
||||||
|
@ -2069,7 +2069,7 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (statements.length > 0) {
|
if (statements.length > 0) {
|
||||||
IASTStatement st = statements[statements.length - 1];
|
IASTStatement st = statements[statements.length - 1];
|
||||||
if (st instanceof IASTExpressionStatement)
|
if (st instanceof IASTExpressionStatement)
|
||||||
return getExpressionType(((IASTExpressionStatement) st).getExpression());
|
return ((IASTExpressionStatement) st).getExpression().getExpressionType();
|
||||||
}
|
}
|
||||||
} else if (expression instanceof IASTConditionalExpression) {
|
} else if (expression instanceof IASTConditionalExpression) {
|
||||||
final IASTConditionalExpression conditional = (IASTConditionalExpression) expression;
|
final IASTConditionalExpression conditional = (IASTConditionalExpression) expression;
|
||||||
|
@ -2077,8 +2077,8 @@ public class CPPVisitor extends ASTQueries {
|
||||||
if (positiveExpression == null) {
|
if (positiveExpression == null) {
|
||||||
positiveExpression= conditional.getLogicalConditionExpression();
|
positiveExpression= conditional.getLogicalConditionExpression();
|
||||||
}
|
}
|
||||||
IType t2 = getExpressionType(positiveExpression);
|
IType t2 = positiveExpression.getExpressionType();
|
||||||
IType t3 = getExpressionType(conditional.getNegativeResultExpression());
|
IType t3 = conditional.getNegativeResultExpression().getExpressionType();
|
||||||
if (t3 instanceof IPointerType || t2 == null)
|
if (t3 instanceof IPointerType || t2 == null)
|
||||||
return t3;
|
return t3;
|
||||||
return t2;
|
return t2;
|
||||||
|
|
|
@ -64,6 +64,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBas
|
||||||
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
|
import org.eclipse.cdt.core.parser.util.CharArrayObjectMap;
|
||||||
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
import org.eclipse.cdt.core.parser.util.CharArrayUtils;
|
||||||
import org.eclipse.cdt.core.parser.util.ObjectSet;
|
import org.eclipse.cdt.core.parser.util.ObjectSet;
|
||||||
|
import org.eclipse.cdt.internal.core.dom.parser.ASTQueries;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
import org.eclipse.cdt.internal.core.dom.parser.ProblemBinding;
|
||||||
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit;
|
import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTTranslationUnit;
|
||||||
|
|
||||||
|
@ -180,7 +181,7 @@ public class LookupData {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p1 instanceof IASTDeclarator) {
|
if (p1 instanceof IASTDeclarator) {
|
||||||
IASTNode p2= CPPVisitor.findOutermostDeclarator((IASTDeclarator) p1).getParent();
|
IASTNode p2= ASTQueries.findOutermostDeclarator((IASTDeclarator) p1).getParent();
|
||||||
if (p2 instanceof IASTSimpleDeclaration) {
|
if (p2 instanceof IASTSimpleDeclaration) {
|
||||||
if (p2.getParent() instanceof ICPPASTExplicitTemplateInstantiation)
|
if (p2.getParent() instanceof ICPPASTExplicitTemplateInstantiation)
|
||||||
return false;
|
return false;
|
||||||
|
@ -210,7 +211,7 @@ public class LookupData {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p1 instanceof IASTDeclarator) {
|
if (p1 instanceof IASTDeclarator) {
|
||||||
IASTNode p2= CPPVisitor.findOutermostDeclarator((IASTDeclarator) p1).getParent();
|
IASTNode p2= ASTQueries.findOutermostDeclarator((IASTDeclarator) p1).getParent();
|
||||||
if (p2 instanceof IASTSimpleDeclaration || p2 instanceof IASTFunctionDefinition) {
|
if (p2 instanceof IASTSimpleDeclaration || p2 instanceof IASTFunctionDefinition) {
|
||||||
ICPPASTTemplateDeclaration tmplDecl = CPPTemplates.getTemplateDeclaration(n);
|
ICPPASTTemplateDeclaration tmplDecl = CPPTemplates.getTemplateDeclaration(n);
|
||||||
return tmplDecl instanceof ICPPASTTemplateSpecialization;
|
return tmplDecl instanceof ICPPASTTemplateSpecialization;
|
||||||
|
@ -234,7 +235,7 @@ public class LookupData {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p1 instanceof IASTDeclarator) {
|
if (p1 instanceof IASTDeclarator) {
|
||||||
IASTNode p2= CPPVisitor.findOutermostDeclarator((IASTDeclarator) p1).getParent();
|
IASTNode p2= ASTQueries.findOutermostDeclarator((IASTDeclarator) p1).getParent();
|
||||||
if (p2 instanceof IASTDeclaration) {
|
if (p2 instanceof IASTDeclaration) {
|
||||||
return p2.getParent() instanceof ICPPASTExplicitTemplateInstantiation;
|
return p2.getParent() instanceof ICPPASTExplicitTemplateInstantiation;
|
||||||
}
|
}
|
||||||
|
@ -368,11 +369,11 @@ public class LookupData {
|
||||||
if (tempNameParent instanceof ICPPASTUnaryExpression) {
|
if (tempNameParent instanceof ICPPASTUnaryExpression) {
|
||||||
ICPPASTUnaryExpression unaryExp = (ICPPASTUnaryExpression) tempNameParent;
|
ICPPASTUnaryExpression unaryExp = (ICPPASTUnaryExpression) tempNameParent;
|
||||||
IASTExpression oprd= unaryExp.getOperand();
|
IASTExpression oprd= unaryExp.getOperand();
|
||||||
return CPPVisitor.getExpressionType(oprd);
|
return oprd.getExpressionType();
|
||||||
}
|
}
|
||||||
if (tempNameParent instanceof ICPPASTFieldReference) {
|
if (tempNameParent instanceof ICPPASTFieldReference) {
|
||||||
ICPPASTFieldReference fieldRef = (ICPPASTFieldReference) tempNameParent;
|
ICPPASTFieldReference fieldRef = (ICPPASTFieldReference) tempNameParent;
|
||||||
IType implied = CPPVisitor.getExpressionType(fieldRef.getFieldOwner());
|
IType implied = fieldRef.getFieldOwner().getExpressionType();
|
||||||
if (fieldRef.isPointerDereference() && implied instanceof IPointerType) {
|
if (fieldRef.isPointerDereference() && implied instanceof IPointerType) {
|
||||||
return ((IPointerType)implied).getType();
|
return ((IPointerType)implied).getType();
|
||||||
}
|
}
|
||||||
|
@ -380,13 +381,13 @@ public class LookupData {
|
||||||
}
|
}
|
||||||
if (tempNameParent instanceof IASTArraySubscriptExpression) {
|
if (tempNameParent instanceof IASTArraySubscriptExpression) {
|
||||||
IASTExpression exp = ((IASTArraySubscriptExpression)tempNameParent).getArrayExpression();
|
IASTExpression exp = ((IASTArraySubscriptExpression)tempNameParent).getArrayExpression();
|
||||||
return CPPVisitor.getExpressionType(exp);
|
return exp.getExpressionType();
|
||||||
}
|
}
|
||||||
if (tempNameParent instanceof IASTFunctionCallExpression) {
|
if (tempNameParent instanceof IASTFunctionCallExpression) {
|
||||||
return CPPVisitor.getExpressionType(((IASTFunctionCallExpression) tempNameParent).getFunctionNameExpression());
|
return ((IASTFunctionCallExpression) tempNameParent).getFunctionNameExpression().getExpressionType();
|
||||||
}
|
}
|
||||||
if (tempNameParent instanceof IASTBinaryExpression) {
|
if (tempNameParent instanceof IASTBinaryExpression) {
|
||||||
return CPPVisitor.getExpressionType(((IASTBinaryExpression) tempNameParent).getOperand1());
|
return ((IASTBinaryExpression) tempNameParent).getOperand1().getExpressionType();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue