3030import java .io .PrintStream ;
3131import java .util .ArrayList ;
3232import java .util .Collections ;
33- import java .util .Comparator ;
3433import java .util .EnumMap ;
3534import java .util .EnumSet ;
3635import java .util .HashSet ;
4039import java .util .Map ;
4140import java .util .ServiceLoader ;
4241import java .util .Set ;
43- import java .util .TreeSet ;
42+ import java .util .TreeMap ;
4443
4544import javax .lang .model .element .Element ;
4645import javax .lang .model .element .ExecutableElement ;
@@ -98,7 +97,12 @@ public class TagletManager {
9897 public static final char SIMPLE_TAGLET_OPT_SEPARATOR = ':' ;
9998
10099 /**
101- * All taglets, keyed by their {@link Taglet#getName() name}.
100+ * All taglets, keyed either by their {@link Taglet#getName() name},
101+ * or by an alias.
102+ *
103+ * In general, taglets do <i>not</i> provide aliases;
104+ * the one instance that does is {@code ThrowsTaglet}, which handles
105+ * both {@code @throws} tags and {@code @exception} tags.
102106 */
103107 private final LinkedHashMap <String , Taglet > allTaglets ;
104108
@@ -577,17 +581,15 @@ private void initTaglets() {
577581
578582 inlineTags = new LinkedHashMap <>();
579583
580- for ( Taglet t : allTaglets .values ()) {
584+ allTaglets .forEach (( name , t ) -> {
581585 if (t .isInlineTag ()) {
582586 inlineTags .put (t .getName (), t );
583587 }
584588
585- if (t .isBlockTag ()) {
586- for (Location l : t .getAllowedLocations ()) {
587- blockTagletsByLocation .get (l ).add (t );
588- }
589+ if (t .isBlockTag () && t .getName ().equals (name )) {
590+ t .getAllowedLocations ().forEach (l -> blockTagletsByLocation .get (l ).add (t ));
589591 }
590- }
592+ });
591593
592594 // init the serialized form tags for the serialized form page
593595 serializedFormTags = new ArrayList <>();
@@ -612,10 +614,7 @@ private void initStandardTaglets() {
612614
613615 addStandardTaglet (new ParamTaglet ());
614616 addStandardTaglet (new ReturnTaglet ());
615- addStandardTaglet (new ThrowsTaglet ());
616- addStandardTaglet (
617- new SimpleTaglet (EXCEPTION , null ,
618- EnumSet .of (Location .METHOD , Location .CONSTRUCTOR )));
617+ addStandardTaglet (new ThrowsTaglet (), EXCEPTION );
619618 addStandardTaglet (
620619 new SimpleTaglet (SINCE , resources .getText ("doclet.Since" ),
621620 EnumSet .allOf (Location .class ), !nosince ));
@@ -683,6 +682,14 @@ private void addStandardTaglet(Taglet taglet) {
683682 standardTagsLowercase .add (Utils .toLowerCase (name ));
684683 }
685684
685+ private void addStandardTaglet (Taglet taglet , DocTree .Kind alias ) {
686+ addStandardTaglet (taglet );
687+ String name = alias .tagName ;
688+ allTaglets .put (name , taglet );
689+ standardTags .add (name );
690+ standardTagsLowercase .add (Utils .toLowerCase (name ));
691+ }
692+
686693 public boolean isKnownCustomTag (String tagName ) {
687694 return allTaglets .containsKey (tagName );
688695 }
@@ -729,12 +736,11 @@ Taglet getTaglet(String name) {
729736 * a need for a corresponding update to the spec.
730737 */
731738 private void showTaglets (PrintStream out ) {
732- Set <Taglet > taglets = new TreeSet <>(Comparator .comparing (Taglet ::getName ));
733- taglets .addAll (allTaglets .values ());
739+ Map <String , Taglet > taglets = new TreeMap <>(allTaglets );
734740
735- for ( Taglet t : taglets ) {
741+ taglets . forEach (( n , t ) -> {
736742 // give preference to simpler block form if a tag can be either
737- String name = t .isBlockTag () ? "@" + t . getName () : "{@" + t . getName () + "}" ;
743+ String name = t .isBlockTag () ? "@" + n : "{@" + n + "}" ;
738744 out .println (String .format ("%20s" , name ) + ": "
739745 + format (t .isBlockTag (), "block" )+ " "
740746 + format (t .inOverview (), "overview" ) + " "
@@ -746,7 +752,7 @@ private void showTaglets(PrintStream out) {
746752 + format (t .inField (), "field" ) + " "
747753 + format (t .isInlineTag (), "inline" )+ " "
748754 + format ((t instanceof SimpleTaglet ) && !((SimpleTaglet ) t ).enabled , "disabled" ));
749- }
755+ });
750756 }
751757
752758 private String format (boolean b , String s ) {
0 commit comments