From 70929da1d0028b8352ded0ca106aff088bc27d7a Mon Sep 17 00:00:00 2001 From: Laurent SCHOELENS Date: Mon, 27 Mar 2023 12:18:46 +0200 Subject: [PATCH] make some fixes after run on bigger project --- .../java/org/umlgraph/doclet/ClassGraph.java | 40 +++++++++++++------ .../java/org/umlgraph/doclet/Options.java | 3 +- .../java/org/umlgraph/doclet/UmlGraphDoc.java | 2 +- .../org/umlgraph/doclet/util/ElementUtil.java | 28 +++++++++++-- 4 files changed, 54 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/umlgraph/doclet/ClassGraph.java b/src/main/java/org/umlgraph/doclet/ClassGraph.java index 8acdc97..e9974f1 100644 --- a/src/main/java/org/umlgraph/doclet/ClassGraph.java +++ b/src/main/java/org/umlgraph/doclet/ClassGraph.java @@ -57,8 +57,6 @@ import javax.lang.model.type.DeclaredType; import javax.lang.model.type.NoType; import javax.lang.model.type.TypeKind; import javax.lang.model.type.TypeMirror; -import javax.lang.model.type.TypeVariable; -import javax.lang.model.type.WildcardType; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; import javax.tools.JavaFileManager; @@ -810,7 +808,9 @@ class ClassGraph { for (TypeMirror type : types) { // skip primitives and type variables, as well as dependencies // on the source class - if (type.getKind().isPrimitive() || type instanceof NoType || type instanceof WildcardType || type instanceof TypeVariable + if (type.getKind().isPrimitive() + || ElementUtil.isType(type, TypeKind.TYPEVAR) || ElementUtil.isType(type, TypeKind.WILDCARD) + || type instanceof NoType || c.toString().equals(ElementUtil.getTypeElement(type).toString())) { continue; } @@ -856,10 +856,10 @@ class ClassGraph { private FieldRelationInfo getFieldRelationInfo(VariableElement field) { TypeMirror type = field.asType(); - if (type.getKind().isPrimitive() || type.getKind() == TypeKind.WILDCARD || type.getKind() == TypeKind.TYPEVAR) { + if (type.getKind().isPrimitive() || ElementUtil.isType(type, TypeKind.WILDCARD) || ElementUtil.isType(type, TypeKind.TYPEVAR)) { return null; } - + if (ElementUtil.dimensions(type).endsWith("[]")) { return new FieldRelationInfo(ElementUtil.getTypeElement(type), true); } @@ -867,35 +867,49 @@ class ClassGraph { Options opt = optionProvider.getOptionsFor(docTrees, ElementUtil.getTypeElement(type)); if (opt.matchesCollPackageExpression(ElementUtil.getQualifiedName(types, type))) { List argTypes = getInterfaceTypeArguments(collectionClassDoc, type); - if (argTypes != null && argTypes.size() == 1 && !argTypes.get(0).getKind().isPrimitive()) { - return new FieldRelationInfo(ElementUtil.getTypeElement(argTypes.get(0)), true); + if (argTypes != null && argTypes.size() == 1 && !argTypes.get(0).getKind().isPrimitive() && !ElementUtil.isType(argTypes.get(0), TypeKind.TYPEVAR)) { + TypeMirror arg = argTypes.get(0); + return new FieldRelationInfo(ElementUtil.getTypeElement(arg), true); } argTypes = getInterfaceTypeArguments(mapClassDoc, type); - if (argTypes != null && argTypes.size() == 2 && !argTypes.get(1).getKind().isPrimitive()) { - return new FieldRelationInfo(ElementUtil.getTypeElement(argTypes.get(1)), true); + if (argTypes != null && argTypes.size() == 2 && !argTypes.get(1).getKind().isPrimitive() && !ElementUtil.isType(argTypes.get(1), TypeKind.TYPEVAR)) { + TypeMirror arg = argTypes.get(1); + return new FieldRelationInfo(ElementUtil.getTypeElement(arg), true); } } return new FieldRelationInfo(ElementUtil.getTypeElement(type), false); } - private List getInterfaceTypeArguments(TypeElement iface, TypeMirror t) { + private List getInterfaceTypeArguments(Element iface, TypeMirror t) { if (t instanceof DeclaredType) { DeclaredType pt = (DeclaredType) t; if (iface != null && iface.equals(pt.asElement())) { return pt.getTypeArguments(); } else { - for (TypeMirror pti : ElementUtil.getInterfacesTypes(iface)) { + for (TypeMirror pti : ElementUtil.getInterfacesTypes(pt.asElement())) { List result = getInterfaceTypeArguments(iface, pti); if (result != null) { return result; } } - if (ElementUtil.getSuperclassType(pt) != null) { - return getInterfaceTypeArguments(iface, ElementUtil.getSuperclassType(pt)); + TypeMirror superType = ElementUtil.getSuperclassType(pt); + if (superType != null && superType.getKind() != TypeKind.NONE) { + return getInterfaceTypeArguments(iface, superType); } } + } else if (iface instanceof TypeElement) { + for (TypeMirror pti : ElementUtil.getInterfacesTypes((TypeElement) iface)) { + List result = getInterfaceTypeArguments(iface, pti); + if (result != null) { + return result; + } + } + TypeElement superType = ElementUtil.getSuperclass((TypeElement) iface); + if (superType != null && superType.asType().getKind() != TypeKind.NONE) { + return getInterfaceTypeArguments(iface, superType.asType()); + } } return null; } diff --git a/src/main/java/org/umlgraph/doclet/Options.java b/src/main/java/org/umlgraph/doclet/Options.java index f5b4175..b5b9b77 100644 --- a/src/main/java/org/umlgraph/doclet/Options.java +++ b/src/main/java/org/umlgraph/doclet/Options.java @@ -1161,8 +1161,9 @@ public class Options implements Cloneable, OptionProvider { public boolean matchesCollPackageExpression(CharSequence s) { for (Pattern collPattern : collPackages) { Matcher m = collPattern.matcher(s); - if (strictMatching ? m.matches() : m.find()) + if (strictMatching ? m.matches() : m.find()) { return true; + } } return false; } diff --git a/src/main/java/org/umlgraph/doclet/UmlGraphDoc.java b/src/main/java/org/umlgraph/doclet/UmlGraphDoc.java index 6a8f796..93ec7d6 100644 --- a/src/main/java/org/umlgraph/doclet/UmlGraphDoc.java +++ b/src/main/java/org/umlgraph/doclet/UmlGraphDoc.java @@ -129,7 +129,7 @@ public class UmlGraphDoc implements Doclet { UmlGraph.buildGraph(reporter, root, opt, view, packageDoc); runGraphviz(opt.dotExecutable, outputFolder, ElementUtil.getModuleOf(root, packageDoc), packageDoc.getQualifiedName(), packageDoc.getSimpleName(), reporter); alterHtmlDocs(opt, outputFolder, ElementUtil.getModuleOf(root, packageDoc), packageDoc.getQualifiedName(), packageDoc.getSimpleName(), "package-summary.html", - Pattern.compile("()|(

)|(

getInterfacesTypes(TypeElement element) { - return element.getInterfaces(); + public static List getInterfacesTypes(Element element) { + if (element instanceof TypeElement) { + return ((TypeElement) element).getInterfaces(); + } + return Collections.emptyList(); } public static List getInterfaces(TypeElement element) {