Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Schorn2012-05-31 14:07:46 +0000
committerMarkus Schorn2012-06-26 05:04:50 +0000
commitea53c271c9de4bcec078ddecce89bb8b1b806a8d (patch)
tree7e36b32cd5ca862b6b5595822bf996b010ab84db /core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCastExpression.java
parent62f0cb04b8520352d92b1f5f3172044e9394c475 (diff)
downloadorg.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.java56
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

Back to the top