+CListConstructExpression = collections.namedtuple(
+ 'CListConstructExpression',
+ [
+ 'allocate',
+ ],
+)
+
+CListAppendStatement = collections.namedtuple(
+ 'CListAppendStatement',
+ [
+ 'list_expression',
+ 'item_expression',
+ ],
+)
+
+CListGetExpression = collections.namedtuple(
+ 'CListGetExpression',
+ [
+ 'list_expression',
+ 'index_expression',
+ ],
+)
+
+def transform_structure_literal_expression(accumulators, expression):
+ return CStructureLiteralExpression(
+ field_count=expression.field_count,
+ symbol_list_variable=expression.symbol_list_variable,
+ value_list_variable=expression.value_list_variable,
+ )
+
+def transform_dot_expression(accumulators, expression):
+ try:
+ symbol_list_index = accumulators.symbol_list.index(expression.field)
+
+ except ValueError:
+ symbol_list_index = len(accumulators.symbol_list)
+ accumulators.symbol_list.append(expression.field)
+
+ return CDotExpression(
+ instance=transform_variable_expression(accumulators, expression.instance),
+ symbol=expression.field,
+ symbol_list_index=symbol_list_index,
+ )
+
+def transform_list_construct_expression(accumulators, expression):
+ return CListConstructExpression(allocate=expression.allocate)
+
+def transform_list_get_expression(accumulators, expression):
+ return CListGetExpression(
+ list_expression=transform_expression(accumulators, expression.list_expression),
+ index_expression=transform_expression(accumulators, expression.index_expression),
+ )
+
+def transform_list_append_statement(accumulators, expression):
+ return CListAppendStatement(
+ list_expression=transform_expression(accumulators, expression.list_expression),
+ item_expression=transform_expression(accumulators, expression.item_expression),
+ )
+