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/13 08:17:10 UTC

[isis] branch master updated: ISIS-2473: j2adoc: adds support for annotation types

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 89f2f20  ISIS-2473: j2adoc: adds support for annotation types
89f2f20 is described below

commit 89f2f2027f052813611718609806477bd9f0c12e
Author: Andi Huber <ah...@apache.org>
AuthorDate: Sun Dec 13 09:16:58 2020 +0100

    ISIS-2473: j2adoc: adds support for annotation types
---
 .../org/apache/isis/tooling/j2adoc/J2AdocUnit.java | 29 +++++----------
 .../tooling/j2adoc/convert/J2AdocConverter.java    |  3 ++
 .../j2adoc/convert/J2AdocConverterDefault.java     | 30 +++++++++++++---
 .../isis/tooling/j2adoc/format/UnitFormatter.java  | 10 +++---
 .../j2adoc/format/UnitFormatterAbstract.java       | 30 ++++++++++++----
 .../UnitFormatterWithSourceAndFootNotes.java       | 42 ++++++++++++++--------
 .../isis/tooling/j2adoc/test/J2AdocTest.java       |  2 +-
 .../javamodel/ast/AnnotationDeclarations.java      | 34 +++++++++++++++++-
 ...ions.java => AnnotationMemberDeclarations.java} | 20 ++++++++---
 .../tooling/javamodel/ast/AnyTypeDeclaration.java  | 27 ++++++++++----
 .../javamodel/ast/ConstructorDeclarations.java     |  6 +++-
 .../javamodel/ast/EnumConstantDeclarations.java    |  4 +--
 .../tooling/javamodel/ast/FieldDeclarations.java   |  8 +++--
 .../isis/tooling/javamodel/ast/Javadocs.java       |  9 +++++
 .../tooling/javamodel/ast/MethodDeclarations.java  |  6 +++-
 15 files changed, 191 insertions(+), 69 deletions(-)

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 9b86bc9..745022c 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
@@ -23,14 +23,11 @@ import java.util.Optional;
 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;
 
 import org.asciidoctor.ast.Document;
 
+import org.apache.isis.commons.internal.base._Strings;
 import org.apache.isis.tooling.j2adoc.util.AsciiDocIncludeTagFilter;
 import org.apache.isis.tooling.javamodel.ast.AnyTypeDeclaration;
 import org.apache.isis.tooling.javamodel.ast.CompilationUnits;
@@ -74,6 +71,10 @@ public final class J2AdocUnit {
 
     }
 
+    public AnyTypeDeclaration getTypeDeclaration() {
+        return atd;
+    }
+    
     /**
      * Returns the recursively resolved (nested) type name. 
      * Same as {@link #getSimpleName()} if type is not nested. 
@@ -86,24 +87,12 @@ public final class J2AdocUnit {
         return atd.getSimpleName();
     }
     
-    public String getDeclarationKeyword() {
-        return atd.getKind().name().toLowerCase();
-    }
-
-    public Stream<EnumConstantDeclaration> streamEnumConstantDeclarations() {
-        return atd.getEnumConstantDeclarations().stream();
-    }
-    
-    public Stream<FieldDeclaration> streamPublicFieldDeclarations() {
-        return atd.getPublicFieldDeclarations().stream();
+    public String getDeclarationKeywordFriendlyName() {
+        return _Strings.capitalize(atd.getKind().name().toLowerCase());
     }
     
-    public Stream<ConstructorDeclaration> streamPublicConstructorDeclarations() {
-        return atd.getPublicConstructorDeclarations().stream();
-    }
-    
-    public Stream<MethodDeclaration> streamPublicMethodDeclarations() {
-        return atd.getPublicMethodDeclarations().stream();
+    public String getDeclarationKeyword() {
+        return atd.getKind().getJavaKeyword();
     }
     
     @Getter(lazy = true)
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 5ef2857..4ff054d 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
@@ -18,6 +18,7 @@
  */
 package org.apache.isis.tooling.j2adoc.convert;
 
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
 import com.github.javaparser.ast.body.EnumConstantDeclaration;
 import com.github.javaparser.ast.body.FieldDeclaration;
