abstractdoclet.java
来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 1,370 行 · 第 1/3 页
JAVA
1,370 行
tagScopeOverview = true; break; case 'p': tagScopePackages = true; break; case 't': tagScopeTypes = true; break; case 'c': tagScopeConstructors = true; break; case 'm': tagScopeMethods = true; break; case 'f': tagScopeFields = true; break; default: validTagSpec = false; break tag_option_loop; } } if (validTagSpec) { GenericTaglet taglet = new GenericTaglet(tagName, tagHead, tagScopeOverview, tagScopePackages, tagScopeTypes, tagScopeConstructors, tagScopeMethods, tagScopeFields); taglet.setTagletEnabled(!tagDisabled); taglet.register(tagletMap); mentionedTags.add(taglet); } } } if (!validTagSpec) { printError("Value for option -tag must be in format \"<tagname>:Xaoptcmf:<taghead>\"."); } return validTagSpec; } } private DocletOption[] commonOptions = { optionTargetDirectory, optionAuthor, optionVersion, optionNoSince, optionNoDeprecated, optionGroup, optionDocFilesSubDirs, optionExcludeDocFilesSubDir, optionTagletPath, optionTaglet, optionTag, }; private void registerOptions() { if (!optionsRegistered) { for (int i=0; i<commonOptions.length; ++i) { DocletOption option = commonOptions[i]; registerOption(option); } DocletOption[] docletOptions = getOptions(); for (int i=0; i<docletOptions.length; ++i) { DocletOption option = docletOptions[i]; registerOption(option); } optionsRegistered = true; } } protected abstract DocletOption[] getOptions(); private boolean optionsRegistered = false; private void registerOption(DocletOption option) { nameToOptionMap.put(option.getName(), option); } private Map nameToOptionMap = new HashMap(); private int getOptionLength(String optionName) { registerOptions(); DocletOption option = (DocletOption)nameToOptionMap.get(optionName.toLowerCase()); if (null != option) { return option.getLength(); } else { return -1; } } protected List getKnownDirectSubclasses(ClassDoc classDoc) { List result = new LinkedList(); if (!"java.lang.Object".equals(classDoc.qualifiedName())) { ClassDoc[] classes = rootDoc.classes(); for (int i=0; i<classes.length; ++i) { if (classDoc == classes[i].superclass()) { result.add(classes[i]); } } } return result; } protected static class IndexKey implements Comparable { private String name; private String lowerName; public IndexKey(String name) { this.name = name; this.lowerName = name.toLowerCase(); } public boolean equals(Object other) { return this.lowerName.equals(((IndexKey)other).lowerName); } public int hashCode() { return lowerName.hashCode(); } public int compareTo(Object other) { return lowerName.compareTo(((IndexKey)other).lowerName); } public String getName() { return name; } } private Map categorizedIndex; protected Map getCategorizedIndex() { if (null == categorizedIndex) { categorizedIndex = new LinkedHashMap(); Map indexMap = getIndexByName(); LinkedList keys = new LinkedList(); //indexMap.keySet().size()); keys.addAll(indexMap.keySet()); Collections.sort(keys); Iterator it = keys.iterator(); //indexMap.keySet().iterator(); char previousCategoryLetter = '\0'; Character keyLetter = null; while (it.hasNext()) { IndexKey key = (IndexKey)it.next(); char firstChar = Character.toUpperCase(key.getName().charAt(0)); if (firstChar != previousCategoryLetter) { keyLetter = new Character(firstChar); previousCategoryLetter = firstChar; categorizedIndex.put(keyLetter, new LinkedList()); } List letterList = (List)categorizedIndex.get(keyLetter); letterList.add(indexMap.get(key)); } } return categorizedIndex; } private Map indexByName; protected Map getIndexByName() { if (null == indexByName) { // Create index // Collect index indexByName = new HashMap(); //TreeMap(); // Add packages to index PackageDoc[] packages = rootDoc.specifiedPackages(); for (int i=0, ilim=packages.length; i<ilim; ++i) { PackageDoc c = packages[i]; if (c.name().length() > 0) { indexByName.put(new IndexKey(c.name()), c); } } // Add classes, fields and methods to index ClassDoc[] sumclasses = rootDoc.classes(); for (int i=0, ilim=sumclasses.length; i<ilim; ++i) { ClassDoc c = sumclasses[i]; if (null == c.containingClass()) { indexByName.put(new IndexKey(c.name() + " " + c.containingPackage().name()), c); } else { indexByName.put(new IndexKey(c.name().substring(c.containingClass().name().length() + 1) + " " + c.containingClass().name() + " " + c.containingPackage().name()), c); } FieldDoc[] fields = c.fields(); for (int j=0, jlim=fields.length; j<jlim; ++j) { indexByName.put(new IndexKey(fields[j].name() + " " + fields[j].containingClass().name() + " " + fields[j].containingPackage().name()), fields[j]); } MethodDoc[] methods = c.methods(); for (int j=0, jlim=methods.length; j<jlim; ++j) { MethodDoc method = methods[j]; indexByName.put(new IndexKey(method.name() + method.signature() + " " + method.containingClass().name() + " " + method.containingPackage().name()), method); } ConstructorDoc[] constructors = c.constructors(); for (int j=0, jlim=constructors.length; j<jlim; ++j) { ConstructorDoc constructor = constructors[j]; indexByName.put(new IndexKey(constructor.name() + constructor.signature() + " " + constructor.containingClass().name() + " " + constructor.containingPackage().name()), constructor); } } } return indexByName; } private void registerTaglet(Taglet taglet) { tagletMap.put(taglet.getName(), taglet); } protected void printTaglets(Tag[] tags, TagletContext context, TagletPrinter output, boolean inline) { for (Iterator it = tagletMap.keySet().iterator(); it.hasNext(); ) { String tagName = (String)it.next(); Object o = tagletMap.get(tagName); Taglet taglet = (Taglet)o; Doc doc = context.getDoc(); if (inline == taglet.isInlineTag() && ((doc == null && taglet.inOverview()) || (doc != null && ((doc.isConstructor() && taglet.inConstructor()) || (doc.isField() && taglet.inField()) || (doc.isMethod() && taglet.inMethod()) || (doc instanceof PackageDoc && taglet.inPackage()) || ((doc.isClass() || doc.isInterface()) && taglet.inType()))))) { List tagsOfThisType = new LinkedList(); for (int i=0; i<tags.length; ++i) { if (tags[i].name().substring(1).equals(tagName)) { tagsOfThisType.add(tags[i]); } } Tag[] tagletTags = (Tag[])tagsOfThisType.toArray(new Tag[tagsOfThisType.size()]); String tagletString; if (taglet instanceof StandardTaglet) { tagletString = renderTag(tagName, tagletTags, context); } else if (taglet instanceof GnuExtendedTaglet) { tagletString = ((GnuExtendedTaglet)taglet).toString(tagletTags, context); } else { tagletString = taglet.toString(tagletTags); } if (null != tagletString) { output.printTagletString(tagletString); } } } } protected void printInlineTaglet(Tag tag, TagletContext context, TagletPrinter output) { Taglet taglet = (Taglet)tagletMap.get(tag.name().substring(1)); if (null != taglet) { String tagletString; if (taglet instanceof GnuExtendedTaglet) { tagletString = ((GnuExtendedTaglet)taglet).toString(tag, context); } else { tagletString = taglet.toString(tag); } if (null != tagletString) { output.printTagletString(tagletString); } } else { printWarning("Unknown tag: " + tag.name()); } } protected void printMainTaglets(Tag[] tags, TagletContext context, TagletPrinter output) { printTaglets(tags, context, output, false); } /** * @param usedClassToPackagesMap ClassDoc to (PackageDoc to (UsageType to (Set of Doc))) */ private void addUsedBy(Map usedClassToPackagesMap, ClassDoc usedClass, UsageType usageType, Doc user, PackageDoc userPackage) { Map packageToUsageTypeMap = (Map)usedClassToPackagesMap.get(usedClass); if (null == packageToUsageTypeMap) { packageToUsageTypeMap = new HashMap(); usedClassToPackagesMap.put(usedClass, packageToUsageTypeMap); } Map usageTypeToUsersMap = (Map)packageToUsageTypeMap.get(userPackage); if (null == usageTypeToUsersMap) { usageTypeToUsersMap = new TreeMap(); packageToUsageTypeMap.put(userPackage, usageTypeToUsersMap); } Set userSet = (Set)usageTypeToUsersMap.get(usageType); if (null == userSet) { userSet = new TreeSet(); // FIXME: we need the collator from Main here usageTypeToUsersMap.put(usageType, userSet); } userSet.add(user); } /** * Create the cross reference database. */ private Map collectUsage() { Map _usedClassToPackagesMap = new HashMap(); ClassDoc[] classes = rootDoc.classes(); for (int i = 0, ilim = classes.length; i < ilim; ++ i) { ClassDoc clazz = classes[i]; if (clazz.isInterface()) { // classes implementing InterfaceRelation relation = (InterfaceRelation)getInterfaceRelations().get(clazz); Iterator it = relation.implementingClasses.iterator(); while (it.hasNext()) { ClassDoc implementor = (ClassDoc)it.next(); addUsedBy(_usedClassToPackagesMap, clazz, UsageType.CLASS_IMPLEMENTING, implementor, implementor.containingPackage()); } } else { // classes derived from for (ClassDoc superclass = clazz.superclass(); superclass != null; superclass = superclass.superclass()) { addUsedBy(_usedClassToPackagesMap, superclass, UsageType.CLASS_DERIVED_FROM, clazz, clazz.containingPackage()); } } FieldDoc[] fields = clazz.fields(); for (int j = 0, jlim = fields.length; j < jlim; ++ j) { FieldDoc field = fields[j]; // fields of type ClassDoc fieldType = field.type().asClassDoc(); if (null != fieldType) { addUsedBy(_usedClassToPackagesMap, fieldType, UsageType.FIELD_OF_TYPE, field, clazz.containingPackage()); } } MethodDoc[] methods = clazz.methods(); for (int j = 0, jlim = methods.length; j < jlim; ++ j) { MethodDoc method = methods[j]; // methods with return type ClassDoc returnType = method.returnType().asClassDoc(); if (null != returnType) { addUsedBy(_usedClassToPackagesMap, returnType, UsageType.METHOD_WITH_RETURN_TYPE, method, clazz.containingPackage()); } Parameter[] parameters = method.parameters(); for (int k=0; k<parameters.length; ++k) { // methods with parameter type Parameter parameter = parameters[k]; ClassDoc parameterType = parameter.type().asClassDoc(); if (null != parameterType) { addUsedBy(_usedClassToPackagesMap, parameterType, UsageType.METHOD_WITH_PARAMETER_TYPE, method, clazz.containingPackage()); } } // methods which throw ClassDoc[] thrownExceptions = method.thrownExceptions(); for (int k = 0, klim = thrownExceptions.length; k < klim; ++ k) { ClassDoc thrownException = thrownExceptions[k]; addUsedBy(_usedClassToPackagesMap, thrownException, UsageType.METHOD_WITH_THROWN_TYPE, method, clazz.containingPackage()); } } ConstructorDoc[] constructors = clazz.constructors(); for (int j = 0, jlim = constructors.length; j < jlim; ++ j) { ConstructorDoc constructor = constructors[j]; Parameter[] parameters = constructor.parameters(); for (int k = 0, klim = parameters.length; k < klim; ++ k) { // constructors with parameter type Parameter parameter = parameters[k]; ClassDoc parameterType = parameter.type().asClassDoc(); if (null != parameterType) { addUsedBy(_usedClassToPackagesMap, parameterType, UsageType.CONSTRUCTOR_WITH_PARAMETER_TYPE, constructor, clazz.containingPackage()); } } // constructors which throw ClassDoc[] thrownExceptions = constructor.thrownExceptions(); for (int k = 0, klim = thrownExceptions.length; k < klim; ++ k) { ClassDoc thrownException = thrownExceptions[k]; addUsedBy(_usedClassToPackagesMap, thrownException, UsageType.CONSTRUCTOR_WITH_THROWN_TYPE, constructor, clazz.containingPackage()); } } } return _usedClassToPackagesMap; } private Map usedClassToPackagesMap = null; protected Map getUsageOfClass(ClassDoc classDoc) { if (null == this.usedClassToPackagesMap) { this.usedClassToPackagesMap = collectUsage(); } return (Map)this.usedClassToPackagesMap.get(classDoc); } protected static class UsageType implements Comparable { public static final UsageType CLASS_DERIVED_FROM = new UsageType("class-derived-from");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?