+ for ps in function_prestatements:
+ prestatements.append(ps)
+
+ return (
+ counter,
+ tuple(prestatements),
+ NormalFunctionCallExpression(
+ metadata=expression.metadata,
+ function_expression=function_expression,
+ argument_count=len(expression.argument_list),
+ ),
+ )
+
+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,
+ desugaring.DesugaredSymbolLiteralExpression: normalize_symbol_literal_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),
+ )