@@ -35,6 +36,8 @@ public interface J2AdocConverter {
 
     Document javadoc(Javadoc javadoc);
 
+    String annotationMemberDeclaration(AnnotationMemberDeclaration amd);
+    
     String enumConstantDeclaration(EnumConstantDeclaration ecd);
     
     String fieldDeclaration(FieldDeclaration fd);
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 2ca09f9..41a2a64 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
@@ -23,6 +23,7 @@ import java.util.stream.Stream;
 
 import javax.annotation.Nullable;
 
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
 import com.github.javaparser.ast.body.EnumConstantDeclaration;
 import com.github.javaparser.ast.body.FieldDeclaration;
@@ -44,7 +45,9 @@ 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.AnnotationMemberDeclarations;
 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.Javadocs;
 import org.apache.isis.tooling.javamodel.ast.MethodDeclarations;
@@ -60,6 +63,25 @@ final class J2AdocConverterDefault implements J2AdocConverter {
     private final J2AdocContext j2aContext;
 
     @Override
+    public String annotationMemberDeclaration(AnnotationMemberDeclaration amd) {
+        val isDeprecated = amd.getAnnotations().stream()
+                .anyMatch(a->a.getNameAsString().equals("Deprecated"))
+                || amd.getJavadoc()
+                    .map(Javadocs::hasDeprecated)
+                    .orElse(false);
+        
+        val memberNameFormat = isDeprecated
+                ? j2aContext.getDeprecatedStaticMemberNameFormat()
+                : j2aContext.getStaticMemberNameFormat();
+        
+        val annotMemberFormat =  j2aContext.getFormatter().getAnnotationMemberFormat();
+       
+        return String.format(annotMemberFormat,
+                type(amd.getType()), 
+                String.format(memberNameFormat, AnnotationMemberDeclarations.asNormalizedName(amd)));
+    }
+    
+    @Override
     public String enumConstantDeclaration(final @NonNull EnumConstantDeclaration ecd) {
         val isDeprecated = ecd.getAnnotations().stream()
                 .anyMatch(a->a.getNameAsString().equals("Deprecated"))
@@ -74,7 +96,7 @@ final class J2AdocConverterDefault implements J2AdocConverter {
         val enumConstFormat =  j2aContext.getFormatter().getEnumConstantFormat();
         
         return String.format(enumConstFormat, 
-                String.format(memberNameFormat, ecd.getNameAsString()));
+                String.format(memberNameFormat, EnumConstantDeclarations.asNormalized(ecd)));
     }
     
     @Override
@@ -97,7 +119,7 @@ final class J2AdocConverterDefault implements J2AdocConverter {
        
         return String.format(fieldFormat,
                 type(fd.getCommonType()), 
-                String.format(memberNameFormat, FieldDeclarations.toNormalizedFieldDeclaration(fd)));
+                String.format(memberNameFormat, FieldDeclarations.asNormalizedName(fd)));
     }
     
     @Override
@@ -126,7 +148,7 @@ final class J2AdocConverterDefault implements J2AdocConverter {
         
         val args = Can.<Object>of(
                 isGenericMember ? typeParamters(typeParams) : null,  // Cans do ignored null 
-                String.format(memberNameFormat, cd.getNameAsString()),
+                String.format(memberNameFormat, ConstructorDeclarations.asNormalizedName(cd)),
                 parameters(cd.getParameters().stream())
                 );
        
@@ -161,7 +183,7 @@ final class J2AdocConverterDefault implements J2AdocConverter {
         val args = Can.<Object>of(
                 isGenericMember ? typeParamters(typeParams) : null,  // Cans do ignored null 
                 type(md.getType()),
-                String.format(memberNameFormat, md.getNameAsString()), 
+                String.format(memberNameFormat, MethodDeclarations.asNormalizedName(md)), 
                 parameters(md.getParameters().stream())
                 );
        
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 360f940..524e6c0 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
@@ -35,6 +35,11 @@ extends Function<J2AdocUnit, Document> {
     /**
      * type | name
      */
+    String getAnnotationMemberFormat();
+    
+    /**
+     * type | name
+     */
     String getFieldFormat();
     
     /**
@@ -56,11 +61,6 @@ extends Function<J2AdocUnit, Document> {
      * method-generic-type | return-type | name | param-list
      */
     String getGenericMethodFormat();
-    
-//    /**
-//     * member | description
-//     */
-//    String getMemberDescriptionFormat();
 
     
 }
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 d1c7b1d..8c50ae8 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
@@ -50,8 +50,13 @@ implements UnitFormatter {
     }
     
     @Override
+    public String getAnnotationMemberFormat() {
+        return "`%2$s` : `%1$s`";
+    }
+    
+    @Override
     public String getFieldFormat() {
-        return "`%1$s %2$s`";
+        return "`%2$s` : `%1$s`";
     }
     
     @Override
@@ -78,7 +83,7 @@ implements UnitFormatter {
         return Optional.of(
                 String.format("%s : _%s_", 
                         unit.getName(),
-                        unit.getDeclarationKeyword()));
+                        unit.getDeclarationKeywordFriendlyName().toLowerCase()));
     }
     
     protected void intro(final J2AdocUnit unit, final StructuralNode parent) {
@@ -105,7 +110,8 @@ implements UnitFormatter {
         
         val ul = getMemberDescriptionContainer(parent);
         
-        unit.streamEnumConstantDeclarations()
+        
+        unit.getTypeDeclaration().getEnumConstantDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(ecd->{
             ecd.getJavadoc()
@@ -117,7 +123,7 @@ implements UnitFormatter {
             });
         });
         
-        unit.streamPublicFieldDeclarations()
+        unit.getTypeDeclaration().getPublicFieldDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(fd->{
             
@@ -131,7 +137,19 @@ implements UnitFormatter {
             
         });
         
-        unit.streamPublicConstructorDeclarations()
+        unit.getTypeDeclaration().getAnnotationMemberDeclarations().stream()
+        .filter(Javadocs::presentAndNotHidden)
+        .forEach(ecd->{
+            ecd.getJavadoc()
+            .ifPresent(javadoc->{
+                
+                appendMemberDescription(ul, 
+                                getConverter().annotationMemberDeclaration(ecd),
+                                getConverter().javadoc(javadoc));
+            });
+        });
+        
+        unit.getTypeDeclaration().getPublicConstructorDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(cd->{
             
@@ -145,7 +163,7 @@ implements UnitFormatter {
             
         });
         
-        unit.streamPublicMethodDeclarations()
+        unit.getTypeDeclaration().getPublicMethodDeclarations().stream()
         .filter(Javadocs::presentAndNotHidden)
         .forEach(md->{
             
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 8df174a..0760c06 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
@@ -24,6 +24,7 @@ import org.asciidoctor.ast.StructuralNode;
 
 import org.apache.isis.tooling.j2adoc.J2AdocContext;
 import org.apache.isis.tooling.j2adoc.J2AdocUnit;
+import org.apache.isis.tooling.javamodel.ast.AnnotationMemberDeclarations;
 import org.apache.isis.tooling.javamodel.ast.ConstructorDeclarations;
 import org.apache.isis.tooling.javamodel.ast.EnumConstantDeclarations;
 import org.apache.isis.tooling.javamodel.ast.FieldDeclarations;
@@ -48,47 +49,58 @@ extends UnitFormatterAbstract {
                 unit.getDeclarationKeyword(), 
                 unit.getSimpleName()));
         
-        unit.streamEnumConstantDeclarations()
+        unit.getTypeDeclaration().getEnumConstantDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(ecd->{
             
-            val memberFormat = memberSourceFormat(ecd.getJavadoc().isPresent());
+            val memberFormat = javaSourceMemberFormat(ecd.getJavadoc().isPresent());
             
             java.append(String.format(memberFormat, 
-                    EnumConstantDeclarations.toNormalizedEnumConstantDeclaration(ecd)));
+                    EnumConstantDeclarations.asNormalized(ecd)));
             
         });
         
-        unit.streamPublicFieldDeclarations()
+        unit.getTypeDeclaration().getPublicFieldDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(fd->{
             
-            val memberFormat = memberSourceFormat(fd.getJavadoc().isPresent());
+            val memberFormat = javaSourceMemberFormat(fd.getJavadoc().isPresent());
             
             java.append(String.format(memberFormat, 
-                    FieldDeclarations.toNormalizedFieldDeclaration(fd)));
+                    FieldDeclarations.asNormalized(fd)));
             
         });
         
-        unit.streamPublicConstructorDeclarations()
+        unit.getTypeDeclaration().getAnnotationMemberDeclarations().stream()
+        .filter(Javadocs::notExplicitlyHidden)
+        .forEach(fd->{
+            
+            val memberFormat = javaSourceMemberFormat(fd.getJavadoc().isPresent());
+            
+            java.append(String.format(memberFormat, 
+                    AnnotationMemberDeclarations.asNormalized(fd)));
+            
+        });
+        
+        unit.getTypeDeclaration().getPublicConstructorDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(cd->{
             
-            val memberFormat = memberSourceFormat(cd.getJavadoc().isPresent());
+            val memberFormat = javaSourceMemberFormat(cd.getJavadoc().isPresent());
             
             java.append(String.format(memberFormat, 
-                    ConstructorDeclarations.toNormalizedConstructorDeclaration(cd)));
+                    ConstructorDeclarations.asNormalized(cd)));
             
         });
         
