1
- using com . github . javaparser . ast ;
1
+ using System . Collections . Generic ;
2
+
3
+ using com . github . javaparser . ast ;
2
4
using com . github . javaparser . ast . body ;
5
+
6
+ using Microsoft . CodeAnalysis ;
3
7
using Microsoft . CodeAnalysis . CSharp ;
4
8
using Microsoft . CodeAnalysis . CSharp . Syntax ;
5
- using System . Linq ;
6
9
7
10
namespace JavaToCSharp . Declarations
8
11
{
9
12
public class EnumDeclarationVisitor : BodyDeclarationVisitor < EnumDeclaration >
10
13
{
11
14
public override MemberDeclarationSyntax VisitForClass ( ConversionContext context , ClassDeclarationSyntax classSyntax , EnumDeclaration enumDecl )
12
15
{
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 ;
14
28
15
- var members = enumDecl . getMembers ( ) . ToList < BodyDeclaration > ( ) ;
29
+ var classSyntax = SyntaxFactory . EnumDeclaration ( name ) ;
16
30
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 ) ;
18
44
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 ) ;
21
53
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
+ }
24
63
25
- var mods = enumDecl . getModifiers ( ) ;
64
+ showNoPortedWarning = true ;
65
+ }
26
66
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 ( ) ;
27
82
if ( mods . HasFlag ( Modifier . PRIVATE ) )
28
- enumSyntax = enumSyntax . AddModifiers ( SyntaxFactory . Token ( SyntaxKind . PrivateKeyword ) ) ;
83
+ classSyntax = classSyntax . AddModifiers ( SyntaxFactory . Token ( SyntaxKind . PrivateKeyword ) ) ;
29
84
if ( mods . HasFlag ( Modifier . PROTECTED ) )
30
- enumSyntax = enumSyntax . AddModifiers ( SyntaxFactory . Token ( SyntaxKind . ProtectedKeyword ) ) ;
85
+ classSyntax = classSyntax . AddModifiers ( SyntaxFactory . Token ( SyntaxKind . ProtectedKeyword ) ) ;
31
86
if ( mods . HasFlag ( Modifier . PUBLIC ) )
32
- enumSyntax = enumSyntax . AddModifiers ( SyntaxFactory . Token ( SyntaxKind . PublicKeyword ) ) ;
87
+ classSyntax = classSyntax . AddModifiers ( SyntaxFactory . Token ( SyntaxKind . PublicKeyword ) ) ;
33
88
34
- return enumSyntax ;
35
- }
89
+ return classSyntax . WithJavaComments ( javai ) ;
36
90
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
+ }
40
111
}
41
112
}
42
- }
113
+ }
0 commit comments