--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jdk.javadoc/share/classes/jdk/javadoc/internal/doclets/formats/html/LinkInfoImpl.java Tue Sep 12 19:03:39 2017 +0200
@@ -0,0 +1,450 @@
+/*
+ * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation. Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package jdk.javadoc.internal.doclets.formats.html;
+
+import javax.lang.model.element.ExecutableElement;
+import javax.lang.model.element.TypeElement;
+import javax.lang.model.type.TypeMirror;
+
+import jdk.javadoc.internal.doclets.formats.html.markup.ContentBuilder;
+import jdk.javadoc.internal.doclets.formats.html.markup.StringContent;
+import jdk.javadoc.internal.doclets.toolkit.Content;
+import jdk.javadoc.internal.doclets.toolkit.util.Utils;
+import jdk.javadoc.internal.doclets.toolkit.util.links.LinkInfo;
+
+
+/**
+ * <p><b>This is NOT part of any supported API.
+ * If you write code that depends on this, you do so at your own risk.
+ * This code and its internal interfaces are subject to change or
+ * deletion without notice.</b>
+ */
+public class LinkInfoImpl extends LinkInfo {
+
+ public enum Kind {
+ DEFAULT,
+
+ /**
+ * Indicate that the link appears in a class list.
+ */
+ ALL_CLASSES_FRAME,
+
+ /**
+ * Indicate that the link appears in a class documentation.
+ */
+ CLASS,
+
+ /**
+ * Indicate that the link appears in member documentation.
+ */
+ MEMBER,
+
+ /**
+ * Indicate that the link appears in class use documentation.
+ */
+ CLASS_USE,
+
+ /**
+ * Indicate that the link appears in index documentation.
+ */
+ INDEX,
+
+ /**
+ * Indicate that the link appears in constant value summary.
+ */
+ CONSTANT_SUMMARY,
+
+ /**
+ * Indicate that the link appears in serialized form documentation.
+ */
+ SERIALIZED_FORM,
+
+ /**
+ * Indicate that the link appears in serial member documentation.
+ */
+ SERIAL_MEMBER,
+
+ /**
+ * Indicate that the link appears in package documentation.
+ */
+ PACKAGE,
+
+ /**
+ * Indicate that the link appears in see tag documentation.
+ */
+ SEE_TAG,
+
+ /**
+ * Indicate that the link appears in value tag documentation.
+ */
+ VALUE_TAG,
+
+ /**
+ * Indicate that the link appears in tree documentation.
+ */
+ TREE,
+
+ /**
+ * Indicate that the link appears in a class list.
+ */
+ PACKAGE_FRAME,
+
+ /**
+ * The header in the class documentation.
+ */
+ CLASS_HEADER,
+
+ /**
+ * The signature in the class documentation.
+ */
+ CLASS_SIGNATURE,
+
+ /**
+ * The return type of a method.
+ */
+ RETURN_TYPE,
+
+ /**
+ * The return type of a method in a member summary.
+ */
+ SUMMARY_RETURN_TYPE,
+
+ /**
+ * The type of a method/constructor parameter.
+ */
+ EXECUTABLE_MEMBER_PARAM,
+
+ /**
+ * Super interface links.
+ */
+ SUPER_INTERFACES,
+
+ /**
+ * Implemented interface links.
+ */
+ IMPLEMENTED_INTERFACES,
+
+ /**
+ * Implemented class links.
+ */
+ IMPLEMENTED_CLASSES,
+
+ /**
+ * Subinterface links.
+ */
+ SUBINTERFACES,
+
+ /**
+ * Subclasses links.
+ */
+ SUBCLASSES,
+
+ /**
+ * The signature in the class documentation (implements/extends portion).
+ */
+ CLASS_SIGNATURE_PARENT_NAME,
+
+ /**
+ * The header for method documentation copied from parent.
+ */
+ EXECUTABLE_ELEMENT_COPY,
+
+ /**
+ * Method "specified by" link.
+ */
+ METHOD_SPECIFIED_BY,
+
+ /**
+ * Method "overrides" link.
+ */
+ METHOD_OVERRIDES,
+
+ /**
+ * Annotation link.
+ */
+ ANNOTATION,
+
+ /**
+ * The header for field documentation copied from parent.
+ */
+ VARIABLE_ELEMENT_COPY,
+
+ /**
+ * The parent nodes in the class tree.
+ */
+ CLASS_TREE_PARENT,
+
+ /**
+ * The type parameters of a method or constructor.
+ */
+ MEMBER_TYPE_PARAMS,
+
+ /**
+ * Indicate that the link appears in class use documentation.
+ */
+ CLASS_USE_HEADER,
+
+ /**
+ * The header for property documentation copied from parent.
+ */
+ PROPERTY_COPY,
+
+ /**
+ * A receiver type
+ */
+ RECEIVER_TYPE
+ }
+
+ public final HtmlConfiguration configuration;
+
+ /**
+ * The location of the link.
+ */
+ public Kind context = Kind.DEFAULT;
+
+ /**
+ * The value of the marker #.
+ */
+ public String where = "";
+
+ /**
+ * String style of text defined in style sheet.
+ */
+ public String styleName = "";
+
+ /**
+ * The value of the target.
+ */
+ public String target = "";
+ public final Utils utils;
+ /**
+ * Construct a LinkInfo object.
+ *
+ * @param configuration the configuration data for the doclet
+ * @param context the context of the link.
+ * @param ee the member to link to.
+ */
+ public LinkInfoImpl(HtmlConfiguration configuration, Kind context, ExecutableElement ee) {
+ this.configuration = configuration;
+ this.utils = configuration.utils;
+ this.executableElement = ee;
+ setContext(context);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected Content newContent() {
+ return new ContentBuilder();
+ }
+
+ /**
+ * Construct a LinkInfo object.
+ *
+ * @param configuration the configuration data for the doclet
+ * @param context the context of the link.
+ * @param typeElement the class to link to.
+ */
+ public LinkInfoImpl(HtmlConfiguration configuration, Kind context, TypeElement typeElement) {
+ this.configuration = configuration;
+ this.utils = configuration.utils;
+ this.typeElement = typeElement;
+ setContext(context);
+ }
+
+ /**
+ * Construct a LinkInfo object.
+ *
+ * @param configuration the configuration data for the doclet
+ * @param context the context of the link.
+ * @param type the class to link to.
+ */
+ public LinkInfoImpl(HtmlConfiguration configuration, Kind context, TypeMirror type) {
+ this.configuration = configuration;
+ this.utils = configuration.utils;
+ this.type = type;
+ setContext(context);
+ }
+
+ /**
+ * Set the label for the link.
+ * @param label plain-text label for the link
+ */
+ public LinkInfoImpl label(CharSequence label) {
+ this.label = new StringContent(label);
+ return this;
+ }
+
+ /**
+ * Set the label for the link.
+ */
+ public LinkInfoImpl label(Content label) {
+ this.label = label;
+ return this;
+ }
+
+ /**
+ * Set whether or not the link should be strong.
+ */
+ public LinkInfoImpl strong(boolean strong) {
+ this.isStrong = strong;
+ return this;
+ }
+
+ /**
+ * Set the style to be used for the link.
+ * @param styleName String style of text defined in style sheet.
+ */
+ public LinkInfoImpl styleName(String styleName) {
+ this.styleName = styleName;
+ return this;
+ }
+
+ /**
+ * Set the target to be used for the link.
+ * @param styleName String style of text defined in style sheet.
+ */
+ public LinkInfoImpl target(String target) {
+ this.target = target;
+ return this;
+ }
+
+ /**
+ * Set whether or not this is a link to a varargs parameter.
+ */
+ public LinkInfoImpl varargs(boolean varargs) {
+ this.isVarArg = varargs;
+ return this;
+ }
+
+ /**
+ * Set the fragment specifier for the link.
+ */
+ public LinkInfoImpl where(String where) {
+ this.where = where;
+ return this;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public Kind getContext() {
+ return context;
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * This method sets the link attributes to the appropriate values
+ * based on the context.
+ *
+ * @param c the context id to set.
+ */
+ public final void setContext(Kind c) {
+ //NOTE: Put context specific link code here.
+ switch (c) {
+ case ALL_CLASSES_FRAME:
+ case PACKAGE_FRAME:
+ case IMPLEMENTED_CLASSES:
+ case SUBCLASSES:
+ case EXECUTABLE_ELEMENT_COPY:
+ case VARIABLE_ELEMENT_COPY:
+ case PROPERTY_COPY:
+ case CLASS_USE_HEADER:
+ includeTypeInClassLinkLabel = false;
+ break;
+
+ case ANNOTATION:
+ excludeTypeParameterLinks = true;
+ excludeTypeBounds = true;
+ break;
+
+ case IMPLEMENTED_INTERFACES:
+ case SUPER_INTERFACES:
+ case SUBINTERFACES:
+ case CLASS_TREE_PARENT:
+ case TREE:
+ case CLASS_SIGNATURE_PARENT_NAME:
+ excludeTypeParameterLinks = true;
+ excludeTypeBounds = true;
+ includeTypeInClassLinkLabel = false;
+ includeTypeAsSepLink = true;
+ break;
+
+ case PACKAGE:
+ case CLASS_USE:
+ case CLASS_HEADER:
+ case CLASS_SIGNATURE:
+ case RECEIVER_TYPE:
+ excludeTypeParameterLinks = true;
+ includeTypeAsSepLink = true;
+ includeTypeInClassLinkLabel = false;
+ break;
+
+ case MEMBER_TYPE_PARAMS:
+ includeTypeAsSepLink = true;
+ includeTypeInClassLinkLabel = false;
+ break;
+
+ case RETURN_TYPE:
+ case SUMMARY_RETURN_TYPE:
+ excludeTypeBounds = true;
+ break;
+ case EXECUTABLE_MEMBER_PARAM:
+ excludeTypeBounds = true;
+ break;
+ }
+ context = c;
+ if (type != null &&
+ utils.isTypeVariable(type) &&
+ utils.isExecutableElement(utils.asTypeElement(type).getEnclosingElement())) {
+ excludeTypeParameterLinks = true;
+ }
+ }
+
+ /**
+ * Return true if this link is linkable and false if we can't link to the
+ * desired place.
+ *
+ * @return true if this link is linkable and false if we can't link to the
+ * desired place.
+ */
+ @Override
+ public boolean isLinkable() {
+ return configuration.utils.isLinkable(typeElement);
+ }
+
+ @Override
+ public String toString() {
+ return "LinkInfoImpl{" +
+ "context=" + context +
+ ", where=" + where +
+ ", styleName=" + styleName +
+ ", target=" + target +
+ super.toString() + '}';
+ }
+}