src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java
changeset 47216 71c04702a3d5
parent 45417 f7479ee8de69
child 47395 2ea4edfdef8e
equal deleted inserted replaced
47215:4ebc2e2fb97c 47216:71c04702a3d5
       
     1 /*
       
     2  * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
       
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
       
     4  *
       
     5  * This code is free software; you can redistribute it and/or modify it
       
     6  * under the terms of the GNU General Public License version 2 only, as
       
     7  * published by the Free Software Foundation.  Oracle designates this
       
     8  * particular file as subject to the "Classpath" exception as provided
       
     9  * by Oracle in the LICENSE file that accompanied this code.
       
    10  *
       
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
       
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
       
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
       
    14  * version 2 for more details (a copy is included in the LICENSE file that
       
    15  * accompanied this code).
       
    16  *
       
    17  * You should have received a copy of the GNU General Public License version
       
    18  * 2 along with this work; if not, write to the Free Software Foundation,
       
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
       
    20  *
       
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
       
    22  * or visit www.oracle.com if you need additional information or have any
       
    23  * questions.
       
    24  */
       
    25 
       
    26 package jdk.javadoc.internal.doclets.formats.html;
       
    27 
       
    28 import javax.lang.model.element.ExecutableElement;
       
    29 import javax.lang.model.element.TypeElement;
       
    30 import javax.lang.model.type.TypeMirror;
       
    31 
       
    32 import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
       
    33 import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
       
    34 import jdk.javadoc.internal.doclets.toolkit.Content;
       
    35 import jdk.javadoc.internal.doclets.toolkit.util.Utils;
       
    36 import jdk.javadoc.internal.doclets.toolkit.util.links.LinkInfo;
       
    37 
       
    38 
       
    39 /**
       
    40  *  <p><b>This is NOT part of any supported API.
       
    41  *  If you write code that depends on this, you do so at your own risk.
       
    42  *  This code and its internal interfaces are subject to change or
       
    43  *  deletion without notice.</b>
       
    44  */
       
    45 public class LinkInfoImpl extends LinkInfo {
       
    46 
       
    47     public enum Kind {
       
    48         DEFAULT,
       
    49 
       
    50         /**
       
    51          * Indicate that the link appears in a class list.
       
    52          */
       
    53         ALL_CLASSES_FRAME,
       
    54 
       
    55         /**
       
    56          * Indicate that the link appears in a class documentation.
       
    57          */
       
    58         CLASS,
       
    59 
       
    60         /**
       
    61          * Indicate that the link appears in member documentation.
       
    62          */
       
    63         MEMBER,
       
    64 
       
    65         /**
       
    66          * Indicate that the link appears in class use documentation.
       
    67          */
       
    68         CLASS_USE,
       
    69 
       
    70         /**
       
    71          * Indicate that the link appears in index documentation.
       
    72          */
       
    73         INDEX,
       
    74 
       
    75         /**
       
    76          * Indicate that the link appears in constant value summary.
       
    77          */
       
    78         CONSTANT_SUMMARY,
       
    79 
       
    80         /**
       
    81          * Indicate that the link appears in serialized form documentation.
       
    82          */
       
    83         SERIALIZED_FORM,
       
    84 
       
    85         /**
       
    86          * Indicate that the link appears in serial member documentation.
       
    87          */
       
    88         SERIAL_MEMBER,
       
    89 
       
    90         /**
       
    91          * Indicate that the link appears in package documentation.
       
    92          */
       
    93         PACKAGE,
       
    94 
       
    95         /**
       
    96          * Indicate that the link appears in see tag documentation.
       
    97          */
       
    98         SEE_TAG,
       
    99 
       
   100         /**
       
   101          * Indicate that the link appears in value tag documentation.
       
   102          */
       
   103         VALUE_TAG,
       
   104 
       
   105         /**
       
   106          * Indicate that the link appears in tree documentation.
       
   107          */
       
   108         TREE,
       
   109 
       
   110         /**
       
   111          * Indicate that the link appears in a class list.
       
   112          */
       
   113         PACKAGE_FRAME,
       
   114 
       
   115         /**
       
   116          * The header in the class documentation.
       
   117          */
       
   118         CLASS_HEADER,
       
   119 
       
   120         /**
       
   121          * The signature in the class documentation.
       
   122          */
       
   123         CLASS_SIGNATURE,
       
   124 
       
   125         /**
       
   126          * The return type of a method.
       
   127          */
       
   128         RETURN_TYPE,
       
   129 
       
   130         /**
       
   131          * The return type of a method in a member summary.
       
   132          */
       
   133         SUMMARY_RETURN_TYPE,
       
   134 
       
   135         /**
       
   136          * The type of a method/constructor parameter.
       
   137          */
       
   138         EXECUTABLE_MEMBER_PARAM,
       
   139 
       
   140         /**
       
   141          * Super interface links.
       
   142          */
       
   143         SUPER_INTERFACES,
       
   144 
       
   145         /**
       
   146          * Implemented interface links.
       
   147          */
       
   148         IMPLEMENTED_INTERFACES,
       
   149 
       
   150         /**
       
   151          * Implemented class links.
       
   152          */
       
   153         IMPLEMENTED_CLASSES,
       
   154 
       
   155         /**
       
   156          * Subinterface links.
       
   157          */
       
   158         SUBINTERFACES,
       
   159 
       
   160         /**
       
   161          * Subclasses links.
       
   162          */
       
   163         SUBCLASSES,
       
   164 
       
   165         /**
       
   166          * The signature in the class documentation (implements/extends portion).
       
   167          */
       
   168         CLASS_SIGNATURE_PARENT_NAME,
       
   169 
       
   170         /**
       
   171          * The header for method documentation copied from parent.
       
   172          */
       
   173         EXECUTABLE_ELEMENT_COPY,
       
   174 
       
   175         /**
       
   176          * Method "specified by" link.
       
   177          */
       
   178         METHOD_SPECIFIED_BY,
       
   179 
       
   180         /**
       
   181          * Method "overrides" link.
       
   182          */
       
   183         METHOD_OVERRIDES,
       
   184 
       
   185         /**
       
   186          * Annotation link.
       
   187          */
       
   188         ANNOTATION,
       
   189 
       
   190         /**
       
   191          * The header for field documentation copied from parent.
       
   192          */
       
   193         VARIABLE_ELEMENT_COPY,
       
   194 
       
   195         /**
       
   196          * The parent nodes in the class tree.
       
   197          */
       
   198         CLASS_TREE_PARENT,
       
   199 
       
   200         /**
       
   201          * The type parameters of a method or constructor.
       
   202          */
       
   203         MEMBER_TYPE_PARAMS,
       
   204 
       
   205         /**
       
   206          * Indicate that the link appears in class use documentation.
       
   207          */
       
   208         CLASS_USE_HEADER,
       
   209 
       
   210         /**
       
   211          * The header for property documentation copied from parent.
       
   212          */
       
   213         PROPERTY_COPY,
       
   214 
       
   215         /**
       
   216          * A receiver type
       
   217          */
       
   218         RECEIVER_TYPE
       
   219     }
       
   220 
       
   221     public final HtmlConfiguration configuration;
       
   222 
       
   223     /**
       
   224      * The location of the link.
       
   225      */
       
   226     public Kind context = Kind.DEFAULT;
       
   227 
       
   228     /**
       
   229      * The value of the marker #.
       
   230      */
       
   231     public String where = "";
       
   232 
       
   233     /**
       
   234      * String style of text defined in style sheet.
       
   235      */
       
   236     public String styleName = "";
       
   237 
       
   238     /**
       
   239      * The value of the target.
       
   240      */
       
   241     public String target = "";
       
   242     public  final Utils utils;
       
   243     /**
       
   244      * Construct a LinkInfo object.
       
   245      *
       
   246      * @param configuration the configuration data for the doclet
       
   247      * @param context    the context of the link.
       
   248      * @param ee   the member to link to.
       
   249      */
       
   250     public LinkInfoImpl(HtmlConfiguration configuration, Kind context, ExecutableElement ee) {
       
   251         this.configuration = configuration;
       
   252         this.utils = configuration.utils;
       
   253         this.executableElement = ee;
       
   254         setContext(context);
       
   255     }
       
   256 
       
   257     /**
       
   258      * {@inheritDoc}
       
   259      */
       
   260     @Override
       
   261     protected Content newContent() {
       
   262         return new ContentBuilder();
       
   263     }
       
   264 
       
   265     /**
       
   266      * Construct a LinkInfo object.
       
   267      *
       
   268      * @param configuration the configuration data for the doclet
       
   269      * @param context    the context of the link.
       
   270      * @param typeElement   the class to link to.
       
   271      */
       
   272     public LinkInfoImpl(HtmlConfiguration configuration, Kind context, TypeElement typeElement) {
       
   273         this.configuration = configuration;
       
   274         this.utils = configuration.utils;
       
   275         this.typeElement = typeElement;
       
   276         setContext(context);
       
   277     }
       
   278 
       
   279     /**
       
   280      * Construct a LinkInfo object.
       
   281      *
       
   282      * @param configuration the configuration data for the doclet
       
   283      * @param context    the context of the link.
       
   284      * @param type       the class to link to.
       
   285      */
       
   286     public LinkInfoImpl(HtmlConfiguration configuration, Kind context, TypeMirror type) {
       
   287         this.configuration = configuration;
       
   288         this.utils = configuration.utils;
       
   289         this.type = type;
       
   290         setContext(context);
       
   291     }
       
   292 
       
   293     /**
       
   294      * Set the label for the link.
       
   295      * @param label plain-text label for the link
       
   296      */
       
   297     public LinkInfoImpl label(CharSequence label) {
       
   298         this.label = new StringContent(label);
       
   299         return this;
       
   300     }
       
   301 
       
   302     /**
       
   303      * Set the label for the link.
       
   304      */
       
   305     public LinkInfoImpl label(Content label) {
       
   306         this.label = label;
       
   307         return this;
       
   308     }
       
   309 
       
   310     /**
       
   311      * Set whether or not the link should be strong.
       
   312      */
       
   313     public LinkInfoImpl strong(boolean strong) {
       
   314         this.isStrong = strong;
       
   315         return this;
       
   316     }
       
   317 
       
   318     /**
       
   319      * Set the style to be used for the link.
       
   320      * @param styleName  String style of text defined in style sheet.
       
   321      */
       
   322     public LinkInfoImpl styleName(String styleName) {
       
   323         this.styleName = styleName;
       
   324         return this;
       
   325     }
       
   326 
       
   327     /**
       
   328      * Set the target to be used for the link.
       
   329      * @param styleName  String style of text defined in style sheet.
       
   330      */
       
   331     public LinkInfoImpl target(String target) {
       
   332         this.target = target;
       
   333         return this;
       
   334     }
       
   335 
       
   336     /**
       
   337      * Set whether or not this is a link to a varargs parameter.
       
   338      */
       
   339     public LinkInfoImpl varargs(boolean varargs) {
       
   340         this.isVarArg = varargs;
       
   341         return this;
       
   342     }
       
   343 
       
   344     /**
       
   345      * Set the fragment specifier for the link.
       
   346      */
       
   347     public LinkInfoImpl where(String where) {
       
   348         this.where = where;
       
   349         return this;
       
   350      }
       
   351 
       
   352     /**
       
   353      * {@inheritDoc}
       
   354      */
       
   355     public Kind getContext() {
       
   356         return context;
       
   357     }
       
   358 
       
   359     /**
       
   360      * {@inheritDoc}
       
   361      *
       
   362      * This method sets the link attributes to the appropriate values
       
   363      * based on the context.
       
   364      *
       
   365      * @param c the context id to set.
       
   366      */
       
   367     public final void setContext(Kind c) {
       
   368         //NOTE:  Put context specific link code here.
       
   369         switch (c) {
       
   370             case ALL_CLASSES_FRAME:
       
   371             case PACKAGE_FRAME:
       
   372             case IMPLEMENTED_CLASSES:
       
   373             case SUBCLASSES:
       
   374             case EXECUTABLE_ELEMENT_COPY:
       
   375             case VARIABLE_ELEMENT_COPY:
       
   376             case PROPERTY_COPY:
       
   377             case CLASS_USE_HEADER:
       
   378                 includeTypeInClassLinkLabel = false;
       
   379                 break;
       
   380 
       
   381             case ANNOTATION:
       
   382                 excludeTypeParameterLinks = true;
       
   383                 excludeTypeBounds = true;
       
   384                 break;
       
   385 
       
   386             case IMPLEMENTED_INTERFACES:
       
   387             case SUPER_INTERFACES:
       
   388             case SUBINTERFACES:
       
   389             case CLASS_TREE_PARENT:
       
   390             case TREE:
       
   391             case CLASS_SIGNATURE_PARENT_NAME:
       
   392                 excludeTypeParameterLinks = true;
       
   393                 excludeTypeBounds = true;
       
   394                 includeTypeInClassLinkLabel = false;
       
   395                 includeTypeAsSepLink = true;
       
   396                 break;
       
   397 
       
   398             case PACKAGE:
       
   399             case CLASS_USE:
       
   400             case CLASS_HEADER:
       
   401             case CLASS_SIGNATURE:
       
   402             case RECEIVER_TYPE:
       
   403                 excludeTypeParameterLinks = true;
       
   404                 includeTypeAsSepLink = true;
       
   405                 includeTypeInClassLinkLabel = false;
       
   406                 break;
       
   407 
       
   408             case MEMBER_TYPE_PARAMS:
       
   409                 includeTypeAsSepLink = true;
       
   410                 includeTypeInClassLinkLabel = false;
       
   411                 break;
       
   412 
       
   413             case RETURN_TYPE:
       
   414             case SUMMARY_RETURN_TYPE:
       
   415                 excludeTypeBounds = true;
       
   416                 break;
       
   417             case EXECUTABLE_MEMBER_PARAM:
       
   418                 excludeTypeBounds = true;
       
   419                 break;
       
   420         }
       
   421         context = c;
       
   422         if (type != null &&
       
   423             utils.isTypeVariable(type) &&
       
   424             utils.isExecutableElement(utils.asTypeElement(type).getEnclosingElement())) {
       
   425                 excludeTypeParameterLinks = true;
       
   426         }
       
   427     }
       
   428 
       
   429     /**
       
   430      * Return true if this link is linkable and false if we can't link to the
       
   431      * desired place.
       
   432      *
       
   433      * @return true if this link is linkable and false if we can't link to the
       
   434      * desired place.
       
   435      */
       
   436     @Override
       
   437     public boolean isLinkable() {
       
   438         return configuration.utils.isLinkable(typeElement);
       
   439     }
       
   440 
       
   441     @Override
       
   442     public String toString() {
       
   443         return "LinkInfoImpl{" +
       
   444                 "context=" + context +
       
   445                 ", where=" + where +
       
   446                 ", styleName=" + styleName +
       
   447                 ", target=" + target +
       
   448                 super.toString() + '}';
       
   449     }
       
   450 }