-        unit.streamPublicMethodDeclarations()
+        unit.getTypeDeclaration().getPublicMethodDeclarations().stream()
         .filter(Javadocs::notExplicitlyHidden)
         .forEach(md->{
             
-            val memberFormat = memberSourceFormat(md.getJavadoc().isPresent());
+            val memberFormat = javaSourceMemberFormat(md.getJavadoc().isPresent());
 
             java.append(String.format(memberFormat, 
-                    MethodDeclarations.toNormalizedMethodDeclaration(md)));
+                    MethodDeclarations.asNormalized(md)));
             
         });
 
@@ -99,7 +111,9 @@ extends UnitFormatterAbstract {
                 AsciiDocFactory.SourceFactory.java(java.toString(), "Java Sources"));
             
     }
-    
+
+//XXX java language syntax (for footnote text), but not used any more
+//    
 //    @Override
 //    public String getEnumConstantFormat() {
 //        return "`%s`";
@@ -138,7 +152,7 @@ extends UnitFormatterAbstract {
     
     // -- HELPER
     
-    private String memberSourceFormat(boolean addFootnote) {
+    private String javaSourceMemberFormat(boolean addFootnote) {
         return addFootnote
                 ? "\n  %s // <.>\n"
                 : "\n  %s\n";
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 ebc1910..8f83183 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
@@ -61,7 +61,7 @@ class J2AdocTest {
         //.filter(source->source.toString().contains("ExecutionMode"))
         //.filter(source->source.toString().contains("FactoryService"))
         .filter(source->source.toString().contains("Action"))
-        .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/AnnotationDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnnotationDeclarations.java
index 3085ca9..b04b38b 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnnotationDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnnotationDeclarations.java
@@ -18,6 +18,38 @@
  */
 package org.apache.isis.tooling.javamodel.ast;
 
-public class AnnotationDeclarations {
+import java.util.stream.Stream;
+
+import com.github.javaparser.ast.body.AnnotationDeclaration;
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
+import com.github.javaparser.ast.body.FieldDeclaration;
+import com.github.javaparser.ast.body.MethodDeclaration;
+
+import lombok.NonNull;
+
+public final class AnnotationDeclarations {
+    
+    // ANNOTATION MEMBER
+
+    public static <T> Stream<AnnotationMemberDeclaration> streamAnnotationMemberDeclarations(
+            final @NonNull AnnotationDeclaration typeDeclaration) {
+        return typeDeclaration.getMembers().stream()
+                .filter(member->member instanceof AnnotationMemberDeclaration)
+                .map(AnnotationMemberDeclaration.class::cast);
+    }
+    
+    // -- FIELDS
+
+    public static <T> Stream<FieldDeclaration> streamFieldDeclarations(
+            final @NonNull AnnotationDeclaration typeDeclaration) {
+        return typeDeclaration.getFields().stream();
+    }
+
+    // -- METHODS
+
+    public static <T> Stream<MethodDeclaration> streamMethodDeclarations(
+            final @NonNull AnnotationDeclaration typeDeclaration) {
+        return typeDeclaration.getMethods().stream();
+    }
 
 }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnnotationMemberDeclarations.java
similarity index 56%
copy from tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
copy to tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnnotationMemberDeclarations.java
index 06704d3..7b966f9 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/AnnotationMemberDeclarations.java
@@ -18,17 +18,27 @@
  */
 package org.apache.isis.tooling.javamodel.ast;
 
-import com.github.javaparser.ast.body.EnumConstantDeclaration;
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
+import com.github.javaparser.printer.PrettyPrinterConfiguration;
 
 import lombok.NonNull;
 
-public final class EnumConstantDeclarations {
+public final class AnnotationMemberDeclarations {
+    
+    private static PrettyPrinterConfiguration printingConf = new PrettyPrinterConfiguration();
+    static {
+        printingConf.setPrintJavadoc(false);
+    }
     
     /**
-     * Returns given {@link EnumConstantDeclaration} as normal text, without formatting.
+     * Returns given {@link AnnotationMemberDeclaration} as normal text, without formatting.
      */
-    public static String toNormalizedEnumConstantDeclaration(final @NonNull EnumConstantDeclaration ecd) {
-        return ecd.toString().trim();
+    public static String asNormalized(final @NonNull AnnotationMemberDeclaration amd) {
+        return amd.toString(printingConf).trim();
+    }
+    
+    public static String asNormalizedName(final @NonNull AnnotationMemberDeclaration amd) {
+        return amd.getNameAsString().trim();
     }
     
 }
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 417ee15..50f9881 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
@@ -22,6 +22,7 @@ import java.util.Optional;
 
 import com.github.javaparser.ast.Node;
 import com.github.javaparser.ast.body.AnnotationDeclaration;
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
 import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
 import com.github.javaparser.ast.body.EnumConstantDeclaration;
@@ -44,12 +45,15 @@ import lombok.RequiredArgsConstructor;
 @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
 public final class AnyTypeDeclaration {
 
+    @RequiredArgsConstructor
     public static enum Kind {
-        ANNOTATION,
-        CLASS,
-        ENUM,
-        INTERFACE
+        ANNOTATION("@interface"),
+        CLASS("class"),
+        ENUM("enum"),
+        INTERFACE("interface")
         ;
+        @Getter private final String javaKeyword;
+        public boolean isAnnotation() { return this == ANNOTATION; }
         public boolean isClass() { return this == CLASS; }
         public boolean isEnum() { return this == ENUM; }
         public boolean isInterface() { return this == INTERFACE; }
@@ -61,6 +65,7 @@ public final class AnyTypeDeclaration {
     private final ClassOrInterfaceDeclaration classOrInterfaceDeclaration; 
     private final EnumDeclaration enumDeclaration;
     
+    private final Can<AnnotationMemberDeclaration> annotationMemberDeclarations;
     private final Can<EnumConstantDeclaration> enumConstantDeclarations;
     private final Can<FieldDeclaration> publicFieldDeclarations;
     private final Can<ConstructorDeclaration> publicConstructorDeclarations;
@@ -78,11 +83,15 @@ public final class AnyTypeDeclaration {
                 annotationDeclaration,
                 null,
                 null,
+                //members
+                AnnotationDeclarations.streamAnnotationMemberDeclarations(annotationDeclaration)
+                    .collect(Can.toCan()),
                 Can.empty(),
+                AnnotationDeclarations.streamFieldDeclarations(annotationDeclaration)
+                    .collect(Can.toCan()),
                 Can.empty(),
-                Can.empty(),
-                Can.empty()
-                //TODO add annotation processing
+                AnnotationDeclarations.streamMethodDeclarations(annotationDeclaration)
+                    .collect(Can.toCan())
                 );
     }
     
@@ -94,6 +103,8 @@ public final class AnyTypeDeclaration {
                 null,
                 classOrInterfaceDeclaration,
                 null,
+                //members
+                Can.empty(),
                 Can.empty(),
                 ClassOrInterfaceDeclarations.streamPublicFieldDeclarations(classOrInterfaceDeclaration)
                     .collect(Can.toCan()),
@@ -112,6 +123,8 @@ public final class AnyTypeDeclaration {
                 null, 
                 null,
                 enumDeclaration,
+                //members
+                Can.empty(),
                 EnumDeclarations.streamEnumConstantDeclarations(enumDeclaration)
                     .collect(Can.toCan()),
                 EnumDeclarations.streamPublicFieldDeclarations(enumDeclaration)
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 703175e..46badaf 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
@@ -34,13 +34,17 @@ public final class ConstructorDeclarations {
     /**
      * Returns given {@link ConstructorDeclaration} as normal text, without formatting.
      */
-    public static String toNormalizedConstructorDeclaration(final @NonNull ConstructorDeclaration cd) {
+    public static String asNormalized(final @NonNull ConstructorDeclaration cd) {
         val clone = cd.clone();
         clone.getParameters()
         .forEach(p->p.getAnnotations().clear());
         return clone.getDeclarationAsString(false, false, true);
     }
     
+    public static String asNormalizedName(final @NonNull ConstructorDeclaration cd) {
+        return cd.getNameAsString().trim();
+    }
+    
     public static Can<TypeParameter> getTypeParameters(final @NonNull ConstructorDeclaration cd) {
         return Can.ofStream(cd.getTypeParameters().stream());
     }
diff --git a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
index 06704d3..6174eaf 100644
--- a/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
+++ b/tooling/javamodel/src/main/java/org/apache/isis/tooling/javamodel/ast/EnumConstantDeclarations.java
@@ -27,8 +27,8 @@ public final class EnumConstantDeclarations {
     /**
      * Returns given {@link EnumConstantDeclaration} as normal text, without formatting.
      */
-    public static String toNormalizedEnumConstantDeclaration(final @NonNull EnumConstantDeclaration ecd) {
-        return ecd.toString().trim();
+    public static String asNormalized(final @NonNull EnumConstantDeclaration ecd) {
+        return ecd.getNameAsString().trim();
     }
     
 }
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
index faf18ef..de8d298 100644
--- 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
@@ -33,8 +33,12 @@ 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 String asNormalized(final @NonNull FieldDeclaration fd) {
+        return fd.toString().trim(); //TODO might miss the fields type here
+    }
+    
+    public static String asNormalizedName(final @NonNull FieldDeclaration fd) {
+        return fd.toString().trim(); //TODO might have the fields type to remove here
     }
     
     public static Can<TypeParameter> getTypeParameters(final @NonNull FieldDeclaration fd) {
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 9057f99..ef839a6 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,7 @@ package org.apache.isis.tooling.javamodel.ast;
 import java.util.Optional;
 import java.util.stream.Stream;
 
+import com.github.javaparser.ast.body.AnnotationMemberDeclaration;
 import com.github.javaparser.ast.body.ConstructorDeclaration;
 import com.github.javaparser.ast.body.EnumConstantDeclaration;
 import com.github.javaparser.ast.body.FieldDeclaration;
@@ -51,6 +52,10 @@ public final class Javadocs {
     
     // -- PREDICATES FOR STREAMS (PRESENT AND NOT HIDDEN)
     
+    public static boolean presentAndNotHidden(final @NonNull AnnotationMemberDeclaration amd) {
+        return presentAndNotHidden(amd.getJavadoc());
+    }
+    
     public static boolean presentAndNotHidden(final @NonNull FieldDeclaration fd) {
         return presentAndNotHidden(fd.getJavadoc());
     }
@@ -69,6 +74,10 @@ public final class Javadocs {
     
     // -- PREDICATES FOR STREAMS (NOT EXPLICITLY HIDDEN)
     
+    public static boolean notExplicitlyHidden(final @NonNull AnnotationMemberDeclaration amd) {
+        return !hasHidden(amd.getJavadoc());
+    }
+    
     public static boolean notExplicitlyHidden(final @NonNull FieldDeclaration fd) {
         return !hasHidden(fd.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 8cbab22..4616f79 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
@@ -35,13 +35,17 @@ public final class MethodDeclarations {
     /**
      * Returns given {@link MethodDeclaration} as normal text, without formatting.
      */
-    public static String toNormalizedMethodDeclaration(final @NonNull MethodDeclaration md) {
+    public static String asNormalized(final @NonNull MethodDeclaration md) {
         val clone = md.clone();
         clone.getParameters()
         .forEach(p->p.getAnnotations().clear());
         return clone.getDeclarationAsString(false, false, true);
     }
     
+    public static String asNormalizedName(final @NonNull MethodDeclaration md) {
+        return md.getNameAsString().trim();
+    }
+    
     public static Can<TypeParameter> getTypeParameters(final @NonNull MethodDeclaration md) {
         return Can.ofStream(md.getTypeParameters().stream());
     }