+def normalize_if_expression(counter, expression):
+ counter, condition_prestatements, condition_expression = normalize_expression(
+ counter,
+ expression.condition_expression,
+ )
+
+ counter, if_statement_list = normalize_statement_list(
+ counter,
+ expression.if_statement_list,
+ )
+ counter, else_statement_list = normalize_statement_list(
+ counter,
+ expression.else_statement_list,
+ )
+
+ return (
+ counter,
+ condition_prestatements,
+ NormalIfElseExpression(
+ condition_expression=condition_expression,
+ if_statement_list=if_statement_list,
+ else_statement_list=else_statement_list,
+ ),
+ )
+
+def normalize_expression(counter, expression):
+ return {
+ desugaring.DesugaredBuiltinExpression: normalize_builtin_expression,
+ desugaring.DesugaredFunctionCallExpression: normalize_function_call_expression,
+ desugaring.DesugaredIfExpression: normalize_if_expression,
+ desugaring.DesugaredIntegerLiteralExpression: normalize_integer_literal_expression,
+ desugaring.DesugaredLambdaExpression: normalize_lambda_expression,
+ desugaring.DesugaredListLiteralExpression: normalize_list_literal_expression,
+ desugaring.DesugaredStringLiteralExpression: normalize_string_literal_expression,
+ desugaring.DesugaredStructureLiteralExpression: normalize_structure_literal_expression,
+ desugaring.DesugaredSymbolExpression: normalize_symbol_expression,
+ }[type(expression)](counter, expression)
+
+def normalize_expression_statement(counter, statement):
+ # TODO Normalized will be a NormalVariableExpression, which will go unused
+ # for expression statements in every case except when it's a return
+ # statement. This cases warnings on C compilation. We should only generate
+ # this variable when it will be used on return.
+ counter, prestatements, normalized = normalize_expression(counter, statement.expression)
+
+ return (
+ counter,
+ prestatements,
+ NormalExpressionStatement(expression=normalized),
+ )
+
+def normalize_assignment_statement(counter, statement):
+ counter, prestatements, normalized_expression = normalize_expression(counter, statement.expression)
+ return (
+ counter,
+ prestatements,
+ NormalAssignmentStatement(
+ target=statement.target,
+ expression=normalized_expression,
+ ),
+ )
+
+def normalize_statement(counter, statement):
+ return {
+ desugaring.DesugaredAssignmentStatement: normalize_assignment_statement,
+ desugaring.DesugaredExpressionStatement: normalize_expression_statement,
+ }[type(statement)](counter, statement)
+
+@util.force_generator(tuple)
+def normalize_statement_list(counter, statement_list):
+ result_statement_list = []
+
+ for statement in statement_list: