diff --git a/JavaToCSharp.Tests/ConvertTypeTests.cs b/JavaToCSharp.Tests/ConvertTypeTests.cs index 558a8ef..c9f56ce 100644 --- a/JavaToCSharp.Tests/ConvertTypeTests.cs +++ b/JavaToCSharp.Tests/ConvertTypeTests.cs @@ -28,6 +28,36 @@ public void ConvertType_IntArray_BracketsAfterType() Assert.Equal("int[]", TypeHelper.ConvertType("int[]")); } + [Theory] + [InlineData("String[]", "string[]")] + [InlineData("Integer[]", "int[]")] + [InlineData("String[][]", "string[][]")] + [InlineData("MyType[]", "MyType[]")] + [InlineData("List", "IList")] + [InlineData("MyType[]", "MyType[]")] + public void ConvertType_Arrays(string javaType, string expected) + { + Assert.Equal(expected, TypeHelper.ConvertType(javaType)); + } + + [Fact] + public void ConvertType_ArrayMethodSignature() + { + const string javaCode = """ + public interface Lemmatizer { + String[] lemmatize(String[] toks, String[] tags); + } + """; + var options = new JavaConversionOptions + { + IncludeUsings = false, + IncludeNamespace = false, + }; + var parsed = JavaToCSharpConverter.ConvertText(javaCode, options) ?? ""; + + Assert.Contains("string[] Lemmatize(string[] toks, string[] tags);", parsed); + } + [Fact] public void ConvertType_GenericSingleParameter() { diff --git a/JavaToCSharp/TypeNameParser.cs b/JavaToCSharp/TypeNameParser.cs index 353bab2..6b297f6 100644 --- a/JavaToCSharp/TypeNameParser.cs +++ b/JavaToCSharp/TypeNameParser.cs @@ -33,7 +33,7 @@ internal static string ParseTypeName(string typename, Func trans // Example: List> // // EBNF: - // TypeName = identifier [ "<" TypeArgument { "," TypeArgument } ">" ]. + // TypeName = identifier [ "<" TypeArgument { "," TypeArgument } ">" ] { "[" "]" }. // TypeArgument = [ "?" [ "extends" | "super" ] ] TypeName. _translate = translateIdentifier; @@ -83,37 +83,49 @@ private static void NextToken() private static bool TypeName() { - // TypeName = identifier [ "<" TypeArgument { "," TypeArgument } ">" ]. - if (_token.type is TokenType.Identifier) + // TypeName = identifier [ "<" TypeArgument { "," TypeArgument } ">" ] { "[" "]" }. + if (_token.type is not TokenType.Identifier) { - _sb.Append(_translate?.Invoke(_token.text)); + return false; + } + + _sb.Append(_translate?.Invoke(_token.text)); + NextToken(); + + if (_token.type is TokenType.LeftAngleBracket) + { + _sb.Append('<'); NextToken(); - if (_token.type is TokenType.LeftAngleBracket) + if (!TypeArgument()) return false; + + while (_token.type is TokenType.Comma) { - _sb.Append('<'); + _sb.Append(", "); NextToken(); - if (TypeArgument()) - { - while (_token.type is TokenType.Comma) - { - _sb.Append(", "); - NextToken(); - if (!TypeArgument()) return false; - } - if (_token.type is TokenType.RightAngleBracket) - { - _sb.Append('>'); - NextToken(); - return true; - } - } - } - else - { - return true; + if (!TypeArgument()) return false; } + + if (_token.type is not TokenType.RightAngleBracket) return false; + + _sb.Append('>'); + NextToken(); } - return false; + + return ArraySuffix(); + } + + private static bool ArraySuffix() + { + while (_token.type is TokenType.LeftSquareBracket) + { + NextToken(); + if (_token.type is not TokenType.RightSquareBracket) return false; + + _sb.Append("[]"); + NextToken(); + } + + return true; } private static bool TypeArgument()