You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by ah...@apache.org on 2020/12/11 15:43:05 UTC

[isis] branch master updated: ISIS-2473: j2adoc: add support for field and enum constant processing

This is an automated email from the ASF dual-hosted git repository.

ahuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/isis.git


The following commit(s) were added to refs/heads/master by this push:
     new be33aaf  ISIS-2473: j2adoc: add support for field and enum constant processing
be33aaf is described below

commit be33aaf4a24ccbf50876ee71de9d37c56198a3c9
Author: Andi Huber <ah...@apache.org>
AuthorDate: Fri Dec 11 16:42:48 2020 +0100

    ISIS-2473: j2adoc: add support for field and enum constant processing
---
 .../services/wrapper/control/ExecutionMode.java    |  4 --
 .../org/apache/isis/tooling/j2adoc/J2AdocUnit.java | 11 ++-
 .../tooling/j2adoc/convert/J2AdocConverter.java    |  7 +-
 .../j2adoc/convert/J2AdocConverterDefault.java     | 81 +++++++++++++++++-----
 .../isis/tooling/j2adoc/format/UnitFormatter.java  | 10 +++
 .../j2adoc/format/UnitFormatterAbstract.java       | 20 ++++++
 .../j2adoc/format/UnitFormatterCompact.java        | 12 ++++
 .../UnitFormatterWithSourceAndFootNotes.java       | 24 +++++++
 .../isis/tooling/j2adoc/test/J2AdocTest.java       |  2 +-
 .../tooling/javamodel/ast/AnyTypeDeclaration.java  | 32 ++++++---
 .../ast/ClassOrInterfaceDeclarations.java          | 26 +++++++
 .../javamodel/ast/ConstructorDeclarations.java     | 45 +++++++++---
 ...arations.java => EnumConstantDeclarations.java} | 25 ++-----
 ...faceDeclarations.java => EnumDeclarations.java} | 46 ++++++++++--
 .../tooling/javamodel/ast/FieldDeclarations.java   | 74 ++++++++++++++++++++
 .../isis/tooling/javamodel/ast/Javadocs.java       | 19 +++++
 .../tooling/javamodel/ast/MethodDeclarations.java  | 52 ++++++++++----
 .../tooling/javamodel/ast/TypeDeclarations.java    |  7 ++
 .../isis/tooling/javamodel/test/AnalyzerTest.java  |  4 +-
 19 files changed, 421 insertions(+), 80 deletions(-)

diff --git a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/control/ExecutionMode.java b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/control/ExecutionMode.java
index d5db4b5..4fd7081 100644
--- a/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/control/ExecutionMode.java
+++ b/api/applib/src/main/java/org/apache/isis/applib/services/wrapper/control/ExecutionMode.java
@@ -21,9 +21,6 @@ package org.apache.isis.applib.services.wrapper.control;
 import org.apache.isis.applib.services.wrapper.WrapperFactory;
 import org.apache.isis.commons.collections.ImmutableEnumSet;
 
-import lombok.AccessLevel;
-import lombok.RequiredArgsConstructor;
-
 /**
  * Whether interactions with the wrapper are actually passed onto the
  * underlying domain object.
@@ -32,7 +29,6 @@ import lombok.RequiredArgsConstructor;
  * 
  * @since 2.0 {@index}
  */
