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/CPPASTArraySubscriptExpression.java')
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArraySubscriptExpression.java122
1 files changed, 46 insertions, 76 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArraySubscriptExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArraySubscriptExpression.java
index 913ca3902f3..111aee3c912 100644
--- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArraySubscriptExpression.java
+++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArraySubscriptExpression.java
@@ -13,42 +13,28 @@
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.internal.core.dom.parser.cpp.semantics.ExpressionTypes.glvalueType;
-import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE;
-import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.REF;
-import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF;
import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTExpression;
import org.eclipse.cdt.core.dom.ast.IASTImplicitName;
import org.eclipse.cdt.core.dom.ast.IASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.IASTNode;
-import org.eclipse.cdt.core.dom.ast.IPointerType;
-import org.eclipse.cdt.core.dom.ast.ISemanticProblem;
import org.eclipse.cdt.core.dom.ast.IType;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArraySubscriptExpression;
-import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTInitializerClause;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction;
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.Conversions;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes;
-import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalBinary;
+import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed;
public class CPPASTArraySubscriptExpression extends ASTNode
implements ICPPASTArraySubscriptExpression, IASTAmbiguityParent {
- private IASTExpression arrayExpression;
- private IASTInitializerClause subscriptExp;
- private ICPPFunction overload= UNINITIALIZED_FUNCTION;
-
+ private ICPPASTExpression arrayExpression;
+ private ICPPASTInitializerClause subscriptExp;
+ private ICPPEvaluation evaluation;
private IASTImplicitName[] implicitNames;
- @Override
- public ICPPInitClauseEvaluation getEvaluation() {
- // mstodo Auto-generated method stub
- return null;
- }
public CPPASTArraySubscriptExpression() {
}
@@ -76,33 +62,37 @@ public class CPPASTArraySubscriptExpression extends ASTNode
}
@Override
- public IASTExpression getArrayExpression() {
+ public ICPPASTExpression getArrayExpression() {
return arrayExpression;
}
@Override
public void setArrayExpression(IASTExpression expression) {
assertNotFrozen();
- arrayExpression = expression;
if (expression != null) {
+ if (!(expression instanceof ICPPASTExpression))
+ throw new IllegalArgumentException(expression.getClass().getName());
expression.setParent(this);
expression.setPropertyInParent(ARRAY);
}
+ arrayExpression = (ICPPASTExpression) expression;
}
@Override
- public IASTInitializerClause getArgument() {
+ public ICPPASTInitializerClause getArgument() {
return subscriptExp;
}
@Override
public void setArgument(IASTInitializerClause arg) {
assertNotFrozen();
- subscriptExp = arg;
if (arg != null) {
+ if (!(arg instanceof ICPPASTInitializerClause))
+ throw new IllegalArgumentException(arg.getClass().getName());
arg.setParent(this);
arg.setPropertyInParent(SUBSCRIPT);
}
+ subscriptExp = (ICPPASTInitializerClause) arg;
}
@Override
@@ -118,7 +108,7 @@ public class CPPASTArraySubscriptExpression extends ASTNode
public void setSubscriptExpression(IASTExpression expression) {
setArgument(expression);
}
-
+
@Override
public IASTImplicitName[] getImplicitNames() {
if (implicitNames == null) {
@@ -141,20 +131,15 @@ public class CPPASTArraySubscriptExpression extends ASTNode
return implicitNames;
}
-
- public ICPPFunction getOverload() {
- if (overload == UNINITIALIZED_FUNCTION) {
- overload= null;
- IType t = getArrayExpression().getExpressionType();
- t= SemanticUtil.getNestedType(t, TDEF | REF | CVTYPE);
- if (t instanceof ICPPClassType) {
- overload= CPPSemantics.findOverloadedOperator(this);
- }
- }
- return overload;
- }
- @Override
+ private ICPPFunction getOverload() {
+ ICPPEvaluation eval = getEvaluation();
+ if (eval instanceof EvalBinary)
+ return ((EvalBinary) eval).getOverload(this);
+ return null;
+ }
+
+ @Override
public boolean accept(ASTVisitor action) {
if (action.shouldVisitExpressions) {
switch (action.visit(this)) {
@@ -192,56 +177,41 @@ public class CPPASTArraySubscriptExpression extends ASTNode
if (child == subscriptExp) {
other.setPropertyInParent(child.getPropertyInParent());
other.setParent(child.getParent());
- subscriptExp = (IASTExpression) other;
+ subscriptExp = (ICPPASTExpression) other;
}
if (child == arrayExpression) {
other.setPropertyInParent(child.getPropertyInParent());
other.setParent(child.getParent());
- arrayExpression = (IASTExpression) other;
+ arrayExpression = (ICPPASTExpression) other;
}
}
-
+
+ @Override
+ public ICPPEvaluation getEvaluation() {
+ if (evaluation == null)
+ evaluation= computeEvaluation();
+
+ return evaluation;
+ }
+
+ private ICPPEvaluation computeEvaluation() {
+ if (arrayExpression == null || subscriptExp == null)
+ return EvalFixed.INCOMPLETE;
+ return new EvalBinary(EvalBinary.op_arrayAccess, arrayExpression.getEvaluation(), subscriptExp.getEvaluation());
+ }
+
@Override
public IType getExpressionType() {
- ICPPFunction op = getOverload();
- if (op != null) {
- return ExpressionTypes.typeFromFunctionCall(op);
- }
- IType t1 = getArrayExpression().getExpressionType();
- t1= Conversions.lvalue_to_rvalue(t1, true);
- if (t1 instanceof IPointerType) {
- t1= ((IPointerType) t1).getType();
- return glvalueType(t1);
- }
-
- IType t2= null;
- IASTInitializerClause arg = getArgument();
- if (arg instanceof IASTExpression) {
- t2= Conversions.lvalue_to_rvalue(t2, true);
- if (t2 instanceof IPointerType) {
- t2= ((IPointerType) t2).getType();
- return glvalueType(t2);
- }
- }
- if (t1 instanceof ICPPUnknownType || t2 instanceof ICPPUnknownType) {
- // mstodo type of unknown
- return CPPUnknownClass.createUnnamedInstance();
- }
-
- return new ProblemType(ISemanticProblem.TYPE_UNKNOWN_FOR_EXPRESSION);
+ return getEvaluation().getTypeOrFunctionSet(this);
}
@Override
- public boolean isLValue() {
- return getValueCategory() == LVALUE;
+ public ValueCategory getValueCategory() {
+ return getEvaluation().getValueCategory(this);
}
@Override
- public ValueCategory getValueCategory() {
- ICPPFunction op = getOverload();
- if (op != null) {
- return ExpressionTypes.valueCategoryFromFunctionCall(op);
- }
- return ValueCategory.LVALUE;
+ public boolean isLValue() {
+ return getValueCategory() == LVALUE;
}
}

Back to the top