Skip to content

Commit db6e072

Browse files
committed
Merge branch 'release/2.1.0'
2 parents 233bc66 + 8b765c6 commit db6e072

File tree

13 files changed

+265
-42
lines changed

13 files changed

+265
-42
lines changed

JavaToCSharp/CommentsHelper.cs

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4+
45
using Microsoft.CodeAnalysis;
56
using Microsoft.CodeAnalysis.CSharp;
67
using Microsoft.CodeAnalysis.CSharp.Syntax;
8+
79
using JavaAst = com.github.javaparser.ast;
810
using JavaComments = com.github.javaparser.ast.comments;
911
using JavaParser = com.github.javaparser;
@@ -120,7 +122,6 @@ private static (SyntaxKind kind, string pre, string post) GetCommentInfo(JavaCom
120122
}
121123
}
122124

123-
124125
return result;
125126
}
126127

@@ -171,6 +172,41 @@ private static JavaAst.Node GetPreviousSibling(JavaAst.Node parentNode, JavaPars
171172
});
172173
}
173174

175+
/// <summary>
176+
/// Convert `JavaAst.Node` code to Comments
177+
/// </summary>
178+
/// <param name="codes"></param>
179+
/// <param name="tag"></param>
180+
/// <param name="hasBlockMark"></param>
181+
/// <returns></returns>
182+
public static IEnumerable<SyntaxTrivia> ConvertToComment(IEnumerable<JavaAst.Node> codes, string tag, bool hasBlockMark = true)
183+
{
184+
var outputs = new List<string>();
185+
foreach (var code in codes)
186+
{
187+
string[] input = code.ToString().Split(new[] { "\r\n" }, StringSplitOptions.None);
188+
outputs.AddRange(input);
189+
}
190+
191+
if (outputs.Count > 0)
192+
{
193+
if (hasBlockMark)
194+
{
195+
yield return SyntaxFactory.Comment($"\r\n");
196+
yield return SyntaxFactory.Comment($"// --------------------");
197+
yield return SyntaxFactory.Comment($"// TODO {tag}");
198+
}
199+
200+
foreach (var t in outputs)
201+
{
202+
yield return SyntaxFactory.Comment($"// {t}");
203+
}
204+
205+
if (hasBlockMark)
206+
yield return SyntaxFactory.Comment($"// --------------------");
207+
}
208+
}
209+
174210
private static IEnumerable<SyntaxTrivia> ConvertDocComment(JavaComments.Comment comment, string post)
175211
{
176212
string[] input = comment.getContent().Split(new[] { "\r\n" }, StringSplitOptions.None);
@@ -281,20 +317,22 @@ private static void OpenSection(ICollection<string> output, string tag, string t
281317
}
282318

283319
break;
320+
284321
case "param": // <param name="id">label</param>
285322
(id, label) = ParseByFirstWord(text);
286323
output.Add($"<param name=\"{id}\">{label}");
287324
break;
325+
288326
case "exception": // <exception cref="id">label</exception>
289327
(id, label) = ParseByFirstWord(text);
290328
output.Add($"<exception cref=\"{id}\">{label}");
291329
break;
330+
292331
default:
293332
output.Add($"<{tag}>{text}");
294333
break;
295334
}
296335

