From 1a39bb268c68bc2c2452263ca539297d9905de8c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Mon, 29 Aug 2016 16:10:23 +0100 Subject: Apply node transformers across lists of types --- .../couscous/ast/visitors/NodeTransformer.java | 11 +++++++++ .../couscous/backends/csharp/CsharpBackend.java | 7 ++---- .../backends/csharp/CsharpCodeGenerator.java | 26 ++++++++++++---------- .../java/org/zwobble/couscous/util/ExtraLists.java | 4 ++++ 4 files changed, 31 insertions(+), 17 deletions(-) (limited to 'src/main') diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java index b75106a..835843d 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java @@ -19,6 +19,17 @@ import static org.zwobble.couscous.util.ExtraIterables.only; import static org.zwobble.couscous.util.ExtraLists.*; public class NodeTransformer { + public static List applyAll(List transformers, List types) { + for (NodeTransformer transformer : transformers) { + types = apply(transformer, types); + } + return types; + } + + public static List apply(NodeTransformer transformer, List types) { + return eagerMap(types, transformer::transformTypeDeclaration); + } + public static NodeTransformer replaceExpressions(Map replacements) { return builder(). transformExpression(expression -> diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java index a086fe2..d97b23d 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java @@ -25,11 +25,8 @@ public class CsharpBackend implements Backend { Files.write( outputFilePath, transform( - classes, - classNode -> compileClass(classNode))); + CsharpCodeGenerator.generateCode(classes, namespace), + CsharpSerializer::serialize)); } - private String compileClass(TypeNode classNode) { - return CsharpSerializer.serialize(CsharpCodeGenerator.generateCode(classNode, namespace)); - } } diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java index 3fccce9..e576102 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java @@ -1,7 +1,7 @@ package org.zwobble.couscous.backends.csharp; import com.google.common.collect.ImmutableMap; -import org.zwobble.couscous.ast.Node; +import org.zwobble.couscous.ast.TypeNode; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.backends.csharp.primitives.CsharpPrimitiveMethods; import org.zwobble.couscous.backends.naming.Naming; @@ -9,9 +9,11 @@ import org.zwobble.couscous.transforms.DesugarForEachToFor; import org.zwobble.couscous.transforms.DesugarForToWhile; import org.zwobble.couscous.types.*; +import java.util.List; import java.util.Map; import static org.zwobble.couscous.util.ExtraLists.eagerMap; +import static org.zwobble.couscous.util.ExtraLists.list; public class CsharpCodeGenerator { public static final Naming NAMING = Naming.noMangling(); @@ -31,8 +33,8 @@ public class CsharpCodeGenerator { private final String namespace; private final NodeTransformer nodeTransformer; - public static Node generateCode(Node node, String namespace) { - return new CsharpCodeGenerator(NAMING, namespace).generateCode(node); + public static List generateCode(List types, String namespace) { + return new CsharpCodeGenerator(NAMING, namespace).generateCode(types); } private CsharpCodeGenerator(Naming naming, String namespace) { @@ -44,15 +46,15 @@ public class CsharpCodeGenerator { .build(); } - private Node generateCode(Node node) { - return nodeTransformer.transform( - CsharpPrimitiveMethods.TRANSFORMER.transform( - DesugarForToWhile.transformer().transform( - DesugarForEachToFor.transformer().transform( - node - ) - ) - ) + private List generateCode(List types) { + return NodeTransformer.applyAll( + list( + DesugarForEachToFor.transformer(), + DesugarForToWhile.transformer(), + CsharpPrimitiveMethods.TRANSFORMER, + nodeTransformer + ), + types ); } diff --git a/src/main/java/org/zwobble/couscous/util/ExtraLists.java b/src/main/java/org/zwobble/couscous/util/ExtraLists.java index aa1f35f..7849ea6 100644 --- a/src/main/java/org/zwobble/couscous/util/ExtraLists.java +++ b/src/main/java/org/zwobble/couscous/util/ExtraLists.java @@ -29,6 +29,10 @@ public class ExtraLists { return ImmutableList.of(value1, value2, value3); } + public static List list(T... values) { + return ImmutableList.copyOf(values); + } + public static List cons(T value, Iterable list) { return concat(list(value), list); } -- cgit v1.2.3