package org.overture.interpreter.utilities.statement; import org.overture.ast.analysis.AnalysisException; import org.overture.ast.analysis.QuestionAnswerAdaptor; import org.overture.ast.expressions.PExp; import org.overture.ast.node.INode; import org.overture.ast.statements.AAlwaysStm; import org.overture.ast.statements.AAssignmentStm; import org.overture.ast.statements.AAtomicStm; import org.overture.ast.statements.ACallObjectStm; import org.overture.ast.statements.ACallStm; import org.overture.ast.statements.ACaseAlternativeStm; import org.overture.ast.statements.ACasesStm; import org.overture.ast.statements.ACyclesStm; import org.overture.ast.statements.ADurationStm; import org.overture.ast.statements.AElseIfStm; import org.overture.ast.statements.AExitStm; import org.overture.ast.statements.AForAllStm; import org.overture.ast.statements.AForIndexStm; import org.overture.ast.statements.AForPatternBindStm; import org.overture.ast.statements.AIfStm; import org.overture.ast.statements.ALetBeStStm; import org.overture.ast.statements.ALetStm; import org.overture.ast.statements.AReturnStm; import org.overture.ast.statements.AStartStm; import org.overture.ast.statements.AStopStm; import org.overture.ast.statements.ATixeStm; import org.overture.ast.statements.ATixeStmtAlternative; import org.overture.ast.statements.ATrapStm; import org.overture.ast.statements.AWhileStm; import org.overture.ast.statements.PStm; import org.overture.ast.statements.SSimpleBlockStm; import org.overture.interpreter.assistant.IInterpreterAssistantFactory; /*************************************** * This method finds an Expression in a statement. * * @author gkanos ****************************************/ public class StatementExpressionFinder extends QuestionAnswerAdaptor<Integer, PExp> { protected static IInterpreterAssistantFactory af; @SuppressWarnings("static-access") public StatementExpressionFinder(IInterpreterAssistantFactory af) { this.af = af; } @Override public PExp caseAAlwaysStm(AAlwaysStm stm, Integer lineno) throws AnalysisException { PExp found = stm.getAlways().apply(THIS, lineno); if (found != null) { return found; } return stm.getBody().apply(THIS, lineno); } @Override public PExp caseAAssignmentStm(AAssignmentStm stm, Integer lineno) throws AnalysisException { return af.createPExpAssistant().findExpression(stm.getExp(), lineno); } @Override public PExp caseAAtomicStm(AAtomicStm stm, Integer lineno) throws AnalysisException { PExp found = null; for (AAssignmentStm stmt : stm.getAssignments()) { found = stmt.apply(THIS, lineno); if (found != null) { break; } } return found; } @Override public PExp caseACallStm(ACallStm stm, Integer lineno) throws AnalysisException { return af.createPExpAssistant().findExpression(stm.getArgs(), lineno); } @Override public PExp caseACallObjectStm(ACallObjectStm stm, Integer lineno) throws AnalysisException { return af.createPExpAssistant().findExpression(stm.getArgs(), lineno); } @Override public PExp caseACasesStm(ACasesStm stm, Integer lineno) throws AnalysisException { PExp found = null; for (ACaseAlternativeStm stmt : stm.getCases()) { found = stmt.getResult().apply(THIS, lineno); if (found != null) { break; } } return found; } @Override public PExp caseACyclesStm(ACyclesStm stm, Integer lineno) throws AnalysisException { return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseADurationStm(ADurationStm stm, Integer lineno) throws AnalysisException { return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseAElseIfStm(AElseIfStm stm, Integer lineno) throws AnalysisException { return af.createPExpAssistant().findExpression(stm.getElseIf(), lineno); } @Override public PExp caseAExitStm(AExitStm stm, Integer lineno) throws AnalysisException { return stm.getExpression() == null ? null : af.createPExpAssistant().findExpression(stm.getExpression(), lineno); } @Override public PExp caseAForAllStm(AForAllStm stm, Integer lineno) throws AnalysisException { PExp found = af.createPExpAssistant().findExpression(stm.getSet(), lineno); if (found != null) { return found; } return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseAForIndexStm(AForIndexStm stm, Integer lineno) throws AnalysisException { PExp found = af.createPExpAssistant().findExpression(stm.getFrom(), lineno); if (found != null) { return found; } found = stm.getTo().apply(THIS, lineno); if (found != null) { return found; } found = af.createPExpAssistant().findExpression(stm.getBy(), lineno); if (found != null) { return found; } return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseAForPatternBindStm(AForPatternBindStm stm, Integer lineno) throws AnalysisException { PExp found = af.createPExpAssistant().findExpression(stm.getExp(), lineno); if (found != null) { return found; } return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseAIfStm(AIfStm stm, Integer lineno) throws AnalysisException { PExp found = stm.getThenStm().apply(THIS, lineno); if (found != null) { return found; } for (AElseIfStm stmt : stm.getElseIf()) { found = stmt.apply(THIS, lineno); if (found != null) { return found; } } if (stm.getElseStm() != null) { found = stm.getElseStm().apply(THIS, lineno); } return found; } @Override public PExp caseALetBeStStm(ALetBeStStm stm, Integer lineno) throws AnalysisException { if (stm.getSuchThat() != null) { PExp found = af.createPExpAssistant().findExpression(stm.getSuchThat(), lineno); if (found != null) { return found; } } return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseALetStm(ALetStm stm, Integer lineno) throws AnalysisException { PExp found = af.createPDefinitionListAssistant().findExpression(stm.getLocalDefs(), lineno); if (found != null) { return found; } return stm.getStatement().apply(THIS, lineno); } @Override public PExp caseAReturnStm(AReturnStm stm, Integer lineno) throws AnalysisException { return stm.getExpression() == null ? null : af.createPExpAssistant().findExpression(stm.getExpression(), lineno); } @Override public PExp defaultSSimpleBlockStm(SSimpleBlockStm stm, Integer lineno) throws AnalysisException { PExp found = null; for (PStm stmt : stm.getStatements()) { found = stmt.apply(THIS, lineno);// PStmAssistantInterpreter.findExpression(stmt, lineno); if (found != null) { break; } } return found; } @Override public PExp caseAStartStm(AStartStm stm, Integer lineno) throws AnalysisException { return af.createPExpAssistant().findExpression(stm.getObj(), lineno); } @Override public PExp caseAStopStm(AStopStm stm, Integer lineno) throws AnalysisException { return af.createPExpAssistant().findExpression(stm.getObj(), lineno); } @Override public PExp caseATixeStm(ATixeStm stm, Integer lineno) throws AnalysisException { PExp found = stm.getBody().apply(THIS, lineno);// PStmAssistantInterpreter.findExpression(stm.getBody(), // lineno); if (found != null) { return found; } for (ATixeStmtAlternative tsa : stm.getTraps()) { found = tsa.getStatement().apply(THIS, lineno);// PStmAssistantInterpreter.findExpression(tsa.getStatement(), // lineno); if (found != null) { break; } } return found; } @Override public PExp caseATrapStm(ATrapStm stm, Integer lineno) throws AnalysisException { PExp found = stm.getBody().apply(THIS, lineno);// PStmAssistantInterpreter.findExpression(stm.getBody(), // lineno); if (found != null) { return found; } return stm.getWith().apply(THIS, lineno);// PStmAssistantInterpreter.findExpression(stm.getWith(), lineno); } @Override public PExp caseAWhileStm(AWhileStm stm, Integer lineno) throws AnalysisException { PExp found = af.createPExpAssistant().findExpression(stm.getExp(), lineno); if (found != null) { return found; } return stm.getStatement().apply(THIS, lineno);// PStmAssistantInterpreter.findExpression(stm.getStatement(), // lineno); } @Override public PExp defaultPStm(PStm stm, Integer lineno) 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; } }