297-
298336
static (string id, string label) ParseByFirstWord(string text)
299337
{
300338
string id = text.Split()[0];
@@ -316,19 +354,18 @@ public static SyntaxNode FixCommentsWhitespaces(SyntaxNode node)
316354

317355
return node;
318356

319-
320357
static SyntaxNode InsertEmptyLineBeforeComment(SyntaxNode node)
321358
{
322359
/* For increased readability we change this
323-
*
360+
*
324361
* DoSomething();
325362
* // Comment
326363
* DoSomethingElse();
327-
*
364+
*
328365
* to this
329366
*
330367
* DoSomething();
331-
*
368+
*
332369
* // Comment
333370
* DoSomethingElse();
334371
*/
Lines changed: 90 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,113 @@
1-
using com.github.javaparser.ast;
1+
using System.Collections.Generic;
2+
3+
using com.github.javaparser.ast;
24
using com.github.javaparser.ast.body;
5+
6+
using Microsoft.CodeAnalysis;
37
using Microsoft.CodeAnalysis.CSharp;
48
using Microsoft.CodeAnalysis.CSharp.Syntax;
5-
using System.Linq;
69

710
namespace JavaToCSharp.Declarations
811
{
912
public class EnumDeclarationVisitor : BodyDeclarationVisitor<EnumDeclaration>
1013
{
1114
public override MemberDeclarationSyntax VisitForClass(ConversionContext context, ClassDeclarationSyntax classSyntax, EnumDeclaration enumDecl)
1215
{
13-
var name = enumDecl.getName();
16+
return VisitEnumDeclaration(context, enumDecl);
17+
}
18+
19+
public override MemberDeclarationSyntax VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, EnumDeclaration declaration)
20+
{
21+
return VisitForClass(context, null, declaration);
22+
}
23+
24+
public static EnumDeclarationSyntax VisitEnumDeclaration(ConversionContext context, EnumDeclaration javai)
25+
{
26+
var name = javai.getName();
27+
context.LastTypeName = name;
1428

15-
var members = enumDecl.getMembers().ToList<BodyDeclaration>();
29+
var classSyntax = SyntaxFactory.EnumDeclaration(name);
1630

17-
var entries = enumDecl.getEntries().ToList<EnumConstantDeclaration>();
31+
var typeConstants = javai.getEntries().ToList<EnumConstantDeclaration>();
32+
if (typeConstants is { Count: > 0 })
33+
{
34+
var useCodeToComment = context.Options.UseUnrecognizedCodeToComment;
35+
var membersCount = typeConstants.Count;
36+
var enumMembers = new List<EnumMemberDeclarationSyntax>(membersCount);
37+
var lastMembersIndex = membersCount - 1;
38+
var showNoPortedWarning = false;
39+
for (int i = 0; i < membersCount; i++)
40+
{
41+
var itemConst = typeConstants[i];
42+
var memberDecl = SyntaxFactory.EnumMemberDeclaration(itemConst.getName())
43+
.WithJavaComments(itemConst);
1844

19-
if (members is {Count: > 0})
20-
context.Options.Warning("Members found in enum " + name + " will not be ported. Check for correctness.", enumDecl.getBegin().line);
45+
if (useCodeToComment)
46+
{
47+
//java-enum `body/args` to `code Comment`
48+
var constArgs = itemConst.getArgs();
49+
var classBody = itemConst.getClassBody();
50+
if (!constArgs.isEmpty() || !classBody.isEmpty())
51+
{
52+
var bodyCodes = CommentsHelper.ConvertToComment(new[] { itemConst }, "enum member body", false);
2153

22-
var enumSyntax = SyntaxFactory.EnumDeclaration(name)
23-
.AddMembers(entries.Select(entry => SyntaxFactory.EnumMemberDeclaration(entry.getName())).ToArray());
54+
if (memberDecl.HasLeadingTrivia)
55+
{
56+
var firstLeadingTrivia = memberDecl.GetLeadingTrivia().Last();
57+
memberDecl = memberDecl.InsertTriviaAfter(firstLeadingTrivia, bodyCodes);
58+
}
59+
else
60+
{
61+
memberDecl = memberDecl.WithLeadingTrivia(bodyCodes);
62+
}
2463

25-
var mods = enumDecl.getModifiers();
64+
showNoPortedWarning = true;
65+
}
2666

67+
//java-enum `method-body` to `code Comment`
68+
if (i == lastMembersIndex)
69+
memberDecl = MembersToCommentTrivia(memberDecl, ref showNoPortedWarning);
70+
}
71+
72+
enumMembers.Add(memberDecl);
73+
}
74+
75+
if (showNoPortedWarning)
76+
context.Options.Warning($"Members found in enum {name} will not be ported. Check for correctness.", javai.getBegin().line);
77+
78+
classSyntax = classSyntax.AddMembers(enumMembers.ToArray());
79+
}
80+
81+
var mods = javai.getModifiers();
2782
if (mods.HasFlag(Modifier.PRIVATE))
28-
enumSyntax = enumSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.PrivateKeyword));
83+
classSyntax = classSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.PrivateKeyword));
2984
if (mods.HasFlag(Modifier.PROTECTED))
30-
enumSyntax = enumSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.ProtectedKeyword));
85+
classSyntax = classSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.ProtectedKeyword));
3186
if (mods.HasFlag(Modifier.PUBLIC))
32-
enumSyntax = enumSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
87+
classSyntax = classSyntax.AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword));
3388

