Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTExpressionList.java')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTExpressionList.java117
1 files changed, 33 insertions, 84 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTExpressionList.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTExpressionList.java
index 338dde0d46e..17a3cde3860 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTExpressionList.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTExpressionList.java
@@ -13,30 +13,22 @@
package org.eclipse.cdt.internal.core.dom.parser.cpp;
import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.LVALUE;
-import static org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory.PRVALUE;
-import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.*;
-import org.eclipse.cdt.core.dom.ast.ASTNodeProperty;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
-import org.eclipse.cdt.core.dom.ast.IASTFunctionCallExpression;
import org.eclipse.cdt.core.dom.ast.IASTImplicitName;
import org.eclipse.cdt.core.dom.ast.IASTNode;
-import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorChainInitializer;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTConstructorInitializer;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpressionList;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNewExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
import org.eclipse.cdt.core.parser.util.ArrayUtil;
import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent;
-import org.eclipse.cdt.internal.core.dom.parser.ProblemType;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalComma;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed;
public class CPPASTExpressionList extends ASTNode implements ICPPASTExpressionList, IASTAmbiguityParent {
- private static final ICPPFunction[] NO_FUNCTIONS = {};
private IASTExpression[] expressions = new IASTExpression[2];
@@ -45,13 +37,8 @@ public class CPPASTExpressionList extends ASTNode implements ICPPASTExpressionLi
* @see CPPASTExpressionList#computeImplicitNames
*/
private IASTImplicitName[] implicitNames;
- private ICPPFunction[] overloads;
-
- @Override
- public ICPPInitClauseEvaluation getEvaluation() {
- // mstodo Auto-generated method stub
- return null;
- }
+
+ private ICPPEvaluation fEvaluation;
@Override
public CPPASTExpressionList copy() {
@@ -155,42 +142,11 @@ public class CPPASTExpressionList extends ASTNode implements ICPPASTExpressionLi
}
private ICPPFunction[] getOverloads() {
- if (overloads == null) {
- IASTExpression[] exprs = getExpressions();
- if (exprs.length < 2)
- return overloads = NO_FUNCTIONS;
-
- ASTNodeProperty prop = getPropertyInParent();
- if (prop == IASTFunctionCallExpression.ARGUMENT ||
- prop == ICPPASTConstructorChainInitializer.INITIALIZER ||
- prop == ICPPASTConstructorInitializer.ARGUMENT ||
- prop == ICPPASTNewExpression.NEW_INITIALIZER)
- return overloads = NO_FUNCTIONS;
-
- overloads = new ICPPFunction[exprs.length - 1];
- IType lookupType = typeOrFunctionSet(exprs[0]);
- ValueCategory vcat= valueCat(exprs[0]);
-
- for (int i = 1; i < exprs.length; i++) {
- IASTExpression e1 = exprs[i - 1], e2 = exprs[i];
- ICPPFunction overload = CPPSemantics.findOverloadedOperatorComma(e1, lookupType, vcat, e2);
- if (overload == null) {
- lookupType = typeOrFunctionSet(e2);
- vcat= valueCat(e2);
- } else {
- overloads[i - 1] = overload;
- lookupType = overload.getType().getReturnType();
- vcat= valueCategoryFromReturnType(lookupType);
- lookupType= typeFromReturnType(lookupType);
- if (lookupType instanceof ISemanticProblem) {
- lookupType = typeOrFunctionSet(e2);
- vcat= valueCat(e2);
- }
- }
- }
+ ICPPEvaluation eval = getEvaluation();
+ if (eval instanceof EvalComma) {
+ return ((EvalComma) eval).getOverloads(this);
}
-
- return overloads;
+ return null;
}
@Override
@@ -206,42 +162,35 @@ public class CPPASTExpressionList extends ASTNode implements ICPPASTExpressionLi
}
@Override
- public IType getExpressionType() {
- ICPPFunction[] overloads = getOverloads();
- if (overloads.length > 0) {
- ICPPFunction last = overloads[overloads.length - 1];
- if (last != null) {
- return typeFromFunctionCall(last);
- }
- }
-
- for (int i = expressions.length - 1; i >= 0; i--) {
- IASTExpression expr = expressions[i];
- if (expr != null)
- return expr.getExpressionType();
- }
+ public ICPPEvaluation getEvaluation() {
+ if (fEvaluation == null)
+ fEvaluation= computeEvaluation();
- return new ProblemType(ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION);
+ return fEvaluation;
}
-
- @Override
- public ValueCategory getValueCategory() {
- ICPPFunction[] overloads = getOverloads();
- if (overloads.length > 0) {
- ICPPFunction last = overloads[overloads.length - 1];
- if (last != null) {
- return valueCategoryFromFunctionCall(last);
- }
+
+ private ICPPEvaluation computeEvaluation() {
+ final IASTExpression[] exprs = getExpressions();
+ if (exprs.length < 2)
+ return EvalFixed.INCOMPLETE;
+
+ ICPPEvaluation[] evals= new ICPPEvaluation[exprs.length];
+ for (int i = 0; i < evals.length; i++) {
+ evals[i]= ((ICPPASTExpression) exprs[i]).getEvaluation();
}
+ return new EvalComma(evals);
+ }
- for (int i = expressions.length-1; i >= 0; i--) {
- IASTExpression expr= expressions[i];
- if (expr != null)
- return expr.getValueCategory();
- }
- return PRVALUE;
+ @Override
+ public IType getExpressionType() {
+ return getEvaluation().getTypeOrFunctionSet(this);
+ }
+
+ @Override
+ public ValueCategory getValueCategory() {
+ return getEvaluation().getValueCategory(this);
}
-
+
@Override
public boolean isLValue() {
return getValueCategory() == LVALUE;

Back to the top