package com.guidewire.rating.flow.domain.util uses gw.rating.flow.domain.CalcStepOperand uses gw.rating.flow.domain.ConditionalOperand uses gw.rating.flow.domain.GenerationContext uses gw.rating.flow.domain.IfStatement uses gw.util.Pair /** * TODO: This generation code belongs in IfStatement and is repetitive of code there. */ final class IfStatementMethodCodeGenerator { final var _ifStatement: IfStatement final var _methodSequences: List[] function IfStatementMethodCodeGenerator(ifStatement: IfStatement, methodSequences: List[]) { _ifStatement = ifStatement _methodSequences = methodSequences } function generate(context: GenerationContext) { if (context.WorksheetsEnabled) { generateWrapped(context) } else { generateUnwrapped(context) } } private function generateUnwrapped(context: GenerationContext) { for (cond in _ifStatement.Conditions index i) { if (cond.First == null) { context.append(" else ") } else { context.append(i == 0 ? "if (" : " else if (") cond.First.generate(context) context.append(") ") } context.append("{") for (methodNumber in _methodSequences[i]) { context.append("\n_method${methodNumber}()") } context.append("\n}") } } private function generateWrapped(context: GenerationContext) { var elseSeen = false var closeBraceCount = 0 for (cond in _ifStatement.Conditions index i) { if (elseSeen) { throw new IllegalStateException("Cannot have if, elseif or else after else") } if (cond.First == null) { context.append(" else {\n") context.WorksheetHelper.endConditional(:isEndif = false) context.WorksheetHelper.logElse() context.append('\n') for (methodNumber in _methodSequences[i]) { context.append("\n_method${methodNumber}()") } context.append("\n}\n") elseSeen = true } else if (i > 0) { context.append(" else {\n") context.WorksheetHelper.endConditional(:isEndif = false) generateWrapped(context, new Pair>(cond.First, _methodSequences[i]), i) closeBraceCount++ } else { generateWrapped(context, new Pair>(cond.First, _methodSequences[i]), i) } } if (not elseSeen) { context.append('\n') } context.append("}\n".repeat(closeBraceCount)) context.WorksheetHelper.endConditional(:isEndif = true) } private function generateWrapped(context: GenerationContext, condition: Pair>, idx: int) { var conditionCount = IfStatement.ConditionCount.getAndIncrement() var conditionVarName = "$$cond${conditionCount}" var operand = condition.First var sequence = condition.Second generateWrapped(context, operand, idx, conditionVarName) context.append("if (${conditionVarName}) {") for (methodNumber in sequence) { context.append("\n_method${methodNumber}()") } context.append("\n}") } private function generateWrapped(context : GenerationContext, operand: CalcStepOperand, idx: int, conditionVarName: String) { context.WorksheetHelper.beginConditional(idx) context.append("var ${conditionVarName} = ") if (operand typeis ConditionalOperand) { for (elt in operand.SubOperands) { if (elt.OperatorType != null) { context.append(' ').append(elt.OperatorType.LogicalOperator).append(' ') } elt.generate(context) } } else { operand.generate(context) } context.append('\n') context.WorksheetHelper.setConditionalResult(conditionVarName) } }