javadoc markup updated

This commit is contained in:
Anna.Kozlova
2018-02-12 09:31:57 +01:00
parent 286a1a7a14
commit b80b461008
65 changed files with 328 additions and 424 deletions
@@ -44,7 +44,7 @@ public class ExternalAnnotationsLineMarkerProvider extends LineMarkerProviderDes
PsiModifierListOwner owner = (PsiModifierListOwner)nameIdentifier.getParent();
return XmlStringUtil.wrapInHtml(NonCodeAnnotationGenerator.getNonCodeHeader(NonCodeAnnotationGenerator.getSignatureNonCodeAnnotations(owner).values()) +
". Full signature:<p>\n" + JavaDocInfoGenerator.generateSignature(owner));
" available. Full signature:<p>\n" + JavaDocInfoGenerator.generateSignature(owner));
};
@Nullable
@@ -1,20 +1,7 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight.javadoc;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.psi.*;
import com.intellij.util.ArrayUtil;
import com.intellij.util.ReflectionUtil;
@@ -30,7 +17,9 @@ public class ColorUtil {
}
public static String generatePreviewHtml(@NotNull final Color color) {
return String.format("<div style=\"padding: 1px; width: 52px; height: 32px; background-color: #555555;\"><div style=\"width: 50px; height: 30px; background-color: #%s;\">&nbsp;</div></div>", com.intellij.ui.ColorUtil.toHex(color));
return DocumentationMarkup.SECTION_HEADER_START + "Preview:" + DocumentationMarkup.SECTION_SEPARATOR + "<p>" +
String.format("<div style=\"padding: 1px; width: 52px; height: 32px; background-color: #555555;\"><div style=\"width: 50px; height: 30px; background-color: #%s;\">&nbsp;</div></div>", com.intellij.ui.ColorUtil.toHex(color)) +
DocumentationMarkup.SECTION_END;
}
@SuppressWarnings("UseJBColor")
@@ -9,6 +9,7 @@ import com.intellij.codeInsight.documentation.DocumentationManagerUtil;
import com.intellij.javadoc.JavadocGeneratorRunProfile;
import com.intellij.lang.ASTNode;
import com.intellij.lang.LangBundle;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.IndexNotReadyException;
@@ -24,7 +25,6 @@ import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.CharsetToolkit;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import com.intellij.psi.impl.JavaConstantExpressionEvaluator;
@@ -50,8 +50,8 @@ import org.jetbrains.annotations.Nullable;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.*;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -211,12 +211,10 @@ public class JavaDocInfoGenerator {
public String generateFileInfo() {
StringBuilder buffer = new StringBuilder();
if (myElement instanceof PsiFile) {
generatePrologue(buffer);
VirtualFile virtualFile = ((PsiFile)myElement).getVirtualFile();
if (virtualFile != null) buffer.append(virtualFile.getPresentableUrl());
generateEpilogue(buffer);
}
return sanitizeHtml(buffer);
@@ -355,32 +353,40 @@ public class JavaDocInfoGenerator {
return packageName;
}
/**
* To be deleted in 2018.2
*/
@Deprecated
public boolean generateDocInfoCore(StringBuilder buffer, boolean generatePrologueAndEpilogue) {
return generateDocInfoCore(buffer);
}
public boolean generateDocInfoCore(StringBuilder buffer) {
if (myElement instanceof PsiClass) {
generateClassJavaDoc(buffer, (PsiClass)myElement, generatePrologueAndEpilogue);
generateClassJavaDoc(buffer, (PsiClass)myElement);
}
else if (myElement instanceof PsiMethod) {
generateMethodJavaDoc(buffer, (PsiMethod)myElement, generatePrologueAndEpilogue);
generateMethodJavaDoc(buffer, (PsiMethod)myElement);
}
else if (myElement instanceof PsiParameter) {
generateMethodParameterJavaDoc(buffer, (PsiParameter)myElement, generatePrologueAndEpilogue);
generateMethodParameterJavaDoc(buffer, (PsiParameter)myElement);
}
else if (myElement instanceof PsiField) {
generateFieldJavaDoc(buffer, (PsiField)myElement, generatePrologueAndEpilogue);
generateFieldJavaDoc(buffer, (PsiField)myElement);
}
else if (myElement instanceof PsiVariable) {
generateVariableJavaDoc(buffer, (PsiVariable)myElement, generatePrologueAndEpilogue);
generateVariableJavaDoc(buffer, (PsiVariable)myElement);
}
else if (myElement instanceof PsiDirectory) {
PsiPackage aPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory)myElement);
if (aPackage == null) return false;
generatePackageJavaDoc(buffer, aPackage, generatePrologueAndEpilogue);
generatePackageJavaDoc(buffer, aPackage);
}
else if (myElement instanceof PsiPackage) {
generatePackageJavaDoc(buffer, (PsiPackage)myElement, generatePrologueAndEpilogue);
generatePackageJavaDoc(buffer, (PsiPackage)myElement);
}
else if (myElement instanceof PsiJavaModule) {
generateModuleJavaDoc(buffer, (PsiJavaModule)myElement, generatePrologueAndEpilogue);
generateModuleJavaDoc(buffer, (PsiJavaModule)myElement);
}
else {
return false;
@@ -407,7 +413,7 @@ public class JavaDocInfoGenerator {
public String generateDocInfo(List<String> docURLs) {
StringBuilder buffer = new StringBuilder();
if (!generateDocInfoCore(buffer, true)) {
if (!generateDocInfoCore(buffer)) {
return null;
}
@@ -423,7 +429,7 @@ public class JavaDocInfoGenerator {
StringUtil.join(docURLs, XmlStringUtil::escapeString, "</i><br>&nbsp;&nbsp;&nbsp;<i>") +
"</i><br>The documentation for this element is not found. Please add all the needed paths to API docs in " +
"<a href=\"open://Project Settings\">Project Settings.</a></p>";
buffer.insert(buffer.indexOf("<body>"), errorSection);
buffer.append( errorSection);
}
}
@@ -453,34 +459,33 @@ public class JavaDocInfoGenerator {
return false;
}
private void generateClassJavaDoc(StringBuilder buffer, PsiClass aClass, boolean generatePrologueAndEpilogue) {
private void generateClassJavaDoc(StringBuilder buffer, PsiClass aClass) {
if (aClass instanceof PsiAnonymousClass) return;
if (generatePrologueAndEpilogue) generatePrologue(buffer);
buffer.append(DocumentationMarkup.DEFINITION_START);
PsiFile file = aClass.getContainingFile();
if (file instanceof PsiJavaFile) {
String packageName = ((PsiJavaFile)file).getPackageName();
if (!packageName.isEmpty()) {
buffer.append("<small><b>");
buffer.append(packageName);
buffer.append("</b></small>");
buffer.append(BR_TAG);
}
}
buffer.append("<PRE>");
if (generateClassSignature(buffer, aClass, SignaturePlace.Javadoc)) return;
buffer.append("</PRE>");
buffer.append(DocumentationMarkup.DEFINITION_END);
PsiDocComment comment = getDocComment(aClass);
if (comment != null) {
generateCommonSection(buffer, comment);
generateTypeParametersSection(buffer, aClass);
}
else {
buffer.append(DocumentationMarkup.SECTIONS_START);
}
new NonCodeAnnotationGenerator(aClass, buffer).explainAnnotations();
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
}
private static boolean generateClassSignature(StringBuilder buffer, PsiClass aClass, SignaturePlace place) {
@@ -617,25 +622,26 @@ public class JavaDocInfoGenerator {
return comment;
}
private void generateFieldJavaDoc(StringBuilder buffer, PsiField field, boolean generatePrologueAndEpilogue) {
if (generatePrologueAndEpilogue) generatePrologue(buffer);
private void generateFieldJavaDoc(StringBuilder buffer, PsiField field) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateLinkToParentIfNeeded(buffer, field);
buffer.append("<PRE>");
generateFieldSignature(buffer, field, SignaturePlace.Javadoc);
buffer.append("</PRE>");
ColorUtil.appendColorPreview(field, buffer);
buffer.append(DocumentationMarkup.DEFINITION_END);
PsiDocComment comment = getDocComment(field);
if (comment != null) {
generateCommonSection(buffer, comment);
}
else {
buffer.append(DocumentationMarkup.SECTIONS_START);
}
ColorUtil.appendColorPreview(field, buffer);
new NonCodeAnnotationGenerator(field, buffer).explainAnnotations();
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
}
private static void generateFieldSignature(StringBuilder buffer, PsiField field, SignaturePlace place) {
@@ -651,9 +657,9 @@ public class JavaDocInfoGenerator {
buffer.append(" ");
buffer.append("<b>");
buffer.append(field.getName());
buffer.append("</b>");
appendInitializer(buffer, field);
enumConstantOrdinal(buffer, field, field.getContainingClass(), "\n");
buffer.append("</b>");
}
public static void enumConstantOrdinal(StringBuilder buffer, PsiField field, PsiClass parentClass, final String newLine) {
@@ -668,10 +674,9 @@ public class JavaDocInfoGenerator {
}
// not a javadoc in fact..
private void generateVariableJavaDoc(StringBuilder buffer, PsiVariable variable, boolean generatePrologueAndEpilogue) {
if (generatePrologueAndEpilogue) generatePrologue(buffer);
private static void generateVariableJavaDoc(StringBuilder buffer, PsiVariable variable) {
buffer.append("<PRE>");
buffer.append(DocumentationMarkup.DEFINITION_START);
String modifiers = PsiFormatUtil.formatModifiers(variable, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
if (!modifiers.isEmpty()) {
buffer.append(modifiers);
@@ -683,14 +688,15 @@ public class JavaDocInfoGenerator {
buffer.append(variable.getName());
appendInitializer(buffer, variable);
buffer.append("</b>");
buffer.append("</PRE>");
buffer.append(DocumentationMarkup.DEFINITION_END);
buffer.append(DocumentationMarkup.SECTIONS_START);
ColorUtil.appendColorPreview(variable, buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
}
private void generatePackageJavaDoc(final StringBuilder buffer, final PsiPackage psiPackage, boolean generatePrologueAndEpilogue) {
private void generatePackageJavaDoc(final StringBuilder buffer, final PsiPackage psiPackage) {
for (PsiDirectory directory : psiPackage.getDirectories(new EverythingGlobalScope(myProject))) {
final PsiFile packageInfoFile = directory.findFile(PsiPackage.PACKAGE_INFO_FILE);
if (packageInfoFile != null) {
@@ -698,34 +704,34 @@ public class JavaDocInfoGenerator {
if (node != null) {
final ASTNode docCommentNode = findRelevantCommentNode(node);
if (docCommentNode != null) {
if (generatePrologueAndEpilogue) generatePrologue(buffer);
generateCommonSection(buffer, (PsiDocComment)docCommentNode.getPsi());
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
break;
}
}
}
PsiFile packageHtmlFile = directory.findFile("package.html");
if (packageHtmlFile != null) {
generatePackageHtmlJavaDoc(buffer, packageHtmlFile, generatePrologueAndEpilogue);
generatePackageHtmlJavaDoc(buffer, packageHtmlFile);
break;
}
}
}
private void generateModuleJavaDoc(StringBuilder buffer, PsiJavaModule module, boolean generatePrologueAndEpilogue) {
if (generatePrologueAndEpilogue) generatePrologue(buffer);
private void generateModuleJavaDoc(StringBuilder buffer, PsiJavaModule module) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateAnnotations(buffer, module, SignaturePlace.Javadoc, true);
buffer.append("<pre>module <b>").append(module.getName()).append("</b></pre>");
buffer.append("module <b>").append(module.getName()).append("</b>");
buffer.append(DocumentationMarkup.DEFINITION_END);
PsiDocComment comment = module.getDocComment();
if (comment != null) {
generateCommonSection(buffer, comment);
buffer.append(DocumentationMarkup.SECTIONS_END);
}
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
}
/**
@@ -742,7 +748,11 @@ public class JavaDocInfoGenerator {
}
public void generateCommonSection(StringBuilder buffer, PsiDocComment docComment) {
buffer.append(DocumentationMarkup.CONTENT_START);
generateDescription(buffer, docComment);
buffer.append(DocumentationMarkup.CONTENT_END);
buffer.append(DocumentationMarkup.SECTIONS_START).append("<p>");
generateApiSection(buffer, docComment);
generateDeprecatedSection(buffer, docComment);
generateSinceSection(buffer, docComment);
@@ -752,18 +762,11 @@ public class JavaDocInfoGenerator {
private void generateApiSection(StringBuilder buffer, PsiDocComment comment) {
final String[] tagNames = {"apiNote", "implSpec", "implNote"};
for (String tagName : tagNames) {
PsiDocTag tag = comment.findTagByName(tagName);
if (tag != null) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>").append(tagName).append("</b>");
buffer.append("<DD>");
generateValue(buffer, tag.getDataElements(), ourEmptyElementsProvider);
buffer.append("</DD></DL></DD>");
}
generateSingleTagSection(buffer, comment, tagName, () -> tagName + ":");
}
}
private void generatePackageHtmlJavaDoc(final StringBuilder buffer, final PsiFile packageHtmlFile, boolean generatePrologueAndEpilogue) {
private void generatePackageHtmlJavaDoc(final StringBuilder buffer, final PsiFile packageHtmlFile) {
String htmlText = packageHtmlFile.getText();
try {
@@ -789,16 +792,15 @@ public class JavaDocInfoGenerator {
return;
}
if (generatePrologueAndEpilogue) generatePrologue(buffer);
generateCommonSection(buffer, docComment);
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
}
public static @Nullable PsiExpression calcInitializerExpression(PsiVariable variable) {
PsiExpression initializer = variable.getInitializer();
if (initializer != null) {
PsiModifierList modifierList = variable.getModifierList();
if (modifierList != null && modifierList.hasModifierProperty(PsiModifier.FINAL) && !(initializer instanceof PsiLiteralExpression)) {
if (modifierList != null && modifierList.hasModifierProperty(PsiModifier.FINAL) && !(initializer instanceof PsiLiteralExpression) && !(initializer instanceof PsiPrefixExpression)) {
JavaPsiFacade instance = JavaPsiFacade.getInstance(variable.getProject());
Object o = instance.getConstantEvaluationHelper().computeConstantExpression(initializer);
if (o != null) {
@@ -888,12 +890,12 @@ public class JavaDocInfoGenerator {
AnnotationUtil.isAnnotated((PsiClass)annotationType, CommonClassNames.JAVA_LANG_ANNOTATION_REPEATABLE, 0);
}
private void generateMethodParameterJavaDoc(StringBuilder buffer, PsiParameter parameter, boolean generatePrologueAndEpilogue) {
private void generateMethodParameterJavaDoc(StringBuilder buffer, PsiParameter parameter) {
String parameterName = parameter.getName();
if (generatePrologueAndEpilogue) generatePrologue(buffer);
buffer.append("<PRE>");
buffer.append(DocumentationMarkup.DEFINITION_START);
String modifiers = PsiFormatUtil.formatModifiers(parameter, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
if (!modifiers.isEmpty()) {
buffer.append(modifiers);
@@ -906,7 +908,7 @@ public class JavaDocInfoGenerator {
buffer.append(parameterName);
appendInitializer(buffer, parameter);
buffer.append("</b>");
buffer.append("</PRE>");
buffer.append(DocumentationMarkup.DEFINITION_END);
final PsiElement method = PsiTreeUtil.getParentOfType(parameter, PsiMethod.class, PsiLambdaExpression.class);
@@ -920,14 +922,16 @@ public class JavaDocInfoGenerator {
final ParamInfo tagInfoProvider = findDocTag(localTags, parameterName, psiMethod, parameterLocator(parameterIndex));
if (tagInfoProvider != null) {
generateOneParameter(buffer, tagInfoProvider);
buffer.append(DocumentationMarkup.CONTENT_START);
buffer.append(generateOneParameter( tagInfoProvider));
buffer.append(DocumentationMarkup.CONTENT_END);
}
}
}
buffer.append(DocumentationMarkup.SECTIONS_START);
new NonCodeAnnotationGenerator(parameter, buffer).explainAnnotations();
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
}
public String generateMethodParameterJavaDoc() {
@@ -955,18 +959,81 @@ public class JavaDocInfoGenerator {
return buffer.toString();
}
private void generateMethodJavaDoc(StringBuilder buffer, PsiMethod method, boolean generatePrologueAndEpilogue) {
if (generatePrologueAndEpilogue) generatePrologue(buffer);
private void generateMethodJavaDoc(StringBuilder buffer, PsiMethod method) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateLinkToParentIfNeeded(buffer, method);
buffer.append("<PRE>");
generateMethodSignature(buffer, method, SignaturePlace.Javadoc);
buffer.append("</PRE>");
buffer.append(DocumentationMarkup.DEFINITION_END);
PsiDocComment comment = getMethodDocComment(method);
generateMethodDescription(buffer, method, comment);
final DocTagLocator<PsiElement[]> descriptionLocator = new DocTagLocator<PsiElement[]>() {
@Override
public PsiElement[] find(PsiDocCommentOwner owner, PsiDocComment comment11) {
return comment11 != null && !isEmptyDescription(comment11) ? comment11.getDescriptionElements() : null;
}
};
if (comment != null && !isEmptyDescription(comment)) {
buffer.append(DocumentationMarkup.CONTENT_START);
generateValue(buffer, comment.getDescriptionElements(), new InheritDocProvider<PsiElement[]>() {
@Override
public Pair<PsiElement[], InheritDocProvider<PsiElement[]>> getInheritDoc() {
return findInheritDocTag(method, descriptionLocator);
}
@Override
public PsiClass getElement() {
return method.getContainingClass();
}
});
buffer.append("<p>");
buffer.append(DocumentationMarkup.CONTENT_END);
buffer.append(DocumentationMarkup.SECTIONS_START)
.append("<p>");
}
else {
buffer.append(DocumentationMarkup.SECTIONS_START)
.append("<p>");
Pair<PsiElement[], InheritDocProvider<PsiElement[]>> pair = findInheritDocTag(method, descriptionLocator);
if (pair != null) {
PsiElement[] elements = pair.first;
if (elements != null) {
PsiClass aClass = pair.second.getElement();
startHeaderSection(buffer, CodeInsightBundle.message(aClass.isInterface() ? "javadoc.description.copied.from.interface"
: "javadoc.description.copied.from.class"))
.append("<p>");
generateLink(buffer, aClass, JavaDocUtil.getShortestClassName(aClass, method), false);
buffer.append(BR_TAG);
generateValue(buffer, elements, pair.second);
buffer.append(DocumentationMarkup.SECTION_END);
}
}
else {
PsiField field = PropertyUtil.getFieldOfGetter(method);
if (field == null) {
field = PropertyUtil.getFieldOfSetter(method);
}
if (field != null) {
PsiDocComment fieldDocComment = field.getDocComment();
if (fieldDocComment != null && !isEmptyDescription(fieldDocComment)) {
startHeaderSection(buffer, CodeInsightBundle.message("javadoc.description.copied.from.field"))
.append("<p>");
generateLink(buffer, field, field.getName(), false);
buffer.append(BR_TAG);
generateValue(buffer, fieldDocComment.getDescriptionElements(), ourEmptyElementsProvider);
buffer.append(DocumentationMarkup.SECTION_END);
}
}
}
}
generateSuperMethodsSection(buffer, method, false);
generateSuperMethodsSection(buffer, method, true);
@@ -988,7 +1055,13 @@ public class JavaDocInfoGenerator {
new NonCodeAnnotationGenerator(method, buffer).explainAnnotations();
if (generatePrologueAndEpilogue) generateEpilogue(buffer);
buffer.append(DocumentationMarkup.SECTIONS_END);
}
private static StringBuilder startHeaderSection(StringBuilder buffer, String message) {
return buffer.append(DocumentationMarkup.SECTION_HEADER_START)
.append(message)
.append(DocumentationMarkup.SECTION_SEPARATOR);
}
private static void generateLinkToParentIfNeeded(StringBuilder buffer, PsiMember member) {
@@ -996,9 +1069,8 @@ public class JavaDocInfoGenerator {
if (parentClass != null) {
String qName = parentClass.getQualifiedName();
if (qName != null) {
buffer.append("<small><b>");
generateLink(buffer, qName, qName + generateTypeParameters(parentClass, true), member, false);
buffer.append("</b></small>");
buffer.append(BR_TAG);
}
}
}
@@ -1112,53 +1184,6 @@ public class JavaDocInfoGenerator {
}
}
protected void generatePrologue(StringBuilder buffer) {
URL baseUrl = getBaseUrl();
buffer.append("<html><head>");
if (baseUrl != null) {
buffer.append("<base href=\"").append(baseUrl).append("\">");
}
buffer.append(" <style type=\"text/css\">" +
" #error {" +
" background-color: #eeeeee;" +
" margin-bottom: 10px;" +
" }" +
" p {" +
" margin: 5px 0;" +
" }" +
" </style>" +
"</head><body>");
}
private URL getBaseUrl() {
if (myElement == null) return null;
PsiElement element = myElement.getNavigationElement();
if (element == null) return null;
PsiFile file = element.getContainingFile();
if (file == null) return null;
VirtualFile vFile = file.getVirtualFile();
if (vFile == null) return null;
return VfsUtilCore.convertToURL(vFile.getUrl());
}
protected void generateEpilogue(StringBuilder buffer) {
while (true) {
if (buffer.length() < BR_TAG.length()) break;
char c = buffer.charAt(buffer.length() - 1);
if (c == '\n' || c == '\r' || c == ' ' || c == '\t') {
buffer.setLength(buffer.length() - 1);
continue;
}
String tail = buffer.substring(buffer.length() - BR_TAG.length());
if (tail.equalsIgnoreCase(BR_TAG)) {
buffer.setLength(buffer.length() - BR_TAG.length());
continue;
}
break;
}
buffer.append("</body></html>");
}
private void generateDescription(StringBuilder buffer, PsiDocComment comment) {
PsiElement[] elements = comment.getDescriptionElements();
generateValue(buffer, elements, ourEmptyElementsProvider);
@@ -1177,67 +1202,6 @@ public class JavaDocInfoGenerator {
return true;
}
private void generateMethodDescription(StringBuilder buffer, PsiMethod method, PsiDocComment comment) {
final DocTagLocator<PsiElement[]> descriptionLocator = new DocTagLocator<PsiElement[]>() {
@Override
public PsiElement[] find(PsiDocCommentOwner owner, PsiDocComment comment) {
return comment != null && !isEmptyDescription(comment) ? comment.getDescriptionElements() : null;
}
};
if (comment != null && !isEmptyDescription(comment)) {
generateValue(buffer, comment.getDescriptionElements(), new InheritDocProvider<PsiElement[]>() {
@Override
public Pair<PsiElement[], InheritDocProvider<PsiElement[]>> getInheritDoc() {
return findInheritDocTag(method, descriptionLocator);
}
@Override
public PsiClass getElement() {
return method.getContainingClass();
}
});
return;
}
Pair<PsiElement[], InheritDocProvider<PsiElement[]>> pair = findInheritDocTag(method, descriptionLocator);
if (pair != null) {
PsiElement[] elements = pair.first;
if (elements != null) {
PsiClass aClass = pair.second.getElement();
buffer.append("<DD><DL>");
buffer.append("<DT><b>");
buffer.append(CodeInsightBundle.message(aClass.isInterface() ? "javadoc.description.copied.from.interface"
: "javadoc.description.copied.from.class"));
buffer.append("</b>&nbsp;");
generateLink(buffer, aClass, JavaDocUtil.getShortestClassName(aClass, method), false);
buffer.append(BR_TAG);
generateValue(buffer, elements, pair.second);
buffer.append("</DD></DL></DD>");
}
}
else {
PsiField field = PropertyUtil.getFieldOfGetter(method);
if (field == null) {
field = PropertyUtil.getFieldOfSetter(method);
}
if (field != null) {
PsiDocComment fieldDocComment = field.getDocComment();
if (fieldDocComment != null && !isEmptyDescription(fieldDocComment)) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>");
buffer.append(CodeInsightBundle.message("javadoc.description.copied.from.field"));
buffer.append("</b>&nbsp;");
generateLink(buffer, field, field.getName(), false);
buffer.append(BR_TAG);
generateValue(buffer, fieldDocComment.getDescriptionElements(), ourEmptyElementsProvider);
buffer.append("</DD></DL></DD>");
}
}
}
}
private void generateValue(StringBuilder buffer, PsiElement[] elements, InheritDocProvider<PsiElement[]> provider) {
generateValue(buffer, elements, 0, provider);
}
@@ -1434,34 +1398,29 @@ public class JavaDocInfoGenerator {
}
private void generateDeprecatedSection(StringBuilder buffer, PsiDocComment comment) {
PsiDocTag tag = comment.findTagByName("deprecated");
generateSingleTagSection(buffer, comment, "deprecated", () -> CodeInsightBundle.message("javadoc.deprecated"));
}
private void generateSingleTagSection(StringBuilder buffer,
PsiDocComment comment,
String tagName,
Supplier<String> computePresentableName) {
PsiDocTag tag = comment.findTagByName(tagName);
if (tag != null) {
buffer.append("<DD><DL>");
buffer.append("<B>").append(CodeInsightBundle.message("javadoc.deprecated")).append("</B>&nbsp;");
buffer.append("<I>");
startHeaderSection(buffer, computePresentableName.get()).append("<p>");
generateValue(buffer, tag.getDataElements(), ourEmptyElementsProvider);
buffer.append("</I>");
buffer.append("</DL></DD>");
buffer.append(DocumentationMarkup.SECTION_END);
}
}
private void generateSinceSection(StringBuilder buffer, PsiDocComment comment) {
PsiDocTag tag = comment.findTagByName("since");
if (tag != null) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>").append(CodeInsightBundle.message("javadoc.since")).append("</b>");
buffer.append("<DD>");
generateValue(buffer, tag.getDataElements(), ourEmptyElementsProvider);
buffer.append("</DD></DL></DD>");
}
generateSingleTagSection(buffer, comment, "since", () -> CodeInsightBundle.message("javadoc.since"));
}
protected void generateSeeAlsoSection(StringBuilder buffer, PsiDocComment comment) {
PsiDocTag[] tags = comment.findTagsByName("see");
if (tags.length > 0) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>").append(CodeInsightBundle.message("javadoc.see.also")).append("</b>");
buffer.append("<DD>");
startHeaderSection(buffer, CodeInsightBundle.message("javadoc.see.also")).append("<p>");
for (int i = 0; i < tags.length; i++) {
PsiDocTag tag = tags[i];
PsiElement[] elements = tag.getDataElements();
@@ -1487,7 +1446,7 @@ public class JavaDocInfoGenerator {
buffer.append(",\n");
}
}
buffer.append("</DD></DL></DD>");
buffer.append(DocumentationMarkup.SECTION_END);
}
}
@@ -1528,12 +1487,9 @@ public class JavaDocInfoGenerator {
private void generateParametersSection(StringBuilder buffer, String titleMessage, LinkedList<ParamInfo> collectedTags) {
if (!collectedTags.isEmpty()) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>").append(titleMessage).append("</b>");
for (ParamInfo tag : collectedTags) {
generateOneParameter(buffer, tag);
}
buffer.append("</DD></DL></DD>");
startHeaderSection(buffer, titleMessage)
.append(StringUtil.join(collectedTags, tag -> generateOneParameter(tag), "<p>"))
.append(DocumentationMarkup.SECTION_END);
}
}
@@ -1556,21 +1512,20 @@ public class JavaDocInfoGenerator {
return tag == null ? null : new ParamInfo(paramName, tag);
}
private void generateOneParameter(StringBuilder buffer, ParamInfo tag) {
private String generateOneParameter(ParamInfo tag) {
StringBuilder buffer = new StringBuilder();
PsiElement[] elements = tag.docTag.getDataElements();
if (elements.length == 0) return;
if (elements.length == 0) return "";
String text = elements[0].getText();
buffer.append("<DD>");
int spaceIndex = text.indexOf(' ');
if (spaceIndex < 0) {
spaceIndex = text.length();
}
buffer.append("<code>");
buffer.append(StringUtil.escapeXml(tag.name));
buffer.append("</code>");
buffer.append(" - ");
buffer.append(" &ndash; ");
buffer.append(text.substring(spaceIndex));
generateValue(buffer, elements, 1, mapProvider(tag.inheritDocTagProvider, true));
return buffer.toString();
}
private void generateReturnsSection(StringBuilder buffer, final PsiMethod method, final PsiDocComment comment) {
@@ -1592,11 +1547,10 @@ public class JavaDocInfoGenerator {
}
if (pair != null) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>").append(CodeInsightBundle.message("javadoc.returns")).append("</b>");
buffer.append("<DD>");
startHeaderSection(buffer, CodeInsightBundle.message("javadoc.returns"))
.append("<p>");
generateValue(buffer, pair.first.getDataElements(), mapProvider(pair.second, false));
buffer.append("</DD></DL></DD>");
buffer.append(DocumentationMarkup.SECTION_END);
}
}
@@ -1705,22 +1659,21 @@ public class JavaDocInfoGenerator {
}
if (!collectedTags.isEmpty()) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>").append(CodeInsightBundle.message("javadoc.throws")).append("</b>");
startHeaderSection(buffer, CodeInsightBundle.message("javadoc.throws"));
for (Pair<PsiDocTag, InheritDocProvider<PsiDocTag>> tag : collectedTags) {
PsiElement[] elements = tag.first.getDataElements();
if (elements.length == 0) continue;
buffer.append("<DD>");
buffer.append("<p>");
String text = elements[0].getText();
int index = JavaDocUtil.extractReference(text);
String refText = text.substring(0, index).trim();
generateLink(buffer, refText, null, method, false);
String rest = text.substring(index);
if (!rest.isEmpty() || elements.length > 1) buffer.append(" - ");
if (!rest.isEmpty() || elements.length > 1) buffer.append(" &ndash; ");
buffer.append(rest);
generateValue(buffer, elements, 1, mapProvider(tag.second, true));
}
buffer.append("</DD></DL></DD>");
buffer.append(DocumentationMarkup.SECTION_END);
}
}
@@ -1742,13 +1695,10 @@ public class JavaDocInfoGenerator {
PsiClass superClass = superMethod.getContainingClass();
if (superClass == null) continue;
if (!headerGenerated) {
buffer.append("<DD><DL>");
buffer.append("<DT><b>");
buffer.append(CodeInsightBundle.message(overrides ? "javadoc.method.overrides" : "javadoc.method.specified.by"));
buffer.append("</b>");
startHeaderSection(buffer, CodeInsightBundle.message(overrides ? "javadoc.method.overrides" : "javadoc.method.specified.by"));
buffer.append("<p>");
headerGenerated = true;
}
buffer.append("<DD>");
StringBuilder methodBuffer = new StringBuilder();
generateLink(methodBuffer, superMethod, superMethod.getName(), false);
@@ -1762,7 +1712,7 @@ public class JavaDocInfoGenerator {
}
}
if (headerGenerated) {
buffer.append("</DD></DL></DD>");
buffer.append(DocumentationMarkup.SECTION_END);
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.javadoc;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifierListOwner;
import com.intellij.psi.PsiNamedElement;
@@ -41,12 +42,12 @@ public class NonCodeAnnotationGenerator {
MultiMap<PsiModifierListOwner, AnnotationDocGenerator> generators = getSignatureNonCodeAnnotations(myOwner);
if (generators.isEmpty()) return;
myOutput.append("\n");
myOutput.append(getNonCodeHeader(generators.values())).append(":<br>\n");
myOutput.append("<ul>\n");
myOutput.append(DocumentationMarkup.SECTION_HEADER_START);
myOutput.append(getNonCodeHeader(generators.values())).append(":");
myOutput.append(DocumentationMarkup.SECTION_SEPARATOR);
generators.keySet().forEach(owner -> {
myOutput.append("<li>");
myOutput.append("<p>");
if (generators.size() > 1) {
myOutput.append(getKind(owner)).append(" <code>").append(((PsiNamedElement)owner).getName()).append("</code>: ");
}
@@ -55,10 +56,8 @@ public class NonCodeAnnotationGenerator {
if (i > 0) myOutput.append(" ");
annotations.get(i).generateAnnotation(myOutput, AnnotationFormat.JavaDocComplete);
}
myOutput.append("</li>\n");
});
myOutput.append("</ul>\n");
myOutput.append(DocumentationMarkup.SECTION_END);
}
@NotNull
@@ -89,7 +88,7 @@ public class NonCodeAnnotationGenerator {
boolean hasExternal = values.stream().anyMatch(AnnotationDocGenerator::isExternal);
boolean hasInferred = values.stream().anyMatch(AnnotationDocGenerator::isInferred);
return (hasExternal && hasInferred ? "External and <i>inferred</i>" : hasExternal ? "External" : "<i>Inferred</i>") + " annotations available";
return (hasExternal && hasInferred ? "External and <i>inferred</i>" : hasExternal ? "External" : "<i>Inferred</i>") + " annotations";
}
private static String getKind(PsiModifierListOwner owner) {
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE><font color=red>@Nullable</font>&nbsp;
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br><font color=red>@Nullable</font>&nbsp;
@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;
public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field = null</b></PRE></body></html>
public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field</b> = null</pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public&nbsp;void&nbsp;<b>foo</b>(@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;s,
@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;p)</PRE></body></html>
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br>public&nbsp;void&nbsp;<b>foo</b>(@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;s,
@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;p)</pre></div><table class='sections'><p></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>public&nbsp;void&nbsp;<b>foo</b>()</PRE><DD><DL><DT><b>Description copied from interface:</b>&nbsp;<a href="psi_element://Foo"><code>Foo</code></a><br>
<div class='definition'><pre>public&nbsp;void&nbsp;<b>foo</b>()</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Description copied from interface:</td><td><p><a href="psi_element://Foo"><code>Foo</code></a><br>
some javadoc
</DD></DL></DD><DD><DL><DT><b>Specified by:</b><DD><a href="psi_element://Foo#foo()"><code>foo</code></a> in interface <a href="psi_element://Foo"><code>Foo</code></a></DD></DL></DD></body></html>
</td><tr><td valign='top' class='section'><p>Specified by:</td><td><p><a href="psi_element://Foo#foo()"><code>foo</code></a> in interface <a href="psi_element://Foo"><code>Foo</code></a></td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public&nbsp;void&nbsp;<b>foo</b>()</PRE><DD><DL><DT><b>apiNote</b><DD> my api note </DD></DL></DD><DD><DL><DT><b>implSpec</b><DD> my impl spec </DD></DL></DD><DD><DL><DT><b>implNote</b><DD> my impl note</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br>public&nbsp;void&nbsp;<b>foo</b>()</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>apiNote:</td><td><p> my api note </td><tr><td valign='top' class='section'><p>implSpec:</td><td><p> my impl spec </td><tr><td valign='top' class='section'><p>implNote:</td><td><p> my impl note</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>C</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE> Some <a href="http://dummy.link">link</a></body></html>
<div class='definition'><pre>class <b>C</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'> Some <a href="http://dummy.link">link</a> </div><table class='sections'><p></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>MethodTypeParam</b>&lt;T&gt;
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE>
<DD><DL><DT><b>Type parameters:</b><DD><code>&lt;T&gt;</code> - type param</DD></DL></DD></body></html>
<div class='definition'><pre>class <b>MethodTypeParam</b>&lt;T&gt;
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'>
</div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td>&lt;T&gt; &ndash; type param</td></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>@<a href="psi_element://Bar"><code>Bar</code></a>(<a href="psi_element://Baz#CONST"><code>Baz.CONST</code></a>,&nbsp;value = {<a href="psi_element://Baz#CONST"><code>Baz.CONST</code></a>})&nbsp;
<div class='definition'><pre>@<a href="psi_element://Bar"><code>Bar</code></a>(<a href="psi_element://Baz#CONST"><code>Baz.CONST</code></a>,&nbsp;value = {<a href="psi_element://Baz#CONST"><code>Baz.CONST</code></a>})&nbsp;
class <b>Foo</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE></body></html>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><table class='sections'></table>
@@ -1,4 +1,4 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Foo"><code>Foo</code></a></b></small><PRE>int <b>foo</b></PRE>
<div class='definition'><pre><a href="psi_element://Foo"><code>Foo</code></a><br>int <b>foo</b></pre></div><div class='content'>
<pre>
<code>
class Clazzz {
@@ -7,4 +7,5 @@
val a = 1
}
</code>
</pre></body></html>
</pre>
</div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field = foo(&quot;&quot;, &quot;&quot;)</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field</b> = foo(&quot;&quot;, &quot;&quot;)</pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public static final int <b>field = 1 + 1
Resolved value: 2</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br>public static final int <b>field</b> = 1 + 1
Resolved value: 2</pre></div><table class='sections'></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://FooBar"><code>FooBar</code></a></b></small><PRE>public&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;<b>getMyFoo</b>()</PRE><DD><DL><DT><b>Description copied from field:</b>&nbsp;<a href="psi_element://FooBar#myFoo"><code>myFoo</code></a><br>
<div class='definition'><pre><a href="psi_element://FooBar"><code>FooBar</code></a><br>public&nbsp;<a href="psi_element://java.lang.String"><code>String</code></a>&nbsp;<b>getMyFoo</b>()</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Description copied from field:</td><td><p><a href="psi_element://FooBar#myFoo"><code>myFoo</code></a><br>
foo bar baz
</DD></DL></DD></body></html>
</td></table>
@@ -1,6 +1,6 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b>java.lang</b></small><PRE>public final class <b>String</b>
<div class='definition'><pre>java.lang<br>public final class <b>String</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a>
implements <a href="psi_element://java.io.Serializable"><code>java.io.Serializable</code></a>,&nbsp;<a href="psi_element://java.lang.Comparable"><code>Comparable</code></a>&lt;<a href="psi_element://java.lang.String"><code>String</code></a>&gt;,&nbsp;<a href="psi_element://java.lang.CharSequence"><code>CharSequence</code></a></PRE>
implements <a href="psi_element://java.io.Serializable"><code>java.io.Serializable</code></a>,&nbsp;<a href="psi_element://java.lang.Comparable"><code>Comparable</code></a>&lt;<a href="psi_element://java.lang.String"><code>String</code></a>&gt;,&nbsp;<a href="psi_element://java.lang.CharSequence"><code>CharSequence</code></a></pre></div><div class='content'>
The <code>String</code> class represents character strings. All
string literals in Java programs, such as <code>"abc"</code>, are
implemented as instances of this class.
@@ -58,7 +58,7 @@ implements <a href="psi_element://java.io.Serializable"><code>java.io.Serializab
Unicode code points (i.e., characters), in addition to those for
dealing with Unicode code units (i.e., <code>char</code> values).
<DD><DL><DT><b>Since:</b><DD>JDK1.0</DD></DL></DD><DD><DL><DT><b>See Also:</b><DD><a href="psi_element://java.lang.Object#toString()"><code>Object.toString()</code></a>,
</div><table class='sections'><p><tr><td valign='top' class='section'><p>Since:</td><td><p>JDK1.0</td><tr><td valign='top' class='section'><p>See Also:</td><td><p><a href="psi_element://java.lang.Object#toString()"><code>Object.toString()</code></a>,
<a href="psi_element://java.lang.StringBuffer"><code>StringBuffer</code></a>,
<a href="psi_element://java.lang.StringBuilder"><code>StringBuilder</code></a>,
<font color=red>java.nio.charset.Charset</font></DD></DL></DD></body></html>
<font color=red>java.nio.charset.Charset</font></td></table>
@@ -1,12 +1,8 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://java.util.List"><code>java.util.List&lt;E&gt;</code></a></b></small><PRE><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>Contract</code></a>(pure = true)</i>&nbsp;
public abstract&nbsp;boolean&nbsp;<b>contains</b>(<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;o)</PRE>
<div class='definition'><pre><a href="psi_element://java.util.List"><code>java.util.List&lt;E&gt;</code></a><br><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>Contract</code></a>(pure = true)</i>&nbsp;
public abstract&nbsp;boolean&nbsp;<b>contains</b>(<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;o)</pre></div><div class='content'>
Returns <tt>true</tt> if this list contains the specified element.
More formally, returns <tt>true</tt> if and only if this list contains
at least one element <tt>e</tt> such that
<tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
<DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code>contains</code></a> in interface <a href="psi_element://java.util.Collection"><code>Collection</code></a></DD></DL></DD><DD><DL><DT><b>Params:</b><DD><code>o</code> - element whose presence in this list is to be tested </DD></DL></DD><DD><DL><DT><b>Returns:</b><DD><tt>true</tt> if this list contains the specified element </DD></DL></DD><DD><DL><DT><b>Throws:</b><DD><a href="psi_element://java.lang.ClassCastException"><code>ClassCastException</code></a> - if the type of the specified element is incompatible with this list (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>) <DD><a href="psi_element://java.lang.NullPointerException"><code>NullPointerException</code></a> - if the specified element is null and this list does not permit null elements (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>)</DD></DL></DD>
<i>Inferred</i> annotations available:<br>
<ul>
<li><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>org.jetbrains.annotations.Contract</code></a>(pure = true)</i></li>
</ul></body></html>
<p></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code>contains</code></a> in interface <a href="psi_element://java.util.Collection"><code>Collection</code></a></td><tr><td valign='top' class='section'><p>Params:</td><td>o &ndash; element whose presence in this list is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td><p><tt>true</tt> if this list contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td><p><a href="psi_element://java.lang.ClassCastException"><code>ClassCastException</code></a> &ndash; if the type of the specified element is incompatible with this list (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>) <p><a href="psi_element://java.lang.NullPointerException"><code>NullPointerException</code></a> &ndash; if the specified element is null and this list does not permit null elements (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>)</td><tr><td valign='top' class='section'><p><i>Inferred</i> annotations:</td><td><p><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>org.jetbrains.annotations.Contract</code></a>(pure = true)</i></td></table>
@@ -1,12 +1,8 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://My"><code>My</code></a></b></small><PRE><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>Contract</code></a>(pure = true)</i>&nbsp;
boolean&nbsp;<b>contains</b>(<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;o)</PRE><DD><DL><DT><b>Description copied from interface:</b>&nbsp;<a href="psi_element://java.util.Collection"><code>java.util.Collection</code></a><br>
<div class='definition'><pre><a href="psi_element://My"><code>My</code></a><br><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>Contract</code></a>(pure = true)</i>&nbsp;
boolean&nbsp;<b>contains</b>(<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;o)</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Description copied from interface:</td><td><p><a href="psi_element://java.util.Collection"><code>java.util.Collection</code></a><br>
Returns <tt>true</tt> if this collection contains the specified element.
More formally, returns <tt>true</tt> if and only if this collection
contains at least one element <tt>e</tt> such that
<tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
</DD></DL></DD><DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code>contains</code></a> in interface <a href="psi_element://java.util.Collection"><code>Collection</code></a><DD><a href="psi_element://I#contains(java.lang.Object)"><code>contains</code></a> in interface <a href="psi_element://I"><code>I</code></a></DD></DL></DD><DD><DL><DT><b>Params:</b><DD><code>o</code> - element whose presence in this collection is to be tested </DD></DL></DD><DD><DL><DT><b>Returns:</b><DD><tt>true</tt> if this collection contains the specified element </DD></DL></DD><DD><DL><DT><b>Throws:</b><DD><a href="psi_element://java.lang.ClassCastException"><code>ClassCastException</code></a> - if the type of the specified element is incompatible with this collection (<a href="psi_element://My###optional-restrictions">optional</a>) <DD><a href="psi_element://java.lang.NullPointerException"><code>NullPointerException</code></a> - if the specified element is null and this collection does not permit null elements (<a href="psi_element://My###optional-restrictions">optional</a>)</DD></DL></DD>
<i>Inferred</i> annotations available:<br>
<ul>
<li><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>org.jetbrains.annotations.Contract</code></a>(pure = true)</i></li>
</ul></body></html>
</td><tr><td valign='top' class='section'><p>Overrides:</td><td><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code>contains</code></a> in interface <a href="psi_element://java.util.Collection"><code>Collection</code></a><a href="psi_element://I#contains(java.lang.Object)"><code>contains</code></a> in interface <a href="psi_element://I"><code>I</code></a></td><tr><td valign='top' class='section'><p>Params:</td><td>o &ndash; element whose presence in this collection is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td><p><tt>true</tt> if this collection contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td><p><a href="psi_element://java.lang.ClassCastException"><code>ClassCastException</code></a> &ndash; if the type of the specified element is incompatible with this collection (<a href="psi_element://My###optional-restrictions">optional</a>) <p><a href="psi_element://java.lang.NullPointerException"><code>NullPointerException</code></a> &ndash; if the specified element is null and this collection does not permit null elements (<a href="psi_element://My###optional-restrictions">optional</a>)</td><tr><td valign='top' class='section'><p><i>Inferred</i> annotations:</td><td><p><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>org.jetbrains.annotations.Contract</code></a>(pure = true)</i></td></table>
@@ -1,3 +1,4 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>C</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE>
a &lt;&lt; b</body></html>
<div class='definition'><pre>class <b>C</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'>
a &lt;&lt; b
</div><table class='sections'><p></table>
@@ -1,5 +1,5 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>C</b>
extends java.lang.Object</PRE>
<div class='definition'><pre>class <b>C</b>
extends java.lang.Object</pre></div><div class='content'>
some text
<DD><DL><DT><b>See Also:</b><DD>System.out</DD></DL></DD></body></html>
</div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td><p>System.out</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://E"><code>E</code></a></b></small><PRE><a href="psi_element://E"><code>E</code></a> <b>A
Enum constant ordinal: 0</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://E"><code>E</code></a><br><a href="psi_element://E"><code>E</code></a> <b>A</b>
Enum constant ordinal: 0</pre></div><table class='sections'></table>
@@ -1,8 +1,4 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://En"><code>En</code></a></b></small><PRE><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>Contract</code></a>(pure = true)</i>&nbsp;
static&nbsp;int&nbsp;<b>valueOf</b>(int&nbsp;i)</PRE>
<div class='definition'><pre><a href="psi_element://En"><code>En</code></a><br><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>Contract</code></a>(pure = true)</i>&nbsp;
static&nbsp;int&nbsp;<b>valueOf</b>(int&nbsp;i)</pre></div><div class='content'>
myjavadoc
<DD><DL><DT><b>Params:</b><DD><code>i</code> - </DD></DL></DD><DD><DL><DT><b>Returns:</b><DD></DD></DL></DD>
<i>Inferred</i> annotations available:<br>
<ul>
<li><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>org.jetbrains.annotations.Contract</code></a>(pure = true)</i></li>
</ul></body></html>
<p></div><table class='sections'><p><tr><td valign='top' class='section'><p>Params:</td><td>i &ndash; </td><tr><td valign='top' class='section'><p>Returns:</td><td><p></td><tr><td valign='top' class='section'><p><i>Inferred</i> annotations:</td><td><p><i>@<a href="psi_element://org.jetbrains.annotations.Contract"><code>org.jetbrains.annotations.Contract</code></a>(pure = true)</i></td></table>
@@ -1,3 +1,4 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Pattern</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE>
\W \n</body></html>
<div class='definition'><pre>class <b>Pattern</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'>
\W \n
</div><table class='sections'><p></table>
@@ -1,2 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Foo"><code>Foo</code></a></b></small><PRE>int <b>foo</b></PRE>
&amp;gt; is &gt; &amp;lt; is &lt; &amp;quot; is &quot;</body></html>
<div class='definition'><pre><a href="psi_element://Foo"><code>Foo</code></a><br>int <b>foo</b></pre></div><div class='content'>
&amp;gt; is &gt; &amp;lt; is &lt; &amp;quot; is &quot;
</div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static&nbsp;void&nbsp;<b>JAVADOC_ME</b>()</PRE> The value of B is <a href="psi_element://A#B">"a&lt;b"</a>.</body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static&nbsp;void&nbsp;<b>JAVADOC_ME</b>()</pre></div><div class='content'> The value of B is <a href="psi_element://A#B">"a&lt;b"</a>. <p></div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static int[] <b>x = new int[]{1, 2, 3}</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static int[] <b>x</b> = new int[]{1, 2, 3}</pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static <font color=red>java.util.function.Consumer&lt;Integer&gt;</font> <b>F = i -&gt; System.out.println(i)</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static <font color=red>java.util.function.Consumer&lt;Integer&gt;</font> <b>F</b> = i -&gt; System.out.println(i)</pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static int[] <b>x = new int[1]</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static int[] <b>x</b> = new int[1]</pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static int <b>JAVADOC_ME = 23</b></PRE> The value of the field is 23.</body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static int <b>JAVADOC_ME</b> = 23</pre></div><div class='content'> The value of the field is 23. </div><table class='sections'><p></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>htmlLink</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE> <a href="psi_element://other">link</a></body></html>
<div class='definition'><pre>class <b>htmlLink</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'> <a href="psi_element://other">link</a> </div><table class='sections'><p></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b>pack</b></small><PRE>class <b>htmlLinkDeep</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE> <a href="psi_element://other">link</a></body></html>
<div class='definition'><pre>pack<br>class <b>htmlLinkDeep</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'> <a href="psi_element://other">link</a> </div><table class='sections'><p></table>
@@ -1,3 +1,4 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b>pack</b></small><PRE>class <b>A</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE>
<a href="psi_element://pack###section2">link</a></body></html>
<div class='definition'><pre>pack<br>class <b>A</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'>
<a href="psi_element://pack###section2">link</a>
</div><table class='sections'><p></table>
@@ -1,5 +1,6 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE>
<div class='definition'><pre>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'>
<a name="section1">section one</a>
text
<a href="psi_element://Test###section1">link up</a></body></html>
<a href="psi_element://Test###section1">link up</a>
</div><table class='sections'><p></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Idea4780"><code>Idea4780</code></a></b></small><PRE>public&nbsp;<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;<b>read</b>()
throws&nbsp;<a href="psi_element://java.io.IOException"><code>IOException</code></a></PRE><DD><DL><DT><b>Throws:</b><DD><a href="psi_element://java.io.IOException"><code>IOException</code></a> - if an I/O error occurs while reading. <DD><a href="psi_element://java.io.EOFException"><code>EOFException</code></a> - if this source is already closed when the <code>read()</code> is called, or is closed during the <code>read()</code>. <DD><font color=red>InterruptedIOException</font> - if the reading thread is interrupted.</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://Idea4780"><code>Idea4780</code></a><br>public&nbsp;<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;<b>read</b>()
throws&nbsp;<a href="psi_element://java.io.IOException"><code>IOException</code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td><p><a href="psi_element://java.io.IOException"><code>IOException</code></a> &ndash; if an I/O error occurs while reading. <p><a href="psi_element://java.io.EOFException"><code>EOFException</code></a> &ndash; if this source is already closed when the <code>read()</code> is called, or is closed during the <code>read()</code>. <p><font color=red>InterruptedIOException</font> &ndash; if the reading thread is interrupted.</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://InheritedDocInThrows"><code>InheritedDocInThrows</code></a></b></small><PRE>void&nbsp;<b>foo</b>()
throws&nbsp;<a href="psi_element://java.io.IOException"><code>IOException</code></a></PRE><DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://A#foo()"><code>foo</code></a> in class <a href="psi_element://A"><code>A</code></a></DD></DL></DD><DD><DL><DT><b>Throws:</b><DD><a href="psi_element://java.io.IOException"><code>IOException</code></a> - la-la-la</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://InheritedDocInThrows"><code>InheritedDocInThrows</code></a><br>void&nbsp;<b>foo</b>()
throws&nbsp;<a href="psi_element://java.io.IOException"><code>IOException</code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td><p><a href="psi_element://A#foo()"><code>foo</code></a> in class <a href="psi_element://A"><code>A</code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td><p><a href="psi_element://java.io.IOException"><code>IOException</code></a> &ndash; la-la-la</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://InheritedDocInThrows1"><code>InheritedDocInThrows1</code></a></b></small><PRE>void&nbsp;<b>foo</b>()
throws&nbsp;<a href="psi_element://java.io.IOException"><code>IOException</code></a></PRE><DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://A#foo()"><code>foo</code></a> in class <a href="psi_element://A"><code>A</code></a></DD></DL></DD><DD><DL><DT><b>Throws:</b><DD><a href="psi_element://java.io.IOException"><code>IOException</code></a> - comment</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://InheritedDocInThrows1"><code>InheritedDocInThrows1</code></a><br>void&nbsp;<b>foo</b>()
throws&nbsp;<a href="psi_element://java.io.IOException"><code>IOException</code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td><p><a href="psi_element://A#foo()"><code>foo</code></a> in class <a href="psi_element://A"><code>A</code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td><p><a href="psi_element://java.io.IOException"><code>IOException</code></a> &ndash; comment</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE><a href="psi_element://java.lang.String"><code>String</code></a> <b>s</b></PRE><DD><code>s</code> - String parameter.</body></html>
<div class='definition'><pre><a href="psi_element://java.lang.String"><code>String</code></a> <b>s</b></pre></div><div class='content'>s &ndash; String parameter.</div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>strings = &quot;A&lt;BLANK&gt;B&quot;</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>strings</b> = &quot;A&lt;BLANK&gt;B&quot;</pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public <a href="psi_element://java.util.List"><code>List</code></a>&lt;<a href="psi_element://java.lang.String"><code>String</code></a>&gt; <b>strings = new <a href="psi_element://java.util.ArrayList"><code>ArrayList</code></a>&lt;<a href="psi_element://java.lang.String"><code>String</code></a>&gt;(new <a href="psi_element://java.util.ArrayList"><code>ArrayList</code></a>&lt;<a href="psi_element://java.lang.Integer"><code>Integer</code></a>&gt;(), Collections.singleton(new <a href="psi_element://java.util.ArrayList"><code>ArrayList</code></a>&lt;<a href="psi_element://java.lang.Double"><code>Double</code></a>&gt;()))</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public <a href="psi_element://java.util.List"><code>List</code></a>&lt;<a href="psi_element://java.lang.String"><code>String</code></a>&gt; <b>strings</b> = new <a href="psi_element://java.util.ArrayList"><code>ArrayList</code></a>&lt;<a href="psi_element://java.lang.String"><code>String</code></a>&gt;(new <a href="psi_element://java.util.ArrayList"><code>ArrayList</code></a>&lt;<a href="psi_element://java.lang.Integer"><code>Integer</code></a>&gt;(), Collections.singleton(new <a href="psi_element://java.util.ArrayList"><code>ArrayList</code></a>&lt;<a href="psi_element://java.lang.Double"><code>Double</code></a>&gt;()))</pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public int <b>field = anotherField</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br>public int <b>field</b> = anotherField</pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>int <b>a</b></PRE></body></html>
<div class='definition'><pre>int <b>a</b></pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE> <pre>abc</pre></body></html>
<div class='definition'><pre>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'> <pre>abc</pre> </div><table class='sections'><p></table>
@@ -1,2 +1,3 @@
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body>
Description of com.jetbrains package</body></html>
<div class='content'>
Description of com.jetbrains package
</div><table class='sections'><p></table>
@@ -1,2 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Foo"><code>Foo</code></a></b></small><PRE>int <b>foo</b></PRE>
foo&lt;&gt;</body></html>
<div class='definition'><pre><a href="psi_element://Foo"><code>Foo</code></a><br>int <b>foo</b></pre></div><div class='content'>
foo&lt;&gt;
</div><table class='sections'><p></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Foo</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE></body></html>
<div class='definition'><pre>class <b>Foo</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Bar"><code>Bar</code></a></b></small><PRE>void&nbsp;<b>m</b>(int&nbsp;bar)</PRE><DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://Foo#m(int)"><code>m</code></a> in class <a href="psi_element://Foo"><code>Foo</code></a></DD></DL></DD><DD><DL><DT><b>Params:</b><DD><code>bar</code> - description</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://Bar"><code>Bar</code></a><br>void&nbsp;<b>m</b>(int&nbsp;bar)</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td><p><a href="psi_element://Foo#m(int)"><code>m</code></a> in class <a href="psi_element://Foo"><code>Foo</code></a></td><tr><td valign='top' class='section'><p>Params:</td><td>bar &ndash; description</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Bar"><code>Bar</code></a></b></small><PRE>&lt;U&gt;&nbsp;void&nbsp;<b>m</b>(U&nbsp;u)</PRE><DD><DL><DT><b>Overrides:</b><DD><a href="psi_element://Foo#m(java.lang.Object)"><code>m</code></a> in class <a href="psi_element://Foo"><code>Foo</code></a></DD></DL></DD><DD><DL><DT><b>Type parameters:</b><DD><code>&lt;U&gt;</code> - description</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://Bar"><code>Bar</code></a><br>&lt;U&gt;&nbsp;void&nbsp;<b>m</b>(U&nbsp;u)</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td><p><a href="psi_element://Foo#m(java.lang.Object)"><code>m</code></a> in class <a href="psi_element://Foo"><code>Foo</code></a></td><tr><td valign='top' class='section'><p>Type parameters:</td><td>&lt;U&gt; &ndash; description</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public byte[] <b>bytes = &quot;&amp;amp;&quot;.getBytes()</b></PRE></body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public byte[] <b>bytes</b> = &quot;&amp;amp;&quot;.getBytes()</pre></div><table class='sections'></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Producer"><code>Producer&lt;T&gt;</code></a></b></small><PRE>&lt;E extends <a href="psi_element://java.lang.Exception"><code>Exception</code></a>&gt;&nbsp;void&nbsp;<b>drainTo</b>(<a href="psi_element://Consumer"><code>Consumer</code></a>&lt;? super T, E&gt;&nbsp;consumer,
<div class='definition'><pre><a href="psi_element://Producer"><code>Producer&lt;T&gt;</code></a><br>&lt;E extends <a href="psi_element://java.lang.Exception"><code>Exception</code></a>&gt;&nbsp;void&nbsp;<b>drainTo</b>(<a href="psi_element://Consumer"><code>Consumer</code></a>&lt;? super T, E&gt;&nbsp;consumer,
<a href="psi_element://java.lang.Object"><code>Object</code></a>&nbsp;someParameter)
throws&nbsp;<a href="psi_element://E"><code>E</code></a></PRE><DD><DL><DT><b>Throws:</b><DD><a href="psi_element://E"><code>E</code></a></DD></DL></DD></body></html>
throws&nbsp;<a href="psi_element://E"><code>E</code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td><p><a href="psi_element://E"><code>E</code></a></td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://MethodTypeParam"><code>MethodTypeParam</code></a></b></small><PRE>&lt;T&gt;&nbsp;void&nbsp;<b>foo</b>(T&nbsp;t)</PRE><DD><DL><DT><b>Type parameters:</b><DD><code>&lt;T&gt;</code> - type param</DD></DL></DD></body></html>
<div class='definition'><pre><a href="psi_element://MethodTypeParam"><code>MethodTypeParam</code></a><br>&lt;T&gt;&nbsp;void&nbsp;<b>foo</b>(T&nbsp;t)</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td>&lt;T&gt; &ndash; type param</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE> <pre>a bc</pre></body></html>
<div class='definition'><pre>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'> <pre>a bc</pre> </div><table class='sections'><p></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Foo</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE> foobar</body></html>
<div class='definition'><pre>class <b>Foo</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'> foobar </div><table class='sections'><p></table>
@@ -1,6 +1,7 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Test"><code>Test</code></a></b></small><PRE>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field = null</b></PRE>
<div class='definition'><pre><a href="psi_element://Test"><code>Test</code></a><br>public <a href="psi_element://java.lang.String"><code>String</code></a> <b>field</b> = null</pre></div><div class='content'>
<pre>
foo
<p></p>
bar
</pre></body></html>
</pre>
</div><table class='sections'><p></table>
@@ -1,2 +1,3 @@
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body>
This package contains nothing but package-info.java</body></html>
<div class='content'>
This package contains nothing but package-info.java
</div><table class='sections'><p></table>
@@ -1,2 +1,3 @@
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body>
some text</body></html>
<div class='content'>
some text
</div><table class='sections'><p></table>
@@ -1,2 +1,3 @@
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body>
This package contains nothing but package-info.java</body></html>
<div class='content'>
This package contains nothing but package-info.java
</div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>int <b>i</b></PRE><DD><code>i</code> - input</body></html>
<div class='definition'><pre>int <b>i</b></pre></div><div class='content'>i &ndash; input</div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static int <b>JAVADOC_ME</b></PRE> Test</body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static int <b>JAVADOC_ME</b></pre></div><div class='content'> Test </div><table class='sections'><p></table>
@@ -1,3 +1,4 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></PRE>
a@b c@d</body></html>
<div class='definition'><pre>class <b>Test</b>
extends <a href="psi_element://java.lang.Object"><code>Object</code></a></pre></div><div class='content'>
a@b c@d
</div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static&nbsp;void&nbsp;<b>JAVADOC_ME</b>()</PRE> The value of A is <a href="psi_element://A#A">23</a>.</body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static&nbsp;void&nbsp;<b>JAVADOC_ME</b>()</pre></div><div class='content'> The value of A is <a href="psi_element://A#A">23</a>. <p></div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://A"><code>A</code></a></b></small><PRE>public static&nbsp;void&nbsp;<b>JAVADOC_ME</b>()</PRE> The value of A is <a href="psi_element://A#A">23</a>.</body></html>
<div class='definition'><pre><a href="psi_element://A"><code>A</code></a><br>public static&nbsp;void&nbsp;<b>JAVADOC_ME</b>()</pre></div><div class='content'> The value of A is <a href="psi_element://A#A">23</a>. <p></div><table class='sections'><p></table>
@@ -87,10 +87,7 @@ class JavaDocumentationTest extends LightCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(exprList, null)
def expected =
"<html><head>" + STYLE_BLOCK + "</head><body>" +
"<small><b><a href=\"psi_element://Foo\"><code>Foo</code></a></b></small>" +
"<PRE>void&nbsp;<b>doFoo</b>()</PRE>" +
"</body></html>"
"<div class='definition'><pre><a href=\"psi_element://Foo\"><code>Foo</code></a><br>void&nbsp;<b>doFoo</b>()</pre></div><table class='sections'><p></table>"
assert doc == expected
}
@@ -160,12 +157,9 @@ class JavaDocumentationTest extends LightCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"<html><head>" + STYLE_BLOCK + "</head><body>" +
"<small><b><a href=\"psi_element://C\"><code>C</code></a></b></small>" +
"<PRE>public&nbsp;void&nbsp;<b>m</b>()</PRE>\n " +
"For example, <a href=\"psi_element://java.lang.String#String(byte[], int, int, java.lang.String)\">" +
"<code>String.String(byte[], int, int, String)</code>" +
"</a>.</body></html>"
"<div class='definition'><pre><a href=\"psi_element://C\"><code>C</code></a><br>public&nbsp;void&nbsp;<b>m</b>()</pre></div><div class='content'>\n" +
" For example, <a href=\"psi_element://java.lang.String#String(byte[], int, int, java.lang.String)\"><code>String.String(byte[], int, int, String)</code></a>.\n" +
" <p></div><table class='sections'><p></table>"
assert doc == expected
}
@@ -181,11 +175,7 @@ class JavaDocumentationTest extends LightCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"<html><head>" + STYLE_BLOCK + "</head><body>" +
"<small><b><a href=\"psi_element://C\"><code>C</code></a></b></small>" +
"<PRE>public&nbsp;void&nbsp;<b>m</b>()</PRE>" +
" Visit the \"<code>/login</code>\" URL." +
"</body></html>"
"<div class='definition'><pre><a href=\"psi_element://C\"><code>C</code></a><br>public&nbsp;void&nbsp;<b>m</b>()</pre></div><div class='content'> Visit the \"<code>/login</code>\" URL. <p></div><table class='sections'><p></table>"
assert doc == expected
}
@@ -213,14 +203,9 @@ class Bar {
def method = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiMethod.class)
def doc = new JavaDocumentationProvider().generateDoc(method, null)
String expected = "<html><head>$STYLE_BLOCK</head><body>" +
"<small><b><a href=\"psi_element://Bar\"><code>Bar</code></a></b></small>" +
"<PRE>void&nbsp;<b>foo</b>()</PRE>" +
"<DD><DL><DT>" +
"<b>Description copied from class:</b>&nbsp;<a href=\"psi_element://Foo\"><code>Foo</code></a><br>" +
"\n Some doc\n " +
"</DD></DL></DD>" +
"</body></html>"
String expected = "<div class='definition'><pre><a href=\"psi_element://Bar\"><code>Bar</code></a><br>void&nbsp;<b>foo</b>()</pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Description copied from class:</td><td><p><a href=\"psi_element://Foo\"><code>Foo</code></a><br>\n" +
" Some doc\n" +
" </td></table>"
assert doc == expected
}
@@ -25,32 +25,15 @@ import com.intellij.util.loadElement
class LightJavadocGeneratorTest : LightCodeInsightFixtureTestCase() {
override fun getProjectDescriptor(): LightProjectDescriptor = JAVA_9
fun testPlainModule() = doTestModule("module M.N { }", """
<body>
<pre>
module
<b>M.N</b>
</pre>
</body>""".trimIndent())
fun testPlainModule() = doTestModule("module M.N { }", """<div class='definition'><pre>module <b>M.N</b></pre></div>""".trimIndent())
fun testDocumentedModule() = doTestModule("/** One humble module. */\n@Deprecated\nmodule M.N { }", """
<body>
@
<a href="psi_element://java.lang.Deprecated">
<code>Deprecated</code>
</a>
<pre>
module
<b>M.N</b>
</pre>
One humble module.
</body>""".trimIndent())
fun testDocumentedModule() = doTestModule("/** One humble module. */\n@Deprecated\nmodule M.N { }", """<div class='definition'><pre>@<a href="psi_element://java.lang.Deprecated"><code>Deprecated</code></a>
module <b>M.N</b></pre></div><div class='content'> One humble module. </div><table class='sections'><p></table>""".trimIndent())
private fun doTestModule(text: String, expected: String) {
val file = myFixture.configureByText("module-info.java", text)
val module = (file as PsiJavaFile).moduleDeclaration!!
val docInfo = JavaDocInfoGeneratorFactory.create(project, module).generateDocInfo(null)!!.replace("&nbsp;", " ")
val body = loadElement(docInfo).getChild("body")
assertThat(body).isEqualTo(expected)
assertThat(docInfo).isEqualTo(expected)
}
}
@@ -27,13 +27,9 @@ public class ExtensionPointDocumentationProviderTest extends LightCodeInsightFix
assertEquals(epDefinition,
provider.getQuickNavigateInfo(docElement, null));
assertEquals("<em>EP Definition</em><br/>" +
epDefinition +
"<br/><br/>" +
"<em>EP Implementation</em>" +
"<html><head> <style type=\"text/css\"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head>" +
"<body><small><b>bar</b></small><PRE>public interface <b>MyExtensionPoint</b></PRE>\n" +
" MyExtensionPoint JavaDoc.</body></html>",
assertEquals("<em>EP Definition</em><br/>[light_idea_test_case] foo<br/><b>bar</b> (extensionPointDocumentation.xml)<br/><a href=\"psi_element://bar.MyExtensionPoint\"><code>MyExtensionPoint</code></a><br/><br/><em>EP Implementation</em><div class='definition'><pre>bar<br>public interface <b>MyExtensionPoint</b></pre></div><div class='content'>\n" +
" MyExtensionPoint JavaDoc.\n" +
" </div><table class='sections'><p></table>",
provider.generateDoc(docElement, null));
}
}
@@ -59,8 +59,9 @@ class Gr {
}
new Gr().fo<caret>o()
''', '''\
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><small><b><a href="psi_element://Gr"><code>Gr</code></a></b></small><PRE>void&nbsp;<b>foo</b>()</PRE>
Use <a href="psi_element://Gr#bar()"><code>bar()</code></a> from class <a href="psi_element://Gr"><code>Gr</code></a> instead</body></html>'''
<div class='definition'><pre><a href="psi_element://Gr"><code>Gr</code></a><br>void&nbsp;<b>foo</b>()</pre></div><div class='content'>
Use <a href="psi_element://Gr#bar()"><code>bar()</code></a> from class <a href="psi_element://Gr"><code>Gr</code></a> instead
<p></div><table class='sections'><p></table>'''
}
void 'test untyped local variable'() {
@@ -68,7 +69,7 @@ new Gr().fo<caret>o()
def aa = 1
a<caret>a
''', '''\
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE><a href="psi_element://java.lang.Object"><code>Object</code></a> <b>aa</b></PRE><p>[inferred type] <a href="psi_element://java.lang.Integer"><code>Integer</code></a></body></html>'''
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code>Object</code></a> <b>aa</b></pre></div><table class='sections'></table><p>[inferred type] <a href="psi_element://java.lang.Integer"><code>Integer</code></a>'''
}
void 'test implicit closure parameter'() {
@@ -76,7 +77,7 @@ a<caret>a
List<String> ss = []
ss.collect { i<caret>t }
''', '''\
<html><head> <style type="text/css"> #error { background-color: #eeeeee; margin-bottom: 10px; } p { margin: 5px 0; } </style></head><body><PRE><a href="psi_element://java.lang.Object"><code>Object</code></a> <b>it</b></PRE><p>[inferred type] <a href="psi_element://java.lang.String"><code>String</code></a></body></html>'''
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code>Object</code></a> <b>it</b></pre></div><table class='sections'></table><p>[inferred type] <a href="psi_element://java.lang.String"><code>String</code></a>'''
}
private void doTest(String text, String doc) {