-@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 public enum ExecutionMode {
     /**
      * Skip all business rules.
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocUnit.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocUnit.java
index 8ccff38..46dd429 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocUnit.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/J2AdocUnit.java
@@ -24,6 +24,8 @@ import java.util.stream.Stream;
 
 import com.github.javaparser.StaticJavaParser;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 import com.github.javaparser.javadoc.Javadoc;
 
@@ -88,6 +90,14 @@ public final class J2AdocUnit {
     public String getDeclarationKeyword() {
         return atd.getKind().name().toLowerCase();
     }
+
+    public Can<EnumConstantDeclaration> getEnumConstantDeclarations() {
+        return atd.getEnumConstantDeclarations();
+    }
+    
+    public Can<FieldDeclaration> getPublicFieldDeclarations() {
+        return atd.getPublicFieldDeclarations();
+    }
     
     public Can<ConstructorDeclaration> getPublicConstructorDeclarations() {
         return atd.getPublicConstructorDeclarations();
@@ -102,7 +112,6 @@ public final class J2AdocUnit {
     
     public String getAsciiDocXref(
             final @NonNull J2AdocContext j2aContext) {
-
         return j2aContext.getConverter().xref(this);
     }
     
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverter.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverter.java
index 6e24b9b..930840f 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverter.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverter.java
@@ -19,6 +19,8 @@
 package org.apache.isis.tooling.j2adoc.convert;
 
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 import com.github.javaparser.javadoc.Javadoc;
 
@@ -31,6 +33,10 @@ public interface J2AdocConverter {
 
     String javadoc(Javadoc javadoc, int level);
 
+    String enumConstantDeclaration(EnumConstantDeclaration ecd);
+    
+    String fieldDeclaration(FieldDeclaration fd);
+    
     String constructorDeclaration(ConstructorDeclaration cd);
 
     String methodDeclaration(MethodDeclaration md);
@@ -42,7 +48,6 @@ public interface J2AdocConverter {
     public static J2AdocConverter createDefault(final @NonNull J2AdocContext context) {
         return J2AdocConverterDefault.of(context);
     }
-
     
 
 }
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java
index 305971e..ac2a06f 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/convert/J2AdocConverterDefault.java
@@ -19,11 +19,13 @@
 package org.apache.isis.tooling.j2adoc.convert;
 
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
-import com.github.javaparser.ast.NodeList;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 import com.github.javaparser.ast.body.Parameter;
 import com.github.javaparser.ast.expr.SimpleName;
@@ -42,7 +44,10 @@ import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal._Constants;
 import org.apache.isis.tooling.j2adoc.J2AdocContext;
 import org.apache.isis.tooling.j2adoc.J2AdocUnit;
+import org.apache.isis.tooling.javamodel.ast.ConstructorDeclarations;
+import org.apache.isis.tooling.javamodel.ast.FieldDeclarations;
 import org.apache.isis.tooling.javamodel.ast.Javadocs;
+import org.apache.isis.tooling.javamodel.ast.MethodDeclarations;
 import org.apache.isis.tooling.model4adoc.AsciiDocFactory;
 import org.apache.isis.tooling.model4adoc.AsciiDocWriter;
 
@@ -54,6 +59,47 @@ import lombok.val;
 final class J2AdocConverterDefault implements J2AdocConverter {
 
     private final J2AdocContext j2aContext;
+
+    @Override
+    public String enumConstantDeclaration(final @NonNull EnumConstantDeclaration ecd) {
+        val isDeprecated = ecd.getAnnotations().stream()
+                .anyMatch(a->a.getNameAsString().equals("Deprecated"))
+                || ecd.getJavadoc()
+                    .map(Javadocs::hasDeprecated)
+                    .orElse(false);
+        
+        val memberNameFormat = isDeprecated
+                ? j2aContext.getDeprecatedStaticMemberNameFormat()
+                : j2aContext.getStaticMemberNameFormat();
+        
+        val enumConstFormat =  j2aContext.getFormatter().getEnumConstantFormat();
+        
+        return String.format(enumConstFormat, 
+                String.format(memberNameFormat, ecd.getNameAsString()));
+    }
+    
+    @Override
+    public String fieldDeclaration(final @NonNull FieldDeclaration fd) {
+        val isDeprecated = fd.getAnnotations().stream()
+                .anyMatch(a->a.getNameAsString().equals("Deprecated"))
+                || fd.getJavadoc()
+                    .map(Javadocs::hasDeprecated)
+                    .orElse(false);
+        
+        val memberNameFormat = isDeprecated
+                ? fd.isStatic()
+                        ? j2aContext.getDeprecatedStaticMemberNameFormat()
+                        : j2aContext.getDeprecatedMemberNameFormat()
+                : fd.isStatic()
+                        ? j2aContext.getStaticMemberNameFormat()
+                        : j2aContext.getMemberNameFormat();
+        
+        val fieldFormat =  j2aContext.getFormatter().getFieldFormat();
+       
+        return String.format(fieldFormat,
+                type(fd.getCommonType()), 
+                String.format(memberNameFormat, FieldDeclarations.toNormalizedFieldDeclaration(fd)));
+    }
     
     @Override
     public String constructorDeclaration(final @NonNull ConstructorDeclaration cd) {
@@ -71,19 +117,18 @@ final class J2AdocConverterDefault implements J2AdocConverter {
                         ? j2aContext.getStaticMemberNameFormat()
                         : j2aContext.getMemberNameFormat();
 
-        val isGenericMember = cd.getTypeParameters().isNonEmpty();
+        val typeParams = ConstructorDeclarations.getTypeParameters(cd);
+        
+        val isGenericMember = !typeParams.isEmpty();
         
         val constructorFormat = isGenericMember
                 ? j2aContext.getFormatter().getGenericConstructorFormat()
                 : j2aContext.getFormatter().getConstructorFormat();
         
         val args = Can.<Object>of(
-                isGenericMember ? typeParamters(cd.getTypeParameters()) : null,  // Cans do ignored null 
-                String.format(memberNameFormat, cd.getNameAsString()), 
-                cd.getParameters()
-                    .stream()
-                    .map(this::parameterDeclaration)
-                    .collect(Collectors.joining(", "))
+                isGenericMember ? typeParamters(typeParams) : null,  // Cans do ignored null 
+                String.format(memberNameFormat, cd.getNameAsString()),
+                parameters(cd.getParameters().stream())
                 );
        
         return String.format(constructorFormat, args.toArray(_Constants.emptyObjects));
@@ -106,28 +151,32 @@ final class J2AdocConverterDefault implements J2AdocConverter {
                         ? j2aContext.getStaticMemberNameFormat()
                         : j2aContext.getMemberNameFormat();
 
-        val isGenericMember = md.getTypeParameters().isNonEmpty();
+        val typeParams = MethodDeclarations.getTypeParameters(md);
+        
+        val isGenericMember = !typeParams.isEmpty();
         
         val methodFormat = isGenericMember
                 ? j2aContext.getFormatter().getGenericMethodFormat()
                 : j2aContext.getFormatter().getMethodFormat();
         
         val args = Can.<Object>of(
-                isGenericMember ? typeParamters(md.getTypeParameters()) : null,  // Cans do ignored null 
+                isGenericMember ? typeParamters(typeParams) : null,  // Cans do ignored null 
                 type(md.getType()),
                 String.format(memberNameFormat, md.getNameAsString()), 
-                md.getParameters()
-                    .stream()
-                    .map(this::parameterDeclaration)
-                    .collect(Collectors.joining(", "))
+                parameters(md.getParameters().stream())
                 );
        
         return String.format(methodFormat, args.toArray(_Constants.emptyObjects));
                 
     }
-
     
-    public String typeParamters(final @Nullable NodeList<TypeParameter> typeParamters) {
+    public String parameters(final @NonNull Stream<Parameter> parameterStream) {
+        return parameterStream
+                .map(this::parameterDeclaration)
+                .collect(Collectors.joining(", "));
+    }
+    
+    public String typeParamters(final @Nullable Can<TypeParameter> typeParamters) {
         if(typeParamters == null
                 || typeParamters.isEmpty()) {
             return "";
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatter.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatter.java
index e1c8239..5018b5d 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatter.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatter.java
@@ -28,6 +28,16 @@ public interface UnitFormatter
 extends Function<J2AdocUnit, Document> {
 
     /**
+     * name
+     */
+    String getEnumConstantFormat();
+    
+    /**
+     * type | name
+     */
+    String getFieldFormat();
+    
+    /**
      * name | param-list
      */
     String getConstructorFormat();
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java
index 98414ab..4293a75 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterAbstract.java
@@ -59,6 +59,26 @@ implements UnitFormatter {
         
         val sb = new StringBuilder();
         
+        unit.getEnumConstantDeclarations().forEach(ecd->{
+            ecd.getJavadoc()
+            .ifPresent(javadoc->{
+                sb.append(String.format(getContext().getFormatter().getMemberDescriptionFormat(),
+                        getConverter().enumConstantDeclaration(ecd),
+                        getConverter().javadoc(javadoc, 1)));
+            });
+        });
+        
+        unit.getPublicFieldDeclarations().forEach(fd->{
+            
+            fd.getJavadoc()
+            .ifPresent(javadoc->{
+                sb.append(String.format(getContext().getFormatter().getMemberDescriptionFormat(),
+                        getConverter().fieldDeclaration(fd),
+                        getConverter().javadoc(javadoc, 1)));
+            });
+            
+        });
+        
         unit.getPublicConstructorDeclarations().forEach(cd->{
             
             cd.getJavadoc()
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterCompact.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterCompact.java
index 03e0ff6..ca9946b 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterCompact.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterCompact.java
@@ -28,6 +28,16 @@ extends UnitFormatterAbstract {
     }
 
     @Override
+    public String getEnumConstantFormat() {
+        return "`%s`";
+    }
+    
+    @Override
+    public String getFieldFormat() {
+        return "`%1$s %2$s`";
+    }
+    
+    @Override
     public String getConstructorFormat() {
         return "`%1$s(%2$s)`";
     }
@@ -52,4 +62,6 @@ extends UnitFormatterAbstract {
         return "\n* %s\n%s\n";
     }
 
+
+
 }
diff --git a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java
index 51e6357..b138e58 100644
--- a/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java
+++ b/tooling/java2adoc/src/main/java/org/apache/isis/tooling/j2adoc/format/UnitFormatterWithSourceAndFootNotes.java
@@ -23,6 +23,8 @@ import java.util.Optional;
 import org.apache.isis.tooling.j2adoc.J2AdocContext;
 import org.apache.isis.tooling.j2adoc.J2AdocUnit;
 import org.apache.isis.tooling.javamodel.ast.ConstructorDeclarations;
+import org.apache.isis.tooling.javamodel.ast.EnumConstantDeclarations;
+import org.apache.isis.tooling.javamodel.ast.FieldDeclarations;
 import org.apache.isis.tooling.javamodel.ast.MethodDeclarations;
 import org.apache.isis.tooling.model4adoc.AsciiDocFactory;
 
@@ -43,6 +45,18 @@ extends UnitFormatterAbstract {
                 unit.getDeclarationKeyword(), 
                 unit.getSimpleName()));
         
+        unit.getEnumConstantDeclarations().forEach(ecd->{
+            java.append(String.format("\n  %s // <.>\n", 
+                    EnumConstantDeclarations.toNormalizedEnumConstantDeclaration(ecd)));
+        });
+        
+        unit.getPublicFieldDeclarations().forEach(fd->{
+            
+            java.append(String.format("\n  %s // <.>\n", 
+                    FieldDeclarations.toNormalizedFieldDeclaration(fd)));
+            
+        });
+        
         unit.getPublicConstructorDeclarations().forEach(cd->{
             
             java.append(String.format("\n  %s // <.>\n", 
@@ -64,8 +78,18 @@ extends UnitFormatterAbstract {
                 AsciiDocFactory.SourceFactory.java(java.toString(), unit.getName()));
             
     }
+    
+    @Override
+    public String getEnumConstantFormat() {
+        return "`%s`";
+    }
 
     @Override
+    public String getFieldFormat() {
+        return "`%s %s`";
+    }
+    
+    @Override
     public String getConstructorFormat() {
         return "`%s(%s)`";
     }
diff --git a/tooling/java2adoc/src/test/java/org/apache/isis/tooling/j2adoc/test/J2AdocTest.java b/tooling/java2adoc/src/test/java/org/apache/isis/tooling/j2adoc/test/J2AdocTest.java
index 775c508..b673a6f 100644
--- a/tooling/java2adoc/src/test/java/org/apache/isis/tooling/j2adoc/test/J2AdocTest.java
+++ b/tooling/java2adoc/src/test/java/org/apache/isis/tooling/j2adoc/test/J2AdocTest.java
@@ -59,7 +59,7 @@ class J2AdocTest {
         analyzerConfig.getSources(JAVA)
         .stream()
         .filter(source->source.toString().contains("ExecutionMode"))
-        .peek(source->System.out.println("parsing source: " + source))
+        //.peek(source->System.out.println("parsing source: " + source))
         .forEach(j2aContext::add);
         
         j2aContext.streamUnits()
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnyTypeDeclaration.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnyTypeDeclaration.java
index 1c8b190..2b375fc 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnyTypeDeclaration.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnyTypeDeclaration.java
@@ -19,12 +19,13 @@
 package org.apache.isis.tooling.javamodel.ast;
 
 import java.util.Optional;
-import java.util.stream.Stream;
 
 import com.github.javaparser.ast.Node;
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
 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.TypeDeclaration;
 import com.github.javaparser.ast.nodeTypes.NodeWithSimpleName;
@@ -40,7 +41,7 @@ import lombok.RequiredArgsConstructor;
 
 @Getter
 @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
-public class AnyTypeDeclaration {
+public final class AnyTypeDeclaration {
 
     public static enum Kind {
         CLASS,
@@ -57,9 +58,12 @@ public class AnyTypeDeclaration {
     private final ClassOrInterfaceDeclaration classOrInterfaceDeclaration; 
     private final EnumDeclaration enumDeclaration;
     
+    private final Can<EnumConstantDeclaration> enumConstantDeclarations;
+    private final Can<FieldDeclaration> publicFieldDeclarations;
     private final Can<ConstructorDeclaration> publicConstructorDeclarations;
     private final Can<MethodDeclaration> publicMethodDeclarations;
     
+    
     // -- FACTORIES
     
     public static AnyTypeDeclaration of(
@@ -69,6 +73,10 @@ public class AnyTypeDeclaration {
                 classOrInterfaceDeclaration,
                 classOrInterfaceDeclaration,
                 null,
+                Can.empty(),
+                ClassOrInterfaceDeclarations.streamPublicFieldDeclarations(classOrInterfaceDeclaration)
+                    .filter(Javadocs::presentAndNotHidden)
+                    .collect(Can.toCan()),
                 ClassOrInterfaceDeclarations.streamPublicConstructorDeclarations(classOrInterfaceDeclaration)
                     .filter(Javadocs::presentAndNotHidden)
                     .collect(Can.toCan()),
@@ -85,8 +93,19 @@ public class AnyTypeDeclaration {
                 enumDeclaration, 
                 null, 
                 enumDeclaration,
-                Can.empty(),
-                Can.empty());
+                EnumDeclarations.streamEnumConstantDeclarations(enumDeclaration)
+                    .filter(Javadocs::presentAndNotHidden)
+                    .collect(Can.toCan()),
+                EnumDeclarations.streamPublicFieldDeclarations(enumDeclaration)
+                    .filter(Javadocs::presentAndNotHidden)
+                    .collect(Can.toCan()),
+                EnumDeclarations.streamPublicConstructorDeclarations(enumDeclaration)
+                    .filter(Javadocs::presentAndNotHidden)
+                    .collect(Can.toCan()),
+                EnumDeclarations.streamPublicMethodDeclarations(enumDeclaration)
+                    .filter(Javadocs::presentAndNotHidden)
+                    .collect(Can.toCan())
+                );
     }
     
     public static AnyTypeDeclaration auto(
@@ -103,10 +122,6 @@ public class AnyTypeDeclaration {
     
     // -- UTILITY
     
-    public Stream<MethodDeclaration> streamMethodDeclarations() {
-        return td.getMethods().stream();
-    }
-
     public Optional<Javadoc> getJavadoc() {
         return td.getJavadoc();
     }
@@ -139,5 +154,6 @@ public class AnyTypeDeclaration {
         }
         return name;
     }
+
     
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java
index 42c49e0..3e44f6c 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java
@@ -22,12 +22,28 @@ import java.util.stream.Stream;
 
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 
 import lombok.NonNull;
 
 public final class ClassOrInterfaceDeclarations {
 
+    // -- FIELDS
+    
+    public static <T> Stream<FieldDeclaration> streamFieldDeclarations(
+            final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
+        return typeDeclaration.getFields().stream();
+    }
+    
+    public static <T> Stream<FieldDeclaration> streamPublicFieldDeclarations(
+            final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
+        return streamFieldDeclarations(typeDeclaration)
+                .filter(fd->FieldDeclarations.isEffectivePublic(fd, typeDeclaration));
+    }
+    
+    // -- CONSTRUCTORS
+    
     public static <T> Stream<ConstructorDeclaration> streamConstructorDeclarations(
             final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
         return typeDeclaration.getConstructors().stream();
@@ -39,6 +55,8 @@ public final class ClassOrInterfaceDeclarations {
                 .filter(cd->ConstructorDeclarations.isEffectivePublic(cd, typeDeclaration));
     }
     
+    // -- METHODS
+    
     public static <T> Stream<MethodDeclaration> streamMethodDeclarations(
             final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
         return typeDeclaration.getMethods().stream();
@@ -50,4 +68,12 @@ public final class ClassOrInterfaceDeclarations {
                 .filter(md->MethodDeclarations.isEffectivePublic(md, typeDeclaration));
     }
     
+    // -- CONTEXT
+    
+    public static boolean isEffectivePublic(final @NonNull ClassOrInterfaceDeclaration td) {
+        return !td.isPrivate() 
+                && !td.isProtected()
+                ;
+    }
+    
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ConstructorDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ConstructorDeclarations.java
index 1048fad..eb26860 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ConstructorDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ConstructorDeclarations.java
@@ -20,31 +20,56 @@ package org.apache.isis.tooling.javamodel.ast;
 
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumDeclaration;
+import com.github.javaparser.ast.type.TypeParameter;
+
+import org.apache.isis.commons.collections.Can;
 
 import lombok.NonNull;
 
+//TODO effective public might require more context
 public final class ConstructorDeclarations {
 
+    /**
+     * Returns given {@link ConstructorDeclaration} as normal text, without formatting.
+     */
+    public static String toNormalizedConstructorDeclaration(final @NonNull ConstructorDeclaration cd) {
+        return cd.getDeclarationAsString(false, false, true).trim();
+    }
+    
+    public static Can<TypeParameter> getTypeParameters(final @NonNull ConstructorDeclaration cd) {
+        return Can.ofStream(cd.getTypeParameters().stream());
+    }
+    
     public static boolean isEffectivePublic(
-            final @NonNull ConstructorDeclaration cd, final @NonNull ClassOrInterfaceDeclaration td) {
+            final @NonNull ConstructorDeclaration cd, 
+            final @NonNull ClassOrInterfaceDeclaration context) {
         
-        if(td.isInterface()) {
+        if(!ClassOrInterfaceDeclarations.isEffectivePublic(context)) {
+            return false;
+        }
+        if(context.isInterface()) {
             return true;
         }
        
-        //TODO effective public requires more context, eg. is the container an interface 
         return !cd.isPrivate() 
                 && !cd.isAbstract() 
                 && !cd.isProtected()
-                //&& !md.isDefault()
                 ;
     }
-    
-    /**
-     * Returns given {@link ConstructorDeclaration} as normal text, without formatting.
-     */
-    public static String toNormalizedConstructorDeclaration(final @NonNull ConstructorDeclaration cd) {
-        return cd.getDeclarationAsString(false, false, true).trim();
+
+    public static boolean isEffectivePublic(
+            final @NonNull ConstructorDeclaration cd, 
+            final @NonNull EnumDeclaration context) {
+
+        if(!EnumDeclarations.isEffectivePublic(context)) {
+            return false;
+        }
+
+        return !cd.isPrivate() 
+                && !cd.isAbstract() 
+                && !cd.isProtected()
+                ;
     }
     
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
similarity index 56%
copy from tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
copy to tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
index 66d80eb..06704d3 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
@@ -18,30 +18,17 @@
  */
 package org.apache.isis.tooling.javamodel.ast;
 
-import com.github.javaparser.ast.body.TypeDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
 
 import lombok.NonNull;
-import lombok.val;
-
-public final class TypeDeclarations {
 
+public final class EnumConstantDeclarations {
+    
     /**
-     * Whether to include given {@link TypeDeclaration} with the index.
-     * <p>
-     * This is decided base on whether the type's java-doc has a
-     * {@literal @since} tag that contains the literal {@literal {@index}}. 
+     * Returns given {@link EnumConstantDeclaration} as normal text, without formatting.
      */
-    public static boolean hasIndexDirective(final @NonNull TypeDeclaration<?> td) {
-        return td.getJavadoc()
-        .map(javadoc->{
-        
-            val toBeIncluded = Javadocs.streamTagContent(javadoc, "since") 
-            .anyMatch(since->since.toText().contains("{@index}"));
-            
-            return toBeIncluded;
-            
-        }) 
-        .orElse(false);
+    public static String toNormalizedEnumConstantDeclaration(final @NonNull EnumConstantDeclaration ecd) {
+        return ecd.toString().trim();
     }
     
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumDeclarations.java
similarity index 55%
copy from tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java
copy to tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumDeclarations.java
index 42c49e0..a19cd4b 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/ClassOrInterfaceDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumDeclarations.java
@@ -20,34 +20,68 @@ package org.apache.isis.tooling.javamodel.ast;
 
 import java.util.stream.Stream;
 
-import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.EnumDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 
 import lombok.NonNull;
 
-public final class ClassOrInterfaceDeclarations {
+public final class EnumDeclarations {
 
+    // -- ENUM CONSTANTS
+    
+    public static <T> Stream<EnumConstantDeclaration> streamEnumConstantDeclarations(
+            final @NonNull EnumDeclaration typeDeclaration) {
+        return typeDeclaration.getEntries().stream();
+    }
+    
+    // -- FIELDS
+    
+    public static <T> Stream<FieldDeclaration> streamFieldDeclarations(
+            final @NonNull EnumDeclaration typeDeclaration) {
+        return typeDeclaration.getFields().stream();
+    }
+    
+    public static <T> Stream<FieldDeclaration> streamPublicFieldDeclarations(
+            final @NonNull EnumDeclaration typeDeclaration) {
+        return streamFieldDeclarations(typeDeclaration)
+                .filter(fd->FieldDeclarations.isEffectivePublic(fd, typeDeclaration));
+    }
+    
+    // -- CONSTRUCTORS
+    
     public static <T> Stream<ConstructorDeclaration> streamConstructorDeclarations(
-            final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
+            final @NonNull EnumDeclaration typeDeclaration) {
         return typeDeclaration.getConstructors().stream();
     }
     
     public static <T> Stream<ConstructorDeclaration> streamPublicConstructorDeclarations(
-            final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
+            final @NonNull EnumDeclaration typeDeclaration) {
         return streamConstructorDeclarations(typeDeclaration)
                 .filter(cd->ConstructorDeclarations.isEffectivePublic(cd, typeDeclaration));
     }
     
+    // -- METHODS
+    
     public static <T> Stream<MethodDeclaration> streamMethodDeclarations(
-            final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
+            final @NonNull EnumDeclaration typeDeclaration) {
         return typeDeclaration.getMethods().stream();
     }
     
     public static <T> Stream<MethodDeclaration> streamPublicMethodDeclarations(
-            final @NonNull ClassOrInterfaceDeclaration typeDeclaration) {
+            final @NonNull EnumDeclaration typeDeclaration) {
         return streamMethodDeclarations(typeDeclaration)
                 .filter(md->MethodDeclarations.isEffectivePublic(md, typeDeclaration));
     }
     
+    // -- CONTEXT
+    
+    public static boolean isEffectivePublic(final @NonNull EnumDeclaration td) {
+        return !td.isPrivate() 
+                && !td.isProtected()
+                ;
+    }
+    
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/FieldDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/FieldDeclarations.java
new file mode 100644
index 0000000..faf18ef
--- /dev/null
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/FieldDeclarations.java
@@ -0,0 +1,74 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ */
+package org.apache.isis.tooling.javamodel.ast;
+
+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.type.TypeParameter;
+
+import org.apache.isis.commons.collections.Can;
+
+import lombok.NonNull;
+
+//TODO effective public might require more context
+public final class FieldDeclarations {
+    
+    /**
+     * Returns given {@link FieldDeclaration} as normal text, without formatting.
+     */
+    public static String toNormalizedFieldDeclaration(final @NonNull FieldDeclaration fd) {
+        return fd.toString().trim();
+    }
+    
+    public static Can<TypeParameter> getTypeParameters(final @NonNull FieldDeclaration fd) {
+        return Can.ofCollection(fd.findAll(TypeParameter.class));
+    }
+    
+    // -- CONTEXT
+    
+    public static boolean isEffectivePublic(
+            final @NonNull FieldDeclaration fd, 
+            final @NonNull ClassOrInterfaceDeclaration context) {
+        
+        if(!ClassOrInterfaceDeclarations.isEffectivePublic(context)) {
+            return false;
+        }
+        if(context.isInterface()) {
+            return true;
+        }
+        return !fd.isPrivate() 
+                && !fd.isProtected()
+                ;
+    }
+    
+    public static boolean isEffectivePublic(
+            final @NonNull FieldDeclaration fd, 
+            final @NonNull EnumDeclaration context) {
+        
+        if(!EnumDeclarations.isEffectivePublic(context)) {
+            return false;
+        }
+       
+        return !fd.isPrivate() 
+                && !fd.isProtected()
+                ;
+    }
+    
+}
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/Javadocs.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/Javadocs.java
index 472caa1..d9015ee 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/Javadocs.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/Javadocs.java
@@ -21,6 +21,8 @@ package org.apache.isis.tooling.javamodel.ast;
 import java.util.stream.Stream;
 
 import com.github.javaparser.ast.body.ConstructorDeclaration;
+import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
 import com.github.javaparser.javadoc.Javadoc;
 import com.github.javaparser.javadoc.JavadocBlockTag;
@@ -47,6 +49,23 @@ public final class Javadocs {
     }
     
     public static boolean presentAndNotHidden(
+            final @NonNull FieldDeclaration fd) {
+        
+        return fd.getJavadoc()
+        .map(jd->!hasHidden(jd))
+        .orElse(false);
+    }
+    
+    public static boolean presentAndNotHidden(
+            final @NonNull EnumConstantDeclaration ecd) {
+        
+        return ecd.getJavadoc()
+        .map(jd->!hasHidden(jd))
+        .orElse(false);
+    }
+    
+    
+    public static boolean presentAndNotHidden(
             final @NonNull ConstructorDeclaration cd) {
         
         return cd.getJavadoc()
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/MethodDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/MethodDeclarations.java
index c5a85f0..aad65f1 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/MethodDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/MethodDeclarations.java
@@ -19,32 +19,58 @@
 package org.apache.isis.tooling.javamodel.ast;
 
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
+import com.github.javaparser.ast.body.EnumDeclaration;
 import com.github.javaparser.ast.body.MethodDeclaration;
+import com.github.javaparser.ast.type.TypeParameter;
+
+import org.apache.isis.commons.collections.Can;
 
 import lombok.NonNull;
 
+//TODO effective public might require more context
 public final class MethodDeclarations {
 
+
+    /**
+     * Returns given {@link MethodDeclaration} as normal text, without formatting.
+     */
+    public static String toNormalizedMethodDeclaration(final @NonNull MethodDeclaration md) {
+        return md.getDeclarationAsString(false, false, true).trim();
+    }
+    
+    public static Can<TypeParameter> getTypeParameters(final @NonNull MethodDeclaration md) {
+        return Can.ofStream(md.getTypeParameters().stream());
+    }
+
     public static boolean isEffectivePublic(
-            final @NonNull MethodDeclaration md, final @NonNull ClassOrInterfaceDeclaration td) {
-        
-        if(td.isInterface()) {
+            final @NonNull MethodDeclaration md, 
+            final @NonNull ClassOrInterfaceDeclaration context) {
+
+        if(!ClassOrInterfaceDeclarations.isEffectivePublic(context)) {
+            return false;
+        }
+        if(context.isInterface()) {
             return true;
         }
-       
-        //TODO effective public requires more context, eg. is the container an interface 
+
         return !md.isPrivate() 
                 && !md.isAbstract() 
                 && !md.isProtected()
-                //&& !md.isDefault()
                 ;
     }
-    
-    /**
-     * Returns given {@link MethodDeclaration} as normal text, without formatting.
-     */
-    public static String toNormalizedMethodDeclaration(final @NonNull MethodDeclaration md) {
-        return md.getDeclarationAsString(false, false, true).trim();
+
+    public static boolean isEffectivePublic(
+            final @NonNull MethodDeclaration md, 
+            final @NonNull EnumDeclaration context) {
+
+        if(!EnumDeclarations.isEffectivePublic(context)) {
+            return false;
+        }
+
+        return !md.isPrivate() 
+                && !md.isAbstract() 
+                && !md.isProtected()
+                ;
     }
-    
+
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
index 66d80eb..fbf8eb3 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/TypeDeclarations.java
@@ -19,6 +19,9 @@
 package org.apache.isis.tooling.javamodel.ast;
 
 import com.github.javaparser.ast.body.TypeDeclaration;
+import com.github.javaparser.ast.type.TypeParameter;
+
+import org.apache.isis.commons.collections.Can;
 
 import lombok.NonNull;
 import lombok.val;
@@ -44,4 +47,8 @@ public final class TypeDeclarations {
         .orElse(false);
     }
     
+    public static Can<TypeParameter> getTypeParameters(final @NonNull TypeDeclaration<?> td) {
+        return Can.ofCollection(td.findAll(TypeParameter.class));
+    }
+    
 }
diff --git a/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/AnalyzerTest.java b/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/AnalyzerTest.java
index 5077b4f..7636be7 100644
--- a/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/AnalyzerTest.java
+++ b/tooling/javamodel/src/test/java/org/apache/isis/tooling/javamodel/test/AnalyzerTest.java
@@ -24,6 +24,7 @@ import java.util.stream.Stream;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
 
+import org.apache.isis.commons.collections.Can;
 import org.apache.isis.commons.internal.base._Files;
 import org.apache.isis.tooling.javamodel.AnalyzerConfigFactory;
 import org.apache.isis.tooling.javamodel.ast.AnyTypeDeclaration;
@@ -77,7 +78,8 @@ class AnalyzerTest {
             });
             
         })
-        .flatMap(AnyTypeDeclaration::streamMethodDeclarations)
+        .map(AnyTypeDeclaration::getPublicMethodDeclarations)
+        .flatMap(Can::stream)
         .forEach(md->{
             
             System.out.println("javadoc: " + md.getJavadocComment());