Method: getOuterBlockDecls(AIdentifierVarExpIR, List)

1: /*
2: * #%~
3: * VDM Code Generator
4: * %%
5: * Copyright (C) 2008 - 2014 Overture
6: * %%
7: * This program is free software: you can redistribute it and/or modify
8: * it under the terms of the GNU General Public License as
9: * published by the Free Software Foundation, either version 3 of the
10: * License, or (at your option) any later version.
11: *
12: * This program is distributed in the hope that it will be useful,
13: * but WITHOUT ANY WARRANTY; without even the implied warranty of
14: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: * GNU General Public License for more details.
16: *
17: * You should have received a copy of the GNU General Public
18: * License along with this program. If not, see
19: * <http://www.gnu.org/licenses/gpl-3.0.html>.
20: * #~%
21: */
22: package org.overture.codegen.trans.quantifier;
23:
24: import java.util.List;
25:
26: import org.overture.codegen.ir.ITempVarGen;
27: import org.overture.codegen.ir.SExpIR;
28: import org.overture.codegen.ir.SPatternIR;
29: import org.overture.codegen.ir.SStmIR;
30: import org.overture.codegen.ir.analysis.AnalysisException;
31: import org.overture.codegen.ir.declarations.AVarDeclIR;
32: import org.overture.codegen.ir.expressions.AIdentifierVarExpIR;
33: import org.overture.codegen.ir.patterns.AIdentifierPatternIR;
34: import org.overture.codegen.trans.IterationVarPrefixes;
35: import org.overture.codegen.trans.assistants.TransAssistantIR;
36: import org.overture.codegen.trans.iterator.ILanguageIterator;
37:
38: public class Exists1QuantifierStrategy extends QuantifierBaseStrategy
39: {
40:         protected CounterData counterData;
41:
42:         public Exists1QuantifierStrategy(TransAssistantIR transformationAssistant,
43:                         SExpIR predicate, String resultVarName,
44:                         ILanguageIterator langIterator, ITempVarGen tempGen,
45:                         IterationVarPrefixes iteVarPrefixes, CounterData counterData)
46:         {
47:                 super(transformationAssistant, predicate, resultVarName, langIterator, tempGen, iteVarPrefixes);
48:
49:                 this.counterData = counterData;
50:         }
51:
52:         @Override
53:         public List<AVarDeclIR> getOuterBlockDecls(AIdentifierVarExpIR setVar,
54:                         List<SPatternIR> patterns) throws AnalysisException
55:         {
56:•                if (firstBind)
57:                 {
58:                         AIdentifierPatternIR name = new AIdentifierPatternIR();
59:                         name.setName(resultVarName);
60:
61:                         return packDecl(transAssist.getInfo().getDeclAssistant().consLocalVarDecl(counterData.getType().clone(), name, counterData.getExp().clone()));
62:                 } else
63:                 {
64:                         return null;
65:                 }
66:         }
67:
68:         @Override
69:         public SExpIR getForLoopCond(AIdentifierVarExpIR setVar,
70:                         List<SPatternIR> patterns, SPatternIR pattern)
71:                         throws AnalysisException
72:         {
73:                 SExpIR left = langIterator.getForLoopCond(setVar, patterns, pattern);
74:                 SExpIR right = transAssist.consLessThanCheck(resultVarName, 2);
75:
76:                 return transAssist.consAndExp(left, right);
77:         }
78:
79:         @Override
80:         public List<SStmIR> getForLoopStms(AIdentifierVarExpIR setVar,
81:                         List<SPatternIR> patterns, SPatternIR pattern)
82:         {
83:                 return lastBind
84:                                 ? packStm(transAssist.consConditionalIncrement(resultVarName, predicate))
85:                                 : null;
86:         }
87: }