From 0c516171298a8ae1684ec3cf36341309abb44bb7 Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 03:12:38 +0900 Subject: [PATCH 01/13] =?UTF-8?q?fix:=20=E3=83=8D=E3=82=B9=E3=83=88?= =?UTF-8?q?=E5=9E=8B=E3=82=92=E8=A7=A3=E6=9E=90=E5=AF=BE=E8=B1=A1=E3=81=AB?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserClassVisitor.java | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index a696e2a6c..0e6233762 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -5,6 +5,8 @@ import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.EnumDeclaration; +import com.github.javaparser.ast.body.FieldDeclaration; +import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.RecordDeclaration; import com.github.javaparser.ast.nodeTypes.NodeWithJavadoc; import com.github.javaparser.ast.nodeTypes.NodeWithMembers; @@ -16,12 +18,11 @@ import org.dddjava.jig.domain.model.data.enums.EnumModel; import org.dddjava.jig.domain.model.data.types.TypeId; import org.dddjava.jig.domain.model.sources.javasources.JavaSourceModel; -import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.ArrayList; import java.util.List; -import java.util.Optional; /** * クラスからの情報の読み取り @@ -32,10 +33,7 @@ class JavaparserClassVisitor extends VoidVisitorAdapter { private static final Logger logger = LoggerFactory.getLogger(JavaparserClassVisitor.class); private final String packageName; - @Nullable - private TypeId typeId; - - private Optional enumModel = Optional.empty(); + private final List enumModels = new ArrayList<>(); public JavaparserClassVisitor(String packageName) { this.packageName = packageName; @@ -56,6 +54,7 @@ public void visit(ImportDeclaration importDeclaration, GlossaryRepository arg) { @Override public void visit(ClassOrInterfaceDeclaration node, GlossaryRepository arg) { visitClassOrInterfaceOrEnumOrRecord(node, arg); + super.visit(node, arg); } @Override @@ -65,7 +64,7 @@ public void visit(EnumDeclaration enumDeclaration, GlossaryRepository arg) { // enum 固有の読み取りを行う var visitor = new JavaparserEnumVisitor(typeId); enumDeclaration.accept(visitor, arg); - enumModel = Optional.of(visitor.createEnumModel()); + enumModels.add(visitor.createEnumModel()); super.visit(enumDeclaration, arg); } @@ -73,6 +72,7 @@ public void visit(EnumDeclaration enumDeclaration, GlossaryRepository arg) { @Override public void visit(RecordDeclaration recordDeclaration, GlossaryRepository arg) { visitClassOrInterfaceOrEnumOrRecord(recordDeclaration, arg); + super.visit(recordDeclaration, arg); } @Override @@ -91,25 +91,18 @@ public void visit(LocalClassDeclarationStmt localClassDeclarationStmt, GlossaryR * class/interface/enum/record の共通処理 */ private & NodeWithJavadoc & NodeWithMembers> TypeId visitClassOrInterfaceOrEnumOrRecord(T node, GlossaryRepository glossaryRepository) { - var fqn = packageName + node.getNameAsString(); - - if (typeId != null) { - logger.warn("1つの *.java ファイルの2つ目以降の class/interface/enum/record には対応していません。{} のロードはスキップされます。対応が必要な場合は読ませたい構造のサンプルを添えてIssueを作成してください。", - fqn - ); - return typeId; - } - - typeId = TypeId.valueOf(fqn); + var typeId = TypeId.valueOf(resolveFqn(node)); // クラスのJavadocが記述されていれば採用 node.getJavadoc().ifPresent(javadoc -> { String javadocText = javadoc.getDescription().toText(); glossaryRepository.register(TermFactory.fromClass(glossaryRepository.fromTypeId(typeId), javadocText)); }); - // メンバの情報を別のVisitorで読む - node.accept(new JavaparserMemberVisitor(typeId), glossaryRepository); - + // メンバの情報を別のVisitorで読む(ネストした型のメンバは対象外) + var memberVisitor = new JavaparserMemberVisitor(typeId); node.getMembers().forEach(member -> { + if (member instanceof FieldDeclaration || member instanceof MethodDeclaration) { + member.accept(memberVisitor, glossaryRepository); + } if (member instanceof ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { logger.debug("nested class or interface: {}", classOrInterfaceDeclaration.getFullyQualifiedName()); } @@ -118,7 +111,26 @@ private & NodeWithJavadoc & NodeWithM return typeId; } + private String resolveFqn(Node node) { + if (node instanceof ClassOrInterfaceDeclaration classDeclaration) { + return classDeclaration.getFullyQualifiedName() + .orElse(packageName + classDeclaration.getNameAsString()); + } + if (node instanceof EnumDeclaration enumDeclaration) { + return enumDeclaration.getFullyQualifiedName() + .orElse(packageName + enumDeclaration.getNameAsString()); + } + if (node instanceof RecordDeclaration recordDeclaration) { + return recordDeclaration.getFullyQualifiedName() + .orElse(packageName + recordDeclaration.getNameAsString()); + } + if (node instanceof NodeWithSimpleName namedNode) { + return packageName + namedNode.getNameAsString(); + } + return packageName; + } + public JavaSourceModel javaSourceModel() { - return JavaSourceModel.from(enumModel.map(List::of).orElseGet(List::of)); + return JavaSourceModel.from(enumModels); } } From 13b92a0564e9fe1edfd2dbf9f7be804b88cb4afd Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 03:16:08 +0900 Subject: [PATCH 02/13] =?UTF-8?q?test:=20=E3=83=8D=E3=82=B9=E3=83=88?= =?UTF-8?q?=E5=9E=8B=E3=81=AE=E8=AA=AD=E3=81=BF=E5=8F=96=E3=82=8A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserReaderTest.java | 28 ++++++++++++++++++- .../javaparser/ut/ParseTargetNestedClass.java | 18 ++++++++++++ 2 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java index feb6c6007..6cfe9efc5 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java @@ -6,7 +6,9 @@ import org.dddjava.jig.domain.model.data.packages.PackageId; import org.dddjava.jig.domain.model.data.terms.Term; import org.dddjava.jig.domain.model.data.terms.TermKind; +import org.dddjava.jig.domain.model.data.types.TypeId; import org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetCanonicalClass; +import org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetNestedClass; import org.dddjava.jig.infrastructure.onmemoryrepository.OnMemoryGlossaryRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -112,6 +114,30 @@ void setUp() { assertEquals("フィールドコメント", term.title()); } + @Test + void ネストしたクラスとメソッドを読み取れる() { + Path path = Path.of("ut", "ParseTargetNestedClass.java"); + GlossaryRepository glossaryRepository = new OnMemoryGlossaryRepository(); + + sut.parseJavaFile(getJavaFilePath(path), glossaryRepository); + + var glossary = glossaryRepository.all(); + var outerTerm = glossary.termOf( + TestSupport.getTypeIdFromClass(ParseTargetNestedClass.class).value(), + TermKind.クラス + ); + var innerTypeId = TypeId.valueOf("org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetNestedClass.Inner"); + var innerTerm = glossary.termOf(innerTypeId.value(), TermKind.クラス); + var innerMethodTerm = glossary.termOf( + JigMethodId.from(innerTypeId, "innerMethod", List.of()).value(), + TermKind.メソッド + ); + + assertEquals("外側クラスコメント", outerTerm.title()); + assertEquals("内側クラスコメント", innerTerm.title()); + assertEquals("内側メソッドコメント", innerMethodTerm.title()); + } + private Path getJavaFilePath(Path requireJavaFilePath) { StackWalker walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); @@ -129,4 +155,4 @@ private Path getJavaFilePath(Path requireJavaFilePath) { throw new AssertionError(e); } } -} \ No newline at end of file +} diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java new file mode 100644 index 000000000..c545e3a86 --- /dev/null +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java @@ -0,0 +1,18 @@ +package org.dddjava.jig.infrastructure.javaparser.ut; + +/** + * 外側クラスコメント + */ +public class ParseTargetNestedClass { + + /** + * 内側クラスコメント + */ + static class Inner { + /** + * 内側メソッドコメント + */ + void innerMethod() { + } + } +} From 63b44e18cd7d5ec2bc72ad61d116092fc60d28e5 Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 03:18:07 +0900 Subject: [PATCH 03/13] =?UTF-8?q?test:=20=E3=83=8D=E3=82=B9=E3=83=88enum/r?= =?UTF-8?q?ecord=E3=81=AE=E8=AA=AD=E3=81=BF=E5=8F=96=E3=82=8A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserReaderTest.java | 11 +++++++++++ .../javaparser/ut/ParseTargetNestedClass.java | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java index 6cfe9efc5..2416fa67b 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java @@ -132,10 +132,21 @@ void setUp() { JigMethodId.from(innerTypeId, "innerMethod", List.of()).value(), TermKind.メソッド ); + var innerEnumTypeId = TypeId.valueOf("org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetNestedClass.InnerEnum"); + var innerEnumTerm = glossary.termOf(innerEnumTypeId.value(), TermKind.クラス); + var innerRecordTypeId = TypeId.valueOf("org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetNestedClass.InnerRecord"); + var innerRecordTerm = glossary.termOf(innerRecordTypeId.value(), TermKind.クラス); + var innerRecordMethodTerm = glossary.termOf( + JigMethodId.from(innerRecordTypeId, "label", List.of()).value(), + TermKind.メソッド + ); assertEquals("外側クラスコメント", outerTerm.title()); assertEquals("内側クラスコメント", innerTerm.title()); assertEquals("内側メソッドコメント", innerMethodTerm.title()); + assertEquals("内側enumコメント", innerEnumTerm.title()); + assertEquals("内側recordコメント", innerRecordTerm.title()); + assertEquals("内側recordメソッドコメント", innerRecordMethodTerm.title()); } private Path getJavaFilePath(Path requireJavaFilePath) { diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java index c545e3a86..6f91cc6bf 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java @@ -15,4 +15,23 @@ static class Inner { void innerMethod() { } } + + /** + * 内側enumコメント + */ + enum InnerEnum { + VALUE + } + + /** + * 内側recordコメント + */ + record InnerRecord(String name) { + /** + * 内側recordメソッドコメント + */ + String label() { + return name; + } + } } From f340e38529e8fc6a9bbfb36d86f9c06640e6d097 Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 03:20:37 +0900 Subject: [PATCH 04/13] =?UTF-8?q?test:=20=E8=A4=87=E6=95=B0=E3=83=88?= =?UTF-8?q?=E3=83=83=E3=83=97=E3=83=AC=E3=83=99=E3=83=AB=E3=82=AF=E3=83=A9?= =?UTF-8?q?=E3=82=B9=E3=81=AE=E8=AA=AD=E3=81=BF=E5=8F=96=E3=82=8A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserReaderTest.java | 19 +++++++++++++++++++ .../ut/ParseTargetMultipleTopLevelClass.java | 14 ++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetMultipleTopLevelClass.java diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java index 2416fa67b..0ecc69281 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java @@ -8,6 +8,7 @@ import org.dddjava.jig.domain.model.data.terms.TermKind; import org.dddjava.jig.domain.model.data.types.TypeId; import org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetCanonicalClass; +import org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetMultipleTopLevelClass; import org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetNestedClass; import org.dddjava.jig.infrastructure.onmemoryrepository.OnMemoryGlossaryRepository; import org.junit.jupiter.api.BeforeEach; @@ -149,6 +150,24 @@ void setUp() { assertEquals("内側recordメソッドコメント", innerRecordMethodTerm.title()); } + @Test + void トップレベルに複数クラスを定義した場合も読み取れる() { + Path path = Path.of("ut", "ParseTargetMultipleTopLevelClass.java"); + GlossaryRepository glossaryRepository = new OnMemoryGlossaryRepository(); + + sut.parseJavaFile(getJavaFilePath(path), glossaryRepository); + + var glossary = glossaryRepository.all(); + var firstTypeId = TestSupport.getTypeIdFromClass(ParseTargetMultipleTopLevelClass.class); + var secondTypeId = TypeId.valueOf("org.dddjava.jig.infrastructure.javaparser.ut.SecondTopLevelClass"); + + var firstTerm = glossary.termOf(firstTypeId.value(), TermKind.クラス); + var secondTerm = glossary.termOf(secondTypeId.value(), TermKind.クラス); + + assertEquals("最初のクラスコメント", firstTerm.title()); + assertEquals("2つ目のクラスコメント", secondTerm.title()); + } + private Path getJavaFilePath(Path requireJavaFilePath) { StackWalker walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetMultipleTopLevelClass.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetMultipleTopLevelClass.java new file mode 100644 index 000000000..a4acb1ae1 --- /dev/null +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetMultipleTopLevelClass.java @@ -0,0 +1,14 @@ +package org.dddjava.jig.infrastructure.javaparser.ut; + +/** + * 最初のクラスコメント + */ +public class ParseTargetMultipleTopLevelClass { +} + +/** + * 2つ目のクラスコメント + */ +class SecondTopLevelClass { +} + From b1602c490e0c5cc79820b4c09203ecd319d085af Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 23:50:23 +0900 Subject: [PATCH 05/13] =?UTF-8?q?fix:=20=E3=83=8D=E3=82=B9=E3=83=88?= =?UTF-8?q?=E5=9E=8B=E3=81=AE=E5=86=8D=E5=B8=B0=E3=82=92=E6=98=8E=E7=A4=BA?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserClassVisitor.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index 0e6233762..9b8223ce4 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -54,7 +54,6 @@ public void visit(ImportDeclaration importDeclaration, GlossaryRepository arg) { @Override public void visit(ClassOrInterfaceDeclaration node, GlossaryRepository arg) { visitClassOrInterfaceOrEnumOrRecord(node, arg); - super.visit(node, arg); } @Override @@ -65,14 +64,11 @@ public void visit(EnumDeclaration enumDeclaration, GlossaryRepository arg) { var visitor = new JavaparserEnumVisitor(typeId); enumDeclaration.accept(visitor, arg); enumModels.add(visitor.createEnumModel()); - - super.visit(enumDeclaration, arg); } @Override public void visit(RecordDeclaration recordDeclaration, GlossaryRepository arg) { visitClassOrInterfaceOrEnumOrRecord(recordDeclaration, arg); - super.visit(recordDeclaration, arg); } @Override @@ -103,6 +99,11 @@ private & NodeWithJavadoc & NodeWithM if (member instanceof FieldDeclaration || member instanceof MethodDeclaration) { member.accept(memberVisitor, glossaryRepository); } + if (member instanceof ClassOrInterfaceDeclaration + || member instanceof EnumDeclaration + || member instanceof RecordDeclaration) { + member.accept(this, glossaryRepository); + } if (member instanceof ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { logger.debug("nested class or interface: {}", classOrInterfaceDeclaration.getFullyQualifiedName()); } From 7798ef38aac469aeecb100579bd11c7c7d709c5d Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 23:54:14 +0900 Subject: [PATCH 06/13] =?UTF-8?q?refactor:=20=E3=83=8D=E3=82=B9=E3=83=88?= =?UTF-8?q?=E5=9E=8B=E5=88=A4=E5=AE=9A=E3=82=92TypeDeclaration=E3=81=AB?= =?UTF-8?q?=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserClassVisitor.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index 9b8223ce4..c597a4798 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -8,6 +8,8 @@ import com.github.javaparser.ast.body.FieldDeclaration; import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.RecordDeclaration; +import com.github.javaparser.ast.body.TypeDeclaration; +import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.nodeTypes.NodeWithJavadoc; import com.github.javaparser.ast.nodeTypes.NodeWithMembers; import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; @@ -99,10 +101,9 @@ private & NodeWithJavadoc & NodeWithM if (member instanceof FieldDeclaration || member instanceof MethodDeclaration) { member.accept(memberVisitor, glossaryRepository); } - if (member instanceof ClassOrInterfaceDeclaration - || member instanceof EnumDeclaration - || member instanceof RecordDeclaration) { - member.accept(this, glossaryRepository); + if (member instanceof TypeDeclaration typeDeclaration + && !(typeDeclaration instanceof AnnotationDeclaration)) { + typeDeclaration.accept(this, glossaryRepository); } if (member instanceof ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { logger.debug("nested class or interface: {}", classOrInterfaceDeclaration.getFullyQualifiedName()); From 9cf47c36d5081bd3710f389b5ae46792e5c16294 Mon Sep 17 00:00:00 2001 From: irof Date: Mon, 9 Feb 2026 23:56:42 +0900 Subject: [PATCH 07/13] =?UTF-8?q?fix:=20=E3=83=8D=E3=82=B9=E3=83=88?= =?UTF-8?q?=E5=9E=8B=E3=81=AB=E3=82=A2=E3=83=8E=E3=83=86=E3=83=BC=E3=82=B7?= =?UTF-8?q?=E3=83=A7=E3=83=B3=E3=82=92=E5=90=AB=E3=82=81=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jig/infrastructure/javaparser/JavaparserClassVisitor.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index c597a4798..e4e6594a1 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -9,7 +9,6 @@ import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.RecordDeclaration; import com.github.javaparser.ast.body.TypeDeclaration; -import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.nodeTypes.NodeWithJavadoc; import com.github.javaparser.ast.nodeTypes.NodeWithMembers; import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; @@ -101,8 +100,7 @@ private & NodeWithJavadoc & NodeWithM if (member instanceof FieldDeclaration || member instanceof MethodDeclaration) { member.accept(memberVisitor, glossaryRepository); } - if (member instanceof TypeDeclaration typeDeclaration - && !(typeDeclaration instanceof AnnotationDeclaration)) { + if (member instanceof TypeDeclaration typeDeclaration) { typeDeclaration.accept(this, glossaryRepository); } if (member instanceof ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { From 5ba5c3a66fd44f215bce96c8cef1a98f27669bce Mon Sep 17 00:00:00 2001 From: irof Date: Tue, 10 Feb 2026 00:01:04 +0900 Subject: [PATCH 08/13] =?UTF-8?q?fix:=20=E3=82=A2=E3=83=8E=E3=83=86?= =?UTF-8?q?=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E7=94=A8=E8=AA=9E=E3=81=AE?= =?UTF-8?q?=E8=AA=AD=E3=81=BF=E5=8F=96=E3=82=8A=E3=82=92=E6=A4=9C=E8=A8=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserClassVisitor.java | 10 ++++++++++ .../javaparser/JavaparserReaderTest.java | 3 +++ .../javaparser/ut/ParseTargetNestedClass.java | 6 ++++++ 3 files changed, 19 insertions(+) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index e4e6594a1..227a72641 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -9,6 +9,7 @@ import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.RecordDeclaration; import com.github.javaparser.ast.body.TypeDeclaration; +import com.github.javaparser.ast.body.AnnotationDeclaration; import com.github.javaparser.ast.nodeTypes.NodeWithJavadoc; import com.github.javaparser.ast.nodeTypes.NodeWithMembers; import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; @@ -72,6 +73,11 @@ public void visit(RecordDeclaration recordDeclaration, GlossaryRepository arg) { visitClassOrInterfaceOrEnumOrRecord(recordDeclaration, arg); } + @Override + public void visit(AnnotationDeclaration annotationDeclaration, GlossaryRepository arg) { + visitClassOrInterfaceOrEnumOrRecord(annotationDeclaration, arg); + } + @Override public void visit(LocalRecordDeclarationStmt localRecordDeclarationStmt, GlossaryRepository arg) { // ローカルレコード(メソッド内のRecord)はJIGの関心ある構造でないので対応予定はない @@ -124,6 +130,10 @@ private String resolveFqn(Node node) { return recordDeclaration.getFullyQualifiedName() .orElse(packageName + recordDeclaration.getNameAsString()); } + if (node instanceof AnnotationDeclaration annotationDeclaration) { + return annotationDeclaration.getFullyQualifiedName() + .orElse(packageName + annotationDeclaration.getNameAsString()); + } if (node instanceof NodeWithSimpleName namedNode) { return packageName + namedNode.getNameAsString(); } diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java index 0ecc69281..b886f7f2c 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java @@ -141,6 +141,8 @@ void setUp() { JigMethodId.from(innerRecordTypeId, "label", List.of()).value(), TermKind.メソッド ); + var innerAnnotationTypeId = TypeId.valueOf("org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetNestedClass.InnerAnnotation"); + var innerAnnotationTerm = glossary.termOf(innerAnnotationTypeId.value(), TermKind.クラス); assertEquals("外側クラスコメント", outerTerm.title()); assertEquals("内側クラスコメント", innerTerm.title()); @@ -148,6 +150,7 @@ void setUp() { assertEquals("内側enumコメント", innerEnumTerm.title()); assertEquals("内側recordコメント", innerRecordTerm.title()); assertEquals("内側recordメソッドコメント", innerRecordMethodTerm.title()); + assertEquals("内側annotationコメント", innerAnnotationTerm.title()); } @Test diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java index 6f91cc6bf..b51d57ad3 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetNestedClass.java @@ -34,4 +34,10 @@ String label() { return name; } } + + /** + * 内側annotationコメント + */ + @interface InnerAnnotation { + } } From 8cdd2d408e66ec3dc695d7b84399a0e45b8f78e6 Mon Sep 17 00:00:00 2001 From: irof Date: Tue, 10 Feb 2026 00:04:12 +0900 Subject: [PATCH 09/13] =?UTF-8?q?test:=20=E3=83=88=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=AC=E3=83=99=E3=83=AB=E3=82=A2=E3=83=8E=E3=83=86=E3=83=BC?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=B3=E3=82=92=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserReaderTest.java | 14 ++++++++++++++ .../ut/ParseTargetTopLevelAnnotation.java | 7 +++++++ 2 files changed, 21 insertions(+) create mode 100644 jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetTopLevelAnnotation.java diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java index b886f7f2c..d101d5af7 100644 --- a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/JavaparserReaderTest.java @@ -171,6 +171,20 @@ void setUp() { assertEquals("2つ目のクラスコメント", secondTerm.title()); } + @Test + void トップレベルのアノテーションを読み取れる() { + Path path = Path.of("ut", "ParseTargetTopLevelAnnotation.java"); + GlossaryRepository glossaryRepository = new OnMemoryGlossaryRepository(); + + sut.parseJavaFile(getJavaFilePath(path), glossaryRepository); + + var glossary = glossaryRepository.all(); + var annotationTypeId = TypeId.valueOf("org.dddjava.jig.infrastructure.javaparser.ut.ParseTargetTopLevelAnnotation"); + var annotationTerm = glossary.termOf(annotationTypeId.value(), TermKind.クラス); + + assertEquals("トップレベルannotationコメント", annotationTerm.title()); + } + private Path getJavaFilePath(Path requireJavaFilePath) { StackWalker walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE); diff --git a/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetTopLevelAnnotation.java b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetTopLevelAnnotation.java new file mode 100644 index 000000000..b43517562 --- /dev/null +++ b/jig-core/src/test/java/org/dddjava/jig/infrastructure/javaparser/ut/ParseTargetTopLevelAnnotation.java @@ -0,0 +1,7 @@ +package org.dddjava.jig.infrastructure.javaparser.ut; + +/** + * トップレベルannotationコメント + */ +public @interface ParseTargetTopLevelAnnotation { +} From 3d1d4c723d9ab0a287f724ede411a06d594927f4 Mon Sep 17 00:00:00 2001 From: irof Date: Tue, 10 Feb 2026 00:06:35 +0900 Subject: [PATCH 10/13] =?UTF-8?q?refactor:=20=E5=9E=8B=E5=BC=95=E6=95=B0?= =?UTF-8?q?=E3=82=92TypeDeclaration=E3=81=AB=E7=B5=B1=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../javaparser/JavaparserClassVisitor.java | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index 227a72641..2e28bb021 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -1,7 +1,6 @@ package org.dddjava.jig.infrastructure.javaparser; import com.github.javaparser.ast.ImportDeclaration; -import com.github.javaparser.ast.Node; import com.github.javaparser.ast.PackageDeclaration; import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; import com.github.javaparser.ast.body.EnumDeclaration; @@ -10,9 +9,6 @@ import com.github.javaparser.ast.body.RecordDeclaration; import com.github.javaparser.ast.body.TypeDeclaration; import com.github.javaparser.ast.body.AnnotationDeclaration; -import com.github.javaparser.ast.nodeTypes.NodeWithJavadoc; -import com.github.javaparser.ast.nodeTypes.NodeWithMembers; -import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName; import com.github.javaparser.ast.stmt.LocalClassDeclarationStmt; import com.github.javaparser.ast.stmt.LocalRecordDeclarationStmt; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; @@ -93,7 +89,7 @@ public void visit(LocalClassDeclarationStmt localClassDeclarationStmt, GlossaryR /** * class/interface/enum/record の共通処理 */ - private & NodeWithJavadoc & NodeWithMembers> TypeId visitClassOrInterfaceOrEnumOrRecord(T node, GlossaryRepository glossaryRepository) { + private TypeId visitClassOrInterfaceOrEnumOrRecord(TypeDeclaration node, GlossaryRepository glossaryRepository) { var typeId = TypeId.valueOf(resolveFqn(node)); // クラスのJavadocが記述されていれば採用 node.getJavadoc().ifPresent(javadoc -> { @@ -117,27 +113,9 @@ private & NodeWithJavadoc & NodeWithM return typeId; } - private String resolveFqn(Node node) { - if (node instanceof ClassOrInterfaceDeclaration classDeclaration) { - return classDeclaration.getFullyQualifiedName() - .orElse(packageName + classDeclaration.getNameAsString()); - } - if (node instanceof EnumDeclaration enumDeclaration) { - return enumDeclaration.getFullyQualifiedName() - .orElse(packageName + enumDeclaration.getNameAsString()); - } - if (node instanceof RecordDeclaration recordDeclaration) { - return recordDeclaration.getFullyQualifiedName() - .orElse(packageName + recordDeclaration.getNameAsString()); - } - if (node instanceof AnnotationDeclaration annotationDeclaration) { - return annotationDeclaration.getFullyQualifiedName() - .orElse(packageName + annotationDeclaration.getNameAsString()); - } - if (node instanceof NodeWithSimpleName namedNode) { - return packageName + namedNode.getNameAsString(); - } - return packageName; + private String resolveFqn(TypeDeclaration node) { + return node.getFullyQualifiedName() + .orElse(packageName + node.getNameAsString()); } public JavaSourceModel javaSourceModel() { From 8fc886db4cbef13479a45785e88e7dc011d16806 Mon Sep 17 00:00:00 2001 From: irof Date: Tue, 10 Feb 2026 00:13:28 +0900 Subject: [PATCH 11/13] =?UTF-8?q?refactor:=20=E5=9E=8B=E5=AE=9A=E7=BE=A9?= =?UTF-8?q?=E3=81=AE=E5=85=B1=E9=80=9A=E5=87=A6=E7=90=86=E3=83=A1=E3=82=BD?= =?UTF-8?q?=E3=83=83=E3=83=89=E5=90=8D=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit visitClassOrInterfaceOrEnumOrRecordをvisitTypeDeclarationに変更 --- .../javaparser/JavaparserClassVisitor.java | 20 +++++++------------ 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index 2e28bb021..1c3796d20 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -2,13 +2,7 @@ import com.github.javaparser.ast.ImportDeclaration; import com.github.javaparser.ast.PackageDeclaration; -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration; -import com.github.javaparser.ast.body.EnumDeclaration; -import com.github.javaparser.ast.body.FieldDeclaration; -import com.github.javaparser.ast.body.MethodDeclaration; -import com.github.javaparser.ast.body.RecordDeclaration; -import com.github.javaparser.ast.body.TypeDeclaration; -import com.github.javaparser.ast.body.AnnotationDeclaration; +import com.github.javaparser.ast.body.*; import com.github.javaparser.ast.stmt.LocalClassDeclarationStmt; import com.github.javaparser.ast.stmt.LocalRecordDeclarationStmt; import com.github.javaparser.ast.visitor.VoidVisitorAdapter; @@ -51,12 +45,12 @@ public void visit(ImportDeclaration importDeclaration, GlossaryRepository arg) { @Override public void visit(ClassOrInterfaceDeclaration node, GlossaryRepository arg) { - visitClassOrInterfaceOrEnumOrRecord(node, arg); + visitTypeDeclaration(node, arg); } @Override public void visit(EnumDeclaration enumDeclaration, GlossaryRepository arg) { - TypeId typeId = visitClassOrInterfaceOrEnumOrRecord(enumDeclaration, arg); + TypeId typeId = visitTypeDeclaration(enumDeclaration, arg); // enum 固有の読み取りを行う var visitor = new JavaparserEnumVisitor(typeId); @@ -66,12 +60,12 @@ public void visit(EnumDeclaration enumDeclaration, GlossaryRepository arg) { @Override public void visit(RecordDeclaration recordDeclaration, GlossaryRepository arg) { - visitClassOrInterfaceOrEnumOrRecord(recordDeclaration, arg); + visitTypeDeclaration(recordDeclaration, arg); } @Override public void visit(AnnotationDeclaration annotationDeclaration, GlossaryRepository arg) { - visitClassOrInterfaceOrEnumOrRecord(annotationDeclaration, arg); + visitTypeDeclaration(annotationDeclaration, arg); } @Override @@ -87,9 +81,9 @@ public void visit(LocalClassDeclarationStmt localClassDeclarationStmt, GlossaryR } /** - * class/interface/enum/record の共通処理 + * 型定義の共通処理 */ - private TypeId visitClassOrInterfaceOrEnumOrRecord(TypeDeclaration node, GlossaryRepository glossaryRepository) { + private TypeId visitTypeDeclaration(TypeDeclaration node, GlossaryRepository glossaryRepository) { var typeId = TypeId.valueOf(resolveFqn(node)); // クラスのJavadocが記述されていれば採用 node.getJavadoc().ifPresent(javadoc -> { From f3e329dbc33e133cab25b19a200677f05b5c7027 Mon Sep 17 00:00:00 2001 From: irof Date: Tue, 10 Feb 2026 00:15:38 +0900 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20=E3=83=8D=E3=82=B9=E3=83=88?= =?UTF-8?q?=E3=82=AF=E3=83=A9=E3=82=B9=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=84=E3=81=AA=E3=81=84=E3=81=93=E3=81=A8=E3=82=92?= =?UTF-8?q?=E5=87=BA=E5=8A=9B=E3=81=97=E3=81=A6=E3=81=84=E3=81=9F=E3=83=87?= =?UTF-8?q?=E3=83=90=E3=83=83=E3=82=B0=E3=83=AD=E3=82=B0=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jig/infrastructure/javaparser/JavaparserClassVisitor.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index 1c3796d20..935a4ceb7 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -99,9 +99,6 @@ private TypeId visitTypeDeclaration(TypeDeclaration node, GlossaryRepository if (member instanceof TypeDeclaration typeDeclaration) { typeDeclaration.accept(this, glossaryRepository); } - if (member instanceof ClassOrInterfaceDeclaration classOrInterfaceDeclaration) { - logger.debug("nested class or interface: {}", classOrInterfaceDeclaration.getFullyQualifiedName()); - } }); return typeId; From 55981a90482b40553bf5e37b6cdcc066b167729b Mon Sep 17 00:00:00 2001 From: irof Date: Tue, 10 Feb 2026 00:29:23 +0900 Subject: [PATCH 13/13] =?UTF-8?q?refactor:=20=E5=9E=8B=E3=81=AE=E5=87=A6?= =?UTF-8?q?=E7=90=86=E5=88=86=E5=B2=90=E3=82=92=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/javaparser/JavaparserClassVisitor.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java index 935a4ceb7..f40df199c 100644 --- a/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java +++ b/jig-core/src/main/java/org/dddjava/jig/infrastructure/javaparser/JavaparserClassVisitor.java @@ -90,14 +90,13 @@ private TypeId visitTypeDeclaration(TypeDeclaration node, GlossaryRepository String javadocText = javadoc.getDescription().toText(); glossaryRepository.register(TermFactory.fromClass(glossaryRepository.fromTypeId(typeId), javadocText)); }); - // メンバの情報を別のVisitorで読む(ネストした型のメンバは対象外) + // メンバの情報を別のVisitorで読む(型は再帰先で処理する) var memberVisitor = new JavaparserMemberVisitor(typeId); node.getMembers().forEach(member -> { - if (member instanceof FieldDeclaration || member instanceof MethodDeclaration) { - member.accept(memberVisitor, glossaryRepository); - } if (member instanceof TypeDeclaration typeDeclaration) { typeDeclaration.accept(this, glossaryRepository); + } else { + member.accept(memberVisitor, glossaryRepository); } });