diff options
author | Markus Schorn | 2012-05-31 14:07:46 +0000 |
---|---|---|
committer | Markus Schorn | 2012-06-26 05:04:50 +0000 |
commit | ea53c271c9de4bcec078ddecce89bb8b1b806a8d (patch) | |
tree | 7e36b32cd5ca862b6b5595822bf996b010ab84db /core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java | |
parent | 62f0cb04b8520352d92b1f5f3172044e9394c475 (diff) | |
download | org.eclipse.cdt-ea53c271c9de4bcec078ddecce89bb8b1b806a8d.tar.gz org.eclipse.cdt-ea53c271c9de4bcec078ddecce89bb8b1b806a8d.tar.xz org.eclipse.cdt-ea53c271c9de4bcec078ddecce89bb8b1b806a8d.zip |
Bug 299911: Introduce ICPPEvaluation
Diffstat (limited to 'core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java')
-rw-r--r-- | core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java | 56 |
1 files changed, 32 insertions, 24 deletions
diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java index bb5cce839c4..f1cf7b966f8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java @@ -12,34 +12,30 @@ 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.typeFromReturnType; -import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.valueCategoryFromReturnType; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTypeId; +import org.eclipse.cdt.core.dom.ast.IProblemType; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExpression; 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.cpp.semantics.CPPVisitor; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalFixed; +import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.EvalTypeId; /** * Cast expression for C++ */ public class CPPASTCastExpression extends ASTNode implements ICPPASTCastExpression, IASTAmbiguityParent { private int op; - private IASTExpression operand; + private ICPPASTExpression operand; private IASTTypeId typeId; - private IType fType; - private ValueCategory fValueCategory; - @Override - public ICPPInitClauseEvaluation getEvaluation() { - // mstodo Auto-generated method stub - return null; - } - + private ICPPEvaluation fEvaluation; + public CPPASTCastExpression() { } @@ -102,7 +98,7 @@ public class CPPASTCastExpression extends ASTNode implements ICPPASTCastExpressi @Override public void setOperand(IASTExpression expression) { assertNotFrozen(); - operand = expression; + operand = (ICPPASTExpression) expression; if (expression != null) { expression.setParent(this); expression.setPropertyInParent(OPERAND); @@ -138,26 +134,38 @@ public class CPPASTCastExpression extends ASTNode implements ICPPASTCastExpressi if (child == operand) { other.setPropertyInParent(child.getPropertyInParent()); other.setParent(child.getParent()); - operand = (IASTExpression) other; + operand = (ICPPASTExpression) other; } } + @Override - public IType getExpressionType() { - if (fType == null) { - IType t= CPPVisitor.createType(typeId.getAbstractDeclarator()); - fValueCategory= valueCategoryFromReturnType(t); - fType= typeFromReturnType(t); - } - return fType; + public ICPPEvaluation getEvaluation() { + if (fEvaluation == null) + fEvaluation= computeEvaluation(); + + return fEvaluation; + } + + private ICPPEvaluation computeEvaluation() { + if (operand == null) + return EvalFixed.INCOMPLETE; + + IType type= CPPVisitor.createType(getTypeId()); + if (type == null || type instanceof IProblemType) + return EvalFixed.INCOMPLETE; + + return new EvalTypeId(type, operand.getEvaluation()); } + @Override + public IType getExpressionType() { + return getEvaluation().getTypeOrFunctionSet(this); + } + @Override public ValueCategory getValueCategory() { - if (fValueCategory == null) { - getExpressionType(); // as a side effect fValueCategory is computed - } - return fValueCategory; + return getEvaluation().getValueCategory(this); } @Override |