package org.overture.interpreter.utilities.definition;
import org.overture.ast.analysis.AnalysisException;
import org.overture.ast.analysis.QuestionAnswerAdaptor;
import org.overture.ast.definitions.AAssignmentDefinition;
import org.overture.ast.definitions.AClassInvariantDefinition;
import org.overture.ast.definitions.AEqualsDefinition;
import org.overture.ast.definitions.AExplicitFunctionDefinition;
import org.overture.ast.definitions.AExplicitOperationDefinition;
import org.overture.ast.definitions.AImplicitFunctionDefinition;
import org.overture.ast.definitions.AImplicitOperationDefinition;
import org.overture.ast.definitions.AInstanceVariableDefinition;
import org.overture.ast.definitions.APerSyncDefinition;
import org.overture.ast.definitions.AStateDefinition;
import org.overture.ast.definitions.AThreadDefinition;
import org.overture.ast.definitions.ATypeDefinition;
import org.overture.ast.definitions.AValueDefinition;
import org.overture.ast.definitions.PDefinition;
import org.overture.ast.definitions.SClassDefinition;
import org.overture.ast.expressions.AEqualsBinaryExp;
import org.overture.ast.expressions.PExp;
import org.overture.ast.node.INode;
import org.overture.ast.statements.AErrorCase;
import org.overture.interpreter.assistant.IInterpreterAssistantFactory;
/***************************************
* This method finds a expession within a definition.
*
* @author gkanos
****************************************/
public class ExpressionFinder extends QuestionAnswerAdaptor<Integer, PExp>
{
protected IInterpreterAssistantFactory af;
public ExpressionFinder(IInterpreterAssistantFactory af)
{
this.af = af;
}
@Override
public PExp caseAAssignmentDefinition(AAssignmentDefinition def,
Integer lineno) throws AnalysisException
{
return af.createPExpAssistant().findExpression(def.getExpression(), lineno);
}
@Override
public PExp caseAClassInvariantDefinition(AClassInvariantDefinition def,
Integer lineno) throws AnalysisException
{
return af.createPExpAssistant().findExpression(def.getExpression(), lineno);
}
@Override
public PExp defaultSClassDefinition(SClassDefinition def, Integer lineno)
throws AnalysisException
{
return af.createSClassDefinitionAssistant().findExpression(def, lineno);
}
@Override
public PExp caseAEqualsDefinition(AEqualsDefinition def, Integer lineno)
throws AnalysisException
{
return af.createPExpAssistant().findExpression(def.getTest(), lineno);
}
@Override
public PExp caseAExplicitFunctionDefinition(
AExplicitFunctionDefinition def, Integer lineno)
throws AnalysisException
{
if (def.getPredef() != null)
{
PExp found = def.getPredef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
if (def.getPostdef() != null)
{
PExp found = def.getPostdef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
return af.createPExpAssistant().findExpression(def.getBody(), lineno);
}
@Override
public PExp caseAExplicitOperationDefinition(
AExplicitOperationDefinition def, Integer lineno)
throws AnalysisException
{
if (def.getPredef() != null)
{
PExp found = def.getPredef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
if (def.getPostdef() != null)
{
PExp found = def.getPostdef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
return af.createPStmAssistant().findExpression(def.getBody(), lineno);
}
@Override
public PExp caseAImplicitFunctionDefinition(
AImplicitFunctionDefinition def, Integer lineno)
throws AnalysisException
{
if (def.getPredef() != null)
{
PExp found = def.getPredef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
if (def.getPostdef() != null)
{
PExp found = def.getPostdef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
return def.getBody() == null ? null
: af.createPExpAssistant().findExpression(def.getBody(), lineno);
}
@Override
public PExp caseAImplicitOperationDefinition(
AImplicitOperationDefinition def, Integer lineno)
throws AnalysisException
{
if (def.getPredef() != null)
{
PExp found = def.getPredef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
if (def.getPostdef() != null)
{
PExp found = def.getPostdef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
if (def.getErrors() != null)
{
for (AErrorCase err : def.getErrors())
{
PExp found = err.apply(THIS, lineno);// AErrorCaseAssistantInterpreter.findExpression(err, lineno);
if (found != null)
{
return found;
}
}
}
return def.getBody() == null ? null
: af.createPStmAssistant().findExpression(def.getBody(), lineno);
}
@Override
public PExp caseAInstanceVariableDefinition(
AInstanceVariableDefinition def, Integer lineno)
throws AnalysisException
{
return af.createPExpAssistant().findExpression(def.getExpression(), lineno);
}
@Override
public PExp caseAPerSyncDefinition(APerSyncDefinition def, Integer lineno)
throws AnalysisException
{
return af.createPExpAssistant().findExpression(def.getGuard(), lineno);
}
@Override
public PExp caseAStateDefinition(AStateDefinition def, Integer lineno)
throws AnalysisException
{
if (def.getInvExpression() != null)
{
PExp found = af.createPExpAssistant().findExpression(def.getInvExpression(), lineno);
if (found != null)
{
return found;
}
}
if (def.getInitExpression() != null)
{
if (def.getInitExpression() instanceof AEqualsBinaryExp)
{
AEqualsBinaryExp ee = (AEqualsBinaryExp) def.getInitExpression();
PExp found = af.createPExpAssistant().findExpression(ee.getRight(), lineno);
if (found != null)
{
return found;
}
}
}
return null;
}
@Override
public PExp caseAThreadDefinition(AThreadDefinition def, Integer lineno)
throws AnalysisException
{
return af.createPStmAssistant().findExpression(def.getStatement(), lineno);
}
@Override
public PExp caseATypeDefinition(ATypeDefinition def, Integer lineno)
throws AnalysisException
{
if (def.getInvdef() != null)
{
PExp found = def.getInvdef().apply(THIS, lineno);
if (found != null)
{
return found;
}
}
return null;
}
@Override
public PExp caseAValueDefinition(AValueDefinition def, Integer lineno)
throws AnalysisException
{
return af.createPExpAssistant().findExpression(def.getExpression(), lineno);
}
@Override
public PExp defaultPDefinition(PDefinition node, Integer question)
throws AnalysisException
{
return null;
}
@Override
public PExp createNewReturnValue(INode node, Integer question)
throws AnalysisException
{
// TODO Auto-generated method stub
return null;
}
@Override
public PExp createNewReturnValue(Object node, Integer question)
throws AnalysisException
{
// TODO Auto-generated method stub
return null;
}
}