diff options
Diffstat (limited to 'src/main/java/org/zwobble')
50 files changed, 1847 insertions, 974 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java index bb5b054..9424e39 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeVisitors.java @@ -4,6 +4,7 @@ import org.zwobble.couscous.ast.AssignmentNode; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ConstructorCallNode; import org.zwobble.couscous.ast.ConstructorNode; +import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.ast.ExpressionStatementNode; import org.zwobble.couscous.ast.FieldAccessNode; import org.zwobble.couscous.ast.LiteralNode; @@ -12,16 +13,15 @@ import org.zwobble.couscous.ast.MethodCallNode; import org.zwobble.couscous.ast.MethodNode; import org.zwobble.couscous.ast.Node; import org.zwobble.couscous.ast.ReturnNode; +import org.zwobble.couscous.ast.StatementNode; import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.ThisReferenceNode; import org.zwobble.couscous.ast.VariableReferenceNode; -import lombok.val; - public class NodeVisitors { public static void visitAll(Node node, NodeVisitor visitor) { - node.accept(new NodeVisitor() { + node.accept(new NodeVisitor(){ @Override public void visit(LiteralNode literal) { visitor.visit(literal); @@ -31,7 +31,7 @@ public class NodeVisitors { public void visit(VariableReferenceNode variableReference) { visitor.visit(variableReference); } - + @Override public void visit(ThisReferenceNode reference) { visitor.visit(reference); @@ -56,7 +56,7 @@ public class NodeVisitors { public void visit(MethodCallNode methodCall) { visitor.visit(methodCall); methodCall.getReceiver().accept(this); - for (val argument : methodCall.getArguments()) { + for (ExpressionNode argument : methodCall.getArguments()) { argument.accept(this); } } @@ -64,19 +64,19 @@ public class NodeVisitors { @Override public void visit(StaticMethodCallNode staticMethodCall) { visitor.visit(staticMethodCall); - for (val argument : staticMethodCall.getArguments()) { + for (ExpressionNode argument : staticMethodCall.getArguments()) { argument.accept(this); } } - + @Override public void visit(ConstructorCallNode call) { visitor.visit(call); - for (val argument : call.getArguments()) { + for (ExpressionNode argument : call.getArguments()) { argument.accept(this); } } - + @Override public void visit(FieldAccessNode fieldAccess) { visitor.visit(fieldAccess); @@ -99,29 +99,29 @@ public class NodeVisitors { visitor.visit(localVariableDeclaration); localVariableDeclaration.getInitialValue().accept(this); } - + @Override public void visit(ClassNode classNode) { visitor.visit(classNode); classNode.getConstructor().accept(this); - for (val method : classNode.getMethods()) { + for (MethodNode method : classNode.getMethods()) { method.accept(this); } } - + @Override public void visit(MethodNode methodNode) { - for (val statement : methodNode.getBody()) { + for (StatementNode statement : methodNode.getBody()) { statement.accept(this); } } - + @Override public void visit(ConstructorNode constructorNode) { - for (val statement : constructorNode.getBody()) { + for (StatementNode statement : constructorNode.getBody()) { statement.accept(this); } } }); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java index cc2b116..01e62c1 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCodeGenerator.java @@ -1,10 +1,10 @@ package org.zwobble.couscous.backends.python; +import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; - import org.zwobble.couscous.ast.AssignmentNode; import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.ConstructorCallNode; @@ -28,6 +28,7 @@ import org.zwobble.couscous.ast.visitors.NodeVisitorWithEmptyDefaults; import org.zwobble.couscous.ast.visitors.NodeVisitors; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; import org.zwobble.couscous.backends.python.ast.PythonBlock; +import org.zwobble.couscous.backends.python.ast.PythonClassNode; import org.zwobble.couscous.backends.python.ast.PythonExpressionNode; import org.zwobble.couscous.backends.python.ast.PythonFunctionDefinitionNode; import org.zwobble.couscous.backends.python.ast.PythonImportNode; @@ -40,13 +41,11 @@ import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValueVisitor; import org.zwobble.couscous.values.StringValue; import org.zwobble.couscous.values.UnitValue; - import com.google.common.base.Strings; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.common.collect.Iterators; - import static com.google.common.collect.Iterators.singletonIterator; import static java.util.Arrays.asList; import static org.zwobble.couscous.backends.python.ast.PythonAssignmentNode.pythonAssignment; @@ -64,54 +63,38 @@ import static org.zwobble.couscous.backends.python.ast.PythonReturnNode.pythonRe import static org.zwobble.couscous.backends.python.ast.PythonStringLiteralNode.pythonStringLiteral; import static org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode.pythonVariableReference; -import lombok.val; - public class PythonCodeGenerator { + + public static PythonModuleNode generateCode(ClassNode classNode) { - val imports = generateImports(classNode).iterator(); - - val constructor = generateConstructor(classNode.getConstructor()); - - val pythonMethods = Iterables.transform( - classNode.getMethods(), - PythonCodeGenerator::generateFunction); - - - val pythonBody = Iterables.concat( - asList(constructor), - pythonMethods); - - val pythonClass = pythonClass( - classNode.getSimpleName(), - ImmutableList.copyOf(pythonBody)); - - return pythonModule(ImmutableList.copyOf(Iterators.concat( - imports, - singletonIterator(pythonClass)))); + Iterator<org.zwobble.couscous.backends.python.ast.PythonImportNode> imports = generateImports(classNode).iterator(); + PythonFunctionDefinitionNode constructor = generateConstructor(classNode.getConstructor()); + Iterable<PythonFunctionDefinitionNode> pythonMethods = Iterables.transform(classNode.getMethods(), PythonCodeGenerator::generateFunction); + Iterable<PythonStatementNode> pythonBody = Iterables.concat(asList(constructor), pythonMethods); + PythonClassNode pythonClass = pythonClass(classNode.getSimpleName(), ImmutableList.copyOf(pythonBody)); + return pythonModule(ImmutableList.copyOf(Iterators.concat(imports, singletonIterator(pythonClass)))); } - + private static Stream<PythonImportNode> generateImports(ClassNode classNode) { - val classes = findReferencedClasses(classNode); - return classes.stream() - .map(name -> pythonImport( - Strings.repeat(".", packageDepth(classNode) + 1) + name.getQualifiedName(), - asList(pythonImportAlias(name.getSimpleName())))); + final java.util.Set<org.zwobble.couscous.ast.TypeName> classes = findReferencedClasses(classNode); + return classes.stream().map(name -> pythonImport(Strings.repeat(".", packageDepth(classNode) + 1) + name.getQualifiedName(), asList(pythonImportAlias(name.getSimpleName())))); } private static int packageDepth(ClassNode classNode) { int depth = 0; - val qualifiedName = classNode.getName().getQualifiedName(); + final java.lang.String qualifiedName = classNode.getName().getQualifiedName(); for (int index = 0; index < qualifiedName.length(); index++) { if (qualifiedName.charAt(index) == '.') { - depth += 1; + depth += 1; } } return depth; } private static Set<TypeName> findReferencedClasses(ClassNode classNode) { - val imports = ImmutableSet.<TypeName>builder(); - NodeVisitors.visitAll(classNode, new NodeVisitorWithEmptyDefaults() { + ImmutableSet.Builder<TypeName> imports = ImmutableSet.builder(); + NodeVisitors.visitAll(classNode, new NodeVisitorWithEmptyDefaults(){ + @Override public void visit(StaticMethodCallNode staticMethodCall) { imports.add(staticMethodCall.getClassName()); @@ -126,22 +109,23 @@ public class PythonCodeGenerator { } public static PythonExpressionNode generateCode(PrimitiveValue value) { - return value.accept(new PrimitiveValueVisitor<PythonExpressionNode>() { + return value.accept(new PrimitiveValueVisitor<PythonExpressionNode>(){ + @Override public PythonExpressionNode visit(IntegerValue value) { return pythonIntegerLiteral(value.getValue()); } - + @Override public PythonExpressionNode visit(StringValue value) { return pythonStringLiteral(value.getValue()); } - + @Override public PythonExpressionNode visit(BooleanValue value) { return pythonBooleanLiteral(value.getValue()); } - + @Override public PythonExpressionNode visit(UnitValue unitValue) { throw new UnsupportedOperationException(); @@ -149,45 +133,18 @@ public class PythonCodeGenerator { }); } - private static PythonFunctionDefinitionNode generateConstructor( - ConstructorNode constructor) { - val explicitArgumentNames = Iterables.transform( - constructor.getArguments(), - argument -> argument.getName()); - - val argumentNames = Iterables.concat( - asList("self"), - explicitArgumentNames); - - val pythonBody = constructor.getBody() - .stream() - .map(PythonCodeGenerator::generateStatement) - .collect(Collectors.toList()); - - return pythonFunctionDefinition( - "__init__", - ImmutableList.copyOf(argumentNames), - new PythonBlock(pythonBody)); + private static PythonFunctionDefinitionNode generateConstructor(ConstructorNode constructor) { + Iterable<String> explicitArgumentNames = Iterables.transform(constructor.getArguments(), argument -> argument.getName()); + Iterable<String> argumentNames = Iterables.concat(asList("self"), explicitArgumentNames); + List<PythonStatementNode> pythonBody = constructor.getBody().stream().map(PythonCodeGenerator::generateStatement).collect(Collectors.toList()); + return pythonFunctionDefinition("__init__", ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody)); } private static PythonFunctionDefinitionNode generateFunction(MethodNode method) { - val explicitArgumentNames = Iterables.transform( - method.getArguments(), - argument -> argument.getName()); - - val argumentNames = Iterables.concat( - method.isStatic() ? asList() : asList("self"), - explicitArgumentNames); - - val pythonBody = method.getBody() - .stream() - .map(PythonCodeGenerator::generateStatement) - .collect(Collectors.toList()); - - return pythonFunctionDefinition( - method.getName(), - ImmutableList.copyOf(argumentNames), - new PythonBlock(pythonBody)); + Iterable<String> explicitArgumentNames = Iterables.transform(method.getArguments(), argument -> argument.getName()); + Iterable<String> argumentNames = Iterables.concat(method.isStatic() ? asList() : asList("self"), explicitArgumentNames); + List<PythonStatementNode> pythonBody = method.getBody().stream().map(PythonCodeGenerator::generateStatement).collect(Collectors.toList()); + return pythonFunctionDefinition(method.getName(), ImmutableList.copyOf(argumentNames), new PythonBlock(pythonBody)); } private static PythonStatementNode generateStatement(StatementNode statement) { @@ -195,28 +152,26 @@ public class PythonCodeGenerator { } private static class StatementGenerator implements StatementNodeMapper<PythonStatementNode> { + + @Override public PythonStatementNode visit(ReturnNode returnNode) { return pythonReturn(generateExpression(returnNode.getValue())); } - + @Override public PythonStatementNode visit(ExpressionStatementNode expressionStatement) { if (expressionStatement.getExpression() instanceof AssignmentNode) { - val assignment = (AssignmentNode) expressionStatement.getExpression(); - return pythonAssignment( - assignment.getTarget().accept(EXPRESSION_GENERATOR), - generateExpression(assignment.getValue())); + final org.zwobble.couscous.ast.AssignmentNode assignment = (AssignmentNode)expressionStatement.getExpression(); + return pythonAssignment(assignment.getTarget().accept(EXPRESSION_GENERATOR), generateExpression(assignment.getValue())); } else { - throw new UnsupportedOperationException(); + throw new UnsupportedOperationException(); } } - + @Override public PythonStatementNode visit(LocalVariableDeclarationNode declaration) { - return pythonAssignment( - pythonVariableReference(declaration.getDeclaration().getName()), - generateExpression(declaration.getInitialValue())); + return pythonAssignment(pythonVariableReference(declaration.getDeclaration().getName()), generateExpression(declaration.getInitialValue())); } } @@ -225,89 +180,74 @@ public class PythonCodeGenerator { } private static List<PythonExpressionNode> generateExpressions(Iterable<ExpressionNode> expressions) { - return ImmutableList.copyOf( - Iterables.transform(expressions, PythonCodeGenerator::generateExpression)); + return ImmutableList.copyOf(Iterables.transform(expressions, PythonCodeGenerator::generateExpression)); } - private static final ExpressionGenerator EXPRESSION_GENERATOR = new ExpressionGenerator(); private static class ExpressionGenerator implements ExpressionNodeMapper<PythonExpressionNode> { + + @Override public PythonExpressionNode visit(LiteralNode literal) { return generateCode(literal.getValue()); } - + @Override public PythonVariableReferenceNode visit(VariableReferenceNode variableReference) { return pythonVariableReference(variableReference.getReferent().getName()); } - + @Override public PythonExpressionNode visit(ThisReferenceNode reference) { return pythonVariableReference("self"); } - + @Override public PythonExpressionNode visit(AssignmentNode assignment) { throw new UnsupportedOperationException(); } - + @Override public PythonExpressionNode visit(TernaryConditionalNode ternaryConditional) { - return pythonConditionalExpression( - generateExpression(ternaryConditional.getCondition()), - generateExpression(ternaryConditional.getIfTrue()), - generateExpression(ternaryConditional.getIfFalse())); + return pythonConditionalExpression(generateExpression(ternaryConditional.getCondition()), generateExpression(ternaryConditional.getIfTrue()), generateExpression(ternaryConditional.getIfFalse())); } - + @Override public PythonExpressionNode visit(MethodCallNode methodCall) { - val receiver = generateExpression(methodCall.getReceiver()); - val arguments = generateExpressions(methodCall.getArguments()); + final org.zwobble.couscous.backends.python.ast.PythonExpressionNode receiver = generateExpression(methodCall.getReceiver()); + final java.util.List<org.zwobble.couscous.backends.python.ast.PythonExpressionNode> arguments = generateExpressions(methodCall.getArguments()); if (isPrimitive(methodCall.getReceiver())) { - val primitiveMethodGenerator = PrimitiveMethods.getPrimitiveMethod( - methodCall.getReceiver().getType(), - methodCall.getMethodName()).get(); + final org.zwobble.couscous.backends.python.PrimitiveMethods.PrimitiveMethodGenerator primitiveMethodGenerator = PrimitiveMethods.getPrimitiveMethod(methodCall.getReceiver().getType(), methodCall.getMethodName()).get(); return primitiveMethodGenerator.generate(receiver, arguments); } else { - return pythonCall( - pythonAttributeAccess(receiver, methodCall.getMethodName()), - arguments); + return pythonCall(pythonAttributeAccess(receiver, methodCall.getMethodName()), arguments); } } - + @Override public PythonExpressionNode visit(StaticMethodCallNode staticMethodCall) { - val className = staticMethodCall.getClassName(); - val classReference = pythonVariableReference(className.getSimpleName()); - - val methodReference = pythonAttributeAccess( - classReference, - staticMethodCall.getMethodName()); - - val arguments = generateExpressions(staticMethodCall.getArguments()); - + final org.zwobble.couscous.ast.TypeName className = staticMethodCall.getClassName(); + final org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode classReference = pythonVariableReference(className.getSimpleName()); + final org.zwobble.couscous.backends.python.ast.PythonAttributeAccessNode methodReference = pythonAttributeAccess(classReference, staticMethodCall.getMethodName()); + final java.util.List<org.zwobble.couscous.backends.python.ast.PythonExpressionNode> arguments = generateExpressions(staticMethodCall.getArguments()); return pythonCall(methodReference, arguments); } - + @Override public PythonExpressionNode visit(ConstructorCallNode call) { - val className = call.getType(); - val classReference = pythonVariableReference(className.getSimpleName()); - val arguments = generateExpressions(call.getArguments()); - + final org.zwobble.couscous.ast.TypeName className = call.getType(); + final org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode classReference = pythonVariableReference(className.getSimpleName()); + final java.util.List<org.zwobble.couscous.backends.python.ast.PythonExpressionNode> arguments = generateExpressions(call.getArguments()); return pythonCall(classReference, arguments); } - + @Override public PythonExpressionNode visit(FieldAccessNode fieldAccess) { - return pythonAttributeAccess( - generateExpression(fieldAccess.getLeft()), - fieldAccess.getFieldName()); + return pythonAttributeAccess(generateExpression(fieldAccess.getLeft()), fieldAccess.getFieldName()); } } private static boolean isPrimitive(ExpressionNode value) { return PrimitiveMethods.isPrimitive(value.getType()); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonCompiler.java b/src/main/java/org/zwobble/couscous/backends/python/PythonCompiler.java index 8787d81..c5ea3e3 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonCompiler.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonCompiler.java @@ -5,62 +5,55 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.List; - import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.ast.ClassNode; - import static java.util.Arrays.asList; import static org.zwobble.couscous.backends.python.PythonCodeGenerator.generateCode; import static org.zwobble.couscous.backends.python.PythonSerializer.serialize; -import lombok.SneakyThrows; -import lombok.val; - public class PythonCompiler { private final Path root; private final String packageName; - + public PythonCompiler(Path root, String packageName) { this.root = root; this.packageName = packageName; } public void compile(List<ClassNode> classes) { - for (val classNode : classes) { + for (ClassNode classNode : classes) { compileClass(classNode); } - writeClass(TypeName.of("java.lang.Integer"), - "class Integer(object):\n" + - " def parseInt(value):\n" + - " return int(value)" - ); + writeClass(TypeName.of("java.lang.Integer"), "class Integer(object):\n def parseInt(value):\n return int(value)"); } - + private Path pathForClass(TypeName className) { - return root - .resolve(packageName) + return root.resolve(packageName) .resolve(className.getQualifiedName().replace(".", File.separator) + ".py"); } - + private void compileClass(ClassNode classNode) { writeClass(classNode.getName(), serialize(generateCode(classNode))); } - - @SneakyThrows + private void writeClass(TypeName name, String contents) { - val path = pathForClass(name); - Files.createDirectories(path.getParent()); - createPythonPackages(path.getParent()); - Files.write(path, asList(contents)); + try { + final java.nio.file.Path path = pathForClass(name); + Files.createDirectories(path.getParent()); + createPythonPackages(path.getParent()); + Files.write(path, asList(contents)); + } catch (final java.lang.Throwable $ex) { + throw new RuntimeException($ex); + } } - + private void createPythonPackages(Path packagePath) throws IOException { while (packagePath.startsWith(root)) { - val packageFile = packagePath.resolve("__init__.py"); + final java.nio.file.Path packageFile = packagePath.resolve("__init__.py"); if (!packageFile.toFile().exists()) { Files.createFile(packageFile); } packagePath = packagePath.getParent(); } } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java index 249d9fa..1674e1f 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/python/PythonSerializer.java @@ -2,7 +2,6 @@ package org.zwobble.couscous.backends.python; import java.util.List; import java.util.function.Consumer; - import org.zwobble.couscous.backends.python.ast.PythonAssignmentNode; import org.zwobble.couscous.backends.python.ast.PythonAttributeAccessNode; import org.zwobble.couscous.backends.python.ast.PythonBlock; @@ -19,19 +18,17 @@ import org.zwobble.couscous.backends.python.ast.PythonModuleNode; import org.zwobble.couscous.backends.python.ast.PythonNode; import org.zwobble.couscous.backends.python.ast.PythonPassNode; import org.zwobble.couscous.backends.python.ast.PythonReturnNode; +import org.zwobble.couscous.backends.python.ast.PythonStatementNode; import org.zwobble.couscous.backends.python.ast.PythonStringLiteralNode; import org.zwobble.couscous.backends.python.ast.PythonVariableReferenceNode; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; import org.zwobble.couscous.util.Action; - import static com.google.common.collect.Iterables.skip; -import lombok.val; - public class PythonSerializer implements PythonNodeVisitor { public static String serialize(PythonNode node) { - val writer = new PythonWriter(); - val serializer = new PythonSerializer(writer); + PythonWriter writer = new PythonWriter(); + PythonSerializer serializer = new PythonSerializer(writer); serializer.write(node); return writer.asString(); } @@ -50,22 +47,22 @@ public class PythonSerializer implements PythonNodeVisitor { public void visit(PythonIntegerLiteralNode integerLiteral) { writer.writeInteger(integerLiteral.getValue()); } - + @Override public void visit(PythonStringLiteralNode stringLiteral) { writer.writeStringLiteral(stringLiteral.getValue()); } - + @Override public void visit(PythonBooleanLiteralNode booleanLiteral) { writer.writeKeyword(booleanLiteral.getValue() ? "True" : "False"); } - + @Override public void visit(PythonVariableReferenceNode reference) { writer.writeIdentifier(reference.getName()); } - + @Override public void visit(PythonConditionalExpressionNode conditional) { writeParenthesised(conditional.getTrueValue()); @@ -78,14 +75,14 @@ public class PythonSerializer implements PythonNodeVisitor { writer.writeSpace(); writeParenthesised(conditional.getFalseValue()); } - + @Override public void visit(PythonAttributeAccessNode attributeAccess) { writeParenthesised(attributeAccess.getLeft()); writer.writeSymbol("."); writer.writeIdentifier(attributeAccess.getAttributeName()); } - + @Override public void visit(PythonCallNode call) { writeParenthesised(call.getCallee()); @@ -96,7 +93,7 @@ public class PythonSerializer implements PythonNodeVisitor { }); writer.writeSymbol(")"); } - + @Override public void visit(PythonGetSliceNode getSlice) { writeParenthesised(getSlice.getReceiver()); @@ -106,7 +103,7 @@ public class PythonSerializer implements PythonNodeVisitor { }); writer.writeSymbol("]"); } - + @Override public void visit(PythonReturnNode pythonReturn) { writer.writeStatement(() -> { @@ -115,14 +112,14 @@ public class PythonSerializer implements PythonNodeVisitor { write(pythonReturn.getValue()); }); } - + @Override public void visit(PythonPassNode pass) { writer.writeStatement(() -> { - writer.writeKeyword("pass"); + writer.writeKeyword("pass"); }); } - + @Override public void visit(PythonClassNode pythonClass) { writer.writeStatement(() -> { @@ -135,7 +132,7 @@ public class PythonSerializer implements PythonNodeVisitor { writeBlock(pythonClass.getBody()); }); } - + @Override public void visit(PythonFunctionDefinitionNode functionDefinition) { writer.writeStatement(() -> { @@ -148,7 +145,7 @@ public class PythonSerializer implements PythonNodeVisitor { writeBlock(functionDefinition.getBody()); }); } - + @Override public void visit(PythonAssignmentNode assignment) { writer.writeStatement(() -> { @@ -157,10 +154,9 @@ public class PythonSerializer implements PythonNodeVisitor { writer.writeSymbol("="); writer.writeSpace(); write(assignment.getValue()); - }); } - + @Override public void visit(PythonImportNode importNode) { writer.writeStatement(() -> { @@ -170,38 +166,32 @@ public class PythonSerializer implements PythonNodeVisitor { writer.writeSpace(); writer.writeKeyword("import"); writer.writeSpace(); - writeWithSeparator( - importNode.getAliases(), - alias -> { - writer.writeIdentifier(alias.getName()); - }, - () -> { - writer.writeSymbol(","); - writer.writeSpace(); - }); + writeWithSeparator(importNode.getAliases(), alias -> { + writer.writeIdentifier(alias.getName()); + }, () -> { + writer.writeSymbol(","); + writer.writeSpace(); + }); }); } - + private void writeParenthesised(PythonExpressionNode expression) { writer.writeSymbol("("); write(expression); writer.writeSymbol(")"); } - + private void writeArgumentNames(PythonFunctionDefinitionNode functionDefinition) { - writeWithSeparator( - functionDefinition.getArgumentNames(), - writer::writeIdentifier, - () -> { - writer.writeSymbol(","); - writer.writeSpace(); - }); + writeWithSeparator(functionDefinition.getArgumentNames(), writer::writeIdentifier, () -> { + writer.writeSymbol(","); + writer.writeSpace(); + }); } - + private <T> void writeWithSeparator(List<T> values, Consumer<T> writeValue, Action separator) { if (!values.isEmpty()) { writeValue.accept(values.get(0)); - for (val value : skip(values, 1)) { + for (T value : skip(values, 1)) { separator.run(); writeValue.accept(value); } @@ -210,16 +200,16 @@ public class PythonSerializer implements PythonNodeVisitor { @Override public void visit(PythonModuleNode module) { - for (val statement : module.getStatements()) { + for (PythonStatementNode statement : module.getStatements()) { write(statement); } } - + private void writeBlock(PythonBlock body) { writer.startBlock(); - for (val statement : body) { + for (PythonStatementNode statement : body) { write(statement); } writer.endBlock(); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAssignmentNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAssignmentNode.java index 9c5b20a..37ca7b7 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAssignmentNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAssignmentNode.java @@ -2,15 +2,59 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonAssignment") -public class PythonAssignmentNode implements PythonStatementNode { - PythonExpressionNode target; - PythonExpressionNode value; +public final class PythonAssignmentNode implements PythonStatementNode { + private final PythonExpressionNode target; + private final PythonExpressionNode value; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonAssignmentNode(final PythonExpressionNode target, final PythonExpressionNode value) { + this.target = target; + this.value = value; + } + + public static PythonAssignmentNode pythonAssignment(final PythonExpressionNode target, final PythonExpressionNode value) { + return new PythonAssignmentNode(target, value); + } + + public PythonExpressionNode getTarget() { + return this.target; + } + + public PythonExpressionNode getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonAssignmentNode)) return false; + final PythonAssignmentNode other = (PythonAssignmentNode)o; + final java.lang.Object this$target = this.getTarget(); + final java.lang.Object other$target = other.getTarget(); + if (this$target == null ? other$target != null : !this$target.equals(other$target)) return false; + final java.lang.Object this$value = this.getValue(); + final java.lang.Object other$value = other.getValue(); + if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $target = this.getTarget(); + result = result * PRIME + ($target == null ? 43 : $target.hashCode()); + final java.lang.Object $value = this.getValue(); + result = result * PRIME + ($value == null ? 43 : $value.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonAssignmentNode(target=" + this.getTarget() + ", value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAttributeAccessNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAttributeAccessNode.java index ccd795f..bb46af3 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAttributeAccessNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonAttributeAccessNode.java @@ -2,15 +2,59 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonAttributeAccess") -public class PythonAttributeAccessNode implements PythonExpressionNode { - PythonExpressionNode left; - String attributeName; +public final class PythonAttributeAccessNode implements PythonExpressionNode { + private final PythonExpressionNode left; + private final String attributeName; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonAttributeAccessNode(final PythonExpressionNode left, final String attributeName) { + this.left = left; + this.attributeName = attributeName; + } + + public static PythonAttributeAccessNode pythonAttributeAccess(final PythonExpressionNode left, final String attributeName) { + return new PythonAttributeAccessNode(left, attributeName); + } + + public PythonExpressionNode getLeft() { + return this.left; + } + + public String getAttributeName() { + return this.attributeName; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonAttributeAccessNode)) return false; + final PythonAttributeAccessNode other = (PythonAttributeAccessNode)o; + final java.lang.Object this$left = this.getLeft(); + final java.lang.Object other$left = other.getLeft(); + if (this$left == null ? other$left != null : !this$left.equals(other$left)) return false; + final java.lang.Object this$attributeName = this.getAttributeName(); + final java.lang.Object other$attributeName = other.getAttributeName(); + if (this$attributeName == null ? other$attributeName != null : !this$attributeName.equals(other$attributeName)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $left = this.getLeft(); + result = result * PRIME + ($left == null ? 43 : $left.hashCode()); + final java.lang.Object $attributeName = this.getAttributeName(); + result = result * PRIME + ($attributeName == null ? 43 : $attributeName.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonAttributeAccessNode(left=" + this.getLeft() + ", attributeName=" + this.getAttributeName() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBooleanLiteralNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBooleanLiteralNode.java index 349ab4b..3f3d9a0 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBooleanLiteralNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonBooleanLiteralNode.java @@ -2,14 +2,8 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Value; - -@Value(staticConstructor="pythonBooleanLiteral") -public class PythonBooleanLiteralNode implements PythonExpressionNode { - @Getter(value = AccessLevel.NONE) - boolean value; +public final class PythonBooleanLiteralNode implements PythonExpressionNode { + private final boolean value; public boolean getValue() { return value; @@ -19,4 +13,34 @@ public class PythonBooleanLiteralNode implements PythonExpressionNode { public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonBooleanLiteralNode(final boolean value) { + this.value = value; + } + + public static PythonBooleanLiteralNode pythonBooleanLiteral(final boolean value) { + return new PythonBooleanLiteralNode(value); + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonBooleanLiteralNode)) return false; + final PythonBooleanLiteralNode other = (PythonBooleanLiteralNode)o; + if (this.getValue() != other.getValue()) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + (this.getValue() ? 79 : 97); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonBooleanLiteralNode(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonCallNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonCallNode.java index 92c8b20..6cc5b11 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonCallNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonCallNode.java @@ -1,19 +1,61 @@ package org.zwobble.couscous.backends.python.ast; import java.util.List; - import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonCall") -public class PythonCallNode implements PythonExpressionNode { - PythonExpressionNode callee; - List<PythonExpressionNode> arguments; - +public final class PythonCallNode implements PythonExpressionNode { + private final PythonExpressionNode callee; + private final List<PythonExpressionNode> arguments; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonCallNode(final PythonExpressionNode callee, final List<PythonExpressionNode> arguments) { + this.callee = callee; + this.arguments = arguments; + } + + public static PythonCallNode pythonCall(final PythonExpressionNode callee, final List<PythonExpressionNode> arguments) { + return new PythonCallNode(callee, arguments); + } + + public PythonExpressionNode getCallee() { + return this.callee; + } + + public List<PythonExpressionNode> getArguments() { + return this.arguments; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonCallNode)) return false; + final PythonCallNode other = (PythonCallNode)o; + final java.lang.Object this$callee = this.getCallee(); + final java.lang.Object other$callee = other.getCallee(); + if (this$callee == null ? other$callee != null : !this$callee.equals(other$callee)) return false; + final java.lang.Object this$arguments = this.getArguments(); + final java.lang.Object other$arguments = other.getArguments(); + if (this$arguments == null ? other$arguments != null : !this$arguments.equals(other$arguments)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $callee = this.getCallee(); + result = result * PRIME + ($callee == null ? 43 : $callee.hashCode()); + final java.lang.Object $arguments = this.getArguments(); + result = result * PRIME + ($arguments == null ? 43 : $arguments.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonCallNode(callee=" + this.getCallee() + ", arguments=" + this.getArguments() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonClassNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonClassNode.java index 3ed7eba..8fe2ffe 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonClassNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonClassNode.java @@ -1,15 +1,11 @@ package org.zwobble.couscous.backends.python.ast; import java.util.List; - import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; - import com.google.common.collect.ImmutableList; -import lombok.Value; - -@Value(staticConstructor="pythonClass") -public class PythonClassNode implements PythonStatementNode { +public final class PythonClassNode implements PythonStatementNode { + public static Builder builder(String name) { return new Builder(name); } @@ -17,7 +13,7 @@ public class PythonClassNode implements PythonStatementNode { public static class Builder { private final String name; private final ImmutableList.Builder<PythonStatementNode> statements; - + public Builder(String name) { this.name = name; this.statements = ImmutableList.builder(); @@ -26,7 +22,7 @@ public class PythonClassNode implements PythonStatementNode { public PythonClassNode build() { return new PythonClassNode(name, new PythonBlock(statements.build())); } - + public Builder statement(PythonStatementNode statement) { statements.add(statement); return this; @@ -36,13 +32,58 @@ public class PythonClassNode implements PythonStatementNode { public static PythonClassNode pythonClass(String name, List<? extends PythonStatementNode> body) { return new PythonClassNode(name, new PythonBlock(body)); } - - String name; - PythonBlock body; + private final String name; + private final PythonBlock body; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } - -} + + private PythonClassNode(final String name, final PythonBlock body) { + this.name = name; + this.body = body; + } + + public static PythonClassNode pythonClass(final String name, final PythonBlock body) { + return new PythonClassNode(name, body); + } + + public String getName() { + return this.name; + } + + public PythonBlock getBody() { + return this.body; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonClassNode)) return false; + final PythonClassNode other = (PythonClassNode)o; + final java.lang.Object this$name = this.getName(); + final java.lang.Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + final java.lang.Object this$body = this.getBody(); + final java.lang.Object other$body = other.getBody(); + if (this$body == null ? other$body != null : !this$body.equals(other$body)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + final java.lang.Object $body = this.getBody(); + result = result * PRIME + ($body == null ? 43 : $body.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonClassNode(name=" + this.getName() + ", body=" + this.getBody() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonConditionalExpressionNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonConditionalExpressionNode.java index e39dce1..13f5e99 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonConditionalExpressionNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonConditionalExpressionNode.java @@ -2,16 +2,70 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonConditionalExpression") -public class PythonConditionalExpressionNode implements PythonExpressionNode { - PythonExpressionNode condition; - PythonExpressionNode trueValue; - PythonExpressionNode falseValue; +public final class PythonConditionalExpressionNode implements PythonExpressionNode { + private final PythonExpressionNode condition; + private final PythonExpressionNode trueValue; + private final PythonExpressionNode falseValue; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonConditionalExpressionNode(final PythonExpressionNode condition, final PythonExpressionNode trueValue, final PythonExpressionNode falseValue) { + this.condition = condition; + this.trueValue = trueValue; + this.falseValue = falseValue; + } + + public static PythonConditionalExpressionNode pythonConditionalExpression(final PythonExpressionNode condition, final PythonExpressionNode trueValue, final PythonExpressionNode falseValue) { + return new PythonConditionalExpressionNode(condition, trueValue, falseValue); + } + + public PythonExpressionNode getCondition() { + return this.condition; + } + + public PythonExpressionNode getTrueValue() { + return this.trueValue; + } + + public PythonExpressionNode getFalseValue() { + return this.falseValue; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonConditionalExpressionNode)) return false; + final PythonConditionalExpressionNode other = (PythonConditionalExpressionNode)o; + final java.lang.Object this$condition = this.getCondition(); + final java.lang.Object other$condition = other.getCondition(); + if (this$condition == null ? other$condition != null : !this$condition.equals(other$condition)) return false; + final java.lang.Object this$trueValue = this.getTrueValue(); + final java.lang.Object other$trueValue = other.getTrueValue(); + if (this$trueValue == null ? other$trueValue != null : !this$trueValue.equals(other$trueValue)) return false; + final java.lang.Object this$falseValue = this.getFalseValue(); + final java.lang.Object other$falseValue = other.getFalseValue(); + if (this$falseValue == null ? other$falseValue != null : !this$falseValue.equals(other$falseValue)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $condition = this.getCondition(); + result = result * PRIME + ($condition == null ? 43 : $condition.hashCode()); + final java.lang.Object $trueValue = this.getTrueValue(); + result = result * PRIME + ($trueValue == null ? 43 : $trueValue.hashCode()); + final java.lang.Object $falseValue = this.getFalseValue(); + result = result * PRIME + ($falseValue == null ? 43 : $falseValue.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonConditionalExpressionNode(condition=" + this.getCondition() + ", trueValue=" + this.getTrueValue() + ", falseValue=" + this.getFalseValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonFunctionDefinitionNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonFunctionDefinitionNode.java index a7983d6..8c50ebd 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonFunctionDefinitionNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonFunctionDefinitionNode.java @@ -1,15 +1,11 @@ package org.zwobble.couscous.backends.python.ast; import java.util.List; - import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; - import com.google.common.collect.ImmutableList; -import lombok.Value; - -@Value(staticConstructor="pythonFunctionDefinition") -public class PythonFunctionDefinitionNode implements PythonStatementNode { +public final class PythonFunctionDefinitionNode implements PythonStatementNode { + public static Builder builder(String name) { return new Builder(name); } @@ -24,7 +20,7 @@ public class PythonFunctionDefinitionNode implements PythonStatementNode { this.argumentNames = ImmutableList.builder(); this.body = ImmutableList.builder(); } - + public Builder argument(String argumentName) { argumentNames.add(argumentName); return this; @@ -34,13 +30,69 @@ public class PythonFunctionDefinitionNode implements PythonStatementNode { return pythonFunctionDefinition(name, argumentNames.build(), new PythonBlock(body.build())); } } - - String name; - List<String> argumentNames; - PythonBlock body; + private final String name; + private final List<String> argumentNames; + private final PythonBlock body; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonFunctionDefinitionNode(final String name, final List<String> argumentNames, final PythonBlock body) { + this.name = name; + this.argumentNames = argumentNames; + this.body = body; + } + + public static PythonFunctionDefinitionNode pythonFunctionDefinition(final String name, final List<String> argumentNames, final PythonBlock body) { + return new PythonFunctionDefinitionNode(name, argumentNames, body); + } + + public String getName() { + return this.name; + } + + public List<String> getArgumentNames() { + return this.argumentNames; + } + + public PythonBlock getBody() { + return this.body; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonFunctionDefinitionNode)) return false; + final PythonFunctionDefinitionNode other = (PythonFunctionDefinitionNode)o; + final java.lang.Object this$name = this.getName(); + final java.lang.Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + final java.lang.Object this$argumentNames = this.getArgumentNames(); + final java.lang.Object other$argumentNames = other.getArgumentNames(); + if (this$argumentNames == null ? other$argumentNames != null : !this$argumentNames.equals(other$argumentNames)) return false; + final java.lang.Object this$body = this.getBody(); + final java.lang.Object other$body = other.getBody(); + if (this$body == null ? other$body != null : !this$body.equals(other$body)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + final java.lang.Object $argumentNames = this.getArgumentNames(); + result = result * PRIME + ($argumentNames == null ? 43 : $argumentNames.hashCode()); + final java.lang.Object $body = this.getBody(); + result = result * PRIME + ($body == null ? 43 : $body.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonFunctionDefinitionNode(name=" + this.getName() + ", argumentNames=" + this.getArgumentNames() + ", body=" + this.getBody() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java index 27c191e..2298086 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonGetSliceNode.java @@ -1,18 +1,61 @@ package org.zwobble.couscous.backends.python.ast; import java.util.List; - import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonGetSlice") -public class PythonGetSliceNode implements PythonExpressionNode { - PythonExpressionNode receiver; - List<PythonExpressionNode> arguments; +public final class PythonGetSliceNode implements PythonExpressionNode { + private final PythonExpressionNode receiver; + private final List<PythonExpressionNode> arguments; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonGetSliceNode(final PythonExpressionNode receiver, final List<PythonExpressionNode> arguments) { + this.receiver = receiver; + this.arguments = arguments; + } + + public static PythonGetSliceNode pythonGetSlice(final PythonExpressionNode receiver, final List<PythonExpressionNode> arguments) { + return new PythonGetSliceNode(receiver, arguments); + } + + public PythonExpressionNode getReceiver() { + return this.receiver; + } + + public List<PythonExpressionNode> getArguments() { + return this.arguments; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonGetSliceNode)) return false; + final PythonGetSliceNode other = (PythonGetSliceNode)o; + final java.lang.Object this$receiver = this.getReceiver(); + final java.lang.Object other$receiver = other.getReceiver(); + if (this$receiver == null ? other$receiver != null : !this$receiver.equals(other$receiver)) return false; + final java.lang.Object this$arguments = this.getArguments(); + final java.lang.Object other$arguments = other.getArguments(); + if (this$arguments == null ? other$arguments != null : !this$arguments.equals(other$arguments)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $receiver = this.getReceiver(); + result = result * PRIME + ($receiver == null ? 43 : $receiver.hashCode()); + final java.lang.Object $arguments = this.getArguments(); + result = result * PRIME + ($arguments == null ? 43 : $arguments.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonGetSliceNode(receiver=" + this.getReceiver() + ", arguments=" + this.getArguments() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java index 9fb531a..783eb4e 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportAliasNode.java @@ -1,8 +1,42 @@ package org.zwobble.couscous.backends.python.ast; -import lombok.Value; +public final class PythonImportAliasNode { + private final String name; -@Value(staticConstructor="pythonImportAlias") -public class PythonImportAliasNode { - String name; -} + private PythonImportAliasNode(final String name) { + this.name = name; + } + + public static PythonImportAliasNode pythonImportAlias(final String name) { + return new PythonImportAliasNode(name); + } + + public String getName() { + return this.name; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonImportAliasNode)) return false; + final PythonImportAliasNode other = (PythonImportAliasNode)o; + final java.lang.Object this$name = this.getName(); + final java.lang.Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonImportAliasNode(name=" + this.getName() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java index c639829..4916cf7 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonImportNode.java @@ -1,18 +1,61 @@ package org.zwobble.couscous.backends.python.ast; import java.util.List; - import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonImport") -public class PythonImportNode implements PythonStatementNode { - String moduleName; - List<PythonImportAliasNode> aliases; +public final class PythonImportNode implements PythonStatementNode { + private final String moduleName; + private final List<PythonImportAliasNode> aliases; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonImportNode(final String moduleName, final List<PythonImportAliasNode> aliases) { + this.moduleName = moduleName; + this.aliases = aliases; + } + + public static PythonImportNode pythonImport(final String moduleName, final List<PythonImportAliasNode> aliases) { + return new PythonImportNode(moduleName, aliases); + } + + public String getModuleName() { + return this.moduleName; + } + + public List<PythonImportAliasNode> getAliases() { + return this.aliases; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonImportNode)) return false; + final PythonImportNode other = (PythonImportNode)o; + final java.lang.Object this$moduleName = this.getModuleName(); + final java.lang.Object other$moduleName = other.getModuleName(); + if (this$moduleName == null ? other$moduleName != null : !this$moduleName.equals(other$moduleName)) return false; + final java.lang.Object this$aliases = this.getAliases(); + final java.lang.Object other$aliases = other.getAliases(); + if (this$aliases == null ? other$aliases != null : !this$aliases.equals(other$aliases)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $moduleName = this.getModuleName(); + result = result * PRIME + ($moduleName == null ? 43 : $moduleName.hashCode()); + final java.lang.Object $aliases = this.getAliases(); + result = result * PRIME + ($aliases == null ? 43 : $aliases.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonImportNode(moduleName=" + this.getModuleName() + ", aliases=" + this.getAliases() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonIntegerLiteralNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonIntegerLiteralNode.java index 1c273d7..459ad6d 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonIntegerLiteralNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonIntegerLiteralNode.java @@ -2,14 +2,45 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonIntegerLiteral") -public class PythonIntegerLiteralNode implements PythonExpressionNode { - int value; +public final class PythonIntegerLiteralNode implements PythonExpressionNode { + private final int value; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonIntegerLiteralNode(final int value) { + this.value = value; + } + + public static PythonIntegerLiteralNode pythonIntegerLiteral(final int value) { + return new PythonIntegerLiteralNode(value); + } + + public int getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonIntegerLiteralNode)) return false; + final PythonIntegerLiteralNode other = (PythonIntegerLiteralNode)o; + if (this.getValue() != other.getValue()) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + this.getValue(); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonIntegerLiteralNode(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonModuleNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonModuleNode.java index b3fd728..a95b6c5 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonModuleNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonModuleNode.java @@ -1,18 +1,50 @@ package org.zwobble.couscous.backends.python.ast; import java.util.List; - import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonModule") -public class PythonModuleNode implements PythonNode { - List<PythonStatementNode> statements; +public final class PythonModuleNode implements PythonNode { + private final List<PythonStatementNode> statements; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } - -} + + private PythonModuleNode(final List<PythonStatementNode> statements) { + this.statements = statements; + } + + public static PythonModuleNode pythonModule(final List<PythonStatementNode> statements) { + return new PythonModuleNode(statements); + } + + public List<PythonStatementNode> getStatements() { + return this.statements; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonModuleNode)) return false; + final PythonModuleNode other = (PythonModuleNode)o; + final java.lang.Object this$statements = this.getStatements(); + final java.lang.Object other$statements = other.getStatements(); + if (this$statements == null ? other$statements != null : !this$statements.equals(other$statements)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $statements = this.getStatements(); + result = result * PRIME + ($statements == null ? 43 : $statements.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonModuleNode(statements=" + this.getStatements() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonReturnNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonReturnNode.java index adb4168..1967dd3 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonReturnNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonReturnNode.java @@ -2,15 +2,48 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonReturn") -public class PythonReturnNode implements PythonStatementNode { - PythonExpressionNode value; +public final class PythonReturnNode implements PythonStatementNode { + private final PythonExpressionNode value; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + private PythonReturnNode(final PythonExpressionNode value) { + this.value = value; + } + + public static PythonReturnNode pythonReturn(final PythonExpressionNode value) { + return new PythonReturnNode(value); + } + + public PythonExpressionNode getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonReturnNode)) return false; + final PythonReturnNode other = (PythonReturnNode)o; + final java.lang.Object this$value = this.getValue(); + final java.lang.Object other$value = other.getValue(); + if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $value = this.getValue(); + result = result * PRIME + ($value == null ? 43 : $value.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonReturnNode(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonStringLiteralNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonStringLiteralNode.java index bd35621..3907555 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonStringLiteralNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonStringLiteralNode.java @@ -2,14 +2,48 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonStringLiteral") -public class PythonStringLiteralNode implements PythonExpressionNode { - String value; +public final class PythonStringLiteralNode implements PythonExpressionNode { + private final String value; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonStringLiteralNode(final String value) { + this.value = value; + } + + public static PythonStringLiteralNode pythonStringLiteral(final String value) { + return new PythonStringLiteralNode(value); + } + + public String getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonStringLiteralNode)) return false; + final PythonStringLiteralNode other = (PythonStringLiteralNode)o; + final java.lang.Object this$value = this.getValue(); + final java.lang.Object other$value = other.getValue(); + if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $value = this.getValue(); + result = result * PRIME + ($value == null ? 43 : $value.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonStringLiteralNode(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonVariableReferenceNode.java b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonVariableReferenceNode.java index a67da73..4edad3e 100644 --- a/src/main/java/org/zwobble/couscous/backends/python/ast/PythonVariableReferenceNode.java +++ b/src/main/java/org/zwobble/couscous/backends/python/ast/PythonVariableReferenceNode.java @@ -2,14 +2,48 @@ package org.zwobble.couscous.backends.python.ast; import org.zwobble.couscous.backends.python.ast.visitors.PythonNodeVisitor; -import lombok.Value; - -@Value(staticConstructor="pythonVariableReference") -public class PythonVariableReferenceNode implements PythonExpressionNode { - String name; +public final class PythonVariableReferenceNode implements PythonExpressionNode { + private final String name; @Override public void accept(PythonNodeVisitor visitor) { visitor.visit(this); } -} + + private PythonVariableReferenceNode(final String name) { + this.name = name; + } + + public static PythonVariableReferenceNode pythonVariableReference(final String name) { + return new PythonVariableReferenceNode(name); + } + + public String getName() { + return this.name; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof PythonVariableReferenceNode)) return false; + final PythonVariableReferenceNode other = (PythonVariableReferenceNode)o; + final java.lang.Object this$name = this.getName(); + final java.lang.Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "PythonVariableReferenceNode(name=" + this.getName() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java index 8b92cec..d7bd54f 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaFrontend.java @@ -6,22 +6,24 @@ import java.nio.file.Path; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; - import org.zwobble.couscous.ast.ClassNode; -import lombok.val; - public class JavaFrontend { public static List<ClassNode> readSourceDirectory(Path directoryPath) throws IOException { - val reader = new JavaReader(); - + JavaReader reader = new JavaReader(); return findJavaFiles(directoryPath) - .map(javaFile -> reader.readClassFromFile(directoryPath, javaFile)) + .map(javaFile -> { + // TODO: unwrap exception in outer scope + try { + return reader.readClassFromFile(directoryPath, javaFile); + } catch (Exception e) { + throw new RuntimeException(e); + } + }) .collect(Collectors.toList()); } private static Stream<Path> findJavaFiles(Path directoryPath) throws IOException { - return Files.walk(directoryPath) - .filter(path -> path.toFile().isFile() && path.toString().endsWith(".java")); + return Files.walk(directoryPath).filter(path -> path.toFile().isFile() && path.toString().endsWith(".java")); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java index d171761..0f8d963 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaParser.java @@ -2,18 +2,15 @@ package org.zwobble.couscous.frontends.java; import java.io.IOException; import java.nio.ByteBuffer; +import java.nio.CharBuffer; import java.nio.file.Files; import java.nio.file.Path; - import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; - import com.google.common.base.Charsets; -import lombok.val; - public class JavaParser { private final ASTParser parser; @@ -22,20 +19,15 @@ public class JavaParser { parser.setBindingsRecovery(true); parser.setKind(ASTParser.K_COMPILATION_UNIT); parser.setCompilerOptions(JavaCore.getOptions()); - parser.setEnvironment( - new String[] {"/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar"}, - new String[0], - new String[0], - false); + parser.setEnvironment(new String[]{"/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/rt.jar"}, new String[0], new String[0], false); parser.setResolveBindings(true); } public CompilationUnit parseCompilationUnit(Path root, Path sourcePath) throws IOException { parser.setUnitName("/" + root.relativize(sourcePath).toString()); - - val javaFileBytes = Files.readAllBytes(sourcePath); - val source = Charsets.UTF_8.decode(ByteBuffer.wrap(javaFileBytes)); + final byte[] javaFileBytes = Files.readAllBytes(sourcePath); + CharBuffer source = Charsets.UTF_8.decode(ByteBuffer.wrap(javaFileBytes)); parser.setSource(source.array()); return (CompilationUnit)parser.createAST(null); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java index 12c9b6e..36c6b9c 100644 --- a/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java +++ b/src/main/java/org/zwobble/couscous/frontends/java/JavaReader.java @@ -1,8 +1,8 @@ package org.zwobble.couscous.frontends.java; +import java.io.IOException; import java.nio.file.Path; import java.util.List; - import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.Assignment; import org.eclipse.jdt.core.dom.BooleanLiteral; @@ -15,6 +15,7 @@ import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.IBinding; +import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; @@ -47,272 +48,236 @@ import org.zwobble.couscous.ast.StaticMethodCallNode; import org.zwobble.couscous.ast.TernaryConditionalNode; import org.zwobble.couscous.ast.ThisReferenceNode; import org.zwobble.couscous.ast.TypeName; - import com.google.common.collect.Lists; - import static java.util.Arrays.asList; import static org.zwobble.couscous.ast.ExpressionStatementNode.expressionStatement; import static org.zwobble.couscous.ast.LocalVariableDeclarationNode.localVariableDeclaration; import static org.zwobble.couscous.ast.VariableDeclaration.var; import static org.zwobble.couscous.ast.VariableReferenceNode.reference; -import lombok.SneakyThrows; -import lombok.val; - public class JavaReader { + private final JavaParser parser = new JavaParser(); - @SneakyThrows - public ClassNode readClassFromFile(Path root, Path sourcePath) { - val ast = parser.parseCompilationUnit(root, sourcePath); + public ClassNode readClassFromFile(Path root, Path sourcePath) throws IOException { + CompilationUnit ast = parser.parseCompilationUnit(root, sourcePath); return readCompilationUnit(ast); } - + private static ClassNode readCompilationUnit(CompilationUnit ast) { - val name = generateClassName(ast); - - val classBuilder = new ClassNodeBuilder(name); - - val type = (TypeDeclaration)ast.types().get(0); - + String name = generateClassName(ast); + ClassNodeBuilder classBuilder = new ClassNodeBuilder(name); + TypeDeclaration type = (TypeDeclaration)ast.types().get(0); readFields(type, classBuilder); readMethods(type, classBuilder); - - return classBuilder - .build(); + return classBuilder.build(); } - + private static void readFields(TypeDeclaration type, ClassNodeBuilder classBuilder) { - for (val field : type.getFields()) { + for (FieldDeclaration field : type.getFields()) { readField(field, classBuilder); } } - + private static void readField(FieldDeclaration field, ClassNodeBuilder classBuilder) { - for (val fragment : field.fragments()) { - val name = ((VariableDeclarationFragment)fragment).getName().getIdentifier(); - classBuilder.field(name, typeOf(field.getType())); + for (Object fragment : field.fragments()) { + String name = ((VariableDeclarationFragment)fragment).getName().getIdentifier(); + classBuilder.field(name, typeOf(field.getType())); } } - + private static void readMethods(TypeDeclaration type, ClassNodeBuilder classBuilder) { - for (val method : type.getMethods()) { + for (MethodDeclaration method : type.getMethods()) { readMethod(classBuilder, method); } } - + private static void readMethod(ClassNodeBuilder classBuilder, MethodDeclaration method) { if (method.isConstructor()) { classBuilder.constructor(builder -> buildMethod(method, builder)); } else { - classBuilder.method( - method.getName().getIdentifier(), - true, - builder -> buildMethod(method, builder)); + classBuilder.method(method.getName().getIdentifier(), true, builder -> buildMethod(method, builder)); } } - - private static <T> MethodBuilder<T> buildMethod( - MethodDeclaration method, - MethodBuilder<T> builder) { + + private static <T> MethodBuilder<T> buildMethod(MethodDeclaration method, MethodBuilder<T> builder) { for (IAnnotationBinding annotation : method.resolveBinding().getAnnotations()) { builder.annotation(typeOf(annotation.getAnnotationType())); } for (Object parameterObject : method.parameters()) { - val parameter = (SingleVariableDeclaration)parameterObject; - builder.argument( - parameter.resolveBinding().getKey(), - parameter.getName().getIdentifier(), - typeOf(parameter.resolveBinding())); + SingleVariableDeclaration parameter = (SingleVariableDeclaration)parameterObject; + builder.argument(parameter.resolveBinding().getKey(), parameter.getName().getIdentifier(), typeOf(parameter.resolveBinding())); } for (Object statement : method.getBody().statements()) { for (StatementNode intermediateStatement : readStatement((Statement)statement)) { - builder.statement(intermediateStatement); + builder.statement(intermediateStatement); } - } return builder; } - + private static List<StatementNode> readStatement(Statement statement) { switch (statement.getNodeType()) { - case ASTNode.RETURN_STATEMENT: - return asList(readReturnStatement((ReturnStatement)statement)); - case ASTNode.EXPRESSION_STATEMENT: - return asList(readExpressionStatement((ExpressionStatement)statement)); - case ASTNode.VARIABLE_DECLARATION_STATEMENT: - return readVariableDeclarationStatement((VariableDeclarationStatement)statement); - default: - throw new RuntimeException("Unsupported statement: " + statement.getClass()); + case ASTNode.RETURN_STATEMENT: + return asList(readReturnStatement((ReturnStatement)statement)); + + case ASTNode.EXPRESSION_STATEMENT: + return asList(readExpressionStatement((ExpressionStatement)statement)); + + case ASTNode.VARIABLE_DECLARATION_STATEMENT: + return readVariableDeclarationStatement((VariableDeclarationStatement)statement); + + default: + throw new RuntimeException("Unsupported statement: " + statement.getClass()); + } } - + private static StatementNode readReturnStatement(ReturnStatement statement) { return ReturnNode.returns(readExpression(statement.getExpression())); } - + private static StatementNode readExpressionStatement(ExpressionStatement statement) { return expressionStatement(readExpression(statement.getExpression())); } - + private static List<StatementNode> readVariableDeclarationStatement(VariableDeclarationStatement statement) { @SuppressWarnings("unchecked") - val fragments = (List<VariableDeclarationFragment>)statement.fragments(); - val type = typeOf(statement.getType()); - return Lists.transform(fragments, fragment -> - localVariableDeclaration( - fragment.resolveBinding().getKey(), - fragment.getName().getIdentifier(), - type, - readExpression(fragment.getInitializer()))); + List<VariableDeclarationFragment> fragments = (List<VariableDeclarationFragment>)statement.fragments(); + TypeName type = typeOf(statement.getType()); + return Lists.transform(fragments, fragment -> localVariableDeclaration(fragment.resolveBinding().getKey(), fragment.getName().getIdentifier(), type, readExpression(fragment.getInitializer()))); } - + private static ExpressionNode readExpression(Expression expression) { switch (expression.getNodeType()) { - case ASTNode.BOOLEAN_LITERAL: - return readBooleanLiteral((BooleanLiteral)expression); - case ASTNode.NUMBER_LITERAL: - return readNumberLiteral((NumberLiteral)expression); - case ASTNode.STRING_LITERAL: - return readStringLiteral((StringLiteral)expression); - case ASTNode.SIMPLE_NAME: - return readSimpleName((SimpleName)expression); - case ASTNode.THIS_EXPRESSION: - return readThisExpression((ThisExpression)expression); - case ASTNode.FIELD_ACCESS: - return readFieldAccess((FieldAccess)expression); - case ASTNode.METHOD_INVOCATION: - return readMethodInvocation((MethodInvocation)expression); - case ASTNode.CLASS_INSTANCE_CREATION: - return readClassInstanceCreation((ClassInstanceCreation)expression); - case ASTNode.CONDITIONAL_EXPRESSION: - return readConditionalExpression((ConditionalExpression)expression); - case ASTNode.ASSIGNMENT: - return readAssignment((Assignment)expression); - default: - throw new RuntimeException("Unsupported expression: " + expression.getClass()); + case ASTNode.BOOLEAN_LITERAL: + return readBooleanLiteral((BooleanLiteral)expression); + + case ASTNode.NUMBER_LITERAL: + return readNumberLiteral((NumberLiteral)expression); + + case ASTNode.STRING_LITERAL: + return readStringLiteral((StringLiteral)expression); + + case ASTNode.SIMPLE_NAME: + return readSimpleName((SimpleName)expression); + + case ASTNode.THIS_EXPRESSION: + return readThisExpression((ThisExpression)expression); + + case ASTNode.FIELD_ACCESS: + return readFieldAccess((FieldAccess)expression); + + case ASTNode.METHOD_INVOCATION: + return readMethodInvocation((MethodInvocation)expression); + + case ASTNode.CLASS_INSTANCE_CREATION: + return readClassInstanceCreation((ClassInstanceCreation)expression); + + case ASTNode.CONDITIONAL_EXPRESSION: + return readConditionalExpression((ConditionalExpression)expression); + + case ASTNode.ASSIGNMENT: + return readAssignment((Assignment)expression); + + default: + throw new RuntimeException("Unsupported expression: " + expression.getClass()); + } } - + private static ExpressionNode readBooleanLiteral(BooleanLiteral expression) { return LiteralNode.literal(expression.booleanValue()); } - + private static LiteralNode readNumberLiteral(NumberLiteral expression) { return LiteralNode.literal(Integer.parseInt(expression.getToken())); } - + private static ExpressionNode readStringLiteral(StringLiteral expression) { return LiteralNode.literal(expression.getLiteralValue()); } - + private static ExpressionNode readSimpleName(SimpleName expression) { - val binding = expression.resolveBinding(); + IBinding binding = expression.resolveBinding(); if (binding.getKind() == IBinding.VARIABLE) { return readVariableBinding((IVariableBinding)binding); } else { throw new RuntimeException("Unsupported binding: " + binding.getClass()); } } - + private static ExpressionNode readVariableBinding(IVariableBinding binding) { - val type = typeOf(binding); + TypeName type = typeOf(binding); if (binding.getDeclaringClass() == null) { - return reference(var( - binding.getKey(), - binding.getName(), - type)); + return reference(var(binding.getKey(), binding.getName(), type)); } else { - return FieldAccessNode.fieldAccess( - ThisReferenceNode.thisReference(typeOf(binding.getDeclaringClass())), - binding.getName(), - type); + return FieldAccessNode.fieldAccess(ThisReferenceNode.thisReference(typeOf(binding.getDeclaringClass())), binding.getName(), type); } } - + private static ExpressionNode readThisExpression(ThisExpression expression) { return ThisReferenceNode.thisReference(typeOf(expression)); } private static ExpressionNode readFieldAccess(FieldAccess expression) { - return FieldAccessNode.fieldAccess( - readExpression(expression.getExpression()), - expression.getName().getIdentifier(), - typeOf(expression)); + return FieldAccessNode.fieldAccess(readExpression(expression.getExpression()), expression.getName().getIdentifier(), typeOf(expression)); } - + private static ExpressionNode readMethodInvocation(MethodInvocation expression) { - val methodName = expression.getName().getIdentifier(); - val arguments = readArguments(expression.arguments()); + String methodName = expression.getName().getIdentifier(); + List<ExpressionNode> arguments = readArguments(expression.arguments()); if (expression.getExpression() == null) { - val methodBinding = expression.resolveMethodBinding(); - val receiverType = typeOf(methodBinding.getDeclaringClass()); + IMethodBinding methodBinding = expression.resolveMethodBinding(); + TypeName receiverType = typeOf(methodBinding.getDeclaringClass()); if ((methodBinding.getModifiers() & Modifier.STATIC) != 0) { - return StaticMethodCallNode.staticMethodCall( - receiverType, methodName, arguments); + return StaticMethodCallNode.staticMethodCall(receiverType, methodName, arguments); } else { - return MethodCallNode.methodCall( - ThisReferenceNode.thisReference(receiverType), - methodName, - arguments, - typeOf(expression)); + return MethodCallNode.methodCall(ThisReferenceNode.thisReference(receiverType), methodName, arguments, typeOf(expression)); } } else if (expression.getExpression().getNodeType() == ASTNode.SIMPLE_NAME) { - val receiver = expression.getExpression(); + Expression receiver = expression.getExpression(); return StaticMethodCallNode.staticMethodCall(typeOf(receiver), methodName, arguments); } else { - return MethodCallNode.methodCall( - readExpression(expression.getExpression()), - methodName, - arguments, - typeOf(expression)); + return MethodCallNode.methodCall(readExpression(expression.getExpression()), methodName, arguments, typeOf(expression)); } } - + private static ExpressionNode readClassInstanceCreation(ClassInstanceCreation expression) { - return ConstructorCallNode.constructorCall( - typeOf(expression), - readArguments(expression.arguments())); + return ConstructorCallNode.constructorCall(typeOf(expression), readArguments(expression.arguments())); } - - @SuppressWarnings({ "unchecked", "rawtypes" }) + + @SuppressWarnings({"unchecked", "rawtypes"}) private static List<ExpressionNode> readArguments(final List javaArguments) { - return Lists.transform( - (List<Expression>)javaArguments, - JavaReader::readExpression); + return Lists.transform((List<Expression>)javaArguments, JavaReader::readExpression); } - + private static ExpressionNode readConditionalExpression(ConditionalExpression expression) { - return TernaryConditionalNode.ternaryConditional( - readExpression(expression.getExpression()), - readExpression(expression.getThenExpression()), - readExpression(expression.getElseExpression())); + return TernaryConditionalNode.ternaryConditional(readExpression(expression.getExpression()), readExpression(expression.getThenExpression()), readExpression(expression.getElseExpression())); } - + private static ExpressionNode readAssignment(Assignment expression) { - return AssignmentNode.assign( - (AssignableExpressionNode)readExpression(expression.getLeftHandSide()), - readExpression(expression.getRightHandSide())); + return AssignmentNode.assign((AssignableExpressionNode)readExpression(expression.getLeftHandSide()), readExpression(expression.getRightHandSide())); } - + private static String generateClassName(CompilationUnit ast) { - val type = (TypeDeclaration)ast.types().get(0); + TypeDeclaration type = (TypeDeclaration)ast.types().get(0); return ast.getPackage().getName().getFullyQualifiedName() + "." + type.getName().getFullyQualifiedName(); } - + private static TypeName typeOf(Expression expression) { return typeOf(expression.resolveTypeBinding()); } - + private static TypeName typeOf(IVariableBinding variableBinding) { return typeOf(variableBinding.getType()); } - + private static TypeName typeOf(Type type) { return typeOf(type.resolveBinding()); } - + private static TypeName typeOf(ITypeBinding typeBinding) { return TypeName.of(typeBinding.getQualifiedName()); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/ConditionMustBeBoolean.java b/src/main/java/org/zwobble/couscous/interpreter/ConditionMustBeBoolean.java index 7f2e901..b9cf32a 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/ConditionMustBeBoolean.java +++ b/src/main/java/org/zwobble/couscous/interpreter/ConditionMustBeBoolean.java @@ -2,13 +2,45 @@ package org.zwobble.couscous.interpreter; import org.zwobble.couscous.interpreter.values.InterpreterValue; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class ConditionMustBeBoolean extends InterpreterException { +public final class ConditionMustBeBoolean extends InterpreterException { private static final long serialVersionUID = 1L; + private final InterpreterValue actual; + + public ConditionMustBeBoolean(final InterpreterValue actual) { + this.actual = actual; + } + + public InterpreterValue getActual() { + return this.actual; + } + + @java.lang.Override + public java.lang.String toString() { + return "ConditionMustBeBoolean(actual=" + this.getActual() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof ConditionMustBeBoolean)) return false; + final ConditionMustBeBoolean other = (ConditionMustBeBoolean)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$actual = this.getActual(); + final java.lang.Object other$actual = other.getActual(); + if (this$actual == null ? other$actual != null : !this$actual.equals(other$actual)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof ConditionMustBeBoolean; + } - InterpreterValue actual; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $actual = this.getActual(); + result = result * PRIME + ($actual == null ? 43 : $actual.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/Environment.java b/src/main/java/org/zwobble/couscous/interpreter/Environment.java index 675cfda..b1d59e2 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Environment.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Environment.java @@ -2,33 +2,22 @@ package org.zwobble.couscous.interpreter; import java.util.Map; import java.util.Optional; - import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.ast.VariableDeclaration; import org.zwobble.couscous.ast.VariableNode; import org.zwobble.couscous.interpreter.values.ConcreteType; import org.zwobble.couscous.interpreter.values.InterpreterValue; - import static java.util.stream.Collectors.toMap; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import lombok.val; - public class Environment { private final Project project; private final Optional<InterpreterValue> thisValue; private final Map<String, VariableEntry> stackFrame; - - public Environment( - Project project, - Optional<InterpreterValue> thisValue, - Map<VariableDeclaration, Optional<InterpreterValue>> stackFrame) { + + public Environment(Project project, Optional<InterpreterValue> thisValue, Map<VariableDeclaration, Optional<InterpreterValue>> stackFrame) { this.project = project; this.thisValue = thisValue; - this.stackFrame = stackFrame.entrySet() - .stream() + this.stackFrame = stackFrame.entrySet().stream() .collect(toMap( entry -> entry.getKey().getId(), entry -> VariableEntry.of(entry.getKey().getType(), entry.getValue()))); @@ -37,47 +26,65 @@ public class Environment { public Optional<InterpreterValue> getThis() { return thisValue; } - + public InterpreterValue get(String variableId) { checkVariableIsInScope(variableId); - val entry = stackFrame.get(variableId); + final org.zwobble.couscous.interpreter.Environment.VariableEntry entry = stackFrame.get(variableId); return entry.getValue().orElseThrow(() -> new UnboundVariable(variableId)); } - + public void put(String variableId, InterpreterValue value) { checkVariableIsInScope(variableId); checkVariableType(variableId, value); stackFrame.get(variableId).setValue(Optional.of(value)); } - + public void put(VariableNode variable, InterpreterValue value) { put(variable.getDeclaration().getId(), value); } - + public ConcreteType findClass(TypeName className) { return project.findClass(className); } - + public Environment withStackFrame(Optional<InterpreterValue> thisValue, Map<VariableDeclaration, Optional<InterpreterValue>> stackFrame) { return new Environment(project, thisValue, stackFrame); } - + private void checkVariableIsInScope(String variableId) { if (!stackFrame.containsKey(variableId)) { throw new VariableNotInScope(variableId); } } - + private void checkVariableType(String variableId, InterpreterValue value) { - val variableType = stackFrame.get(variableId).getType(); + TypeName variableType = stackFrame.get(variableId).getType(); InterpreterTypes.checkIsInstance(variableType, value); } - @AllArgsConstructor(staticName="of") - @Getter - @Setter private static class VariableEntry { private final TypeName type; private Optional<InterpreterValue> value; + + private VariableEntry(final TypeName type, final Optional<InterpreterValue> value) { + this.type = type; + this.value = value; + } + + public static VariableEntry of(final TypeName type, final Optional<InterpreterValue> value) { + return new VariableEntry(type, value); + } + + public TypeName getType() { + return this.type; + } + + public Optional<InterpreterValue> getValue() { + return this.value; + } + + public void setValue(final Optional<InterpreterValue> value) { + this.value = value; + } } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java index 1bc1ab8..2122f01 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Evaluator.java @@ -2,7 +2,6 @@ package org.zwobble.couscous.interpreter; import java.util.List; import java.util.stream.Collectors; - import org.zwobble.couscous.ast.AssignmentNode; import org.zwobble.couscous.ast.ConstructorCallNode; import org.zwobble.couscous.ast.ExpressionNode; @@ -16,18 +15,17 @@ import org.zwobble.couscous.ast.VariableReferenceNode; import org.zwobble.couscous.ast.visitors.AssignableExpressionNodeVisitor; import org.zwobble.couscous.ast.visitors.ExpressionNodeMapper; import org.zwobble.couscous.interpreter.values.BooleanInterpreterValue; +import org.zwobble.couscous.interpreter.values.ConcreteType; import org.zwobble.couscous.interpreter.values.InterpreterValue; import org.zwobble.couscous.interpreter.values.InterpreterValues; -import lombok.val; - public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { public static InterpreterValue eval(Environment environment, ExpressionNode expression) { return new Evaluator(environment).eval(expression); } private final Environment environment; - + private Evaluator(Environment environment) { this.environment = environment; } @@ -35,29 +33,29 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { public InterpreterValue eval(ExpressionNode expression) { return expression.accept(this); } - + @Override public InterpreterValue visit(LiteralNode literal) { return InterpreterValues.value(literal.getValue()); } - + @Override public InterpreterValue visit(VariableReferenceNode variableReference) { return environment.get(variableReference.getReferentId()); } - + @Override public InterpreterValue visit(ThisReferenceNode reference) { return environment.getThis().get(); } - + @Override public InterpreterValue visit(AssignmentNode assignment) { - val value = eval(assignment.getValue()); - assignment.getTarget().accept(new AssignableExpressionNodeVisitor() { + InterpreterValue value = eval(assignment.getValue()); + assignment.getTarget().accept(new AssignableExpressionNodeVisitor(){ @Override public void visit(FieldAccessNode fieldAccess) { - val left = eval(fieldAccess.getLeft()); + InterpreterValue left = eval(fieldAccess.getLeft()); left.setField(fieldAccess.getFieldName(), value); } @@ -68,51 +66,48 @@ public class Evaluator implements ExpressionNodeMapper<InterpreterValue> { }); return value; } - + @Override public InterpreterValue visit(TernaryConditionalNode ternaryConditional) { - val condition = eval(ternaryConditional.getCondition()); + InterpreterValue condition = eval(ternaryConditional.getCondition()); if (!(condition instanceof BooleanInterpreterValue)) { throw new ConditionMustBeBoolean(condition); } - val branch = ((BooleanInterpreterValue)condition).getValue() - ? ternaryConditional.getIfTrue() - : ternaryConditional.getIfFalse(); + final org.zwobble.couscous.ast.ExpressionNode branch = ((BooleanInterpreterValue)condition).getValue() ? ternaryConditional.getIfTrue() : ternaryConditional.getIfFalse(); return eval(branch); } - + @Override public InterpreterValue visit(MethodCallNode methodCall) { - val receiver = eval(methodCall.getReceiver()); - val type = receiver.getType(); - val arguments = evalArguments(methodCall.getArguments()); + InterpreterValue receiver = eval(methodCall.getReceiver()); + ConcreteType type = receiver.getType(); + List<InterpreterValue> arguments = evalArguments(methodCall.getArguments()); return type.callMethod(environment, receiver, methodCall.getMethodName(), arguments); } - + @Override public InterpreterValue visit(StaticMethodCallNode staticMethodCall) { - val clazz = environment.findClass(staticMethodCall.getClassName()); - val arguments = evalArguments(staticMethodCall.getArguments()); + ConcreteType clazz = environment.findClass(staticMethodCall.getClassName()); + List<InterpreterValue> arguments = evalArguments(staticMethodCall.getArguments()); return clazz.callStaticMethod(environment, staticMethodCall.getMethodName(), arguments); } - + @Override public InterpreterValue visit(ConstructorCallNode call) { - val clazz = environment.findClass(call.getType()); - val arguments = evalArguments(call.getArguments()); + ConcreteType clazz = environment.findClass(call.getType()); + List<InterpreterValue> arguments = evalArguments(call.getArguments()); return clazz.callConstructor(environment, arguments); } - + @Override public InterpreterValue visit(FieldAccessNode fieldAccess) { - val left = eval(fieldAccess.getLeft()); + InterpreterValue left = eval(fieldAccess.getLeft()); return left.getField(fieldAccess.getFieldName()); } - + private List<InterpreterValue> evalArguments(List<ExpressionNode> arguments) { - return arguments - .stream() + return arguments.stream() .map(argument -> eval(argument)) .collect(Collectors.toList()); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/Executor.java b/src/main/java/org/zwobble/couscous/interpreter/Executor.java index 5c26244..e47106d 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Executor.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Executor.java @@ -3,7 +3,6 @@ package org.zwobble.couscous.interpreter; import java.util.List; import java.util.Optional; import java.util.stream.Stream; - import org.zwobble.couscous.ast.CallableNode; import org.zwobble.couscous.ast.ExpressionStatementNode; import org.zwobble.couscous.ast.LocalVariableDeclarationNode; @@ -13,72 +12,55 @@ import org.zwobble.couscous.ast.VariableNode; import org.zwobble.couscous.ast.visitors.StatementNodeMapper; import org.zwobble.couscous.interpreter.values.InterpreterValue; import org.zwobble.couscous.interpreter.values.UnitInterpreterValue; - import static org.zwobble.couscous.interpreter.Evaluator.eval; -import lombok.val; - public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> { - public static InterpreterValue callMethod( - Environment environment, - CallableNode method, - Optional<InterpreterValue> thisValue, - PositionalArguments arguments) { - - val innerEnvironment = buildEnvironment(environment, method, thisValue, arguments); - - for (val statement : method.getBody()) { - val result = exec(innerEnvironment, statement); + + public static InterpreterValue callMethod(Environment environment, CallableNode method, Optional<InterpreterValue> thisValue, PositionalArguments arguments) { + final org.zwobble.couscous.interpreter.Environment innerEnvironment = buildEnvironment(environment, method, thisValue, arguments); + for (final org.zwobble.couscous.ast.StatementNode statement : method.getBody()) { + final java.util.Optional<org.zwobble.couscous.interpreter.values.InterpreterValue> result = exec(innerEnvironment, statement); if (result.isPresent()) { return result.get(); } } return UnitInterpreterValue.UNIT; } - - private static Environment buildEnvironment( - final Environment environment, - final CallableNode method, - Optional<InterpreterValue> thisValue, - PositionalArguments arguments) { - - val stackFrame = new StackFrameBuilder(); + + private static Environment buildEnvironment(final Environment environment, final CallableNode method, Optional<InterpreterValue> thisValue, PositionalArguments arguments) { + final org.zwobble.couscous.interpreter.StackFrameBuilder stackFrame = new StackFrameBuilder(); for (int index = 0; index < method.getArguments().size(); index++) { stackFrame.declare(method.getArguments().get(index), arguments.get(index)); } - - findDeclarations(method.getBody()).forEach(declaration -> - stackFrame.declare(declaration)); - + findDeclarations(method.getBody()).forEach(declaration -> stackFrame.declare(declaration)); return environment.withStackFrame(thisValue, stackFrame.build()); } private static Stream<VariableNode> findDeclarations(List<StatementNode> body) { - return body.stream() - .flatMap(statement -> statement.accept(new StatementNodeMapper<Stream<VariableNode>>() { - @Override - public Stream<VariableNode> visit(ReturnNode returnNode) { - return Stream.empty(); - } - - @Override - public Stream<VariableNode> visit(ExpressionStatementNode expressionStatement) { - return Stream.empty(); - } - - @Override - public Stream<VariableNode> visit(LocalVariableDeclarationNode localVariableDeclaration) { - return Stream.of(localVariableDeclaration); - } - })); + return body.stream().flatMap(statement -> statement.accept(new StatementNodeMapper<Stream<VariableNode>>(){ + + @Override + public Stream<VariableNode> visit(ReturnNode returnNode) { + return Stream.empty(); + } + + @Override + public Stream<VariableNode> visit(ExpressionStatementNode expressionStatement) { + return Stream.empty(); + } + + @Override + public Stream<VariableNode> visit(LocalVariableDeclarationNode localVariableDeclaration) { + return Stream.of(localVariableDeclaration); + } + })); } - + public static Optional<InterpreterValue> exec(Environment environment, StatementNode statement) { return statement.accept(new Executor(environment)); } - private final Environment environment; - + private Executor(Environment environment) { this.environment = environment; } @@ -87,17 +69,17 @@ public class Executor implements StatementNodeMapper<Optional<InterpreterValue>> public Optional<InterpreterValue> visit(ReturnNode returnNode) { return Optional.of(eval(environment, returnNode.getValue())); } - + @Override public Optional<InterpreterValue> visit(ExpressionStatementNode expressionStatement) { eval(environment, expressionStatement.getExpression()); return Optional.empty(); } - + @Override public Optional<InterpreterValue> visit(LocalVariableDeclarationNode localVariableDeclaration) { - val value = eval(environment, localVariableDeclaration.getInitialValue()); + final org.zwobble.couscous.interpreter.values.InterpreterValue value = eval(environment, localVariableDeclaration.getInitialValue()); environment.put(localVariableDeclaration, value); return Optional.empty(); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java index 0506a59..e5f6482 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java +++ b/src/main/java/org/zwobble/couscous/interpreter/Interpreter.java @@ -3,32 +3,30 @@ package org.zwobble.couscous.interpreter; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; - import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.ast.ExpressionNode; import org.zwobble.couscous.interpreter.values.InterpreterValue; - import com.google.common.collect.ImmutableMap; - import static org.zwobble.couscous.ast.LiteralNode.literal; import static org.zwobble.couscous.ast.StaticMethodCallNode.staticMethodCall; import static org.zwobble.couscous.interpreter.Evaluator.eval; -import lombok.val; - public class Interpreter { private Project project; - + public Interpreter(Project project) { this.project = project; } public InterpreterValue run(TypeName className, String methodName, List<InterpreterValue> arguments) { - val argumentExpressions = arguments - .stream() - .<ExpressionNode>map(argument -> literal(argument.toPrimitiveValue().get())) + List<ExpressionNode> argumentExpressions = arguments.stream() + .map(argument -> literal(argument.toPrimitiveValue().get())) .collect(Collectors.toList()); - return eval(new Environment(project, Optional.empty(), ImmutableMap.of()), + return eval( + new Environment( + project, + Optional.empty(), + ImmutableMap.of()), staticMethodCall(className, methodName, argumentExpressions)); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java b/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java index fd01053..e6b6df1 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java +++ b/src/main/java/org/zwobble/couscous/interpreter/JavaProject.java @@ -8,8 +8,6 @@ import org.zwobble.couscous.interpreter.values.ConcreteType; import com.google.common.collect.Iterables; -import lombok.val; - public class JavaProject { public static MapBackedProject.Builder builder() { return MapBackedProject.builder() @@ -17,7 +15,7 @@ public class JavaProject { } public static Project of(List<ClassNode> classNodes) { - val concreteTypes = Iterables.transform(classNodes, ConcreteType::fromNode); + Iterable<ConcreteType> concreteTypes = Iterables.transform(classNodes, ConcreteType::fromNode); return builder() .addClasses(concreteTypes) .build(); diff --git a/src/main/java/org/zwobble/couscous/interpreter/MapBackedProject.java b/src/main/java/org/zwobble/couscous/interpreter/MapBackedProject.java index 7206b1a..7f16b8f 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/MapBackedProject.java +++ b/src/main/java/org/zwobble/couscous/interpreter/MapBackedProject.java @@ -1,15 +1,12 @@ package org.zwobble.couscous.interpreter; import java.util.Map; - import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.interpreter.values.ConcreteType; - import com.google.common.collect.ImmutableMap; -import lombok.val; - public class MapBackedProject implements Project { + public static Builder builder() { return new Builder(); } @@ -27,7 +24,7 @@ public class MapBackedProject implements Project { } public Builder addClasses(Iterable<ConcreteType> classes) { - for (val clazz : classes) { + for (ConcreteType clazz : classes) { addClass(clazz); } return this; @@ -37,9 +34,8 @@ public class MapBackedProject implements Project { return new MapBackedProject(classes.build()); } } - private Map<TypeName, ConcreteType> classes; - + public MapBackedProject(Map<TypeName, ConcreteType> classes) { this.classes = classes; } @@ -47,10 +43,9 @@ public class MapBackedProject implements Project { @Override public ConcreteType findClass(TypeName name) { if (classes.containsKey(name)) { - return classes.get(name); + return classes.get(name); } else { throw new IllegalArgumentException("Cannot find class: " + name); } - } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/NoSuchField.java b/src/main/java/org/zwobble/couscous/interpreter/NoSuchField.java index 31feaab..03b714f 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/NoSuchField.java +++ b/src/main/java/org/zwobble/couscous/interpreter/NoSuchField.java @@ -1,12 +1,43 @@ package org.zwobble.couscous.interpreter; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class NoSuchField extends InterpreterException { +public final class NoSuchField extends InterpreterException { private static final long serialVersionUID = 1L; + private final String fieldName; + + public NoSuchField(final String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldName() { + return this.fieldName; + } + + public java.lang.String toString() { + return "NoSuchField(fieldName=" + this.getFieldName() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof NoSuchField)) return false; + final NoSuchField other = (NoSuchField)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$fieldName = this.getFieldName(); + final java.lang.Object other$fieldName = other.getFieldName(); + if (this$fieldName == null ? other$fieldName != null : !this$fieldName.equals(other$fieldName)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof NoSuchField; + } - String fieldName; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $fieldName = this.getFieldName(); + result = result * PRIME + ($fieldName == null ? 43 : $fieldName.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java b/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java index e69c978..ddddd71 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java +++ b/src/main/java/org/zwobble/couscous/interpreter/NoSuchMethod.java @@ -1,12 +1,44 @@ package org.zwobble.couscous.interpreter; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class NoSuchMethod extends InterpreterException { +public final class NoSuchMethod extends InterpreterException { private static final long serialVersionUID = 1L; + private final String methodName; + + public NoSuchMethod(final String methodName) { + this.methodName = methodName; + } + + public String getMethodName() { + return this.methodName; + } + + @java.lang.Override + public java.lang.String toString() { + return "NoSuchMethod(methodName=" + this.getMethodName() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof NoSuchMethod)) return false; + final NoSuchMethod other = (NoSuchMethod)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$methodName = this.getMethodName(); + final java.lang.Object other$methodName = other.getMethodName(); + if (this$methodName == null ? other$methodName != null : !this$methodName.equals(other$methodName)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof NoSuchMethod; + } - String methodName; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $methodName = this.getMethodName(); + result = result * PRIME + ($methodName == null ? 43 : $methodName.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/UnboundField.java b/src/main/java/org/zwobble/couscous/interpreter/UnboundField.java index 2efca06..1d21071 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/UnboundField.java +++ b/src/main/java/org/zwobble/couscous/interpreter/UnboundField.java @@ -1,12 +1,44 @@ package org.zwobble.couscous.interpreter; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class UnboundField extends InterpreterException { +public final class UnboundField extends InterpreterException { private static final long serialVersionUID = 1L; + private final String fieldName; + + public UnboundField(final String fieldName) { + this.fieldName = fieldName; + } + + public String getFieldName() { + return this.fieldName; + } + + @java.lang.Override + public java.lang.String toString() { + return "UnboundField(fieldName=" + this.getFieldName() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof UnboundField)) return false; + final UnboundField other = (UnboundField)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$fieldName = this.getFieldName(); + final java.lang.Object other$fieldName = other.getFieldName(); + if (this$fieldName == null ? other$fieldName != null : !this$fieldName.equals(other$fieldName)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof UnboundField; + } - String fieldName; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $fieldName = this.getFieldName(); + result = result * PRIME + ($fieldName == null ? 43 : $fieldName.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java b/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java index 684a3b9..e0131f0 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java +++ b/src/main/java/org/zwobble/couscous/interpreter/UnboundVariable.java @@ -1,12 +1,44 @@ package org.zwobble.couscous.interpreter; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class UnboundVariable extends InterpreterException { +public final class UnboundVariable extends InterpreterException { private static final long serialVersionUID = 1L; + private final String variableId; + + public UnboundVariable(final String variableId) { + this.variableId = variableId; + } + + public String getVariableId() { + return this.variableId; + } + + @java.lang.Override + public java.lang.String toString() { + return "UnboundVariable(variableId=" + this.getVariableId() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof UnboundVariable)) return false; + final UnboundVariable other = (UnboundVariable)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$variableId = this.getVariableId(); + final java.lang.Object other$variableId = other.getVariableId(); + if (this$variableId == null ? other$variableId != null : !this$variableId.equals(other$variableId)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof UnboundVariable; + } - String variableId; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $variableId = this.getVariableId(); + result = result * PRIME + ($variableId == null ? 43 : $variableId.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java b/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java index 827b9e9..2b40728 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java +++ b/src/main/java/org/zwobble/couscous/interpreter/UnexpectedValueType.java @@ -2,14 +2,56 @@ package org.zwobble.couscous.interpreter; import org.zwobble.couscous.ast.TypeName; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class UnexpectedValueType extends InterpreterException { +public final class UnexpectedValueType extends InterpreterException { private static final long serialVersionUID = 1L; + private final TypeName expected; + private final TypeName actual; + + public UnexpectedValueType(final TypeName expected, final TypeName actual) { + this.expected = expected; + this.actual = actual; + } + + public TypeName getExpected() { + return this.expected; + } + + public TypeName getActual() { + return this.actual; + } + + @java.lang.Override + public java.lang.String toString() { + return "UnexpectedValueType(expected=" + this.getExpected() + ", actual=" + this.getActual() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof UnexpectedValueType)) return false; + final UnexpectedValueType other = (UnexpectedValueType)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$expected = this.getExpected(); + final java.lang.Object other$expected = other.getExpected(); + if (this$expected == null ? other$expected != null : !this$expected.equals(other$expected)) return false; + final java.lang.Object this$actual = this.getActual(); + final java.lang.Object other$actual = other.getActual(); + if (this$actual == null ? other$actual != null : !this$actual.equals(other$actual)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof UnexpectedValueType; + } - TypeName expected; - TypeName actual; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $expected = this.getExpected(); + result = result * PRIME + ($expected == null ? 43 : $expected.hashCode()); + final java.lang.Object $actual = this.getActual(); + result = result * PRIME + ($actual == null ? 43 : $actual.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java b/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java index 17ab6af..54b66bd 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java +++ b/src/main/java/org/zwobble/couscous/interpreter/VariableNotInScope.java @@ -1,12 +1,44 @@ package org.zwobble.couscous.interpreter; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class VariableNotInScope extends InterpreterException { +public final class VariableNotInScope extends InterpreterException { private static final long serialVersionUID = 1L; + private final String variableId; + + public VariableNotInScope(final String variableId) { + this.variableId = variableId; + } + + public String getVariableId() { + return this.variableId; + } + + @java.lang.Override + public java.lang.String toString() { + return "VariableNotInScope(variableId=" + this.getVariableId() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof VariableNotInScope)) return false; + final VariableNotInScope other = (VariableNotInScope)o; + if (!other.canEqual((java.lang.Object)this)) return false; + final java.lang.Object this$variableId = this.getVariableId(); + final java.lang.Object other$variableId = other.getVariableId(); + if (this$variableId == null ? other$variableId != null : !this$variableId.equals(other$variableId)) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof VariableNotInScope; + } - String variableId; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $variableId = this.getVariableId(); + result = result * PRIME + ($variableId == null ? 43 : $variableId.hashCode()); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/WrongNumberOfArguments.java b/src/main/java/org/zwobble/couscous/interpreter/WrongNumberOfArguments.java index 06d8079..800aabb 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/WrongNumberOfArguments.java +++ b/src/main/java/org/zwobble/couscous/interpreter/WrongNumberOfArguments.java @@ -1,13 +1,49 @@ package org.zwobble.couscous.interpreter; -import lombok.EqualsAndHashCode; -import lombok.Value; - -@Value -@EqualsAndHashCode(callSuper=false) -public class WrongNumberOfArguments extends InterpreterException { +public final class WrongNumberOfArguments extends InterpreterException { private static final long serialVersionUID = 1L; + private final int expected; + private final int actual; + + public WrongNumberOfArguments(final int expected, final int actual) { + this.expected = expected; + this.actual = actual; + } + + public int getExpected() { + return this.expected; + } + + public int getActual() { + return this.actual; + } + + @java.lang.Override + public java.lang.String toString() { + return "WrongNumberOfArguments(expected=" + this.getExpected() + ", actual=" + this.getActual() + ")"; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof WrongNumberOfArguments)) return false; + final WrongNumberOfArguments other = (WrongNumberOfArguments)o; + if (!other.canEqual((java.lang.Object)this)) return false; + if (this.getExpected() != other.getExpected()) return false; + if (this.getActual() != other.getActual()) return false; + return true; + } + + protected boolean canEqual(final java.lang.Object other) { + return other instanceof WrongNumberOfArguments; + } - int expected; - int actual; -} + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + this.getExpected(); + result = result * PRIME + this.getActual(); + return result; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java index 7bb108c..8245f87 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/BooleanInterpreterValue.java @@ -1,44 +1,61 @@ package org.zwobble.couscous.interpreter.values; import java.util.Optional; - import org.zwobble.couscous.interpreter.NoSuchField; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValues; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Value; - -@Value -public class BooleanInterpreterValue implements InterpreterValue { - private static final ConcreteType TYPE = ConcreteType.builder(BooleanInterpreterValue.class, "Boolean") - .build(); +public final class BooleanInterpreterValue implements InterpreterValue { + private static final ConcreteType TYPE = ConcreteType.builder(BooleanInterpreterValue.class, "Boolean").build(); + private final boolean value; - @Getter(value = AccessLevel.NONE) - boolean value; - public boolean getValue() { return value; } - + @Override public ConcreteType getType() { return TYPE; } - + @Override public Optional<PrimitiveValue> toPrimitiveValue() { return Optional.of(PrimitiveValues.value(value)); } - + @Override public InterpreterValue getField(String fieldName) { throw new NoSuchField(fieldName); } - + @Override public void setField(String fieldName, InterpreterValue value) { throw new NoSuchField(fieldName); } -} + + public BooleanInterpreterValue(final boolean value) { + this.value = value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof BooleanInterpreterValue)) return false; + final BooleanInterpreterValue other = (BooleanInterpreterValue)o; + if (this.getValue() != other.getValue()) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + (this.getValue() ? 79 : 97); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "BooleanInterpreterValue(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java index a6ba5e1..458eca7 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/BoxedIntegerInterpreterValue.java @@ -4,13 +4,11 @@ import org.zwobble.couscous.values.StringValue; import static java.util.Arrays.asList; -import lombok.val; - public class BoxedIntegerInterpreterValue { public static final ConcreteType TYPE = ConcreteType.classBuilder("java.lang.Integer") .staticMethod("parseInt", asList(StringValue.REF), (environment, arguments) -> { - val value = (StringInterpreterValue)arguments.get(0); + StringInterpreterValue value = (StringInterpreterValue)arguments.get(0); return new IntegerInterpreterValue(Integer.parseInt(value.getValue())); }) diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java index 2c64031..a61ec27 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/ConcreteType.java @@ -5,7 +5,6 @@ import java.util.Map; import java.util.Optional; import java.util.function.BiFunction; import java.util.stream.Collectors; - import org.zwobble.couscous.ast.ClassNode; import org.zwobble.couscous.ast.FormalArgumentNode; import org.zwobble.couscous.ast.TypeName; @@ -16,32 +15,27 @@ import org.zwobble.couscous.interpreter.NoSuchMethod; import org.zwobble.couscous.interpreter.PositionalArguments; import org.zwobble.couscous.interpreter.WrongNumberOfArguments; import org.zwobble.couscous.util.Casts; - import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; - import static java.util.stream.Collectors.toMap; -import lombok.val; - public class ConcreteType { + public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, TypeName reference) { return new Builder<>(interpreterValueType, reference); } - + public static <T> ConcreteType.Builder<T> builder(Class<T> interpreterValueType, String name) { return builder(interpreterValueType, TypeName.of(name)); } - + public static ConcreteType.Builder<ObjectInterpreterValue> classBuilder(String name) { return builder(ObjectInterpreterValue.class, name); } public static class Builder<T> { - private final ImmutableMap.Builder<String, MethodValue> methods = - ImmutableMap.builder(); - private final ImmutableMap.Builder<String, StaticMethodValue> staticMethods = - ImmutableMap.builder(); + private final ImmutableMap.Builder<String, MethodValue> methods = ImmutableMap.builder(); + private final ImmutableMap.Builder<String, StaticMethodValue> staticMethods = ImmutableMap.builder(); private final Class<T> interpreterValueType; private final TypeName name; @@ -50,112 +44,51 @@ public class ConcreteType { this.name = name; } - public Builder<T> method( - String name, - List<TypeName> argumentsTypes, - BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method) { + public Builder<T> method(String name, List<TypeName> argumentsTypes, BiFunction<Environment, MethodCallArguments<T>, InterpreterValue> method) { methods.put(name, new MethodValue(argumentsTypes, (environment, arguments) -> { - return Casts.tryCast(interpreterValueType, arguments.getReceiver()) - .map(typedReceiver -> - method.apply(environment, MethodCallArguments.of(typedReceiver, arguments.getPositionalArguments()))) - .orElseThrow(() -> new RuntimeException("receiver is of wrong type")); + return Casts.tryCast(interpreterValueType, arguments.getReceiver()).map(typedReceiver -> method.apply(environment, MethodCallArguments.of(typedReceiver, arguments.getPositionalArguments()))).orElseThrow(() -> new RuntimeException("receiver is of wrong type")); })); return this; } - public Builder<T> staticMethod( - String name, - List<TypeName> argumentsTypes, - BiFunction<Environment, PositionalArguments, InterpreterValue> method) { + public Builder<T> staticMethod(String name, List<TypeName> argumentsTypes, BiFunction<Environment, PositionalArguments, InterpreterValue> method) { staticMethods.put(name, new StaticMethodValue(argumentsTypes, method)); return this; } public ConcreteType build() { - return new ConcreteType( - name, - ImmutableMap.of(), - new MethodValue( - ImmutableList.of(), - (environment, arguments) -> InterpreterValues.UNIT), - methods.build(), - staticMethods.build()); + return new ConcreteType(name, ImmutableMap.of(), new MethodValue(ImmutableList.of(), (environment, arguments) -> InterpreterValues.UNIT), methods.build(), staticMethods.build()); } } public static ConcreteType fromNode(ClassNode classNode) { - val fields = classNode.getFields().stream() - .collect(toMap( - field -> field.getName(), - field -> new FieldValue(field.getName(), field.getType()))); - - val constructor = new MethodValue( - getArgumentTypes(classNode.getConstructor().getArguments()), - (environment, arguments) -> Executor.callMethod( - environment, - classNode.getConstructor(), - Optional.of(arguments.getReceiver()), - arguments.getPositionalArguments())); - - val methods = classNode.getMethods().stream() - .filter(method -> !method.isStatic()) - .collect(toMap( - method -> method.getName(), - method -> { - val argumentTypes = getArgumentTypes(method.getArguments()); - - return new MethodValue(argumentTypes, (environment, arguments) -> { - return Executor.callMethod( - environment, - method, - Optional.of(arguments.getReceiver()), - arguments.getPositionalArguments()); - }); - })); - - val staticMethods = classNode.getMethods() - .stream() - .filter(method -> method.isStatic()) - .collect(toMap( - method -> method.getName(), - method -> { - val argumentTypes = getArgumentTypes(method.getArguments()); - - return new StaticMethodValue(argumentTypes, (environment, arguments) -> { - return Executor.callMethod( - environment, - method, - Optional.empty(), - arguments); - }); - })); - return new ConcreteType( - classNode.getName(), - fields, - constructor, - methods, - staticMethods); + final java.util.Map<String, FieldValue> fields = classNode.getFields().stream().collect(toMap(field -> field.getName(), field -> new FieldValue(field.getName(), field.getType()))); + final org.zwobble.couscous.interpreter.values.MethodValue constructor = new MethodValue(getArgumentTypes(classNode.getConstructor().getArguments()), (environment, arguments) -> Executor.callMethod(environment, classNode.getConstructor(), Optional.of(arguments.getReceiver()), arguments.getPositionalArguments())); + final java.util.Map<String, MethodValue> methods = classNode.getMethods().stream().filter(method -> !method.isStatic()).collect(toMap(method -> method.getName(), method -> { + List<TypeName> argumentTypes = getArgumentTypes(method.getArguments()); + return new MethodValue(argumentTypes, (environment, arguments) -> { + return Executor.callMethod(environment, method, Optional.of(arguments.getReceiver()), arguments.getPositionalArguments()); + }); + })); + final java.util.Map<String, StaticMethodValue> staticMethods = classNode.getMethods().stream().filter(method -> method.isStatic()).collect(toMap(method -> method.getName(), method -> { + List<TypeName> argumentTypes = getArgumentTypes(method.getArguments()); + return new StaticMethodValue(argumentTypes, (environment, arguments) -> { + return Executor.callMethod(environment, method, Optional.empty(), arguments); + }); + })); + return new ConcreteType(classNode.getName(), fields, constructor, methods, staticMethods); } private static List<TypeName> getArgumentTypes(List<FormalArgumentNode> arguments) { - return arguments - .stream() - .map(arg -> arg.getType()) - .collect(Collectors.toList()); + return arguments.stream().map(arg -> arg.getType()).collect(Collectors.toList()); } - private final TypeName name; private final Map<String, FieldValue> fields; private final MethodValue constructor; private final Map<String, MethodValue> methods; private final Map<String, StaticMethodValue> staticMethods; - - public ConcreteType( - TypeName name, - Map<String, FieldValue> fields, - MethodValue constructor, - Map<String, MethodValue> methods, - Map<String, StaticMethodValue> staticMethods) { + + public ConcreteType(TypeName name, Map<String, FieldValue> fields, MethodValue constructor, Map<String, MethodValue> methods, Map<String, StaticMethodValue> staticMethods) { this.name = name; this.fields = fields; this.constructor = constructor; @@ -170,27 +103,21 @@ public class ConcreteType { public Optional<FieldValue> getField(String fieldName) { return Optional.ofNullable(fields.get(fieldName)); } - + public InterpreterValue callMethod(Environment environment, InterpreterValue receiver, String methodName, List<InterpreterValue> arguments) { - val method = findMethod(methods, methodName, arguments); - return method.apply( - environment, - MethodCallArguments.of(receiver, new PositionalArguments(arguments))); + final org.zwobble.couscous.interpreter.values.MethodValue method = findMethod(methods, methodName, arguments); + return method.apply(environment, MethodCallArguments.of(receiver, new PositionalArguments(arguments))); } - + public InterpreterValue callStaticMethod(Environment environment, String methodName, List<InterpreterValue> arguments) { - val method = findMethod(staticMethods, methodName, arguments); + final org.zwobble.couscous.interpreter.values.StaticMethodValue method = findMethod(staticMethods, methodName, arguments); return method.apply(environment, new PositionalArguments(arguments)); } - - public InterpreterValue callConstructor( - Environment environment, - List<InterpreterValue> arguments) { - val object = new ObjectInterpreterValue(this); + + public InterpreterValue callConstructor(Environment environment, List<InterpreterValue> arguments) { + final org.zwobble.couscous.interpreter.values.ObjectInterpreterValue object = new ObjectInterpreterValue(this); checkMethodArguments(constructor, arguments); - constructor.apply( - environment, - MethodCallArguments.of(object, new PositionalArguments(arguments))); + constructor.apply(environment, MethodCallArguments.of(object, new PositionalArguments(arguments))); return object; } @@ -198,20 +125,17 @@ public class ConcreteType { if (!methods.containsKey(methodName)) { throw new NoSuchMethod(methodName); } - val method = methods.get(methodName); + final T method = methods.get(methodName); checkMethodArguments(method, arguments); return method; } - - private static void checkMethodArguments( - final Callable method, - List<InterpreterValue> arguments) { + + private static void checkMethodArguments(final Callable method, List<InterpreterValue> arguments) { if (method.getArgumentTypes().size() != arguments.size()) { throw new WrongNumberOfArguments(method.getArgumentTypes().size(), arguments.size()); } - for (int index = 0; index < arguments.size(); index++) { - val formalArgumentType = method.getArgumentTypes().get(index); + final org.zwobble.couscous.ast.TypeName formalArgumentType = method.getArgumentTypes().get(index); InterpreterTypes.checkIsInstance(formalArgumentType, arguments.get(index)); } } @@ -220,4 +144,4 @@ public class ConcreteType { public String toString() { return "ConcreteType<" + name + ">"; } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java index d778144..4ee1c95 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/FieldValue.java @@ -2,10 +2,50 @@ package org.zwobble.couscous.interpreter.values; import org.zwobble.couscous.ast.TypeName; -import lombok.Value; +public final class FieldValue { + private final String name; + private final TypeName type; -@Value -public class FieldValue { - String name; - TypeName type; -} + public FieldValue(final String name, final TypeName type) { + this.name = name; + this.type = type; + } + + public String getName() { + return this.name; + } + + public TypeName getType() { + return this.type; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof FieldValue)) return false; + final FieldValue other = (FieldValue)o; + final java.lang.Object this$name = this.getName(); + final java.lang.Object other$name = other.getName(); + if (this$name == null ? other$name != null : !this$name.equals(other$name)) return false; + final java.lang.Object this$type = this.getType(); + final java.lang.Object other$type = other.getType(); + if (this$type == null ? other$type != null : !this$type.equals(other$type)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $name = this.getName(); + result = result * PRIME + ($name == null ? 43 : $name.hashCode()); + final java.lang.Object $type = this.getType(); + result = result * PRIME + ($type == null ? 43 : $type.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "FieldValue(name=" + this.getName() + ", type=" + this.getType() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java index 95b05aa..bd214cb 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/IntegerInterpreterValue.java @@ -1,48 +1,67 @@ package org.zwobble.couscous.interpreter.values; import java.util.Optional; - import org.zwobble.couscous.interpreter.NoSuchField; import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValues; import org.zwobble.couscous.values.StringValue; - import static java.util.Arrays.asList; -import lombok.Value; -import lombok.val; - -@Value -public class IntegerInterpreterValue implements InterpreterValue { - public static final ConcreteType TYPE = ConcreteType.builder(IntegerInterpreterValue.class, IntegerValue.REF) - .staticMethod("parseInt", asList(StringValue.REF), - (environment, arguments) -> { - val value = (StringInterpreterValue)arguments.get(0); - return new IntegerInterpreterValue(Integer.parseInt(value.getValue())); - }) - - .build(); - - int value; - +public final class IntegerInterpreterValue implements InterpreterValue { + public static final ConcreteType TYPE = ConcreteType.builder(IntegerInterpreterValue.class, IntegerValue.REF).staticMethod("parseInt", asList(StringValue.REF), (environment, arguments) -> { + StringInterpreterValue value = (StringInterpreterValue)arguments.get(0); + return new IntegerInterpreterValue(Integer.parseInt(value.getValue())); + }).build(); + private final int value; + @Override public ConcreteType getType() { return TYPE; } - + @Override public Optional<PrimitiveValue> toPrimitiveValue() { return Optional.of(PrimitiveValues.value(value)); } - + @Override public InterpreterValue getField(String fieldName) { throw new NoSuchField(fieldName); } - + @Override public void setField(String fieldName, InterpreterValue value) { throw new NoSuchField(fieldName); } -} + + public IntegerInterpreterValue(final int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof IntegerInterpreterValue)) return false; + final IntegerInterpreterValue other = (IntegerInterpreterValue)o; + if (this.getValue() != other.getValue()) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + this.getValue(); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "IntegerInterpreterValue(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/MethodCallArguments.java b/src/main/java/org/zwobble/couscous/interpreter/values/MethodCallArguments.java index 9f3e937..23af57f 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/MethodCallArguments.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/MethodCallArguments.java @@ -2,11 +2,6 @@ package org.zwobble.couscous.interpreter.values; import org.zwobble.couscous.interpreter.PositionalArguments; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor(staticName="of") -@Getter public class MethodCallArguments<T> { private final T receiver; private final PositionalArguments positionalArguments; @@ -14,4 +9,21 @@ public class MethodCallArguments<T> { public InterpreterValue get(int index) { return positionalArguments.get(index); } -} + + private MethodCallArguments(final T receiver, final PositionalArguments positionalArguments) { + this.receiver = receiver; + this.positionalArguments = positionalArguments; + } + + public static <T> MethodCallArguments<T> of(final T receiver, final PositionalArguments positionalArguments) { + return new MethodCallArguments<T>(receiver, positionalArguments); + } + + public T getReceiver() { + return this.receiver; + } + + public PositionalArguments getPositionalArguments() { + return this.positionalArguments; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/MethodValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/MethodValue.java index b5068fc..81964fb 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/MethodValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/MethodValue.java @@ -2,21 +2,53 @@ package org.zwobble.couscous.interpreter.values; import java.util.List; import java.util.function.BiFunction; - import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.interpreter.Environment; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Value; - -@Value -public class MethodValue implements Callable { - List<TypeName> argumentTypes; - @Getter(value=AccessLevel.NONE) - BiFunction<Environment, MethodCallArguments<InterpreterValue>, InterpreterValue> apply; +public final class MethodValue implements Callable { + private final List<TypeName> argumentTypes; + private final BiFunction<Environment, MethodCallArguments<InterpreterValue>, InterpreterValue> apply; public InterpreterValue apply(Environment environment, MethodCallArguments<InterpreterValue> arguments) { return apply.apply(environment, arguments); } -} + + public MethodValue(final List<TypeName> argumentTypes, final BiFunction<Environment, MethodCallArguments<InterpreterValue>, InterpreterValue> apply) { + this.argumentTypes = argumentTypes; + this.apply = apply; + } + + public List<TypeName> getArgumentTypes() { + return this.argumentTypes; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof MethodValue)) return false; + final MethodValue other = (MethodValue)o; + final java.lang.Object this$argumentTypes = this.getArgumentTypes(); + final java.lang.Object other$argumentTypes = other.getArgumentTypes(); + if (this$argumentTypes == null ? other$argumentTypes != null : !this$argumentTypes.equals(other$argumentTypes)) return false; + final java.lang.Object this$apply = this.apply; + final java.lang.Object other$apply = other.apply; + if (this$apply == null ? other$apply != null : !this$apply.equals(other$apply)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $argumentTypes = this.getArgumentTypes(); + result = result * PRIME + ($argumentTypes == null ? 43 : $argumentTypes.hashCode()); + final java.lang.Object $apply = this.apply; + result = result * PRIME + ($apply == null ? 43 : $apply.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "MethodValue(argumentTypes=" + this.getArgumentTypes() + ", apply=" + this.apply + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java index b248398..bebd5f7 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/ObjectInterpreterValue.java @@ -3,18 +3,15 @@ package org.zwobble.couscous.interpreter.values; import java.util.HashMap; import java.util.Map; import java.util.Optional; - import org.zwobble.couscous.interpreter.InterpreterTypes; import org.zwobble.couscous.interpreter.NoSuchField; import org.zwobble.couscous.interpreter.UnboundField; import org.zwobble.couscous.values.PrimitiveValue; -import lombok.val; - public class ObjectInterpreterValue implements InterpreterValue { private final ConcreteType type; private final Map<String, InterpreterValue> fields; - + public ObjectInterpreterValue(ConcreteType type) { this.type = type; this.fields = new HashMap<>(); @@ -24,26 +21,27 @@ public class ObjectInterpreterValue implements InterpreterValue { public ConcreteType getType() { return type; } - + @Override public Optional<PrimitiveValue> toPrimitiveValue() { return Optional.empty(); } - + @Override public InterpreterValue getField(String fieldName) { type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName)); if (fields.containsKey(fieldName)) { - return fields.get(fieldName); + return fields.get(fieldName); } else { throw new UnboundField(fieldName); } } - + @Override public void setField(String fieldName, InterpreterValue value) { - val field = type.getField(fieldName).orElseThrow(() -> new NoSuchField(fieldName)); + FieldValue field = type.getField(fieldName) + .orElseThrow(() -> new NoSuchField(fieldName)); InterpreterTypes.checkIsInstance(field.getType(), value); - fields.put(fieldName, value); + fields.put(fieldName, value); } -} +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StaticMethodValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StaticMethodValue.java index 37f3c56..302582c 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/StaticMethodValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/StaticMethodValue.java @@ -2,23 +2,54 @@ package org.zwobble.couscous.interpreter.values; import java.util.List; import java.util.function.BiFunction; - import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.interpreter.PositionalArguments; import org.zwobble.couscous.interpreter.Environment; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Value; - -@Value -public class StaticMethodValue implements Callable { - List<TypeName> argumentTypes; - @Getter(value=AccessLevel.NONE) - BiFunction<Environment, PositionalArguments, InterpreterValue> apply; +public final class StaticMethodValue implements Callable { + private final List<TypeName> argumentTypes; + private final BiFunction<Environment, PositionalArguments, InterpreterValue> apply; public InterpreterValue apply(Environment environment, PositionalArguments arguments) { return apply.apply(environment, arguments); } - -} + + public StaticMethodValue(final List<TypeName> argumentTypes, final BiFunction<Environment, PositionalArguments, InterpreterValue> apply) { + this.argumentTypes = argumentTypes; + this.apply = apply; + } + + public List<TypeName> getArgumentTypes() { + return this.argumentTypes; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof StaticMethodValue)) return false; + final StaticMethodValue other = (StaticMethodValue)o; + final java.lang.Object this$argumentTypes = this.getArgumentTypes(); + final java.lang.Object other$argumentTypes = other.getArgumentTypes(); + if (this$argumentTypes == null ? other$argumentTypes != null : !this$argumentTypes.equals(other$argumentTypes)) return false; + final java.lang.Object this$apply = this.apply; + final java.lang.Object other$apply = other.apply; + if (this$apply == null ? other$apply != null : !this$apply.equals(other$apply)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $argumentTypes = this.getArgumentTypes(); + result = result * PRIME + ($argumentTypes == null ? 43 : $argumentTypes.hashCode()); + final java.lang.Object $apply = this.apply; + result = result * PRIME + ($apply == null ? 43 : $apply.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "StaticMethodValue(argumentTypes=" + this.getArgumentTypes() + ", apply=" + this.apply + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java index 15bde43..42ee713 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/StringInterpreterValue.java @@ -1,53 +1,71 @@ package org.zwobble.couscous.interpreter.values; import java.util.Optional; - import org.zwobble.couscous.interpreter.NoSuchField; import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValues; import org.zwobble.couscous.values.StringValue; - import static java.util.Arrays.asList; -import lombok.Value; -import lombok.val; - -@Value -public class StringInterpreterValue implements InterpreterValue { - public static final ConcreteType TYPE = ConcreteType.builder(StringInterpreterValue.class, StringValue.REF) - .method("length", asList(), - (environment, arguments) -> - new IntegerInterpreterValue(arguments.getReceiver().value.length())) - - .method("substring", asList(IntegerValue.REF, IntegerValue.REF), - (environment, arguments) -> { - val startIndex = (IntegerInterpreterValue)arguments.get(0); - val endIndex = (IntegerInterpreterValue)arguments.get(1); - return new StringInterpreterValue(arguments.getReceiver().value.substring(startIndex.getValue(), endIndex.getValue())); - }) - - .build(); - - String value; - +public final class StringInterpreterValue implements InterpreterValue { + public static final ConcreteType TYPE = ConcreteType.builder(StringInterpreterValue.class, StringValue.REF).method("length", asList(), (environment, arguments) -> new IntegerInterpreterValue(arguments.getReceiver().value.length())).method("substring", asList(IntegerValue.REF, IntegerValue.REF), (environment, arguments) -> { + IntegerInterpreterValue startIndex = (IntegerInterpreterValue)arguments.get(0); + IntegerInterpreterValue endIndex = (IntegerInterpreterValue)arguments.get(1); + return new StringInterpreterValue(arguments.getReceiver().value.substring(startIndex.getValue(), endIndex.getValue())); + }).build(); + private final String value; + @Override public ConcreteType getType() { return TYPE; } - + @Override public Optional<PrimitiveValue> toPrimitiveValue() { return Optional.of(PrimitiveValues.value(value)); } - + @Override public InterpreterValue getField(String fieldName) { throw new NoSuchField(fieldName); } - + @Override public void setField(String fieldName, InterpreterValue value) { throw new NoSuchField(fieldName); } -} + + public StringInterpreterValue(final String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof StringInterpreterValue)) return false; + final StringInterpreterValue other = (StringInterpreterValue)o; + final java.lang.Object this$value = this.getValue(); + final java.lang.Object other$value = other.getValue(); + if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $value = this.getValue(); + result = result * PRIME + ($value == null ? 43 : $value.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "StringInterpreterValue(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java b/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java index 1c184a4..2d4ef9c 100644 --- a/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java +++ b/src/main/java/org/zwobble/couscous/interpreter/values/UnitInterpreterValue.java @@ -1,40 +1,39 @@ package org.zwobble.couscous.interpreter.values; import java.util.Optional; - import org.zwobble.couscous.interpreter.NoSuchField; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValues; -import lombok.ToString; - -@ToString public class UnitInterpreterValue implements InterpreterValue { - private static final ConcreteType TYPE = ConcreteType.builder(UnitInterpreterValue.class, "Unit") - .build(); - - public static final UnitInterpreterValue UNIT = new UnitInterpreterValue(); + private static final ConcreteType TYPE = ConcreteType.builder(UnitInterpreterValue.class, "Unit").build(); + public static final UnitInterpreterValue UNIT = new UnitInterpreterValue(); private UnitInterpreterValue() { } - + @Override public ConcreteType getType() { return TYPE; } - + @Override public Optional<PrimitiveValue> toPrimitiveValue() { return Optional.of(PrimitiveValues.UNIT); } - + @Override public InterpreterValue getField(String fieldName) { throw new NoSuchField(fieldName); } - + @Override public void setField(String fieldName, InterpreterValue value) { throw new NoSuchField(fieldName); } -} + + @java.lang.Override + public java.lang.String toString() { + return "UnitInterpreterValue()"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/values/BooleanValue.java b/src/main/java/org/zwobble/couscous/values/BooleanValue.java index 6f18e36..5e6191f 100644 --- a/src/main/java/org/zwobble/couscous/values/BooleanValue.java +++ b/src/main/java/org/zwobble/couscous/values/BooleanValue.java @@ -2,28 +2,47 @@ package org.zwobble.couscous.values; import org.zwobble.couscous.ast.TypeName; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.Value; - -@Value -public class BooleanValue implements PrimitiveValue { +public final class BooleanValue implements PrimitiveValue { public static final TypeName REF = TypeName.of("boolean"); - - @Getter(value = AccessLevel.NONE) - boolean value; + private final boolean value; public boolean getValue() { return value; } - + @Override public <T> T accept(PrimitiveValueVisitor<T> visitor) { return visitor.visit(this); } - + @Override public TypeName getType() { return REF; } -} + + public BooleanValue(final boolean value) { + this.value = value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof BooleanValue)) return false; + final BooleanValue other = (BooleanValue)o; + if (this.getValue() != other.getValue()) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + (this.getValue() ? 79 : 97); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "BooleanValue(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/values/IntegerValue.java b/src/main/java/org/zwobble/couscous/values/IntegerValue.java index 794ad8c..e897668 100644 --- a/src/main/java/org/zwobble/couscous/values/IntegerValue.java +++ b/src/main/java/org/zwobble/couscous/values/IntegerValue.java @@ -2,21 +2,47 @@ package org.zwobble.couscous.values; import org.zwobble.couscous.ast.TypeName; -import lombok.Value; - -@Value -public class IntegerValue implements PrimitiveValue { +public final class IntegerValue implements PrimitiveValue { public static final TypeName REF = TypeName.of("int"); + private final int value; - int value; - @Override public <T> T accept(PrimitiveValueVisitor<T> visitor) { return visitor.visit(this); } - + @Override public TypeName getType() { return REF; } -} + + public IntegerValue(final int value) { + this.value = value; + } + + public int getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof IntegerValue)) return false; + final IntegerValue other = (IntegerValue)o; + if (this.getValue() != other.getValue()) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + result = result * PRIME + this.getValue(); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "IntegerValue(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file diff --git a/src/main/java/org/zwobble/couscous/values/StringValue.java b/src/main/java/org/zwobble/couscous/values/StringValue.java index b912fd3..73e3191 100644 --- a/src/main/java/org/zwobble/couscous/values/StringValue.java +++ b/src/main/java/org/zwobble/couscous/values/StringValue.java @@ -2,25 +2,54 @@ package org.zwobble.couscous.values; import org.zwobble.couscous.ast.TypeName; -import lombok.Value; - -@Value -public class StringValue implements PrimitiveValue { +public final class StringValue implements PrimitiveValue { + public static StringValue of(String value) { return new StringValue(value); } - public static final TypeName REF = TypeName.of("java.lang.String"); - - String value; - + private final String value; + @Override public <T> T accept(PrimitiveValueVisitor<T> visitor) { return visitor.visit(this); } - + @Override public TypeName getType() { return REF; } -} + + public StringValue(final String value) { + this.value = value; + } + + public String getValue() { + return this.value; + } + + @java.lang.Override + public boolean equals(final java.lang.Object o) { + if (o == this) return true; + if (!(o instanceof StringValue)) return false; + final StringValue other = (StringValue)o; + final java.lang.Object this$value = this.getValue(); + final java.lang.Object other$value = other.getValue(); + if (this$value == null ? other$value != null : !this$value.equals(other$value)) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + final int PRIME = 59; + int result = 1; + final java.lang.Object $value = this.getValue(); + result = result * PRIME + ($value == null ? 43 : $value.hashCode()); + return result; + } + + @java.lang.Override + public java.lang.String toString() { + return "StringValue(value=" + this.getValue() + ")"; + } +}
\ No newline at end of file |
