From 11627e103110f1abfe6de7f391f6c90475ca888c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 16 Jan 2016 15:51:06 +0000 Subject: Implement non-dynamic return types in C# backend --- src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java | 9 ++++++++- src/main/java/org/zwobble/couscous/ast/MethodNode.java | 5 +++++ .../zwobble/couscous/backends/csharp/CsharpSerializer.java | 11 +++++++---- 3 files changed, 20 insertions(+), 5 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java index b41c972..f1240f6 100644 --- a/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java +++ b/src/main/java/org/zwobble/couscous/ast/ClassNodeBuilder.java @@ -2,6 +2,7 @@ package org.zwobble.couscous.ast; import com.google.common.collect.ImmutableList; import org.zwobble.couscous.ast.identifiers.Identifier; +import org.zwobble.couscous.values.UnitValue; import java.util.Optional; import java.util.function.Function; @@ -21,7 +22,6 @@ public class ClassNodeBuilder { this.fields = ImmutableList.builder(); this.constructor = Optional.empty(); this.methods = ImmutableList.builder(); - } public ClassNodeBuilder(String name) { @@ -76,6 +76,7 @@ public class ClassNodeBuilder { .isStatic(isStatic) .annotations(builder.annotations.build()) .arguments(builder.arguments.build()) + .returns(builder.returnType) .body(builder.statements.build()) .build()); } @@ -93,6 +94,7 @@ public class ClassNodeBuilder { private final Function, T> build; private final ImmutableList.Builder annotations; private final ImmutableList.Builder arguments; + private TypeName returnType = UnitValue.REF; private final ImmutableList.Builder statements; public MethodBuilder(Function, T> build) { @@ -115,6 +117,11 @@ public class ClassNodeBuilder { arguments.add(formalArg(var(id, name, type))); return this; } + + public MethodBuilder returns(TypeName returnType) { + this.returnType = returnType; + return this; + } public MethodBuilder argument(FormalArgumentNode argument) { arguments.add(argument); diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java index d67bb1e..5ee3a7d 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java @@ -51,6 +51,11 @@ public class MethodNode implements CallableNode { this.arguments.addAll(arguments); return this; } + + public Builder returns(TypeName returnType) { + this.returnType = returnType; + return this; + } public Builder statement(StatementNode statement) { this.body.add(statement); 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 ef13854..1d05081 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -4,15 +4,18 @@ import com.google.common.collect.ImmutableMap; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.NodeVisitor; import org.zwobble.couscous.backends.SourceCodeWriter; -import org.zwobble.couscous.values.IntegerValue; -import org.zwobble.couscous.values.PrimitiveValueVisitor; +import org.zwobble.couscous.values.*; import java.util.List; import java.util.Map; public class CsharpSerializer implements NodeVisitor { private final static Map PRIMITIVES = ImmutableMap.of( - IntegerValue.REF, "int"); + IntegerValue.REF, "int", + StringValue.REF, "string", + BooleanValue.REF, "bool", + ObjectValues.CLASS, "System.Type", + UnitValue.REF, "void"); public static String serialize(Node node, String namespace) { SourceCodeWriter writer = new SourceCodeWriter( @@ -202,7 +205,7 @@ public class CsharpSerializer implements NodeVisitor { writer.writeKeyword("static"); writer.writeSpace(); } - writer.writeKeyword("dynamic"); + writeTypeReference(method.getReturnType()); writer.writeSpace(); writer.writeIdentifier(method.getName()); writer.writeSymbol("("); -- cgit v1.2.3