aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/ast/NodeTypes.java139
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpNodeTypes.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveInstanceMethodCall.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveStaticMethodCall.java6
4 files changed, 63 insertions, 94 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/NodeTypes.java b/src/main/java/org/zwobble/couscous/ast/NodeTypes.java
index 7edaaab..ac37540 100644
--- a/src/main/java/org/zwobble/couscous/ast/NodeTypes.java
+++ b/src/main/java/org/zwobble/couscous/ast/NodeTypes.java
@@ -1,103 +1,74 @@
package org.zwobble.couscous.ast;
-import com.google.common.collect.ImmutableMap;
import org.zwobble.couscous.ast.sugar.SwitchCaseNode;
import org.zwobble.couscous.ast.sugar.SwitchNode;
-import org.zwobble.couscous.backends.csharp.CsharpNodeTypes;
-import org.zwobble.couscous.backends.csharp.primitives.PrimitiveInstanceMethodCall;
-import org.zwobble.couscous.backends.csharp.primitives.PrimitiveStaticMethodCall;
+import java.util.HashMap;
import java.util.Map;
public class NodeTypes {
- public static final int ANNOTATION = 10000;
- public static final int ARRAY = 10001;
- public static final int ASSIGNMENT = 10002;
- public static final int CAST = 10003;
- public static final int CLASS = 10004;
- public static final int CONSTRUCTOR_CALL = 10005;
- public static final int CONSTRUCTOR = 10006;
- public static final int ENUM = 10007;
- public static final int EXCEPTION_HANDLER = 10008;
- public static final int EXPRESSION_STATEMENT = 10009;
- public static final int FIELD_ACCESS = 10010;
- public static final int FIELD_DECLARATION = 10011;
- public static final int FORMAL_ARGUMENT = 10012;
- public static final int FORMAL_TYPE_PARAMETER = 10013;
- public static final int IF_STATEMENT = 10014;
- public static final int INSTANCE_OF = 10015;
- public static final int INSTANCE_RECEIVER = 10016;
- public static final int INTERFACE = 10017;
- public static final int LITERAL = 10018;
- public static final int LOCAL_VARIABLE_DECLARATION = 10019;
- public static final int METHOD_CALL = 10020;
- public static final int METHOD = 10031;
- public static final int OPERATION = 10021;
- public static final int RETURN = 10022;
- public static final int STATIC_RECEIVER = 10023;
- public static final int SWITCH = 10032;
- public static final int SWITCH_CASE = 10033;
- public static final int TERNARY_CONDITIONAL = 10024;
- public static final int THIS_REFERENCE = 10025;
- public static final int THROW = 10026;
- public static final int TRY = 10027;
- public static final int TYPE_COERCION = 10028;
- public static final int VARIABLE_REFERENCE = 10029;
- public static final int WHILE = 10030;
- public static final int FOR = 10036;
- public static final int FOR_EACH = 10034;
- public static final int STATEMENT_BLOCK = 10035;
+ private static int count = 0;
+ private static final Map<Class<? extends Node>, Integer> NODE_TYPES = new HashMap<>();
- private NodeTypes() {
+ public static synchronized int register(Class<? extends Node> node) {
+ NODE_TYPES.put(node, count);
+ return count++;
}
- private static final Map<Class<? extends Node>, Integer> NODE_TYPES = ImmutableMap.<Class<? extends Node>, Integer>builder()
- .put(AnnotationNode.class, ANNOTATION)
- .put(ArrayNode.class, ARRAY)
- .put(AssignmentNode.class, ASSIGNMENT)
- .put(CastNode.class, CAST)
- .put(ClassNode.class, CLASS)
- .put(ConstructorCallNode.class, CONSTRUCTOR_CALL)
- .put(ConstructorNode.class, CONSTRUCTOR)
- .put(EnumNode.class, ENUM)
- //.put(ExceptionHandlerNode.class, EXCEPTION_HANDLER)
- .put(ExpressionStatementNode.class, EXPRESSION_STATEMENT)
- .put(FieldAccessNode.class, FIELD_ACCESS)
- .put(FieldDeclarationNode.class, FIELD_DECLARATION)
- .put(FormalArgumentNode.class, FORMAL_ARGUMENT)
- .put(FormalTypeParameterNode.class, FORMAL_TYPE_PARAMETER)
- .put(IfStatementNode.class, IF_STATEMENT)
- .put(InstanceOfNode.class, INSTANCE_OF)
- .put(InstanceReceiver.class, INSTANCE_RECEIVER)
- .put(InterfaceNode.class, INTERFACE)
- .put(LiteralNode.class, LITERAL)
- .put(LocalVariableDeclarationNode.class, LOCAL_VARIABLE_DECLARATION)
- .put(MethodCallNode.class, METHOD_CALL)
- .put(MethodNode.class, METHOD)
- .put(OperationNode.class, OPERATION)
- .put(ReturnNode.class, RETURN)
- .put(StaticReceiver.class, STATIC_RECEIVER)
- .put(SwitchNode.class, SWITCH)
- .put(SwitchCaseNode.class, SWITCH_CASE)
- .put(TernaryConditionalNode.class, TERNARY_CONDITIONAL)
- .put(ThisReferenceNode.class, THIS_REFERENCE)
- .put(ThrowNode.class, THROW)
- .put(TryNode.class, TRY)
- .put(TypeCoercionNode.class, TYPE_COERCION)
- .put(VariableReferenceNode.class, VARIABLE_REFERENCE)
- .put(WhileNode.class, WHILE)
- .put(ForNode.class, FOR)
- .put(ForEachNode.class, FOR_EACH)
- .put(StatementBlockNode.class, STATEMENT_BLOCK)
- .put(PrimitiveInstanceMethodCall.class, CsharpNodeTypes.PRIMITIVE_INSTANCE_METHOD_CALL)
- .put(PrimitiveStaticMethodCall.class, CsharpNodeTypes.PRIMITIVE_STATIC_METHOD_CALL)
- .build();
+ public static final int ANNOTATION = register(AnnotationNode.class);
+ public static final int ARRAY = register(ArrayNode.class);
+ public static final int ASSIGNMENT = register(AssignmentNode.class);
+ public static final int CAST = register(CastNode.class);
+ public static final int CLASS = register(ClassNode.class);
+ public static final int CONSTRUCTOR_CALL = register(ConstructorCallNode.class);
+ public static final int CONSTRUCTOR = register(ConstructorNode.class);
+ public static final int ENUM = register(EnumNode.class);
+ public static final int EXPRESSION_STATEMENT = register(ExpressionStatementNode.class);
+ public static final int FIELD_ACCESS = register(FieldAccessNode.class);
+ public static final int FIELD_DECLARATION = register(FieldDeclarationNode.class);
+ public static final int FORMAL_ARGUMENT = register(FormalArgumentNode.class);
+ public static final int FORMAL_TYPE_PARAMETER = register(FormalTypeParameterNode.class);
+ public static final int IF_STATEMENT = register(IfStatementNode.class);
+ public static final int INSTANCE_OF = register(InstanceOfNode.class);
+ public static final int INSTANCE_RECEIVER = register(InstanceReceiver.class);
+ public static final int INTERFACE = register(InterfaceNode.class);
+ public static final int LITERAL = register(LiteralNode.class);
+ public static final int LOCAL_VARIABLE_DECLARATION = register(LocalVariableDeclarationNode.class);
+ public static final int METHOD_CALL = register(MethodCallNode.class);
+ public static final int METHOD = register(MethodNode.class);
+ public static final int OPERATION = register(OperationNode.class);
+ public static final int RETURN = register(ReturnNode.class);
+ public static final int STATIC_RECEIVER = register(StaticReceiver.class);
+ public static final int SWITCH = register(SwitchNode.class);
+ public static final int SWITCH_CASE = register(SwitchCaseNode.class);
+ public static final int TERNARY_CONDITIONAL = register(TernaryConditionalNode.class);
+ public static final int THIS_REFERENCE = register(ThisReferenceNode.class);
+ public static final int THROW = register(ThrowNode.class);
+ public static final int TRY = register(TryNode.class);
+ public static final int TYPE_COERCION = register(TypeCoercionNode.class);
+ public static final int VARIABLE_REFERENCE = register(VariableReferenceNode.class);
+ public static final int WHILE = register(WhileNode.class);
+ public static final int FOR = register(ForNode.class);
+ public static final int FOR_EACH = register(ForEachNode.class);
+ public static final int STATEMENT_BLOCK = register(StatementBlockNode.class);
+
+ private NodeTypes() {
+ }
public static int forClass(Class<?> nodeClass) {
if (NODE_TYPES.containsKey(nodeClass)) {
return NODE_TYPES.get(nodeClass);
} else {
- throw new UnsupportedOperationException("Unknown node class: " + nodeClass);
+ try {
+ Class.forName(nodeClass.getName(), true, nodeClass.getClassLoader());
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ if (NODE_TYPES.containsKey(nodeClass)) {
+ return NODE_TYPES.get(nodeClass);
+ } else {
+ throw new UnsupportedOperationException("Unknown node class: " + nodeClass);
+ }
}
}
}
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpNodeTypes.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpNodeTypes.java
deleted file mode 100644
index 11be7e5..0000000
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpNodeTypes.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package org.zwobble.couscous.backends.csharp;
-
-public class CsharpNodeTypes {
- public static final int PRIMITIVE_INSTANCE_METHOD_CALL = 20000;
- public static final int PRIMITIVE_STATIC_METHOD_CALL = 20001;
-}
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveInstanceMethodCall.java b/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveInstanceMethodCall.java
index 25555d8..4eeb22c 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveInstanceMethodCall.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveInstanceMethodCall.java
@@ -2,8 +2,8 @@ package org.zwobble.couscous.backends.csharp.primitives;
import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.ast.Node;
+import org.zwobble.couscous.ast.NodeTypes;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
-import org.zwobble.couscous.backends.csharp.CsharpNodeTypes;
import org.zwobble.couscous.types.Type;
import java.util.List;
@@ -11,6 +11,8 @@ import java.util.List;
import static org.zwobble.couscous.util.ExtraIterables.lazyCons;
public class PrimitiveInstanceMethodCall implements ExpressionNode {
+ private final static int NODE_TYPE = NodeTypes.register(PrimitiveInstanceMethodCall.class);
+
private final PrimitiveInstanceMethod method;
private final ExpressionNode receiver;
private final List<ExpressionNode> arguments;
@@ -28,7 +30,7 @@ public class PrimitiveInstanceMethodCall implements ExpressionNode {
@Override
public int type() {
- return CsharpNodeTypes.PRIMITIVE_INSTANCE_METHOD_CALL;
+ return NODE_TYPE;
}
@Override
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveStaticMethodCall.java b/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveStaticMethodCall.java
index 94b26da..6ce3660 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveStaticMethodCall.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/primitives/PrimitiveStaticMethodCall.java
@@ -2,13 +2,15 @@ package org.zwobble.couscous.backends.csharp.primitives;
import org.zwobble.couscous.ast.ExpressionNode;
import org.zwobble.couscous.ast.Node;
+import org.zwobble.couscous.ast.NodeTypes;
import org.zwobble.couscous.ast.visitors.NodeTransformer;
-import org.zwobble.couscous.backends.csharp.CsharpNodeTypes;
import org.zwobble.couscous.types.Type;
import java.util.List;
public class PrimitiveStaticMethodCall implements ExpressionNode {
+ private final static int NODE_TYPE = NodeTypes.register(PrimitiveStaticMethodCall.class);
+
private final PrimitiveStaticMethod method;
private final List<ExpressionNode> arguments;
@@ -24,7 +26,7 @@ public class PrimitiveStaticMethodCall implements ExpressionNode {
@Override
public int type() {
- return CsharpNodeTypes.PRIMITIVE_STATIC_METHOD_CALL;
+ return NODE_TYPE;
}
@Override