diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-01-16 17:07:45 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-01-16 17:07:45 +0000 |
| commit | 013265afb2432181de05a109fd8fe7823d8f3d69 (patch) | |
| tree | 3e01bc64e887a981682e58d4018d112a09535158 | |
| parent | 8d7bc34b73f2c62d1b9fd50c12b0e0ba6ab0c37a (diff) | |
Add hacktastic support for primitive static methods in C#
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() { } |
