aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-02-28 14:14:47 +0000
committerMichael Williamson <mike@zwobble.org>2016-02-28 14:16:16 +0000
commit74c98ef82b94abe7fe7548766471b8e43c149504 (patch)
tree075d6b370677cdba9946e1dcafada6fd2367e5ef /src/main
parent28a122e74fa8f76da97625d1581e69afee835b7c (diff)
C#: Write super types
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java11
-rw-r--r--src/main/java/org/zwobble/couscous/backends/SourceCodeWriter.java15
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java16
3 files changed, 32 insertions, 10 deletions
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<TypeName> superTypes;
private final ImmutableList.Builder<FieldDeclarationNode> fields;
private List<StatementNode> staticConstructor;
private Optional<ConstructorNode> 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 <T> void writeWithSeparator(List<T> values, Consumer<T> writeValue, Action separator) {
- if (!values.isEmpty()) {
- writeValue.accept(values.get(0));
- for (T value : skip(values, 1)) {
+ public <T> void writeWithSeparator(Iterable<T> values, Consumer<T> writeValue, Action separator) {
+ Iterator<T> 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(() -> {