@@ -61,7 +61,7 @@ class PythonExpressionGenerator {
6161
6262 public var List<String > importsFound
6363 public var ifCondBlocks = new ArrayList<String > ()
64- public var switchCondBlocks = new ArrayList< String > ()
64+ public var switchCond = false
6565
6666 def String generateConditions (Data cls ) {
6767 var nConditions = 0 ;
@@ -198,12 +198,10 @@ class PythonExpressionGenerator {
198198
199199 private def generateIfThenElseOrSwitch (Condition c ) {
200200 ifCondBlocks. clear()
201- switchCondBlocks . clear()
201+ switchCond = false
202202 var expr = generateExpression(c. expression, 0 , false )
203- if (! switchCondBlocks. isEmpty()) {
204- var switchBlocks = ' ' ' «FOR arg : switchCondBlocks»«arg»«ENDFOR»' ' '
205- return ' ' ' «switchBlocks» «expr»' ' '
206- }
203+ if (switchCond) return expr
204+
207205 var blocks = (ifCondBlocks. isEmpty()) ? " " : ' ' ' «FOR arg : ifCondBlocks»«arg»«ENDFOR»' ' '
208206 return ' ' ' «blocks» return «expr»
209207 ' ' '
@@ -286,82 +284,72 @@ class PythonExpressionGenerator {
286284 }
287285
288286 private def String generateSwitchOperation (SwitchOperation expr , int ifLevel , boolean isLambda ) {
289- // translate switch into a series of if / elif statements
290287 val attr = generateExpression(expr. argument, 0 , isLambda)
291- val arg = expr. argument as RosettaSymbolReference
292288
293- var funcNames = new ArrayList< String > ()
289+ var switchCases = expr . cases
294290
295- for (i : 0 .. < expr. cases. size) {
296- if (expr. cases. get(i). isDefault()){
297- // default case
298- val defaultExprDef = generateExpression(expr. getDefault(), 0 , isLambda)
299- val defaultFuncName = ' ' ' _then_default' ' '
300- funcNames. add(defaultFuncName)
301- switchCondBlocks. add(
302- ' ' '
303- def «defaultFuncName»():
304- return «defaultExprDef»
305- ' ' '
306- )}
307- else {
308- val thenExpr= expr. cases. get(i)
309- val thenExprDef = generateExpression(thenExpr. getExpression(), ifLevel + 1 , isLambda)
310- val funcName = ' ' ' _then_«funcNames.size()+1»' ' '
311- funcNames. add(funcName)
312- switchCondBlocks. add(
313- ' ' '
314- def «funcName»():
315- return «thenExprDef»
316- ' ' '
317- )
318- }
319- }
291+ var _thenFuncsBuilder = new StringConcatenation ()
292+ var _switchLogicBuilder= new StringConcatenation ()
320293
321-
322- var _builder = new StringConcatenation ()
323-
324- // Generate switch logic
325294 val indent = " "
326- _builder. append(" switchAttribute = " )
327- _builder. append(attr)
328- _builder. newLine()
329- // Append each conditional
330- for (i : 0 .. < expr. cases. size) {
331- if (expr. cases. get(i). isDefault()){
295+ switchCond= true
296+
297+ for (i : 0 .. < switchCases. size) {
298+ val funcName= if (switchCases. get(i). isDefault()) " _then_default" else " _then_" + (i+ 1 )
299+ val thenExprDef= if (switchCases. get(i). isDefault())
300+ generateExpression(expr. getDefault(), 0 , isLambda)
301+ else
302+ generateExpression(switchCases. get(i). getExpression(), ifLevel + 1 , isLambda)
303+
304+ _thenFuncsBuilder. append(indent)
305+ _thenFuncsBuilder. append(" def " + funcName + " ():" )
306+ _thenFuncsBuilder. newLine
307+ _thenFuncsBuilder. append(indent)
308+ _thenFuncsBuilder. append(" return " + thenExprDef)
309+ _thenFuncsBuilder. newLine
310+
311+ if (switchCases. get(i). isDefault()){
332312 // Default else
333- _builder . append(indent)
334- _builder . append(" else:" )
335- _builder . newLine()
336- _builder . append(indent)
337- _builder . append(" return " )
338- _builder . append(funcNames . last )
339- _builder . append(" ()" )
313+ _switchLogicBuilder . append(indent)
314+ _switchLogicBuilder . append(" else:" )
315+ _switchLogicBuilder . newLine()
316+ _switchLogicBuilder . append(indent)
317+ _switchLogicBuilder . append(" return " )
318+ _switchLogicBuilder . append(funcName )
319+ _switchLogicBuilder . append(" ()" )
340320 }
341321 else {
342- val guard = expr . cases . get(i). getGuard()
322+ val guard = switchCases . get(i). getGuard()
343323
344324 val prefix = (i == 0 ) ? " if " : " elif "
345- _builder . append(indent)
346- _builder . append(prefix)
325+ _switchLogicBuilder . append(indent)
326+ _switchLogicBuilder . append(prefix)
347327 if (guard. getLiteralGuard() !== null ) {
348328 val guardExpr = generateExpression(guard. getLiteralGuard(), 0 , isLambda)
349- _builder . append(" switchAttribute == " )
350- _builder . append(guardExpr)
329+ _switchLogicBuilder . append(" switchAttribute == " )
330+ _switchLogicBuilder . append(guardExpr)
351331 } else {
352332 val guardExpr = getGuardExpression(guard, isLambda)
353- _builder . append(guardExpr)
333+ _switchLogicBuilder . append(guardExpr)
354334 }
355- _builder . append(" :" )
356- _builder . newLine()
357- _builder . append(indent)
358- _builder . append(" return " )
359- _builder . append(funcNames . get(i) )
360- _builder . append(" ()" )
361- _builder . newLine()
335+ _switchLogicBuilder . append(" :" )
336+ _switchLogicBuilder . newLine()
337+ _switchLogicBuilder . append(indent)
338+ _switchLogicBuilder . append(" return " )
339+ _switchLogicBuilder . append(funcName )
340+ _switchLogicBuilder . append(" ()" )
341+ _switchLogicBuilder . newLine()
362342 }
363343 }
364-
344+
345+ val _builder= new StringConcatenation
346+ _builder. append(_thenFuncsBuilder. toString)
347+ _builder. append(indent)
348+ _builder. append(" switchAttribute = " )
349+ _builder. append(attr)
350+ _builder. newLine
351+ _builder. append(_switchLogicBuilder. toString)
352+
365353 return _builder. toString
366354 }
367355
0 commit comments