aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-31 19:17:43 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-31 19:17:43 +0000
commitbfe06980f1e0e5f3597b710f458819eedc190954 (patch)
treeff7ee348f9ccc6853597ec5d88b4f38063e86ae7 /src
parent82e65d3e011beb475e15c70b9bf911fcfc52a080 (diff)
Add CsharpCompilerMethodTests
Diffstat (limited to 'src')
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodCallNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/MethodNode.java2
-rw-r--r--src/main/java/org/zwobble/couscous/ast/visitors/NodeTransformer.java17
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpCodeGenerator.java6
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java1
-rw-r--r--src/main/resources/csharp/runtime/_couscous.cs2
-rw-r--r--src/test/java/org/zwobble/couscous/tests/BackendMethodTests.java10
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerMethodTests.java48
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpMethodRunner.java13
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);" +
" }" +