/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
* Zend Technologies
*******************************************************************************/
package org.eclipse.php.internal.core.typeinference.evaluators;
import org.eclipse.dltk.ast.ASTNode;
import org.eclipse.dltk.ast.declarations.TypeDeclaration;
import org.eclipse.dltk.ast.references.TypeReference;
import org.eclipse.dltk.ast.references.VariableReference;
import org.eclipse.dltk.ti.IGoalEvaluatorFactory;
import org.eclipse.dltk.ti.goals.ExpressionTypeGoal;
import org.eclipse.dltk.ti.goals.FixedAnswerEvaluator;
import org.eclipse.dltk.ti.goals.GoalEvaluator;
import org.eclipse.dltk.ti.goals.IGoal;
import org.eclipse.php.core.compiler.ast.nodes.*;
import org.eclipse.php.internal.core.typeinference.PHPSimpleTypes;
import org.eclipse.php.internal.core.typeinference.evaluators.phpdoc.PHPDocClassVariableEvaluator;
import org.eclipse.php.internal.core.typeinference.evaluators.phpdoc.PHPDocMethodReturnTypeEvaluator;
import org.eclipse.php.internal.core.typeinference.goals.*;
import org.eclipse.php.internal.core.typeinference.goals.phpdoc.PHPDocClassVariableGoal;
import org.eclipse.php.internal.core.typeinference.goals.phpdoc.PHPDocMethodReturnTypeGoal;
public class DefaultPHPGoalEvaluatorFactory implements IGoalEvaluatorFactory {
public GoalEvaluator createEvaluator(IGoal goal) {
Class<?> goalClass = goal.getClass();
if (goalClass == ExpressionTypeGoal.class) {
ExpressionTypeGoal exprGoal = (ExpressionTypeGoal) goal;
return createExpressionEvaluator(exprGoal);
}
if (goalClass == MethodElementReturnTypeGoal.class) {
return new MethodReturnTypeEvaluator(goal);
}
if (goalClass == PHPDocMethodReturnTypeGoal.class) {
return new PHPDocMethodReturnTypeEvaluator(goal);
}
if (goalClass == GlobalVariableReferencesGoal.class) {
return new GlobalVariableReferencesEvaluator(goal);
}
if (goalClass == ClassVariableDeclarationGoal.class) {
return new ClassVariableDeclarationEvaluator(goal);
}
if (goalClass == PHPDocClassVariableGoal.class) {
return new PHPDocClassVariableEvaluator(goal);
}
if (goalClass == ConstantDeclarationGoal.class) {
return new ConstantDeclarationEvaluator(goal);
}
if (goalClass == ForeachStatementGoal.class) {
return new ForeachStatementEvaluator(goal);
}
if (goalClass == ArrayDeclarationGoal.class) {
return new ArrayDeclarationGoalEvaluator(goal);
}
if (goalClass == IteratorTypeGoal.class) {
return new IteratorTypeGoalEvaluator(goal);
}
return null;
}
private GoalEvaluator createExpressionEvaluator(ExpressionTypeGoal exprGoal) {
ASTNode expression = exprGoal.getExpression();
Class<?> expressionClass = expression.getClass();
if (expressionClass == InterfaceDeclaration.class || expressionClass == ClassDeclaration.class
|| expressionClass == TraitDeclaration.class) {
return new PHPClassEvaluator(exprGoal, (TypeDeclaration) expression);
}
if (expressionClass == Assignment.class) {
return new AssignmentEvaluator(exprGoal);
}
if (expressionClass == Scalar.class) {
Scalar scalar = (Scalar) expression;
return new ScalarEvaluator(exprGoal, scalar);
}
if (expressionClass == TypeReference.class || expressionClass == FullyQualifiedReference.class) {
TypeReference type = (TypeReference) expression;
return new TypeReferenceEvaluator(exprGoal, type);
}
if (expressionClass == TraitAliasStatement.class) {
TraitAliasStatement tas = (TraitAliasStatement) expression;
if (tas.getAlias().getTraitMethod() instanceof FullyQualifiedTraitMethodReference) {
FullyQualifiedTraitMethodReference reference = (FullyQualifiedTraitMethodReference) tas.getAlias()
.getTraitMethod();
return new TypeReferenceEvaluator(exprGoal, reference.getClassName());
}
}
if (expressionClass == PHPCallExpression.class || expressionClass == StaticMethodInvocation.class) {
return new MethodCallTypeEvaluator(exprGoal);
}
if (expressionClass == ClassInstanceCreation.class) {
return new InstanceCreationEvaluator(exprGoal);
}
if (expressionClass == InfixExpression.class) {
return new InfixExpressionEvaluator(exprGoal);
}
if (expressionClass == PrefixExpression.class) {
return new PrefixExpressionEvaluator(exprGoal);
}
if (expressionClass == PostfixExpression.class) {
return new PostfixExpressionEvaluator(exprGoal);
}
if (expressionClass == UnaryOperation.class) {
return new UnaryOperationEvaluator(exprGoal);
}
if (expressionClass == CastExpression.class) {
return new CastEvaluator(exprGoal);
}
if (expressionClass == VariableReference.class) {
return new VariableReferenceEvaluator(exprGoal);
}
if (expressionClass == BackTickExpression.class || expressionClass == Quote.class) {
return new FixedAnswerEvaluator(exprGoal, PHPSimpleTypes.STRING);
}
if (expressionClass == CloneExpression.class) {
return new CloneEvaluator(exprGoal);
}
if (expressionClass == InstanceOfExpression.class) {
return new FixedAnswerEvaluator(exprGoal, PHPSimpleTypes.BOOLEAN);
}
if (expressionClass == ConditionalExpression.class) {
return new ConditionalExpressionEvaluator(exprGoal);
}
if (expressionClass == ArrayCreation.class) {
return new ArrayCreationEvaluator(exprGoal);
}
if (expressionClass == ArrayVariableReference.class
|| expressionClass == ReflectionArrayVariableReference.class) {
return new ArrayVariableReferenceEvaluator(exprGoal);
}
if (expressionClass == FieldAccess.class || expressionClass == StaticFieldAccess.class) {
return new FieldAccessEvaluator(exprGoal);
}
if (expressionClass == StaticConstantAccess.class) {
return new StaticConstantAccessEvaluator(exprGoal);
}
if (expressionClass == FormalParameter.class || expressionClass == FormalParameterByReference.class) {
return new FormalParameterEvaluator(exprGoal);
}
if (expressionClass == CatchClause.class) {
return new CatchClauseEvaluator(exprGoal);
}
return null;
}
}