Skip to content

Commit b2be669

Browse files
refactored switch generation to use a single for loop
1 parent 760f74f commit b2be669

File tree

1 file changed

+53
-65
lines changed

1 file changed

+53
-65
lines changed

src/main/java/com/regnosys/rosetta/generator/python/expressions/PythonExpressionGenerator.xtend

Lines changed: 53 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)