From 351567960bd825fbdd4a3f15719f7074a13cdfd3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Fri, 15 Jul 2016 14:34:15 +0100 Subject: Generate switch statements in C# backend --- .../backends/csharp/CsharpCodeGenerator.java | 6 +--- .../couscous/backends/csharp/CsharpSerializer.java | 32 ++++++++++++++++++++++ 2 files changed, 33 insertions(+), 5 deletions(-) (limited to 'src/main/java/org/zwobble/couscous/backends/csharp') 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 23743d0..537184c 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java @@ -7,8 +7,6 @@ import org.zwobble.couscous.ast.Node; import org.zwobble.couscous.ast.Receiver; import org.zwobble.couscous.ast.visitors.NodeTransformer; import org.zwobble.couscous.backends.naming.Naming; -import org.zwobble.couscous.frontends.java.Scope; -import org.zwobble.couscous.transforms.DesugarSwitchToIfElse; import org.zwobble.couscous.types.*; import java.util.Map; @@ -50,9 +48,7 @@ public class CsharpCodeGenerator { } private Node generateCode(Node node) { - return node - .transform(DesugarSwitchToIfElse.transformer(Scope.create())) - .transform(nodeTransformer); + return node.transform(nodeTransformer); } private Type transformType(Type type) { 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 91a4400..6164d04 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -2,6 +2,8 @@ package org.zwobble.couscous.backends.csharp; import com.google.common.collect.ImmutableSet; import org.zwobble.couscous.ast.*; +import org.zwobble.couscous.ast.sugar.SwitchCaseNode; +import org.zwobble.couscous.ast.sugar.SwitchNode; import org.zwobble.couscous.ast.visitors.DynamicNodeMapper; import org.zwobble.couscous.ast.visitors.DynamicNodeVisitor; import org.zwobble.couscous.backends.SourceCodeWriter; @@ -366,6 +368,36 @@ public class CsharpSerializer { } } + public void visit(SwitchNode switchNode) { + writer.writeStatement(() -> { + writer.writeKeyword("switch"); + writer.writeSpace(); + writer.writeSymbol("("); + write(switchNode.getValue()); + writer.writeSymbol(")"); + writer.startBlock(); + switchNode.getCases().forEach(this::visit); + writer.endBlock(); + }); + } + + private void visit(SwitchCaseNode switchCase) { + writer.writeStatement(() -> { + if (switchCase.getValue().isPresent()) { + writer.writeKeyword("case"); + writer.writeSpace(); + write(switchCase.getValue().get()); + } else { + writer.writeKeyword("default"); + } + writer.writeSymbol(":"); + }); + writer.indent(); + writeAll(switchCase.getStatements()); + writer.dedent(); + + } + public void visit(WhileNode whileLoop) { writer.writeStatement(() -> { writer.writeKeyword("while"); -- cgit v1.2.3