1- using com . github . javaparser . ast ;
1+ using System . Collections . Generic ;
2+
3+ using com . github . javaparser . ast ;
24using com . github . javaparser . ast . body ;
5+
6+ using Microsoft . CodeAnalysis ;
37using Microsoft . CodeAnalysis . CSharp ;
48using Microsoft . CodeAnalysis . CSharp . Syntax ;
5- using System . Linq ;
69
710namespace 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+ }
0 commit comments