aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java11
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpBackend.java7
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java26
-rw-r--r--src/main/java/org/zwobble/couscous/util/ExtraLists.java4
4 files changed, 31 insertions, 17 deletions
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<TypeNode> applyAll(List<NodeTransformer> transformers, List<TypeNode> types) {
+ for (NodeTransformer transformer : transformers) {
+ types = apply(transformer, types);
+ }
+ return types;
+ }
+
+ public static List<TypeNode> apply(NodeTransformer transformer, List<TypeNode> types) {
+ return eagerMap(types, transformer::transformTypeDeclaration);
+ }
+
public static NodeTransformer replaceExpressions(Map<ExpressionNode, ExpressionNode> 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<TypeNode> generateCode(List<TypeNode> 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<TypeNode> generateCode(List<TypeNode> 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 <T> List<T> list(T... values) {
+ return ImmutableList.copyOf(values);
+ }
+
public static <T> List<T> cons(T value, Iterable<T> list) {
return concat(list(value), list);
}