diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java | 246 |
1 files changed, 82 insertions, 164 deletions
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 6c8a3ab..8765b9b 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -2,8 +2,8 @@ package org.zwobble.couscous.backends.csharp; import com.google.common.collect.ImmutableSet; import org.zwobble.couscous.ast.*; +import org.zwobble.couscous.ast.visitors.DynamicNodeMapper; import org.zwobble.couscous.ast.visitors.DynamicNodeVisitor; -import org.zwobble.couscous.ast.visitors.NodeMapper; import org.zwobble.couscous.backends.SourceCodeWriter; import org.zwobble.couscous.types.*; import org.zwobble.couscous.util.Action; @@ -12,6 +12,7 @@ import org.zwobble.couscous.values.PrimitiveValue; import java.util.List; import java.util.Set; import java.util.function.Consumer; +import java.util.function.Function; import static java.util.Arrays.asList; import static org.zwobble.couscous.util.ExtraIterables.lazyFilter; @@ -674,186 +675,103 @@ public class CsharpSerializer { } } - private int precedence(Node node) { - return node.accept(new NodeMapper<Integer>() { - @Override - public Integer visit(LiteralNode literal) { - return Integer.MAX_VALUE; - } - - @Override - public Integer visit(VariableReferenceNode variableReference) { - return Integer.MAX_VALUE; - } - - @Override - public Integer visit(ThisReferenceNode reference) { - return Integer.MAX_VALUE; - } - - @Override - public Integer visit(ArrayNode array) { - return Integer.MAX_VALUE; - } - - @Override - public Integer visit(AssignmentNode assignment) { - return 1; - } - - @Override - public Integer visit(TernaryConditionalNode ternaryConditional) { - return 2; - } - - @Override - public Integer visit(MethodCallNode methodCall) { - return 15; - } - - @Override - public Integer visit(ConstructorCallNode call) { - return 13; - } + private static final Function<Node, Integer> precedence = DynamicNodeMapper.build( + Precedence.class, + Integer.class, + "visit" + ).instantiate(new Precedence()); - @Override - public Integer visit(OperationNode operation) { - switch (operation.getOperator()) { - case BOOLEAN_NOT: - return 14; - case MULTIPLY: - case DIVIDE: - case MOD: - return 12; - case ADD: - case SUBTRACT: - return 11; - case LESS_THAN: - case LESS_THAN_OR_EQUAL: - case GREATER_THAN: - case GREATER_THAN_OR_EQUAL: - return 9; - case EQUALS: - case NOT_EQUALS: - return 8; - case BOOLEAN_AND: - return 4; - case BOOLEAN_OR: - return 3; - default: - throw new UnsupportedOperationException(); - } - } - - @Override - public Integer visit(InstanceOfNode instanceOf) { - return 9; - } - - @Override - public Integer visit(FieldAccessNode fieldAccess) { - return 15; - } - - @Override - public Integer visit(TypeCoercionNode typeCoercion) { - return precedence(typeCoercion.getExpression()); - } - - @Override - public Integer visit(CastNode cast) { - return 13; - } - - @Override - public Integer visit(InstanceReceiver receiver) { - return precedence(receiver.getExpression()); - } - - @Override - public Integer visit(StaticReceiver receiver) { - return Integer.MAX_VALUE; - } + public static class Precedence { + public Integer visit(LiteralNode literal) { + return Integer.MAX_VALUE; + } - @Override - public Integer visit(ReturnNode returnNode) { - return 0; - } + public Integer visit(VariableReferenceNode variableReference) { + return Integer.MAX_VALUE; + } - @Override - public Integer visit(ThrowNode throwNode) { - return 0; - } + public Integer visit(ThisReferenceNode reference) { + return Integer.MAX_VALUE; + } - @Override - public Integer visit(ExpressionStatementNode expressionStatement) { - return 0; - } + public Integer visit(ArrayNode array) { + return Integer.MAX_VALUE; + } - @Override - public Integer visit(LocalVariableDeclarationNode localVariableDeclaration) { - return 0; - } + public Integer visit(AssignmentNode assignment) { + return 1; + } - @Override - public Integer visit(IfStatementNode ifStatement) { - return 0; - } + public Integer visit(TernaryConditionalNode ternaryConditional) { + return 2; + } - @Override - public Integer visit(WhileNode whileLoop) { - return 0; - } + public Integer visit(MethodCallNode methodCall) { + return 15; + } - @Override - public Integer visit(TryNode tryStatement) { - return 0; - } + public Integer visit(ConstructorCallNode call) { + return 13; + } - @Override - public Integer visit(FormalTypeParameterNode parameter) { - return 0; + public Integer visit(OperationNode operation) { + switch (operation.getOperator()) { + case BOOLEAN_NOT: + return 14; + case MULTIPLY: + case DIVIDE: + case MOD: + return 12; + case ADD: + case SUBTRACT: + return 11; + case LESS_THAN: + case LESS_THAN_OR_EQUAL: + case GREATER_THAN: + case GREATER_THAN_OR_EQUAL: + return 9; + case EQUALS: + case NOT_EQUALS: + return 8; + case BOOLEAN_AND: + return 4; + case BOOLEAN_OR: + return 3; + default: + throw new UnsupportedOperationException(); } + } - @Override - public Integer visit(FormalArgumentNode formalArgumentNode) { - return 0; - } + public Integer visit(InstanceOfNode instanceOf) { + return 9; + } - @Override - public Integer visit(AnnotationNode annotation) { - return 0; - } + public Integer visit(FieldAccessNode fieldAccess) { + return 15; + } - @Override - public Integer visit(MethodNode methodNode) { - return 0; - } + public Integer visit(TypeCoercionNode typeCoercion) { + return precedence(typeCoercion.getExpression()); + } - @Override - public Integer visit(ConstructorNode constructorNode) { - return 0; - } + public Integer visit(CastNode cast) { + return 13; + } - @Override - public Integer visit(FieldDeclarationNode declaration) { - return 0; - } + public Integer visit(InstanceReceiver receiver) { + return precedence(receiver.getExpression()); + } - @Override - public Integer visit(ClassNode classNode) { - return 0; - } + public Integer visit(StaticReceiver receiver) { + return Integer.MAX_VALUE; + } - @Override - public Integer visit(InterfaceNode interfaceNode) { - return 0; - } + public Integer visit(Node node) { + return 0; + } + } - @Override - public Integer visit(EnumNode enumNode) { - return 0; - } - }); + private static int precedence(Node node) { + return precedence.apply(node); } } |
