/** * Build the emittable type name. The type may be an array and/or a generic type. * * @param type A Type object * @return The emittable type name */ private String buildEmittableTypeString(com.sun.javadoc.Type type) { if (type == null) { return null; } // type.toString() returns the fully qualified name of the type // including the dimension and the parameters we just need to // escape the generic parameters brackets so that the XML // generated is correct String name = type.toString().replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">"); if (name.startsWith("<<ambiguous>>")) { name = name.substring(13); } return name; }
/** * Get type name of this parameter. For example if parameter is the short 'index', returns * "short". */ public String typeName() { return (type instanceof ClassDoc || type instanceof TypeVariable) ? type.typeName() // omit formal type params or bounds : type.toString(); }
/** Print a class's relations */ public void printRelations(ClassDoc c) { Options opt = optionProvider.getOptionsFor(c); if (hidden(c) || c.name() .equals("")) // avoid phantom classes, they may pop up when the source uses annotations return; String className = c.toString(); // Print generalization (through the Java superclass) Type s = c.superclassType(); if (s != null && !s.toString().equals("java.lang.Object") && !c.isEnum() && !hidden(s.asClassDoc())) { ClassDoc sc = s.asClassDoc(); w.println( "\t//" + c + " extends " + s + "\n" + "\t" + relationNode(sc) + " -> " + relationNode(c) + " [dir=back,arrowtail=empty];"); getClassInfo(className) .addRelation(sc.toString(), RelationType.EXTENDS, RelationDirection.OUT); getClassInfo(sc.toString()) .addRelation(className, RelationType.EXTENDS, RelationDirection.IN); } // Print generalizations (through @extends tags) for (Tag tag : c.tags("extends")) if (!hidden(tag.text())) { ClassDoc from = c.findClass(tag.text()); w.println( "\t//" + c + " extends " + tag.text() + "\n" + "\t" + relationNode(from, tag.text()) + " -> " + relationNode(c) + " [dir=back,arrowtail=empty];"); getClassInfo(className) .addRelation(tag.text(), RelationType.EXTENDS, RelationDirection.OUT); getClassInfo(tag.text()).addRelation(className, RelationType.EXTENDS, RelationDirection.IN); } // Print realizations (Java interfaces) for (Type iface : c.interfaceTypes()) { ClassDoc ic = iface.asClassDoc(); if (!hidden(ic)) { w.println( "\t//" + c + " implements " + ic + "\n\t" + relationNode(ic) + " -> " + relationNode(c) + " [dir=back,arrowtail=empty,style=dashed];"); getClassInfo(className) .addRelation(ic.toString(), RelationType.IMPLEMENTS, RelationDirection.OUT); getClassInfo(ic.toString()) .addRelation(className, RelationType.IMPLEMENTS, RelationDirection.IN); } } // Print other associations allRelation(opt, RelationType.ASSOC, c); allRelation(opt, RelationType.NAVASSOC, c); allRelation(opt, RelationType.HAS, c); allRelation(opt, RelationType.NAVHAS, c); allRelation(opt, RelationType.COMPOSED, c); allRelation(opt, RelationType.NAVCOMPOSED, c); allRelation(opt, RelationType.DEPEND, c); }