From 85bcbfd70fff22169916c9fc1464afd00c376a2a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 10 Apr 2016 22:39:04 +0100 Subject: Split classes with type parameters into static and instance classes --- .../couscous/backends/csharp/CsharpSerializer.java | 64 +++++++++++++++++----- .../org/zwobble/couscous/util/ExtraIterables.java | 9 +++ 2 files changed, 58 insertions(+), 15 deletions(-) (limited to 'src/main') diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java index 4fab81b..a2c77b5 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Set; import static java.util.Arrays.asList; +import static org.zwobble.couscous.util.ExtraIterables.lazyFilter; import static org.zwobble.couscous.util.ExtraLists.list; import static org.zwobble.couscous.util.ExtraSets.set; @@ -448,17 +449,41 @@ public class CsharpSerializer implements NodeVisitor { @Override public void visit(ClassNode classNode) { - writeType(classNode, "class", () -> { - writeAll(classNode.getFields()); - writeStaticConstructor(classNode); - writeConstructor(classNode, classNode.getConstructor()); - writeAll(classNode.getMethods()); - }); + if (classNode.getTypeParameters().isEmpty()) { + writeInstanceType(classNode, "class", () -> { + writeAll(classNode.getFields()); + writeStaticConstructor(classNode); + writeConstructor(classNode, classNode.getConstructor()); + writeAll(classNode.getMethods()); + }); + } else { + writeInNamespace(classNode, () -> { + writer.writeStatement(() -> { + writer.writeKeyword("internal"); + writer.writeSpace(); + writer.writeKeyword("static"); + writer.writeSpace(); + writer.writeKeyword("class"); + writer.writeSpace(); + writer.writeIdentifier(classNode.getName().getSimpleName()); + writer.startBlock(); + writeAll(lazyFilter(classNode.getFields(), field -> field.isStatic())); + writeStaticConstructor(classNode); + writeAll(lazyFilter(classNode.getMethods(), method -> method.isStatic())); + writer.endBlock(); + }); + }); + writeInstanceType(classNode, "class", () -> { + writeAll(lazyFilter(classNode.getFields(), field -> !field.isStatic())); + writeConstructor(classNode, classNode.getConstructor()); + writeAll(lazyFilter(classNode.getMethods(), method -> !method.isStatic())); + }); + } } @Override public void visit(InterfaceNode interfaceNode) { - writeType(interfaceNode, "interface", () -> { + writeInstanceType(interfaceNode, "interface", () -> { interfaceNode.getMethods().forEach(method -> { writer.writeStatement(() -> { writeSignature(method); @@ -470,7 +495,7 @@ public class CsharpSerializer implements NodeVisitor { @Override public void visit(EnumNode enumNode) { - writeType(enumNode, "enum", () -> { + writeInstanceType(enumNode, "enum", () -> { writer.writeStatement(() -> { writer.writeCommaSeparated( enumNode.getValues(), @@ -479,12 +504,8 @@ public class CsharpSerializer implements NodeVisitor { }); } - private void writeType(TypeNode node, String keyword, Action writeBody) { - writer.writeStatement(() -> { - writer.writeKeyword("namespace"); - writer.writeSpace(); - writeQualifiedName(node.getName().getPackage().get()); - writer.startBlock(); + private void writeInstanceType(TypeNode node, String keyword, Action writeBody) { + writeInNamespace(node, () -> { writer.writeStatement(() -> { writer.writeKeyword("internal"); writer.writeSpace(); @@ -497,7 +518,20 @@ public class CsharpSerializer implements NodeVisitor { writeBody.run(); writer.endBlock(); }); + }); + } + + private void writeInNamespace(TypeNode typeNode, Action writeBody) { + writeInNamespace(typeNode.getName().getPackage().get(), writeBody); + } + private void writeInNamespace(String namespace, Action writeBody) { + writer.writeStatement(() -> { + writer.writeKeyword("namespace"); + writer.writeSpace(); + writeQualifiedName(namespace); + writer.startBlock(); + writeBody.run(); writer.endBlock(); }); } @@ -553,7 +587,7 @@ public class CsharpSerializer implements NodeVisitor { writer.endBlock(); } - private void writeAll(List nodes) { + private void writeAll(Iterable nodes) { for (Node node : nodes) { write(node); } diff --git a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java index 0fcc9af..4b8b802 100644 --- a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java +++ b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java @@ -86,6 +86,15 @@ public class ExtraIterables { return Iterables.concat(list(head), tails); } + public static Iterable lazyFilter(Iterable iterable, java.util.function.Predicate predicate) { + return new Iterable() { + @Override + public Iterator iterator() { + return stream(iterable).filter(predicate).iterator(); + } + }; + } + public static Iterable lazyMap(Iterable iterable, Function function) { return new Iterable() { @Override -- cgit v1.2.3