diff options
Diffstat (limited to 'src')
9 files changed, 89 insertions, 12 deletions
diff --git a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java index 358b4a8..c284d1f 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodCallNode.java @@ -90,7 +90,7 @@ public class MethodCallNode implements ExpressionNode { public ExpressionNode transform(NodeTransformer transformer) { return new MethodCallNode( transformer.transformReceiver(receiver), - methodName, + transformer.transformMethodName(signature()), transformer.transformExpressions(arguments), transformer.transform(type)); } diff --git a/src/main/java/org/zwobble/couscous/ast/MethodNode.java b/src/main/java/org/zwobble/couscous/ast/MethodNode.java index b5dfd39..e0b2432 100644 --- a/src/main/java/org/zwobble/couscous/ast/MethodNode.java +++ b/src/main/java/org/zwobble/couscous/ast/MethodNode.java @@ -156,7 +156,7 @@ public class MethodNode implements CallableNode { return new MethodNode( transformer.transformAnnotations(annotations), isStatic, - name, + transformer.transformMethodName(signature()), transformer.transformFormalArguments(arguments), transformer.transform(returnType), transformer.transformStatements(body)); diff --git a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java index 683b3b9..277813c 100644 --- a/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java +++ b/src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java @@ -150,6 +150,7 @@ public class NodeTransformer { public static class Builder { private Function<ExpressionNode, Optional<ExpressionNode>> transformExpression = expression -> Optional.empty(); private Function<TypeName, TypeName> transformType = type -> type; + private Function<MethodSignature, String> transformMethodName = MethodSignature::getName; public Builder transformExpression( Function<ExpressionNode, Optional<ExpressionNode>> transformExpression) @@ -165,26 +166,38 @@ public class NodeTransformer { return this; } + public Builder transformMethodName(Function<MethodSignature, String> transformMethodName) { + this.transformMethodName = transformMethodName; + return this; + } + public NodeTransformer build() { - return new NodeTransformer(transformExpression, transformType); + return new NodeTransformer(transformExpression, transformType, transformMethodName); } } private final Function<ExpressionNode, Optional<ExpressionNode>> transformExpression; private final Function<TypeName, TypeName> transformType; + private final Function<MethodSignature, String> transformMethodName; private NodeTransformer( Function<ExpressionNode, Optional<ExpressionNode>> transformExpression, - Function<TypeName, TypeName> transformType) + Function<TypeName, TypeName> transformType, + Function<MethodSignature, String> transformMethodName) { this.transformExpression = transformExpression; this.transformType = transformType; + this.transformMethodName = transformMethodName; } public TypeName transform(TypeName type) { return transformType.apply(type); } + public String transformMethodName(MethodSignature signature) { + return transformMethodName.apply(signature); + } + public ExpressionNode transformExpression(ExpressionNode expression) { return transformExpression.apply(expression) .orElseGet(() -> expression.transform(this)); diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java index 2ba7470..a0db521 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java @@ -3,6 +3,7 @@ package org.zwobble.couscous.backends.csharp; import com.google.common.collect.ImmutableMap; import org.zwobble.couscous.ast.*; import org.zwobble.couscous.ast.visitors.NodeTransformer; +import org.zwobble.couscous.backends.python.PythonCodeGenerator; import org.zwobble.couscous.values.*; import java.util.Map; @@ -34,6 +35,7 @@ public class CsharpCodeGenerator { return NodeTransformer.builder() .transformType(this::transformType) .transformExpression(this::transformExpression) + .transformMethodName(this::transformMethodName) .build() .transform(node); } @@ -46,6 +48,10 @@ public class CsharpCodeGenerator { } } + private String transformMethodName(MethodSignature signature) { + return PythonCodeGenerator.toName(signature); + } + private Optional<ExpressionNode> transformExpression(ExpressionNode expression) { return tryCast(MethodCallNode.class, expression) .flatMap(this::transformMethodCall); diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java index c45f85f..f3c946f 100644 --- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java +++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java @@ -21,7 +21,6 @@ public class CsharpSerializer implements NodeVisitor { CsharpSerializer serializer = new CsharpSerializer(writer); serializer.write(node); - System.out.println(writer.asString()); return writer.asString(); } diff --git a/src/main/resources/csharp/runtime/_couscous.cs b/src/main/resources/csharp/runtime/_couscous.cs index 752b021..bcc2a76 100644 --- a/src/main/resources/csharp/runtime/_couscous.cs +++ b/src/main/resources/csharp/runtime/_couscous.cs @@ -1,6 +1,6 @@ namespace Couscous { internal class _couscous { - internal static bool same(object first, object second) { + internal static bool same__java_lang_Object__java_lang_Object(object first, object second) { return object.ReferenceEquals(first, second); } } diff --git a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java index e64542a..38887bd 100644 --- a/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java +++ b/src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java @@ -1,11 +1,7 @@ package org.zwobble.couscous.tests; import org.junit.Test; -import org.zwobble.couscous.ast.ClassNode; -import org.zwobble.couscous.ast.FormalArgumentNode; -import org.zwobble.couscous.ast.LiteralNode; -import org.zwobble.couscous.ast.LocalVariableDeclarationNode; -import org.zwobble.couscous.ast.MethodNode; +import org.zwobble.couscous.ast.*; import org.zwobble.couscous.values.IntegerValue; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.PrimitiveValues; @@ -42,6 +38,7 @@ public abstract class BackendMethodTests { @Test public void canReturnLiteralValue() { MethodNode.Builder method = staticMethod("hello") + .returns(StringValue.REF) .statement(returns(literal("hello, world!"))); final java.lang.Object result = runMethod(method); assertEquals(value("hello, world!"), result); @@ -52,6 +49,7 @@ public abstract class BackendMethodTests { FormalArgumentNode arg = formalArg(var(ANY_ID, "x", StringValue.REF)); MethodNode.Builder method = staticMethod("hello") .argument(arg) + .returns(StringValue.REF) .statement(returns(reference(arg))); final java.lang.Object result = runMethod(method, value("hello, world!")); assertEquals(value("hello, world!"), result); @@ -62,6 +60,7 @@ public abstract class BackendMethodTests { FormalArgumentNode arg = formalArg(var(ANY_ID, "x", StringValue.REF)); MethodNode.Builder method = staticMethod("hello") .argument(arg) + .returns(StringValue.REF) .statement(expressionStatement(assign( reference(arg), literal("[updated value]")))) @@ -74,6 +73,7 @@ public abstract class BackendMethodTests { public void canDeclareVariable() { LocalVariableDeclarationNode localVariableDeclaration = localVariableDeclaration(ANY_ID, "x", StringValue.REF, LiteralNode.literal("[initial value]")); MethodNode.Builder method = staticMethod("hello") + .returns(StringValue.REF) .statement(localVariableDeclaration) .statement(returns(reference(localVariableDeclaration))); final java.lang.Object result = runMethod(method); diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java new file mode 100644 index 0000000..34bb2b1 --- /dev/null +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java @@ -0,0 +1,48 @@ +package org.zwobble.couscous.tests.backends.csharp; + +import org.junit.Ignore; +import org.junit.Test; +import org.zwobble.couscous.tests.BackendMethodTests; +import org.zwobble.couscous.tests.MethodRunner; + +public class CsharpCompilerMethodTests extends BackendMethodTests { + @Ignore + @Test + public void methodWithNoStatementsReturnsUnit() { + } + + @Ignore + @Test + public void canDeclareVariable() { + } + + @Ignore + @Test + public void canDeclareVariableAndThenAssignValues() { + } + + @Ignore + @Test + public void whenConditionIsTrueIfStatementExecutesTrueBranch() { + } + + @Ignore + @Test + public void whenConditionIsFalseIfStatementExecutesTrueBranch() { + } + + @Ignore + @Test + public void whileLoopIsExecutedWhileConditionIsTrue() { + } + + @Ignore + @Test + public void returnWillExitWhileLoopEarly() { + } + + @Override + protected MethodRunner buildMethodRunner() { + return new CsharpMethodRunner(); + } +} diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java index 104308b..5d9c27d 100644 --- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java +++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java @@ -5,13 +5,16 @@ import com.google.common.collect.Iterators; import org.hamcrest.Matchers; import org.zwobble.couscous.Backend; import org.zwobble.couscous.ast.ClassNode; +import org.zwobble.couscous.ast.LiteralNode; import org.zwobble.couscous.ast.MethodSignature; import org.zwobble.couscous.ast.TypeName; import org.zwobble.couscous.backends.csharp.CsharpBackend; +import org.zwobble.couscous.backends.csharp.CsharpSerializer; import org.zwobble.couscous.backends.python.PythonCodeGenerator; import org.zwobble.couscous.tests.MethodRunner; import org.zwobble.couscous.tests.backends.Processes; import org.zwobble.couscous.util.ExtraLists; +import org.zwobble.couscous.values.ObjectValues; import org.zwobble.couscous.values.PrimitiveValue; import org.zwobble.couscous.values.StringValue; @@ -22,6 +25,7 @@ import java.util.List; import static java.lang.Integer.parseInt; import static org.hamcrest.MatcherAssert.assertThat; +import static org.zwobble.couscous.ast.MethodCallNode.staticMethodCall; import static org.zwobble.couscous.tests.util.ExtraFiles.deleteRecursively; import static org.zwobble.couscous.util.ExtraLists.eagerMap; import static org.zwobble.couscous.util.ExtraLists.list; @@ -57,10 +61,17 @@ public class CsharpMethodRunner implements MethodRunner { String csharpMethodName = PythonCodeGenerator.toName(new MethodSignature( methodName, eagerMap(arguments, argument -> argument.getType()))); + String value = CsharpSerializer.serialize( + staticMethodCall( + TypeName.of(NAMESPACE + "." + className.getQualifiedName()), + csharpMethodName, + eagerMap(arguments, LiteralNode::literal), + // TODO: pass in return type + ObjectValues.OBJECT)); String program = "public class MethodRunnerExample { " + " public static void Main() { " + - " var value = " + NAMESPACE + "." + className.getQualifiedName() + "." + csharpMethodName + "();" + + " var value = " + value + ";" + " System.Console.WriteLine(value.GetType());" + " System.Console.WriteLine(value);" + " }" + |