34-
return enumSyntax;
35-
}
89+
return classSyntax.WithJavaComments(javai);
3690

37-
public override MemberDeclarationSyntax VisitForInterface(ConversionContext context, InterfaceDeclarationSyntax interfaceSyntax, EnumDeclaration declaration)
38-
{
39-
return VisitForClass(context, null, declaration);
91+
EnumMemberDeclarationSyntax MembersToCommentTrivia(EnumMemberDeclarationSyntax lastMemberDecl, ref bool showNoPortedWarning)
92+
{
93+
var members = javai.getMembers().ToList<BodyDeclaration>();
94+
if (members is { Count: > 0 })
95+
{
96+
var todoCodes = CommentsHelper.ConvertToComment(members, "enum body members");
97+
if (todoCodes != null)
98+
{
99+
var lastMemberTrailingTrivia = lastMemberDecl.GetTrailingTrivia();
100+
if (lastMemberTrailingTrivia.Count > 0)
101+
lastMemberDecl = lastMemberDecl.InsertTriviaAfter(lastMemberTrailingTrivia.Last(), todoCodes);
102+
else
103+
lastMemberDecl = lastMemberDecl.WithTrailingTrivia(todoCodes);
104+
105+
showNoPortedWarning = true;
106+
}
107+
}
108+
109+
return lastMemberDecl;
110+
}
40111
}
41112
}
42-
}
113+
}

JavaToCSharp/JavaConversionOptions.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public JavaConversionOptions()
1010
{
1111
IncludeNamespace = true;
1212
IncludeUsings = true;
13+
UseUnrecognizedCodeToComment = true;
1314
}
1415

1516
public event EventHandler<ConversionWarningEventArgs> WarningEncountered;
@@ -32,6 +33,11 @@ public JavaConversionOptions()
3233

3334
public bool UseDebugAssertForAsserts { get; set; }
3435

36+
/// <summary>
37+
/// Unrecognized code is translated into comments
38+
/// </summary>
39+
public bool UseUnrecognizedCodeToComment { get; set; }
40+
3541
public ConversionState ConversionState { get; set; }
3642

3743
public JavaConversionOptions AddPackageReplacement(string pattern, string replacement, RegexOptions options = RegexOptions.None)
@@ -64,4 +70,4 @@ internal void ConversionStateChanged(ConversionState newState)
6470
StateChanged?.Invoke(this, new ConversionStateChangedEventArgs(newState));
6571
}
6672
}
67-
}
73+
}

JavaToCSharp/JavaToCSharp.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<Version>2.0.2</Version>
3+
<Version>2.1.0</Version>
44
<TargetFramework>net5.0</TargetFramework>
55
<Nullable>enable</Nullable>
66
<LangVersion>latest</LangVersion>

JavaToCSharp/JavaToCSharpConverter.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,15 @@ public static string ConvertText(string javaText, JavaConversionOptions options
9595
rootMembers.Add(classSyntax);
9696
}
9797
}
98+
else if (type is EnumDeclaration enumType)
99+
{
100+
var classSyntax = EnumDeclarationVisitor.VisitEnumDeclaration(context, enumType);
101+
102+
if (namespaceSyntax != null)
103+
namespaceSyntax = namespaceSyntax.AddMembers(classSyntax);
104+
else
105+
rootMembers.Add(classSyntax);
106+
}
98107
}
99108

100109
if (namespaceSyntax != null)

JavaToCSharpCli/JavaToCSharpCli.csproj

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
<Project Sdk="Microsoft.NET.Sdk">
22
<PropertyGroup>
3-
<Version>2.0.2</Version>
3+
<Version>2.1.0</Version>
44
<OutputType>Exe</OutputType>
55
<TargetFramework>net5.0</TargetFramework>
66
</PropertyGroup>
7+
<ItemGroup>
8+
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="5.0.0" />
9+
</ItemGroup>
710
<ItemGroup>
811
<ProjectReference Include="..\JavaToCSharp\JavaToCSharp.csproj" />
912
</ItemGroup>

0 commit comments

Comments
 (0)