diff options
Diffstat (limited to 'src')
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 |
