diff --git a/JavaToCSharp.Tests/IntegrationTests.cs b/JavaToCSharp.Tests/IntegrationTests.cs index 1c8b7d6c..7ed5a58e 100644 --- a/JavaToCSharp.Tests/IntegrationTests.cs +++ b/JavaToCSharp.Tests/IntegrationTests.cs @@ -20,14 +20,18 @@ public class IntegrationTests public void GeneralSuccessfulConversionTest(string filePath) { var options = new JavaConversionOptions(); + options.WarningEncountered += (_, eventArgs) - => Console.WriteLine("Line {0}: {1}", eventArgs.JavaLineNumber, eventArgs.Message); - var parsed = JavaToCSharpConverter.ConvertText(System.IO.File.ReadAllText(filePath), options); + => throw new InvalidOperationException($"Encountered a warning in conversion: {eventArgs.Message}"); + + var parsed = JavaToCSharpConverter.ConvertText(File.ReadAllText(filePath), options); Assert.NotNull(parsed); } [Theory] [InlineData("Resources/HelloWorld.java")] + [InlineData("Resources/Java7TryWithResources.java")] + [InlineData("Resources/Java9TryWithResources.java")] public void FullIntegrationTests(string filePath) { var options = new JavaConversionOptions @@ -36,15 +40,17 @@ public void FullIntegrationTests(string filePath) }; options.WarningEncountered += (_, eventArgs) - => Console.WriteLine("Line {0}: {1}", eventArgs.JavaLineNumber, eventArgs.Message); + => throw new InvalidOperationException($"Encountered a warning in conversion: {eventArgs.Message}"); + + var javaText = File.ReadAllText(filePath); - var parsed = JavaToCSharpConverter.ConvertText(System.IO.File.ReadAllText(filePath), options); + var parsed = JavaToCSharpConverter.ConvertText(javaText, options); Assert.NotNull(parsed); var fileName = Path.GetFileNameWithoutExtension(filePath); var assembly = CompileAssembly(fileName, parsed); - var expectation = ParseExpectation(parsed); + var expectation = ParseExpectation(javaText); // NOTE: examples must have a class name of Program in the example package var programType = assembly.GetType("Example.Program"); @@ -88,6 +94,10 @@ public void FullIntegrationTests(string filePath) { throw new InvalidOperationException("Expected an error, but app ran successfully"); } + else + { + throw new InvalidOperationException("Test must have either an output or error expectation"); + } } private static Assembly CompileAssembly(string assemblyName, string cSharpLanguageText) diff --git a/JavaToCSharp.Tests/Resources/Java7TryWithResources.java b/JavaToCSharp.Tests/Resources/Java7TryWithResources.java new file mode 100644 index 00000000..9f09e0ef --- /dev/null +++ b/JavaToCSharp.Tests/Resources/Java7TryWithResources.java @@ -0,0 +1,27 @@ +/// Expect: +/// - output: "Creating TryableResource 1\nCreating TryableResource 2\nHello world!\nClosing TryableResource 2\nClosing TryableResource 1\nFinally\n" +package example; + +public class Program { + public static void main(String[] args) { + try (TryableResource resource1 = new TryableResource(); + TryableResource resource2 = new TryableResource()) { + System.out.println("Hello world!"); + } catch (Exception ignored) { + } finally { + System.out.println("Finally"); + } + } + + public static class TryableResource implements AutoCloseable { + private static int counter = 1; + private final int id = counter++; + public TryableResource() { + System.out.println("Creating TryableResource " + id); + } + @Override + public void close() throws Exception { + System.out.println("Closing TryableResource " + id); + } + } +} \ No newline at end of file diff --git a/JavaToCSharp.Tests/Resources/Java9TryWithResources.java b/JavaToCSharp.Tests/Resources/Java9TryWithResources.java new file mode 100644 index 00000000..f62adc13 --- /dev/null +++ b/JavaToCSharp.Tests/Resources/Java9TryWithResources.java @@ -0,0 +1,30 @@ +/// Expect: +/// - output: "Creating TryableResource 1\nCreating TryableResource 2\nHello world!\nClosing TryableResource 2\nClosing TryableResource 1\nFinally\n" +package example; + +public class Program { + public static void main(String[] args) { + TryableResource resource1 = new TryableResource(); + TryableResource resource2 = new TryableResource(); + + try (resource1; resource2) { + System.out.println("Hello world!"); + } catch (Exception ignored) { + } finally { + System.out.println("Finally"); + } + } + + public static class TryableResource implements AutoCloseable { + private static int counter = 1; + private final int id = counter++; + public TryableResource() { + System.out.println("Creating TryableResource " + id); + } + @Override + public void close() throws Exception { + System.out.println("Closing TryableResource " + id); + } + } +} + diff --git a/JavaToCSharp/Declarations/AnnotationDeclarationVisitor.cs b/JavaToCSharp/Declarations/AnnotationDeclarationVisitor.cs index 29b766f3..493a490c 100644 --- a/JavaToCSharp/Declarations/AnnotationDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/AnnotationDeclarationVisitor.cs @@ -1,14 +1,20 @@ using System; +using System.Collections.Generic; using com.github.javaparser; using com.github.javaparser.ast.body; +using com.github.javaparser.ast.type; using Microsoft.CodeAnalysis.CSharp.Syntax; namespace JavaToCSharp.Declarations; public class AnnotationDeclarationVisitor : BodyDeclarationVisitor { - public override MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, - AnnotationDeclaration declaration) + public override MemberDeclarationSyntax? VisitForClass( + ConversionContext context, + ClassDeclarationSyntax classSyntax, + AnnotationDeclaration declaration, + IReadOnlyList extends, + IReadOnlyList implements) { context.Options.Warning("Declaring an annotation inside a class NotImplemented.", declaration.getBegin().FromRequiredOptional().line); diff --git a/JavaToCSharp/Declarations/BodyDeclarationVisitor.cs b/JavaToCSharp/Declarations/BodyDeclarationVisitor.cs index 488084e8..97c97267 100644 --- a/JavaToCSharp/Declarations/BodyDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/BodyDeclarationVisitor.cs @@ -1,21 +1,31 @@ using System; using System.Collections.Generic; using com.github.javaparser.ast.body; +using com.github.javaparser.ast.type; using Microsoft.CodeAnalysis.CSharp.Syntax; using Range = com.github.javaparser.Range; +using Type = System.Type; namespace JavaToCSharp.Declarations; public abstract class BodyDeclarationVisitor : BodyDeclarationVisitor where T : BodyDeclaration { - public abstract MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, T declaration); + public abstract MemberDeclarationSyntax? VisitForClass(ConversionContext context, + ClassDeclarationSyntax classSyntax, + T declaration, + IReadOnlyList extends, + IReadOnlyList implements); public abstract MemberDeclarationSyntax? VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, T declaration); - protected sealed override MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, BodyDeclaration declaration) + protected sealed override MemberDeclarationSyntax? VisitForClass(ConversionContext context, + ClassDeclarationSyntax classSyntax, + BodyDeclaration declaration, + IReadOnlyList extends, + IReadOnlyList implements) { - return VisitForClass(context, classSyntax, (T)declaration); + return VisitForClass(context, classSyntax, (T)declaration, extends, implements); } protected sealed override MemberDeclarationSyntax? VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, BodyDeclaration declaration) @@ -42,11 +52,19 @@ static BodyDeclarationVisitor() }; } - protected abstract MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, BodyDeclaration declaration); + protected abstract MemberDeclarationSyntax? VisitForClass(ConversionContext context, + ClassDeclarationSyntax classSyntax, + BodyDeclaration declaration, + IReadOnlyList extends, + IReadOnlyList implements); protected abstract MemberDeclarationSyntax? VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, BodyDeclaration declaration); - public static MemberDeclarationSyntax? VisitBodyDeclarationForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, BodyDeclaration declaration) + public static MemberDeclarationSyntax? VisitBodyDeclarationForClass(ConversionContext context, + ClassDeclarationSyntax classSyntax, + BodyDeclaration declaration, + IReadOnlyList extends, + IReadOnlyList implements) { if (!_visitors.TryGetValue(declaration.GetType(), out var visitor)) { @@ -54,7 +72,7 @@ static BodyDeclarationVisitor() throw new InvalidOperationException(message); } - return visitor.VisitForClass(context, classSyntax, declaration) + return visitor.VisitForClass(context, classSyntax, declaration, extends, implements) .WithJavaComments(declaration); } diff --git a/JavaToCSharp/Declarations/ClassOrInterfaceDeclarationVisitor.cs b/JavaToCSharp/Declarations/ClassOrInterfaceDeclarationVisitor.cs index ee3db19b..f3e84132 100644 --- a/JavaToCSharp/Declarations/ClassOrInterfaceDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/ClassOrInterfaceDeclarationVisitor.cs @@ -10,13 +10,16 @@ namespace JavaToCSharp.Declarations; public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor { - public override MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, - ClassOrInterfaceDeclaration declaration) + public override MemberDeclarationSyntax? VisitForClass( + ConversionContext context, + ClassDeclarationSyntax classSyntax, + ClassOrInterfaceDeclaration declaration, + IReadOnlyList extends, + IReadOnlyList implements) { return VisitClassDeclaration(context, declaration); } - public override MemberDeclarationSyntax? VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, ClassOrInterfaceDeclaration declaration) { @@ -58,23 +61,23 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor i.getKeyword() == Modifier.Keyword.FINAL)) classSyntax = classSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.SealedKeyword)); - var extends = javai.getExtendedTypes().ToList(); - if (extends != null) + var extends = javai.getExtendedTypes().ToList(); + if (extends != null) + { + foreach (var extend in extends) { - foreach (var extend in extends) - { - classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend))); - } + classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend))); } + } - var implements = javai.getImplementedTypes().ToList(); - if (implements != null) + var implements = javai.getImplementedTypes().ToList(); + if (implements != null) + { + foreach (var implement in implements) { - foreach (var implement in implements) - { - classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement))); - } + classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement))); } + } var members = javai.getMembers()?.ToList(); @@ -123,24 +126,18 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor i.getKeyword() == Modifier.Keyword.FINAL)) classSyntax = classSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.SealedKeyword)); - var extends = javac.getExtendedTypes().ToList(); + var extends = javac.getExtendedTypes().ToList() ?? new List(); - if (extends != null) + foreach (var extend in extends) { - foreach (var extend in extends) - { - classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend))); - } + classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(extend))); } - var implements = javac.getImplementedTypes().ToList(); + var implements = javac.getImplementedTypes().ToList() ?? new List(); - if (implements != null) + foreach (var implement in implements) { - foreach (var implement in implements) - { - classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement))); - } + classSyntax = classSyntax.AddBaseListTypes(SyntaxFactory.SimpleBaseType(TypeHelper.GetSyntaxFromType(implement))); } var members = javac.getMembers()?.ToList(); @@ -169,7 +166,7 @@ public class ClassOrInterfaceDeclarationVisitor : BodyDeclarationVisitor { - public override MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, ConstructorDeclaration ctorDecl) + public override MemberDeclarationSyntax? VisitForClass( + ConversionContext context, + ClassDeclarationSyntax classSyntax, + ConstructorDeclaration ctorDecl, + IReadOnlyList extends, + IReadOnlyList implements) { string? identifier = classSyntax.Identifier.Value?.ToString(); if (identifier is null) diff --git a/JavaToCSharp/Declarations/EnumDeclarationVisitor.cs b/JavaToCSharp/Declarations/EnumDeclarationVisitor.cs index cb263f28..13489bdc 100644 --- a/JavaToCSharp/Declarations/EnumDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/EnumDeclarationVisitor.cs @@ -3,7 +3,7 @@ using com.github.javaparser; using com.github.javaparser.ast; using com.github.javaparser.ast.body; - +using com.github.javaparser.ast.type; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -12,14 +12,19 @@ namespace JavaToCSharp.Declarations; public class EnumDeclarationVisitor : BodyDeclarationVisitor { - public override MemberDeclarationSyntax? VisitForClass(ConversionContext context, ClassDeclarationSyntax? classSyntax, EnumDeclaration enumDecl) + public override MemberDeclarationSyntax? VisitForClass( + ConversionContext context, + ClassDeclarationSyntax? classSyntax, + EnumDeclaration enumDecl, + IReadOnlyList extends, + IReadOnlyList implements) { return VisitEnumDeclaration(context, enumDecl); } public override MemberDeclarationSyntax? VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, EnumDeclaration declaration) { - return VisitForClass(context, null, declaration); + return VisitEnumDeclaration(context, declaration); } public static EnumDeclarationSyntax? VisitEnumDeclaration(ConversionContext context, EnumDeclaration javai) diff --git a/JavaToCSharp/Declarations/FieldDeclarationVisitor.cs b/JavaToCSharp/Declarations/FieldDeclarationVisitor.cs index a114d051..c2cc365a 100644 --- a/JavaToCSharp/Declarations/FieldDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/FieldDeclarationVisitor.cs @@ -3,6 +3,7 @@ using com.github.javaparser.ast; using com.github.javaparser.ast.body; using com.github.javaparser.ast.expr; +using com.github.javaparser.ast.type; using com.sun.org.apache.bcel.@internal.classfile; using JavaToCSharp.Expressions; using Microsoft.CodeAnalysis.CSharp; @@ -13,7 +14,11 @@ namespace JavaToCSharp.Declarations; public class FieldDeclarationVisitor : BodyDeclarationVisitor { public override MemberDeclarationSyntax VisitForClass( - ConversionContext context, ClassDeclarationSyntax? classSyntax, FieldDeclaration fieldDecl) + ConversionContext context, + ClassDeclarationSyntax? classSyntax, + FieldDeclaration fieldDecl, + IReadOnlyList extends, + IReadOnlyList implements) { var variables = new List(); @@ -77,6 +82,6 @@ public override MemberDeclarationSyntax VisitForInterface(ConversionContext cont InterfaceDeclarationSyntax interfaceSyntax, FieldDeclaration declaration) { // TODO: throw new NotImplementedException("Need to implement diversion of static fields from interface declaration to static class"); - return VisitForClass(context, null, declaration); + return VisitForClass(context, null, declaration, new List(), new List()); } } diff --git a/JavaToCSharp/Declarations/InitializerDeclarationVisitor.cs b/JavaToCSharp/Declarations/InitializerDeclarationVisitor.cs index a57e7ad4..99f4f115 100644 --- a/JavaToCSharp/Declarations/InitializerDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/InitializerDeclarationVisitor.cs @@ -1,6 +1,8 @@ using System; +using System.Collections.Generic; using com.github.javaparser; using com.github.javaparser.ast.body; +using com.github.javaparser.ast.type; using JavaToCSharp.Statements; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -9,8 +11,12 @@ namespace JavaToCSharp.Declarations; public class InitializerDeclarationVisitor : BodyDeclarationVisitor { - public override MemberDeclarationSyntax VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, - InitializerDeclaration declaration) + public override MemberDeclarationSyntax VisitForClass( + ConversionContext context, + ClassDeclarationSyntax classSyntax, + InitializerDeclaration declaration, + IReadOnlyList extends, + IReadOnlyList implements) { if (!declaration.isStatic()) { diff --git a/JavaToCSharp/Declarations/MethodDeclarationVisitor.cs b/JavaToCSharp/Declarations/MethodDeclarationVisitor.cs index 7a61384f..203fd4f5 100644 --- a/JavaToCSharp/Declarations/MethodDeclarationVisitor.cs +++ b/JavaToCSharp/Declarations/MethodDeclarationVisitor.cs @@ -4,6 +4,7 @@ using com.github.javaparser.ast.body; using com.github.javaparser.ast.expr; using com.github.javaparser.ast.stmt; +using com.github.javaparser.ast.type; using JavaToCSharp.Statements; using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; @@ -14,7 +15,12 @@ namespace JavaToCSharp.Declarations; public class MethodDeclarationVisitor : BodyDeclarationVisitor { - public override MemberDeclarationSyntax VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, MethodDeclaration methodDecl) + public override MemberDeclarationSyntax VisitForClass( + ConversionContext context, + ClassDeclarationSyntax classSyntax, + MethodDeclaration methodDecl, + IReadOnlyList extends, + IReadOnlyList implements) { var returnType = methodDecl.getType(); var returnTypeName = TypeHelper.ConvertType(returnType.toString()); @@ -53,7 +59,10 @@ public override MemberDeclarationSyntax VisitForClass(ConversionContext context, foreach (var annotation in annotations) { string name = annotation.getNameAsString(); - if (name == "Override") + + // ignore @Override annotation on interface-only classes. Unfortunately this is as good as we can get for now. + if (name == "Override" + && extends.Count > 0) { methodSyntax = methodSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.OverrideKeyword)); isOverride = true; diff --git a/JavaToCSharp/Expressions/ObjectCreationExpressionVisitor.cs b/JavaToCSharp/Expressions/ObjectCreationExpressionVisitor.cs index b821b37f..5e51693c 100644 --- a/JavaToCSharp/Expressions/ObjectCreationExpressionVisitor.cs +++ b/JavaToCSharp/Expressions/ObjectCreationExpressionVisitor.cs @@ -7,6 +7,7 @@ using Microsoft.CodeAnalysis.CSharp.Syntax; using System.Linq; using com.github.javaparser.ast; +using com.github.javaparser.ast.type; namespace JavaToCSharp.Expressions; @@ -83,7 +84,10 @@ private static ExpressionSyntax VisitAnonymousClassCreationExpression(Conversion classSyntax = classSyntax.AddMembers(ctorSyntax, parentField); } - foreach (var memberSyntax in anonBody.Select(member => BodyDeclarationVisitor.VisitBodyDeclarationForClass(context, classSyntax, member)).Where(memberSyntax => memberSyntax != null)) + // TODO.PI: do we need to pass extends/implements here? + foreach (var memberSyntax in anonBody + .Select(member => BodyDeclarationVisitor.VisitBodyDeclarationForClass(context, classSyntax, member, new List(), new List())) + .Where(memberSyntax => memberSyntax != null)) { classSyntax = classSyntax.AddMembers(memberSyntax!); } diff --git a/JavaToCSharp/Statements/TryStatementVisitor.cs b/JavaToCSharp/Statements/TryStatementVisitor.cs index 1f6656de..cc260577 100644 --- a/JavaToCSharp/Statements/TryStatementVisitor.cs +++ b/JavaToCSharp/Statements/TryStatementVisitor.cs @@ -1,6 +1,11 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using System.Linq; +using com.github.javaparser; +using com.github.javaparser.ast.expr; using com.github.javaparser.ast.stmt; using com.github.javaparser.ast.type; +using JavaToCSharp.Expressions; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.CSharp.Syntax; @@ -10,15 +15,82 @@ public class TryStatementVisitor : StatementVisitor { public override StatementSyntax Visit(ConversionContext context, TryStmt tryStmt) { + var resources = tryStmt.getResources().ToList() ?? new List(); + var tryBlock = tryStmt.getTryBlock(); var tryStatements = tryBlock.getStatements().ToList(); var tryConverted = VisitStatements(context, tryStatements); + var tryBlockStatements = tryConverted.ToArray(); + + if (resources.Count == 0) + { + // regular try statement + return TransformTryBlock(context, tryStmt, tryBlockStatements); + } + + // try-with-resources statement + + // for inner-most using block, use the statements from the Java try block + StatementSyntax result = SyntaxFactory.Block(tryBlockStatements); + + // go inner-most to outer-most + resources.Reverse(); + + foreach (var resource in resources) + { + if (resource.isNameExpr()) + { + result = SyntaxFactory.UsingStatement(result) + .WithExpression( + SyntaxFactory.IdentifierName(resource.asNameExpr().getNameAsString())); + } + else if (resource.isVariableDeclarationExpr()) + { + var varDecl = resource.asVariableDeclarationExpr(); + if (varDecl.getVariables().size() > 1) + { + context.Options.Warning("Unexpected multiple variables in try-with-resources declaration", + resource.getBegin().FromRequiredOptional().line); + } + + var variable = varDecl.getVariable(0); + var variableInit = variable.getInitializer().FromRequiredOptional(); + + var initSyntax = ExpressionVisitor.VisitExpression(context, variableInit) + ?? throw new InvalidOperationException("Unable to parse try-with-resources variable initializer"); + + result = SyntaxFactory.UsingStatement(result) + .WithDeclaration( + SyntaxFactory.VariableDeclaration( + SyntaxFactory.ParseTypeName(TypeHelper.ConvertType(variable.getType())), + SyntaxFactory.SeparatedList(new[] + { + SyntaxFactory.VariableDeclarator(variable.getNameAsString()) + .WithInitializer(SyntaxFactory.EqualsValueClause(initSyntax)) + }) + )); + } + else + { + context.Options.Warning("Unexpected try-with-resources resource", + resource.getBegin().FromRequiredOptional().line); + } + } + + result = TransformTryBlock(context, tryStmt, new[] { result }); + + return result; + } + + private static StatementSyntax TransformTryBlock(ConversionContext context, TryStmt tryStmt, + IEnumerable tryBlockStatements) + { var catches = tryStmt.getCatchClauses().ToList(); var trySyn = SyntaxFactory.TryStatement() - .AddBlockStatements(tryConverted.ToArray()); + .AddBlockStatements(tryBlockStatements.ToArray()); if (catches != null) { @@ -70,7 +142,7 @@ private static TryStatementSyntax AddCatches(ConversionContext context, CatchCla SyntaxFactory.CatchClause( SyntaxFactory.CatchDeclaration( SyntaxFactory.ParseTypeName(type), - SyntaxFactory.ParseToken(ctch.getParameter().getType().asString()) + SyntaxFactory.ParseToken(ctch.getParameter().getNameAsString()) ), filter: null, block: catchBlockSyntax @@ -79,4 +151,4 @@ private static TryStatementSyntax AddCatches(ConversionContext context, CatchCla return trySyn; } -} +} \ No newline at end of file diff --git a/JavaToCSharp/TypeHelper.cs b/JavaToCSharp/TypeHelper.cs index 50fec389..d532418a 100644 --- a/JavaToCSharp/TypeHelper.cs +++ b/JavaToCSharp/TypeHelper.cs @@ -104,6 +104,7 @@ public static string ReplaceCommonMethodNames(string name) return name.ToLower() switch { "hashcode" => "GetHashCode", "getclass" => "GetType", + "close" => "Dispose", _ => name, }; }