From 74c98ef82b94abe7fe7548766471b8e43c149504 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 28 Feb 2016 14:14:47 +0000 Subject: C#: Write super types --- .../java/org/zwobble/couscous/ast/ClassNodeBuilder.java | 11 +++++++++-- .../org/zwobble/couscous/backends/SourceCodeWriter.java | 15 +++++++-------- .../couscous/backends/csharp/CsharpSerializer.java | 16 ++++++++++++++++ 3 files changed, 32 insertions(+), 10 deletions(-) (limited to 'src/main/java/org') diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index a4a268a..04491ab 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -1,6 +1,7 @@ package org.zwobble.couscous.ast; import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import org.zwobble.couscous.ast.identifiers.Identifier; import org.zwobble.couscous.values.UnitValue; @@ -8,13 +9,13 @@ import java.util.List; import java.util.Optional; import java.util.function.Function; -import static java.util.Collections.emptySet; import static org.zwobble.couscous.ast.FormalArgumentNode.formalArg; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.util.ExtraLists.list; public class ClassNodeBuilder { private final TypeName name; + private final ImmutableSet.Builder superTypes; private final ImmutableList.Builder fields; private List staticConstructor; private Optional constructor; @@ -22,6 +23,7 @@ public class ClassNodeBuilder { public ClassNodeBuilder(TypeName name) { this.name = name; + this.superTypes = ImmutableSet.builder(); this.fields = ImmutableList.builder(); staticConstructor = list(); this.constructor = Optional.empty(); @@ -32,6 +34,11 @@ public class ClassNodeBuilder { this(TypeName.of(name)); } + public ClassNodeBuilder addSuperType(String type) { + this.superTypes.add(TypeName.of(type)); + return this; + } + public ClassNodeBuilder staticField(String name, TypeName type) { return field(FieldDeclarationNode.staticField(name, type)); } @@ -97,7 +104,7 @@ public class ClassNodeBuilder { public ClassNode build() { return ClassNode.declareClass( name, - emptySet(), + superTypes.build(), fields.build(), staticConstructor, constructor.orElse(ConstructorNode.DEFAULT), diff --git a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java index 301bb61..3908f72 100644 --- a/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java +++ b/src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java @@ -3,11 +3,9 @@ package org.zwobble.couscous.backends; import com.google.common.base.Strings; import org.zwobble.couscous.util.Action; -import java.util.List; +import java.util.Iterator; import java.util.function.Consumer; -import static com.google.common.collect.Iterables.skip; - public class SourceCodeWriter { public interface WriterAction { void run(SourceCodeWriter writer); @@ -95,12 +93,13 @@ public class SourceCodeWriter { action.run(this); } - public void writeWithSeparator(List values, Consumer writeValue, Action separator) { - if (!values.isEmpty()) { - writeValue.accept(values.get(0)); - for (T value : skip(values, 1)) { + public void writeWithSeparator(Iterable values, Consumer writeValue, Action separator) { + Iterator iterator = values.iterator(); + if (iterator.hasNext()) { + writeValue.accept(iterator.next()); + while(iterator.hasNext()) { separator.run(); - writeValue.accept(value); + writeValue.accept(iterator.next()); } } } 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 8a92a51..a3479fa 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -337,6 +337,7 @@ public class CsharpSerializer implements NodeVisitor { writer.writeKeyword(keyword); writer.writeSpace(); writer.writeIdentifier(node.getName().getSimpleName()); + writeSuperTypes(node); writer.startBlock(); writeBody.run(); writer.endBlock(); @@ -346,6 +347,21 @@ public class CsharpSerializer implements NodeVisitor { }); } + private void writeSuperTypes(TypeNode node) { + if (!node.getSuperTypes().isEmpty()) { + writer.writeSpace(); + writer.writeSymbol(":"); + writer.writeSpace(); + writer.writeWithSeparator( + node.getSuperTypes(), + this::writeTypeReference, + () -> { + writer.writeSymbol(","); + writer.writeSpace(); + }); + } + } + private void writeStaticConstructor(ClassNode classNode) { if (!classNode.getStaticConstructor().isEmpty()) { writer.writeStatement(() -> { -- cgit v1.2.3