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 + -
显示快捷键?