diff options
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.java | 122 |
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; } } |