From d6c812964dfaf59dd29536b2eef036e94dcad49f Mon Sep 17 00:00:00 2001 From: Norman Walsh Date: Thu, 19 Sep 2024 12:18:18 +0100 Subject: [PATCH 1/3] More changes to the samples --- sample/src/main/java/org/example/Impl.java | 4 ++++ sample/src/main/java/org/example/ImplAB.java | 8 ++++++++ sample/src/main/java/org/example/ImplABC.java | 13 +++++++++++++ sample/src/main/java/org/example/InterfaceA.java | 5 +++++ sample/src/main/java/org/example/InterfaceAB.java | 5 +++++ sample/src/main/java/org/example/InterfaceABC.java | 5 +++++ sample/src/main/java/org/example/IterImpl.java | 1 - 7 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 sample/src/main/java/org/example/Impl.java create mode 100644 sample/src/main/java/org/example/ImplAB.java create mode 100644 sample/src/main/java/org/example/ImplABC.java create mode 100644 sample/src/main/java/org/example/InterfaceA.java create mode 100644 sample/src/main/java/org/example/InterfaceAB.java create mode 100644 sample/src/main/java/org/example/InterfaceABC.java diff --git a/sample/src/main/java/org/example/Impl.java b/sample/src/main/java/org/example/Impl.java new file mode 100644 index 0000000..758b751 --- /dev/null +++ b/sample/src/main/java/org/example/Impl.java @@ -0,0 +1,4 @@ +package org.example; + +abstract public class Impl implements InterfaceAB, InterfaceA { +} diff --git a/sample/src/main/java/org/example/ImplAB.java b/sample/src/main/java/org/example/ImplAB.java new file mode 100644 index 0000000..a7969fe --- /dev/null +++ b/sample/src/main/java/org/example/ImplAB.java @@ -0,0 +1,8 @@ +package org.example; + +abstract public class ImplAB implements InterfaceAB { + @Override + public void a() { + System.err.println("ImplAB implements a"); + } +} diff --git a/sample/src/main/java/org/example/ImplABC.java b/sample/src/main/java/org/example/ImplABC.java new file mode 100644 index 0000000..6d4b9e9 --- /dev/null +++ b/sample/src/main/java/org/example/ImplABC.java @@ -0,0 +1,13 @@ +package org.example; + +public class ImplABC extends ImplAB implements InterfaceABC { + @Override + public void b() { + System.err.println("ImplABC implements b"); + } + + @Override + public void c() { + System.err.println("ImplABC implements c"); + } +} diff --git a/sample/src/main/java/org/example/InterfaceA.java b/sample/src/main/java/org/example/InterfaceA.java new file mode 100644 index 0000000..23807bf --- /dev/null +++ b/sample/src/main/java/org/example/InterfaceA.java @@ -0,0 +1,5 @@ +package org.example; + +public interface InterfaceA { + void a(); +} diff --git a/sample/src/main/java/org/example/InterfaceAB.java b/sample/src/main/java/org/example/InterfaceAB.java new file mode 100644 index 0000000..af7499c --- /dev/null +++ b/sample/src/main/java/org/example/InterfaceAB.java @@ -0,0 +1,5 @@ +package org.example; + +public interface InterfaceAB extends InterfaceA { + void b(); +} diff --git a/sample/src/main/java/org/example/InterfaceABC.java b/sample/src/main/java/org/example/InterfaceABC.java new file mode 100644 index 0000000..f58dd7c --- /dev/null +++ b/sample/src/main/java/org/example/InterfaceABC.java @@ -0,0 +1,5 @@ +package org.example; + +public interface InterfaceABC extends InterfaceAB { + void c(); +} diff --git a/sample/src/main/java/org/example/IterImpl.java b/sample/src/main/java/org/example/IterImpl.java index f6c529b..949f433 100644 --- a/sample/src/main/java/org/example/IterImpl.java +++ b/sample/src/main/java/org/example/IterImpl.java @@ -1,7 +1,6 @@ package org.example; public class IterImpl implements SequenceIterator { - @Override public boolean hasNext() { return false; } From 28039243e7d9f2d47620a39555d5af036fa4ed04 Mon Sep 17 00:00:00 2001 From: Norman Walsh Date: Thu, 19 Sep 2024 12:18:26 +0100 Subject: [PATCH 2/3] Rework how interfaces are presented --- .../xmldoclet/scanners/XmlTypeElement.java | 106 ++++++++++++------ 1 file changed, 72 insertions(+), 34 deletions(-) diff --git a/xmldoclet/src/main/java/com/saxonica/xmldoclet/scanners/XmlTypeElement.java b/xmldoclet/src/main/java/com/saxonica/xmldoclet/scanners/XmlTypeElement.java index 9371b7d..c75a440 100644 --- a/xmldoclet/src/main/java/com/saxonica/xmldoclet/scanners/XmlTypeElement.java +++ b/xmldoclet/src/main/java/com/saxonica/xmldoclet/scanners/XmlTypeElement.java @@ -35,16 +35,20 @@ public void scan(DocTree tree) { builder.startElement(typeName(), attr); + Implemented impl = new Implemented(); + updateImplemented(element, impl); + if (element.getSuperclass() instanceof DeclaredType) { - Implemented impl = new Implemented(); - updateImplemented(element, impl); showSuperclass(element, (DeclaredType) element.getSuperclass(), impl); } if (!element.getInterfaces().isEmpty()) { builder.startElement("interfaces"); for (TypeMirror tm : element.getInterfaces()) { - TypeUtils.xmlType(builder, "interfaceref", tm); + // Reset the implemented list each time + Implemented classimpl = new Implemented(impl); + updateImplemented(element, classimpl); + showInterfaces(element, (DeclaredType) tm, impl); } builder.endElement("interfaces"); } @@ -76,15 +80,20 @@ public void scan(DocTree tree) { } private void showSuperclass(TypeElement element, DeclaredType superclass, Implemented impl) { + if ("java.lang.Object".equals(superclass.toString())) { + return; + } + /* if (element.getSuperclass() instanceof DeclaredType) { String name = ((DeclaredType) element.getSuperclass()).toString(); if ("java.lang.Object".equals(name)) { return; } } + */ builder.startElement("superclass"); - TypeUtils.xmlType(builder, "type", element.getSuperclass()); + TypeUtils.xmlType(builder, "type", superclass); List enclosed = superclass.asElement().getEnclosedElements(); @@ -128,7 +137,7 @@ private void showSuperclass(TypeElement element, DeclaredType superclass, Implem TypeElement setype = (TypeElement) selem; TypeMirror sstype = setype.getSuperclass(); - showInterfaces(setype, impl); + //showInterfaces(setype, impl); if (sstype.getKind() == TypeKind.DECLARED) { showSuperclass(setype, (DeclaredType) sstype, impl); @@ -139,44 +148,68 @@ private void showSuperclass(TypeElement element, DeclaredType superclass, Implem builder.endElement("superclass"); } - private void showInterfaces(TypeElement element, Implemented impl) { - if (element.getInterfaces().isEmpty()) { - return; + private void showInterfaces(TypeElement element, DeclaredType xinter, Implemented impl) { + Map attr = new HashMap<>(); + attr.put("name", xinter.asElement().getSimpleName().toString()); + attr.put("fullname", xinter.asElement().toString()); + attr.put("package", xinter.asElement().getEnclosingElement().toString()); + builder.startElement("interface", attr); + + for (TypeMirror tm : xinter.getTypeArguments()) { + attr.clear(); + TypeUtils.xmlType(builder, "param", tm); } - for (TypeMirror tm : element.getInterfaces()) { - if (tm.getKind() == TypeKind.DECLARED) { - TypeElement ttm = (TypeElement) ((DeclaredType) tm).asElement(); - Map amap = new HashMap<>(); - amap.put("fullname", ttm.toString()); - amap.put("name", ttm.getSimpleName().toString()); - if (ttm.toString().contains(".")) { - amap.put("package", ttm.toString().substring(0, ttm.toString().lastIndexOf("."))); - } - - builder.startElement("interface", amap); + List enclosed = xinter.asElement().getEnclosedElements(); - for (Element celem : ttm.getEnclosedElements()) { - if (celem.getKind() == ElementKind.FIELD) { - amap = new HashMap<>(); - amap.put("name", celem.getSimpleName().toString()); - builder.startElement("field", amap); - builder.endElement("field"); + List inherited = new ArrayList<>(); + for (Element elem : enclosed) { + String name = elem.toString(); + if (!elem.getModifiers().contains(Modifier.PRIVATE)) { + if (elem.getKind() == ElementKind.FIELD) { + if (!impl.fields.contains(name)) { + impl.fields.add(name); + inherited.add(elem); } - if (celem.getKind() == ElementKind.METHOD) { - if (!impl.methods.contains(celem.toString())) { - amap = new HashMap<>(); - amap.put("name", celem.toString()); - builder.startElement("method", amap); - builder.endElement("method"); - } + } + if (elem.getKind() == ElementKind.METHOD) { + if (!impl.methods.contains(name)) { + impl.methods.add(name); + inherited.add(elem); } } + } + } + + if (!inherited.isEmpty()) { + builder.startElement("inherited"); + for (Element elem : inherited) { + Map amap = new HashMap<>(); + amap.put("name", elem.toString()); + if (elem.getKind() == ElementKind.FIELD) { + builder.startElement("field", amap); + builder.endElement("field"); + } else { + builder.startElement("method", amap); + builder.endElement("method"); + } + } + builder.endElement("inherited"); + } - showInterfaces(ttm, impl); - builder.endElement("interface"); + Element selem = xinter.asElement(); + if (selem instanceof TypeElement) { + TypeElement setype = (TypeElement) selem; + TypeMirror sstype = setype.getSuperclass(); + + if (!setype.getInterfaces().isEmpty()) { + for (TypeMirror tm : setype.getInterfaces()) { + showInterfaces(element, (DeclaredType) tm, impl); + } } } + + builder.endElement("interface"); } private void updateImplemented(TypeElement element, Implemented impl) { @@ -195,6 +228,11 @@ private void updateImplemented(TypeElement element, Implemented impl) { } private static class Implemented { + public Implemented() {} + public Implemented(Implemented impl) { + fields.addAll(impl.fields); + methods.addAll(impl.methods); + } public final Set fields = new HashSet<>(); public final Set methods = new HashSet<>(); } From 8cc264868f327d3d62d9174a49c12c1127355fc8 Mon Sep 17 00:00:00 2001 From: Norman Walsh Date: Thu, 19 Sep 2024 12:18:38 +0100 Subject: [PATCH 3/3] Bump the version --- README.md | 6 ++++++ gradle.properties | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 637b55f..b67d977 100644 --- a/README.md +++ b/README.md @@ -120,6 +120,12 @@ incomplete or incorrect, please [open an issue](https://github.com/Saxonica/xmld ## Change log +* **0.7.0** Improved presentation of interfaces + + Reworked the way interfaces are presented so that the methods inherited + from those interfaces (i.e., the methods not actually implemented on this class) + are shown. + * **0.6.0** Improved handling of method names and inheritance Changed the “name” of methods to include the parameter types. (i.e., `foo(int)` diff --git a/gradle.properties b/gradle.properties index b0ec4a8..a86bd7d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ -docletVersion=0.6.0 -schemaVersion=0.6.0 +docletVersion=0.7.0 +schemaVersion=0.7.0 docletTitle=XmlDoclet docletName=xmldoclet