11package org .dddjava .jig .infrastructure .javaparser ;
22
33import com .github .javaparser .ast .ImportDeclaration ;
4- import com .github .javaparser .ast .Node ;
54import com .github .javaparser .ast .PackageDeclaration ;
6- import com .github .javaparser .ast .body .ClassOrInterfaceDeclaration ;
7- import com .github .javaparser .ast .body .EnumDeclaration ;
8- import com .github .javaparser .ast .body .RecordDeclaration ;
9- import com .github .javaparser .ast .nodeTypes .NodeWithJavadoc ;
10- import com .github .javaparser .ast .nodeTypes .NodeWithMembers ;
11- import com .github .javaparser .ast .nodeTypes .NodeWithSimpleName ;
5+ import com .github .javaparser .ast .body .*;
126import com .github .javaparser .ast .stmt .LocalClassDeclarationStmt ;
137import com .github .javaparser .ast .stmt .LocalRecordDeclarationStmt ;
148import com .github .javaparser .ast .visitor .VoidVisitorAdapter ;
159import org .dddjava .jig .application .GlossaryRepository ;
1610import org .dddjava .jig .domain .model .data .enums .EnumModel ;
1711import org .dddjava .jig .domain .model .data .types .TypeId ;
1812import org .dddjava .jig .domain .model .sources .javasources .JavaSourceModel ;
19- import org .jspecify .annotations .Nullable ;
2013import org .slf4j .Logger ;
2114import org .slf4j .LoggerFactory ;
2215
16+ import java .util .ArrayList ;
2317import java .util .List ;
24- import java .util .Optional ;
2518
2619/**
2720 * クラスからの情報の読み取り
@@ -32,10 +25,7 @@ class JavaparserClassVisitor extends VoidVisitorAdapter<GlossaryRepository> {
3225 private static final Logger logger = LoggerFactory .getLogger (JavaparserClassVisitor .class );
3326
3427 private final String packageName ;
35- @ Nullable
36- private TypeId typeId ;
37-
38- private Optional <EnumModel > enumModel = Optional .empty ();
28+ private final List <EnumModel > enumModels = new ArrayList <>();
3929
4030 public JavaparserClassVisitor (String packageName ) {
4131 this .packageName = packageName ;
@@ -55,24 +45,27 @@ public void visit(ImportDeclaration importDeclaration, GlossaryRepository arg) {
5545
5646 @ Override
5747 public void visit (ClassOrInterfaceDeclaration node , GlossaryRepository arg ) {
58- visitClassOrInterfaceOrEnumOrRecord (node , arg );
48+ visitTypeDeclaration (node , arg );
5949 }
6050
6151 @ Override
6252 public void visit (EnumDeclaration enumDeclaration , GlossaryRepository arg ) {
63- TypeId typeId = visitClassOrInterfaceOrEnumOrRecord (enumDeclaration , arg );
53+ TypeId typeId = visitTypeDeclaration (enumDeclaration , arg );
6454
6555 // enum 固有の読み取りを行う
6656 var visitor = new JavaparserEnumVisitor (typeId );
6757 enumDeclaration .accept (visitor , arg );
68- enumModel = Optional .of (visitor .createEnumModel ());
69-
70- super .visit (enumDeclaration , arg );
58+ enumModels .add (visitor .createEnumModel ());
7159 }
7260
7361 @ Override
7462 public void visit (RecordDeclaration recordDeclaration , GlossaryRepository arg ) {
75- visitClassOrInterfaceOrEnumOrRecord (recordDeclaration , arg );
63+ visitTypeDeclaration (recordDeclaration , arg );
64+ }
65+
66+ @ Override
67+ public void visit (AnnotationDeclaration annotationDeclaration , GlossaryRepository arg ) {
68+ visitTypeDeclaration (annotationDeclaration , arg );
7669 }
7770
7871 @ Override
@@ -88,37 +81,34 @@ public void visit(LocalClassDeclarationStmt localClassDeclarationStmt, GlossaryR
8881 }
8982
9083 /**
91- * class/interface/enum/record の共通処理
84+ * 型定義の共通処理
9285 */
93- private <T extends Node & NodeWithSimpleName <?> & NodeWithJavadoc <?> & NodeWithMembers <?>> TypeId visitClassOrInterfaceOrEnumOrRecord (T node , GlossaryRepository glossaryRepository ) {
94- var fqn = packageName + node .getNameAsString ();
95-
96- if (typeId != null ) {
97- logger .warn ("1つの *.java ファイルの2つ目以降の class/interface/enum/record には対応していません。{} のロードはスキップされます。対応が必要な場合は読ませたい構造のサンプルを添えてIssueを作成してください。" ,
98- fqn
99- );
100- return typeId ;
101- }
102-
103- typeId = TypeId .valueOf (fqn );
86+ private TypeId visitTypeDeclaration (TypeDeclaration <?> node , GlossaryRepository glossaryRepository ) {
87+ var typeId = TypeId .valueOf (resolveFqn (node ));
10488 // クラスのJavadocが記述されていれば採用
10589 node .getJavadoc ().ifPresent (javadoc -> {
10690 String javadocText = javadoc .getDescription ().toText ();
10791 glossaryRepository .register (TermFactory .fromClass (glossaryRepository .fromTypeId (typeId ), javadocText ));
10892 });
109- // メンバの情報を別のVisitorで読む
110- node .accept (new JavaparserMemberVisitor (typeId ), glossaryRepository );
111-
93+ // メンバの情報を別のVisitorで読む(型は再帰先で処理する)
94+ var memberVisitor = new JavaparserMemberVisitor (typeId );
11295 node .getMembers ().forEach (member -> {
113- if (member instanceof ClassOrInterfaceDeclaration classOrInterfaceDeclaration ) {
114- logger .debug ("nested class or interface: {}" , classOrInterfaceDeclaration .getFullyQualifiedName ());
96+ if (member instanceof TypeDeclaration <?> typeDeclaration ) {
97+ typeDeclaration .accept (this , glossaryRepository );
98+ } else {
99+ member .accept (memberVisitor , glossaryRepository );
115100 }
116101 });
117102
118103 return typeId ;
119104 }
120105
106+ private String resolveFqn (TypeDeclaration <?> node ) {
107+ return node .getFullyQualifiedName ()
108+ .orElse (packageName + node .getNameAsString ());
109+ }
110+
121111 public JavaSourceModel javaSourceModel () {
122- return JavaSourceModel .from (enumModel . map ( List :: of ). orElseGet ( List :: of ) );
112+ return JavaSourceModel .from (enumModels );
123113 }
124114}
0 commit comments