From daccdded78c28de07e38978c6ea12d88d2886d4e Mon Sep 17 00:00:00 2001 From: Paul Irwin Date: Mon, 17 Aug 2026 12:59:16 -0600 Subject: [PATCH] Map Throwable.getMessage() to Exception.Message (#165) Java's `e.getMessage()` converted to `e.GetMessage()`, which does not compile against C#'s `Exception`. Route it through the existing `TryTransformMethodCall` property-replacement path, alongside `length` and `size`, so it becomes the `Message` property access. Co-Authored-By: Claude Opus 5 (1M context) --- JavaToCSharp.Tests/ConvertExpressionTests.cs | 2 ++ JavaToCSharp.Tests/IntegrationTests.cs | 1 + .../Resources/ExceptionGetMessage.java | 13 +++++++++++++ JavaToCSharp/TypeHelper.cs | 7 +++++++ 4 files changed, 23 insertions(+) create mode 100644 JavaToCSharp.Tests/Resources/ExceptionGetMessage.java diff --git a/JavaToCSharp.Tests/ConvertExpressionTests.cs b/JavaToCSharp.Tests/ConvertExpressionTests.cs index 1c7098b..0c5850b 100644 --- a/JavaToCSharp.Tests/ConvertExpressionTests.cs +++ b/JavaToCSharp.Tests/ConvertExpressionTests.cs @@ -12,6 +12,8 @@ public class ConvertExpressionTests [InlineData("lst.set(i, value)", "lst[i] = value")] [InlineData("str.length()", "str.Length")] [InlineData("arr.length", "arr.Length")] + [InlineData("e.getMessage()", "e.Message")] + [InlineData("obj.getMessage(i)", "obj.GetMessage(i)")] //Conversion not done if param number does not match the required [InlineData("obj.size(i)", "obj.Size(i)")] diff --git a/JavaToCSharp.Tests/IntegrationTests.cs b/JavaToCSharp.Tests/IntegrationTests.cs index 9b6eb34..01ef0de 100644 --- a/JavaToCSharp.Tests/IntegrationTests.cs +++ b/JavaToCSharp.Tests/IntegrationTests.cs @@ -88,6 +88,7 @@ public void GeneralUnsuccessfulConversionTest(string filePath) [InlineData("Resources/InstanceInitializers.java")] [InlineData("Resources/StaticImports.java")] [InlineData("Resources/LabeledBreakContinue.java")] + [InlineData("Resources/ExceptionGetMessage.java")] public void FullIntegrationTests(string filePath, bool allowWarnings = false) => RunFullIntegrationTest(filePath, allowWarnings); diff --git a/JavaToCSharp.Tests/Resources/ExceptionGetMessage.java b/JavaToCSharp.Tests/Resources/ExceptionGetMessage.java new file mode 100644 index 0000000..39eeacd --- /dev/null +++ b/JavaToCSharp.Tests/Resources/ExceptionGetMessage.java @@ -0,0 +1,13 @@ +/// Expect: +/// - output: "caught: boom\n" +package example; + +public class Program { + public static void main(String[] args) { + try { + throw new IllegalArgumentException("boom"); + } catch (IllegalArgumentException e) { + System.out.println("caught: " + e.getMessage()); + } + } +} diff --git a/JavaToCSharp/TypeHelper.cs b/JavaToCSharp/TypeHelper.cs index 49ca3be..bcaafcf 100644 --- a/JavaToCSharp/TypeHelper.cs +++ b/JavaToCSharp/TypeHelper.cs @@ -273,6 +273,13 @@ public static bool TryTransformMethodCall(ConversionContext context, MethodCallE return true; } + case "getMessage" when args.size() == 0: + { + var scopeSyntaxMessage = ExpressionVisitor.VisitExpression(context, scope); + transformedSyntax = ReplaceMethodByProperty(scopeSyntaxMessage, "Message"); + return true; + } + case "get" when args.size() == 1: { var scopeSyntaxGet = ExpressionVisitor.VisitExpression(context, scope);