aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java42
-rw-r--r--src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java30
-rw-r--r--src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java5
3 files changed, 68 insertions, 9 deletions
diff --git a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java
new file mode 100644
index 0000000..b53560d
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpPrimitiveMethods.java
@@ -0,0 +1,42 @@
+package org.zwobble.couscous.backends.csharp;
+
+import com.google.common.collect.ImmutableMap;
+import org.zwobble.couscous.ast.ExpressionNode;
+import org.zwobble.couscous.ast.TypeName;
+import org.zwobble.couscous.backends.SourceCodeWriter;
+import org.zwobble.couscous.values.ObjectValues;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+
+public class CsharpPrimitiveMethods {
+ private static final Map<String, PrimitiveStaticMethodGenerator> STATIC_INT_METHODS =
+ ImmutableMap.<String, PrimitiveStaticMethodGenerator>builder()
+
+ .put("parseInt", (arguments, writer) -> {
+ writer.writeIdentifier("int");
+ writer.writeSymbol(".");
+ writer.writeIdentifier("Parse");
+ writer.writeSymbol("(");
+ writer.writeIdentifier(CsharpSerializer.serialize(arguments.get(0), ""));
+ writer.writeSymbol(")");
+ })
+
+ .build();
+
+ private static final Map<TypeName, Map<String, PrimitiveStaticMethodGenerator>> STATIC_METHODS =
+ ImmutableMap.<TypeName, Map<String, PrimitiveStaticMethodGenerator>>builder()
+ .put(ObjectValues.BOXED_INT, STATIC_INT_METHODS)
+ .build();
+
+ public static Optional<PrimitiveStaticMethodGenerator> getPrimitiveStaticMethod(TypeName type, String methodName) {
+ return Optional.ofNullable(STATIC_METHODS.get(type))
+ .flatMap(methodsForType -> Optional.ofNullable(methodsForType.get(methodName)));
+ }
+
+ @FunctionalInterface
+ public interface PrimitiveStaticMethodGenerator {
+ void generate(List<ExpressionNode> arguments, SourceCodeWriter writer);
+ }
+}
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 6dc7c34..275ae13 100644
--- a/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
+++ b/src/main/java/org/zwobble/couscous/backends/csharp/CsharpSerializer.java
@@ -117,10 +117,32 @@ public class CsharpSerializer implements NodeVisitor {
@Override
public void visit(MethodCallNode methodCall) {
- write(methodCall.getReceiver());
- writer.writeSymbol(".");
- writer.writeIdentifier(methodCall.getMethodName());
- writeArguments(methodCall.getArguments());
+ if (!writePrimitiveMethod(methodCall)) {
+ write(methodCall.getReceiver());
+ writer.writeSymbol(".");
+ writer.writeIdentifier(methodCall.getMethodName());
+ writeArguments(methodCall.getArguments());
+ }
+ }
+
+ private boolean writePrimitiveMethod(MethodCallNode methodCall) {
+ return methodCall.getReceiver().accept(new Receiver.Mapper<Boolean>() {
+ @Override
+ public Boolean visit(ExpressionNode receiver) {
+ return false;
+ }
+
+ @Override
+ public Boolean visit(TypeName receiver) {
+ // TODO: transform AST before serialisation instead of exposing write to CsharpPrimitiveMethods
+ return CsharpPrimitiveMethods.getPrimitiveStaticMethod(receiver, methodCall.getMethodName())
+ .map(generator -> {
+ generator.generate(methodCall.getArguments(), writer);
+ return true;
+ })
+ .orElse(false);
+ }
+ });
}
@Override
diff --git a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
index 56897e1..24588df 100644
--- a/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
+++ b/src/test/java/org/zwobble/couscous/tests/backends/csharp/CsharpCompilerEvalTests.java
@@ -32,11 +32,6 @@ public class CsharpCompilerEvalTests extends BackendEvalTests {
@Test
@Ignore
- public void canCallBuiltinStaticMethod() {
- }
-
- @Test
- @Ignore
public void canCallStaticMethodFromUserDefinedStaticMethod() {
}