[quickdoc] Second interation of quick doc syntax highlighting for JVM lanugages

- Added setting to turn off highlighting in documentation components
- Fixed some bugs for Java, changed alignment a bit
- Implemented highlighting for Groovy

GitOrigin-RevId: 844fb1510a0df2aeb5c6535d1cf8d826646d7e2f
This commit is contained in:
Alexander Bashkirov
2021-09-26 17:49:27 +00:00
committed by intellij-monorepo-bot
parent 95f48018ad
commit e8ad465859
101 changed files with 1387 additions and 634 deletions
@@ -13,6 +13,7 @@ import com.intellij.codeInsight.intention.impl.AnnotateIntentionAction;
import com.intellij.codeInsight.intention.impl.DeannotateIntentionAction;
import com.intellij.codeInsight.javadoc.AnnotationDocGenerator;
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator;
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory;
import com.intellij.codeInsight.javadoc.NonCodeAnnotationGenerator;
import com.intellij.codeInspection.dataFlow.EditContractIntention;
import com.intellij.icons.AllIcons;
@@ -92,7 +93,7 @@ public abstract class NonCodeAnnotationsLineMarkerProvider extends LineMarkerPro
String tooltip = XmlStringUtil.wrapInHtml(
NonCodeAnnotationGenerator.getNonCodeHeaderAvalable(nonCodeAnnotations) + CommonXmlStrings.NBSP + JavaBundle.message("non.code.annotations.explanation.full.signature") + "<p>\n" +
new JavaDocInfoGenerator(owner.getProject(), owner, false).generateSignature(owner));
JavaDocInfoGeneratorFactory.create(owner.getProject(), owner).generateSignature(owner));
return new LineMarkerInfo<>(element, element.getTextRange(), AllIcons.Gutter.ExtAnnotation, __ -> tooltip, MyIconGutterHandler.INSTANCE,
GutterIconRenderer.Alignment.RIGHT);
}
@@ -11,6 +11,7 @@ import com.intellij.codeInsight.daemon.impl.ParameterHintsPresentationManager;
import com.intellij.codeInsight.hint.ParameterInfoControllerBase;
import com.intellij.codeInsight.hints.ParameterHintsPass;
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator;
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory;
import com.intellij.injected.editor.EditorWindow;
import com.intellij.lang.parameterInfo.*;
import com.intellij.openapi.application.WriteAction;
@@ -710,7 +711,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc
}
if (context.isSingleParameterInfo()) {
String javaDoc = new JavaDocInfoGenerator(param.getProject(), param).generateMethodParameterJavaDoc();
String javaDoc = JavaDocInfoGeneratorFactory.create(param.getProject(), param).generateMethodParameterJavaDoc();
if (javaDoc != null) {
javaDoc = removeHyperlinks(javaDoc);
if (javaDoc.length() < 100) {
@@ -4,9 +4,12 @@ package com.intellij.codeInsight.javadoc;
import com.intellij.codeInsight.AnnotationTargetUtil;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.lang.Language;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
@@ -19,8 +22,6 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import static com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil.appendStyledSpan;
import static com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil.getStyledSpan;
public final class AnnotationDocGenerator {
private static final Logger LOG = Logger.getInstance(AnnotationDocGenerator.class);
@@ -46,8 +47,8 @@ public final class AnnotationDocGenerator {
LOG.debug(e);
indexNotReady = true;
}
myTargetClass = ObjectUtils.tryCast(target, PsiClass.class);
myResolveNotPossible = indexNotReady;
myTargetClass = ObjectUtils.tryCast(target, PsiClass.class);
myResolveNotPossible = indexNotReady;
}
boolean isNonDocumentedAnnotation() {
@@ -72,7 +73,42 @@ public final class AnnotationDocGenerator {
return AnnotationUtil.isInferredAnnotation(myAnnotation);
}
void generateAnnotation(StringBuilder buffer, AnnotationFormat format) {
private static void appendStyledSpan(
boolean doSyntaxHighlighting,
@NotNull StringBuilder buffer,
@NotNull TextAttributesKey attributesKey,
@Nullable String value
) {
if (doSyntaxHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributesKey, value);
}
else {
buffer.append(value);
}
}
private static void appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
boolean doSyntaxHighlighting,
@NotNull StringBuilder buffer,
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet
) {
if (doSyntaxHighlighting) {
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet);
}
else {
buffer.append(codeSnippet);
}
}
void generateAnnotation(
StringBuilder buffer,
AnnotationFormat format,
boolean generateLink,
boolean isForRenderedDoc,
boolean doSyntaxHighlighting
) {
String qualifiedName = myAnnotation.getQualifiedName();
PsiClassType type = myTargetClass != null && qualifiedName != null &&
JavaDocUtil.findReferenceTarget(myContext.getManager(), qualifiedName, myContext) != null
@@ -86,74 +122,96 @@ public final class AnnotationDocGenerator {
if (isInferred()) buffer.append("<i>");
if (red) buffer.append("<font color=red>");
boolean generateLink = format != AnnotationFormat.ToolTip;
boolean forceShortNames = format != AnnotationFormat.JavaDocComplete;
if (red) {
buffer.append("@");
} else {
appendStyledSpan(buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, "@");
}
else {
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, "@");
}
String name = forceShortNames ? myNameReference.getReferenceName() : myNameReference.getText();
if (type != null && generateLink) {
String styledName = getStyledSpan(JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name);
new JavaDocInfoGenerator(myContext.getProject(), null, format != AnnotationFormat.JavaDocComplete)
.generateLink(buffer, myTargetClass, styledName, format == AnnotationFormat.JavaDocComplete);
StringBuilder styledNameBuilder = new StringBuilder();
appendStyledSpan(doSyntaxHighlighting, styledNameBuilder, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name);
String styledName = styledNameBuilder.toString();
JavaDocInfoGeneratorFactory.create(
myContext.getProject(),
null,
JavaDocHighlightingManagerImpl.getInstance(),
isForRenderedDoc,
doSyntaxHighlighting
).generateLink(buffer, myTargetClass, styledName, format == AnnotationFormat.JavaDocComplete);
}
else if (!red && name != null) {
appendStyledSpan(buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name);
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name);
}
if (red) buffer.append("</font>");
generateAnnotationAttributes(buffer, generateLink);
generateAnnotationAttributes(buffer, generateLink, isForRenderedDoc, doSyntaxHighlighting);
if (isInferred()) buffer.append("</i>");
if (highlightNonCodeAnnotations) buffer.append("</b>");
}
private void generateAnnotationAttributes(StringBuilder buffer, boolean generateLink) {
private void generateAnnotationAttributes(
StringBuilder buffer,
boolean generateLink,
boolean isForRenderedDoc,
boolean doSyntaxHighlighting
) {
final PsiNameValuePair[] attributes = myAnnotation.getParameterList().getAttributes();
if (attributes.length > 0) {
appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, "(");
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.PARENTHESES, "(");
boolean first = true;
for (PsiNameValuePair pair : attributes) {
if (!first) appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ",&nbsp;");
if (!first) appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.COMMA, ",&nbsp;");
first = false;
generateAnnotationAttribute(buffer, generateLink, pair);
generateAnnotationAttribute(buffer, generateLink, pair, isForRenderedDoc, doSyntaxHighlighting);
}
appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, ")");
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.PARENTHESES, ")");
}
}
private static void generateAnnotationAttribute(StringBuilder buffer, boolean generateLink, PsiNameValuePair pair) {
private static void generateAnnotationAttribute(
StringBuilder buffer,
boolean generateLink,
PsiNameValuePair pair,
boolean isForRenderedDoc,
boolean doSyntaxHighlighting
) {
final String name = pair.getName();
if (name != null) {
appendStyledSpan(buffer, JavaHighlightingColors.ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES, name);
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " = ");
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES, name);
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.OPERATION_SIGN, " = ");
}
final PsiAnnotationMemberValue value = pair.getValue();
if (value != null) {
if (value instanceof PsiArrayInitializerMemberValue) {
appendStyledSpan(buffer, JavaHighlightingColors.BRACES, "{");
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.BRACES, "{");
boolean firstMember = true;
for(PsiAnnotationMemberValue memberValue:((PsiArrayInitializerMemberValue)value).getInitializers()) {
for (PsiAnnotationMemberValue memberValue : ((PsiArrayInitializerMemberValue)value).getInitializers()) {
if (!firstMember) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ",");
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.COMMA, ",");
}
firstMember = false;
appendLinkOrText(buffer, memberValue, generateLink);
appendLinkOrText(buffer, memberValue, generateLink, isForRenderedDoc, doSyntaxHighlighting);
}
appendStyledSpan(buffer, JavaHighlightingColors.BRACES, "}");
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.BRACES, "}");
}
else {
appendLinkOrText(buffer, value, generateLink);
appendLinkOrText(buffer, value, generateLink, isForRenderedDoc, doSyntaxHighlighting);
}
}
}
private static void appendLinkOrText(StringBuilder buffer,
PsiAnnotationMemberValue memberValue,
boolean generateLink) {
if (generateLink && memberValue instanceof PsiQualifiedReferenceElement) {
private static void appendLinkOrText(
StringBuilder buffer,
PsiAnnotationMemberValue memberValue,
boolean generateLink,
boolean isForRenderedDoc,
boolean doSyntaxHighlighting
) {
if (memberValue instanceof PsiQualifiedReferenceElement) {
String text = ((PsiQualifiedReferenceElement)memberValue).getCanonicalText();
PsiElement resolve = null;
try {
@@ -166,21 +224,33 @@ public final class AnnotationDocGenerator {
if (resolve instanceof PsiField) {
PsiField field = (PsiField)resolve;
PsiClass aClass = field.getContainingClass();
int startOfPropertyNamePosition = text.lastIndexOf('.');
if (startOfPropertyNamePosition != -1) {
text = text.substring(0, startOfPropertyNamePosition) + '#' + text.substring(startOfPropertyNamePosition + 1);
if (generateLink) {
int startOfPropertyNamePosition = text.lastIndexOf('.');
if (startOfPropertyNamePosition != -1) {
text = text.substring(0, startOfPropertyNamePosition) + '#' + text.substring(startOfPropertyNamePosition + 1);
}
else {
if (aClass != null) text = aClass.getQualifiedName() + '#' + field.getName();
}
JavaDocInfoGeneratorFactory.create(
field.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), isForRenderedDoc, doSyntaxHighlighting)
.generateLink(buffer, text, aClass != null ? aClass.getName() + '.' + field.getName() : null, memberValue, false);
}
else {
if (aClass != null) text = aClass.getQualifiedName() + '#' + field.getName();
appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
doSyntaxHighlighting,
buffer,
memberValue.getProject(),
memberValue.getLanguage(),
aClass != null ? aClass.getName() + '.' + field.getName() : memberValue.getText());
}
new JavaDocInfoGenerator(field.getProject(), null, true)
.generateLink(buffer, text, aClass != null? aClass.getName() + '.' + field.getName():null, memberValue, false);
return;
}
}
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
doSyntaxHighlighting,
buffer,
memberValue.getProject(),
memberValue.getLanguage(),
@@ -200,8 +270,8 @@ public final class AnnotationDocGenerator {
Set<String> shownAnnotations = new HashSet<>();
return StreamEx.of(AnnotationUtil.getAllAnnotations(owner, false, null))
.filter(owner instanceof PsiClass || owner instanceof PsiJavaModule ? anno -> true
: anno -> !AnnotationTargetUtil.isTypeAnnotation(anno) ||
AnnotationUtil.isInferredAnnotation(anno) ||
: anno -> !AnnotationTargetUtil.isTypeAnnotation(anno) ||
AnnotationUtil.isInferredAnnotation(anno) ||
AnnotationUtil.isExternalAnnotation(anno))
.map(annotation -> forAnnotation(owner, shownAnnotations, annotation))
.nonNull()
@@ -217,7 +287,10 @@ public final class AnnotationDocGenerator {
AnnotationDocGenerator anno = new AnnotationDocGenerator(annotation, nameReferenceElement, context);
if (anno.isNonDocumentedAnnotation()) return null;
if (!(shownAnnotations.add(annotation.getQualifiedName()) || JavaDocInfoGenerator.isRepeatableAnnotationType(nameReferenceElement.resolve()))) return null;
if (!(shownAnnotations.add(annotation.getQualifiedName()) ||
JavaDocInfoGenerator.isRepeatableAnnotationType(nameReferenceElement.resolve()))) {
return null;
}
return anno;
}
}
@@ -116,8 +116,8 @@ public class JavaDocExternalFilter extends AbstractExternalFilter {
PsiClass aClass = ((PsiMethod)element).getContainingClass();
if (aClass != null) {
String qName = aClass.getQualifiedName();
return pair(qName, qName + new JavaDocInfoGenerator(aClass.getProject(), null, false)
.generateTypeParameters(aClass, true));
String typeParameters = JavaDocInfoGeneratorFactory.create(aClass.getProject(), null).generateTypeParameters(aClass, true);
return pair(qName, qName + typeParameters);
}
return null;
}
@@ -0,0 +1,40 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. 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.openapi.editor.markup.TextAttributes;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod;
import org.jetbrains.annotations.NotNull;
public interface JavaDocHighlightingManager {
@NotNull TextAttributes getKeywordAttributes();
@NotNull TextAttributes getCommaAttributes();
@NotNull TextAttributes getParenthesesAttributes();
@NotNull TextAttributes getDotAttributes();
@NotNull TextAttributes getBracketsAttributes();
@NotNull TextAttributes getOperationSignAttributes();
@NotNull TextAttributes getClassNameAttributes();
@NotNull TextAttributes getClassDeclarationAttributes(@NotNull PsiClass aClass);
@NotNull TextAttributes getMethodDeclarationAttributes(@NotNull PsiMethod method);
@NotNull TextAttributes getFieldDeclarationAttributes(@NotNull PsiField field);
@NotNull TextAttributes getParameterAttributes();
@NotNull TextAttributes getTypeParameterNameAttributes();
@NotNull TextAttributes getLocalVariableAttributes();
@NotNull TextAttributes getMethodCallAttributes();
}
@@ -0,0 +1,162 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. 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.codeInsight.daemon.impl.analysis.HighlightNamesUtil;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
public class JavaDocHighlightingManagerImpl implements JavaDocHighlightingManager {
private static final @NotNull JavaDocHighlightingManagerImpl INSTANCE = new JavaDocHighlightingManagerImpl();
public static @NotNull JavaDocHighlightingManagerImpl getInstance() {
return INSTANCE;
}
private static @NotNull TextAttributes resolveAttributes(@NotNull TextAttributesKey attributesKey) {
return EditorColorsManager.getInstance().getGlobalScheme().getAttributes(attributesKey);
}
@Override
public @NotNull TextAttributes getClassDeclarationAttributes(@NotNull PsiClass aClass) {
if (aClass.isInterface()) return getInterfaceNameAttributes();
if (aClass.isEnum()) return getEnumNameAttributes();
if (aClass instanceof PsiAnonymousClass) return getAnonymousClassNameAttributes();
if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) return getAbstractClassNameAttributes();
return getClassNameAttributes();
}
@Override
public @NotNull TextAttributes getMethodDeclarationAttributes(@NotNull PsiMethod method) {
return method.isConstructor()
? getConstructorDeclarationAttributes()
: getMethodDeclarationAttributes();
}
@Override
public @NotNull TextAttributes getFieldDeclarationAttributes(@NotNull PsiField field) {
boolean isFinal = field.hasModifierProperty(PsiModifier.FINAL);
boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC);
boolean isImported = HighlightNamesUtil.isStaticallyImported(field);
if (isImported) {
return isFinal ? getStaticFinalFieldImportedAttributes()
: getStaticFieldImportedAttributes();
}
else if (isStatic) {
return isFinal ? getStaticFinalFieldAttributes()
: getStaticFieldAttributes();
}
else {
return isFinal ? getInstanceFinalFieldAttributes()
: getInstanceFieldAttributes();
}
}
public @NotNull TextAttributes getInterfaceNameAttributes() {
return resolveAttributes(JavaHighlightingColors.INTERFACE_NAME_ATTRIBUTES);
}
public @NotNull TextAttributes getEnumNameAttributes() {
return resolveAttributes(JavaHighlightingColors.ENUM_NAME_ATTRIBUTES);
}
public @NotNull TextAttributes getAnonymousClassNameAttributes() {
return resolveAttributes(JavaHighlightingColors.ANONYMOUS_CLASS_NAME_ATTRIBUTES);
}
public @NotNull TextAttributes getAbstractClassNameAttributes() {
return resolveAttributes(JavaHighlightingColors.ABSTRACT_CLASS_NAME_ATTRIBUTES);
}
@Override
public @NotNull TextAttributes getClassNameAttributes() {
return resolveAttributes(JavaHighlightingColors.CLASS_NAME_ATTRIBUTES);
}
@Override
public @NotNull TextAttributes getKeywordAttributes() {
return resolveAttributes(JavaHighlightingColors.KEYWORD);
}
@Override
public @NotNull TextAttributes getCommaAttributes() {
return resolveAttributes(JavaHighlightingColors.COMMA);
}
@Override
public @NotNull TextAttributes getParameterAttributes() {
return resolveAttributes(JavaHighlightingColors.PARAMETER_ATTRIBUTES);
}
@Override
public @NotNull TextAttributes getTypeParameterNameAttributes() {
return resolveAttributes(JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES);
}
public @NotNull TextAttributes getStaticFinalFieldImportedAttributes() {
return resolveAttributes(JavaHighlightingColors.STATIC_FINAL_FIELD_IMPORTED_ATTRIBUTES);
}
public @NotNull TextAttributes getStaticFieldImportedAttributes() {
return resolveAttributes(JavaHighlightingColors.STATIC_FIELD_IMPORTED_ATTRIBUTES);
}
public @NotNull TextAttributes getStaticFinalFieldAttributes() {
return resolveAttributes(JavaHighlightingColors.STATIC_FINAL_FIELD_ATTRIBUTES);
}
public @NotNull TextAttributes getStaticFieldAttributes() {
return resolveAttributes(JavaHighlightingColors.STATIC_FIELD_ATTRIBUTES);
}
public @NotNull TextAttributes getInstanceFinalFieldAttributes() {
return resolveAttributes(JavaHighlightingColors.INSTANCE_FINAL_FIELD_ATTRIBUTES);
}
public @NotNull TextAttributes getInstanceFieldAttributes() {
return resolveAttributes(JavaHighlightingColors.INSTANCE_FIELD_ATTRIBUTES);
}
@Override
public @NotNull TextAttributes getOperationSignAttributes() {
return resolveAttributes(JavaHighlightingColors.OPERATION_SIGN);
}
@Override
public @NotNull TextAttributes getLocalVariableAttributes() {
return resolveAttributes(JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES);
}
public @NotNull TextAttributes getConstructorDeclarationAttributes() {
return resolveAttributes(JavaHighlightingColors.CONSTRUCTOR_DECLARATION_ATTRIBUTES);
}
public @NotNull TextAttributes getMethodDeclarationAttributes() {
return resolveAttributes(JavaHighlightingColors.METHOD_DECLARATION_ATTRIBUTES);
}
@Override
public @NotNull TextAttributes getParenthesesAttributes() {
return resolveAttributes(JavaHighlightingColors.PARENTHESES);
}
@Override
public @NotNull TextAttributes getDotAttributes() {
return resolveAttributes(JavaHighlightingColors.DOT);
}
@Override
public @NotNull TextAttributes getBracketsAttributes() {
return resolveAttributes(JavaHighlightingColors.BRACKETS);
}
@Override
public @NotNull TextAttributes getMethodCallAttributes() {
return resolveAttributes(JavaHighlightingColors.METHOD_CALL_ATTRIBUTES);
}
}
@@ -2,23 +2,23 @@
package com.intellij.codeInsight.javadoc;
import com.intellij.CommonBundle;
import com.intellij.application.options.CodeStyle;
import com.intellij.codeInsight.AnnotationUtil;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightNamesUtil;
import com.intellij.codeInsight.documentation.DocumentationManagerProtocol;
import com.intellij.codeInsight.documentation.DocumentationManagerUtil;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.java.JavaBundle;
import com.intellij.javadoc.JavadocGeneratorRunProfile;
import com.intellij.lang.ASTNode;
import com.intellij.lang.Language;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.HighlighterColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.project.DumbService;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
@@ -62,8 +62,6 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import static com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil.*;
public class JavaDocInfoGenerator {
private static final Logger LOG = Logger.getInstance(JavaDocInfoGenerator.class);
@@ -111,17 +109,28 @@ public class JavaDocInfoGenerator {
private final @NotNull Project myProject;
private final @Nullable PsiElement myElement;
private final boolean myIsRendered;
private final @NotNull JavaDocHighlightingManager myHighlightingManager;
private final @Nullable JavaSdkVersion mySdkVersion;
private final boolean myIsRendered;
private final boolean myDoSyntaxHighlighting;
public JavaDocInfoGenerator(@NotNull Project project, @Nullable PsiElement element) {
this(project, element, false);
this(project, element, new JavaDocHighlightingManagerImpl(), false, true);
}
public JavaDocInfoGenerator(@NotNull Project project, @Nullable PsiElement element, boolean isGenerationForRenderedDoc) {
public JavaDocInfoGenerator(
@NotNull Project project,
@Nullable PsiElement element,
@NotNull JavaDocHighlightingManager highlightingManager,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting
) {
myProject = project;
myElement = element;
myIsRendered = isGenerationForRenderedDoc;
myDoSyntaxHighlighting = doSyntaxHighlighting;
myHighlightingManager = highlightingManager;
Sdk jdk = JavadocGeneratorRunProfile.getSdk(myProject);
mySdkVersion = jdk == null ? null : JavaSdk.getInstance().getVersion(jdk);
@@ -130,7 +139,56 @@ public class JavaDocInfoGenerator {
public boolean isRendered() {
return myIsRendered;
}
public boolean doSyntaxHighlighting() {
return myDoSyntaxHighlighting;
}
public @NotNull JavaDocHighlightingManager getHighlightingManager() {
return myHighlightingManager;
}
protected @NotNull StringBuilder appendStyledSpan(
@NotNull StringBuilder buffer,
@NotNull TextAttributes attributes,
@Nullable String value
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value);
}
else {
buffer.append(value);
}
return buffer;
}
protected @NotNull StringBuilder appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
@NotNull StringBuilder buffer,
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet);
}
else {
buffer.append(codeSnippet);
}
return buffer;
}
public @NotNull String getStyledSpan(@NotNull TextAttributes attributes, @Nullable String value) {
return appendStyledSpan(new StringBuilder(), attributes, value).toString();
}
public @NotNull String getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet
) {
return appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(new StringBuilder(), project, language, codeSnippet).toString();
}
private static InheritDocProvider<PsiElement[]> mapProvider(InheritDocProvider<PsiDocTag> i, boolean dropFirst) {
return new InheritDocProvider<>() {
@Override
@@ -490,16 +548,6 @@ public class JavaDocInfoGenerator {
if (!isRendered()) {
buffer.append(DocumentationMarkup.DEFINITION_START);
if (generateClassSignature(buffer, aClass, SignaturePlace.Javadoc)) return;
PsiFile file = aClass.getContainingFile();
if (file instanceof PsiJavaFile) {
String packageName = ((PsiJavaFile)file).getPackageName();
if (!packageName.isEmpty()) {
appendDefinedInClause(buffer);
PsiPackage aPackage = JavaPsiFacade.getInstance(file.getProject()).findPackage(packageName);
appendMaybeUnresolvedLink(buffer, aPackage, packageName, file.getProject(), false);
}
}
buffer.append(DocumentationMarkup.DEFINITION_END);
}
@@ -517,7 +565,7 @@ public class JavaDocInfoGenerator {
}
if (!isRendered()) {
new NonCodeAnnotationGenerator(aClass, buffer).explainAnnotations();
new NonCodeAnnotationGenerator(aClass, buffer).explainAnnotations(isRendered(), doSyntaxHighlighting());
}
buffer.append(DocumentationMarkup.SECTIONS_END);
}
@@ -536,14 +584,6 @@ public class JavaDocInfoGenerator {
generateParametersSection(buffer, CodeInsightBundle.message("javadoc.parameters"), collectedTags);
}
public static TextAttributesKey getClassTextAttributes(PsiClass aClass) {
if (aClass.isInterface()) return JavaHighlightingColors.INTERFACE_NAME_ATTRIBUTES;
if (aClass.isEnum()) return JavaHighlightingColors.ENUM_NAME_ATTRIBUTES;
if (aClass instanceof PsiAnonymousClass) return JavaHighlightingColors.ANONYMOUS_CLASS_NAME_ATTRIBUTES;
if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) return JavaHighlightingColors.ABSTRACT_CLASS_NAME_ATTRIBUTES;
return JavaHighlightingColors.CLASS_NAME_ATTRIBUTES;
}
private boolean generateClassSignature(StringBuilder buffer, PsiClass aClass, SignaturePlace place) {
boolean generateLink = place == SignaturePlace.Javadoc;
String classKeyword =
@@ -551,9 +591,9 @@ public class JavaDocInfoGenerator {
aClass.isEnum() ? PsiKeyword.ENUM :
aClass.isRecord() ? PsiKeyword.RECORD : PsiKeyword.CLASS;
generateAnnotations(buffer, aClass, place, true, false);
generateAnnotations(buffer, aClass, place, true, false, true);
generateModifiers(buffer, aClass, false);
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, classKeyword);
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), classKeyword);
buffer.append(' ');
String refText = JavaDocUtil.getReferenceText(aClass.getProject(), aClass);
if (refText == null) {
@@ -561,28 +601,29 @@ public class JavaDocInfoGenerator {
return true;
}
String className = JavaDocUtil.getLabelText(aClass.getProject(), aClass.getManager(), refText, aClass);
appendStyledSpan(buffer, getClassTextAttributes(aClass), className);
appendStyledSpan(buffer, getHighlightingManager().getClassDeclarationAttributes(aClass), className);
buffer.append(generateTypeParameters(aClass, false));
buffer.append('\n');
PsiClassType[] refs = aClass.getExtendsListTypes();
if (refs.length > 0 || !aClass.isInterface() && !CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) {
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "extends ");
if (refs.length == 0) {
generateLink(buffer, CommonClassNames.JAVA_LANG_OBJECT, null, aClass, false);
}
else {
generateRefList(buffer, aClass, generateLink, refs);
}
if (aClass.isEnum()) {
refs = Arrays.stream(refs)
.filter(it -> {
PsiClass resolved = it.resolve();
return resolved == null || !"java.lang.Enum".equals(resolved.getQualifiedName());
})
.toArray(PsiClassType[]::new);
}
if (refs.length > 0) {
generateRefList(buffer, aClass, generateLink, refs, "extends");
buffer.append('\n');
}
refs = aClass.getImplementsListTypes();
if (refs.length > 0) {
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "implements ");
generateRefList(buffer, aClass, generateLink, refs);
generateRefList(buffer, aClass, generateLink, refs, "implements");
buffer.append('\n');
}
if (buffer.charAt(buffer.length() - 1) == '\n') {
@@ -591,12 +632,20 @@ public class JavaDocInfoGenerator {
return false;
}
private void generateRefList(StringBuilder buffer, PsiClass aClass, boolean generateLink, PsiClassType[] refs) {
private void generateRefList(StringBuilder buffer, PsiClass aClass, boolean generateLink, PsiClassType[] refs, String keyword) {
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), keyword);
buffer.append(" ");
for (int i = 0; i < refs.length; i++) {
generateType(buffer, refs[i], aClass, generateLink);
if (i < refs.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ",");
buffer.append(NBSP);
appendStyledSpan(buffer, getHighlightingManager().getCommaAttributes(), ",");
if (refs.length <= 3) {
buffer.append(NBSP);
}
else {
buffer.append('\n');
buffer.append(NBSP.repeat(keyword.length() + 1));
}
}
}
}
@@ -623,22 +672,22 @@ public class JavaDocInfoGenerator {
}
@NotNull
private static String generateOneParameterPresentableName(PsiNamedElement parameter) {
private String generateOneParameterPresentableName(PsiNamedElement parameter) {
StringBuilder paramName = new StringBuilder();
appendStyledSpan(
paramName,
JavaHighlightingColors.PARAMETER_ATTRIBUTES,
getHighlightingManager().getParameterAttributes(),
Objects.requireNonNullElse(parameter.getName(), CommonBundle.getErrorTitle()));
return paramName.toString();
}
@NotNull
private static String generateOneTypeParameterPresentableName(PsiTypeParameter typeParameter) {
private String generateOneTypeParameterPresentableName(PsiTypeParameter typeParameter) {
StringBuilder paramName = new StringBuilder();
paramName.append(LT);
appendStyledSpan(
paramName,
JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES,
getHighlightingManager().getTypeParameterNameAttributes(),
Objects.requireNonNullElse(typeParameter.getName(), CommonBundle.getErrorTitle()));
paramName.append(GT);
return paramName.toString();
@@ -702,7 +751,6 @@ public class JavaDocInfoGenerator {
if (!isRendered()) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateFieldSignature(buffer, field, SignaturePlace.Javadoc);
generateLinkToParentIfNeeded(buffer, field);
enumConstantOrdinal(buffer, field, field.getContainingClass(), "\n");
buffer.append(DocumentationMarkup.DEFINITION_END);
}
@@ -720,37 +768,21 @@ public class JavaDocInfoGenerator {
if (!isRendered()) {
JavaDocColorUtil.appendColorPreview(field, buffer);
new NonCodeAnnotationGenerator(field, buffer).explainAnnotations();
new NonCodeAnnotationGenerator(field, buffer).explainAnnotations(isRendered(), doSyntaxHighlighting());
}
buffer.append(DocumentationMarkup.SECTIONS_END);
}
public static TextAttributesKey getFieldTextAttributes(PsiField field) {
boolean isFinal = field.hasModifierProperty(PsiModifier.FINAL);
boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC);
boolean isImported = HighlightNamesUtil.isStaticallyImported(field);
if (isImported) {
return isFinal ? JavaHighlightingColors.STATIC_FINAL_FIELD_IMPORTED_ATTRIBUTES
: JavaHighlightingColors.STATIC_FIELD_IMPORTED_ATTRIBUTES;
}
else if (isStatic) {
return isFinal ? JavaHighlightingColors.STATIC_FINAL_FIELD_ATTRIBUTES
: JavaHighlightingColors.STATIC_FIELD_ATTRIBUTES;
}
else {
return isFinal ? JavaHighlightingColors.INSTANCE_FINAL_FIELD_ATTRIBUTES
: JavaHighlightingColors.INSTANCE_FIELD_ATTRIBUTES;
}
}
private void generateFieldSignature(StringBuilder buffer, PsiField field, SignaturePlace place) {
generateAnnotations(buffer, field, place, true, false);
generateModifiers(buffer, field, false);
generateType(buffer, field.getType(), field, place == SignaturePlace.Javadoc);
buffer.append(" ");
appendStyledSpan(buffer, getFieldTextAttributes(field), field.getName());
appendInitializer(buffer, field);
StringBuilder signatureBuffer = new StringBuilder();
generateAnnotations(signatureBuffer, field, place, true, false, true);
generateModifiers(signatureBuffer, field, false);
generateType(signatureBuffer, field.getType(), field, place == SignaturePlace.Javadoc);
signatureBuffer.append(" ");
appendStyledSpan(signatureBuffer, getHighlightingManager().getFieldDeclarationAttributes(field), field.getName());
buffer.append(signatureBuffer);
appendInitializer(buffer, field, StringUtil.removeHtmlTags(signatureBuffer.toString()).length());
}
public static void enumConstantOrdinal(@Nls StringBuilder buffer, PsiField field, PsiClass parentClass, String newLine) {
@@ -760,6 +792,7 @@ public class JavaDocInfoGenerator {
if (idx >= 0) {
buffer.append(newLine);
buffer.append(DocumentationMarkup.GRAYED_START);
buffer.append("// ");
buffer.append(JavaBundle.message("enum.constant.ordinal"));
buffer.append(idx);
buffer.append(DocumentationMarkup.GRAYED_END);
@@ -810,9 +843,9 @@ public class JavaDocInfoGenerator {
if (!isRendered()) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateAnnotations(buffer, module, SignaturePlace.Javadoc, true, false);
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "module ");
appendStyledSpan(buffer, JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, module.getName());
generateAnnotations(buffer, module, SignaturePlace.Javadoc, true, false, true);
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), "module ");
appendStyledSpan(buffer, getHighlightingManager().getClassNameAttributes(), module.getName());
buffer.append(DocumentationMarkup.DEFINITION_END);
}
@@ -923,8 +956,8 @@ public class JavaDocInfoGenerator {
return null;
}
public static void appendExpressionValue(StringBuilder buffer, PsiExpression initializer) {
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " = ");
public void appendExpressionValue(StringBuilder buffer, PsiExpression initializer) {
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), " = ");
String text = initializer.getText().trim();
int index = newLineIndex(text);
boolean trunc = index < text.length();
@@ -937,26 +970,36 @@ public class JavaDocInfoGenerator {
}
}
private void appendInitializer(StringBuilder buffer, PsiVariable variable) {
private void appendInitializer(StringBuilder buffer, PsiVariable variable, int variableSignatureLength) {
PsiExpression initializer = variable.getInitializer();
if (initializer != null) {
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " = ");
String text = initializer.getText().trim();
int index = newLineIndex(text);
if (index < text.length()) {
text = text.substring(0, index);
buffer.append(StringUtil.escapeXmlEntities(text));
buffer.append("...");
}
else {
initializer.accept(new MyVisitor(buffer));
}
PsiExpression constantInitializer = calcInitializerExpression(variable);
if (constantInitializer != null) {
buffer.append(DocumentationMarkup.GRAYED_START);
appendExpressionValue(buffer, constantInitializer);
buffer.append(DocumentationMarkup.GRAYED_END);
}
if (initializer == null) return;
String initializerText = initializer.getText().trim();
if (variableSignatureLength + initializerText.length() < 80) {
// initializer should be printed on the same line
buffer.append(" ");
}
else {
// initializer should be printed on the new line
buffer.append("\n");
buffer.append(NBSP.repeat(CodeStyle.getIndentSize(variable.getContainingFile())));
}
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), "= ");
int index = newLineIndex(initializerText);
if (index < initializerText.length()) {
initializerText = initializerText.substring(0, index);
buffer.append(StringUtil.escapeXmlEntities(initializerText));
buffer.append("...");
}
else {
initializer.accept(new MyVisitor(buffer));
}
PsiExpression constantInitializer = calcInitializerExpression(variable);
if (constantInitializer != null) {
buffer.append(DocumentationMarkup.GRAYED_START);
appendExpressionValue(buffer, constantInitializer);
buffer.append(DocumentationMarkup.GRAYED_END);
}
}
@@ -968,16 +1011,22 @@ public class JavaDocInfoGenerator {
return Math.min(index1, index2);
}
public static int generateModifiers(StringBuilder buffer, PsiModifierListOwner owner, boolean nbsp) {
public int generateModifiers(StringBuilder buffer, PsiModifierListOwner owner, boolean nbsp) {
String modifiers = PsiFormatUtil.formatModifiers(owner, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
if (!modifiers.isEmpty()) {
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, modifiers);
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), modifiers);
buffer.append(nbsp ? NBSP : ' ');
}
return modifiers.length();
}
private static int generateTypeAnnotations(StringBuilder buffer, PsiAnnotationOwner owner, PsiElement context, boolean leadingSpace) {
private int generateTypeAnnotations(
StringBuilder buffer,
PsiAnnotationOwner owner,
PsiElement context,
boolean generateLink,
boolean leadingSpace
) {
int len = 0;
List<AnnotationDocGenerator> generators = AnnotationDocGenerator.getAnnotationsToShow(owner, context);
if (leadingSpace && !generators.isEmpty()) {
@@ -986,7 +1035,7 @@ public class JavaDocInfoGenerator {
}
for (AnnotationDocGenerator anno : generators) {
StringBuilder buf = new StringBuilder();
anno.generateAnnotation(buf, AnnotationFormat.JavaDocShort);
anno.generateAnnotation(buf, AnnotationFormat.JavaDocShort, generateLink, isRendered(), doSyntaxHighlighting());
len += StringUtil.unescapeXmlEntities(StringUtil.stripHtml(buf.toString(), true)).length() + 1;
buffer.append(buf);
buffer.append(NBSP);
@@ -994,15 +1043,18 @@ public class JavaDocInfoGenerator {
return len;
}
private static void generateAnnotations(StringBuilder buffer,
PsiModifierListOwner owner,
SignaturePlace place,
boolean splitAnnotations,
boolean ignoreNonSourceAnnotations) {
private void generateAnnotations(
StringBuilder buffer,
PsiModifierListOwner owner,
SignaturePlace place,
boolean splitAnnotations,
boolean ignoreNonSourceAnnotations,
boolean generateLink
) {
AnnotationFormat format = place == SignaturePlace.Javadoc ? AnnotationFormat.JavaDocShort : AnnotationFormat.ToolTip;
for (AnnotationDocGenerator anno : AnnotationDocGenerator.getAnnotationsToShow(owner)) {
if (ignoreNonSourceAnnotations && (anno.isInferred() || anno.isExternal())) continue;
anno.generateAnnotation(buffer, format);
anno.generateAnnotation(buffer, format, generateLink, isRendered(), doSyntaxHighlighting());
buffer.append(NBSP);
if (splitAnnotations) buffer.append('\n');
@@ -1020,14 +1072,20 @@ public class JavaDocInfoGenerator {
private void generateVariableDefinition(StringBuilder buffer, PsiVariable variable, boolean annotations) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateModifiers(buffer, variable, false);
StringBuilder signatureBuffer = new StringBuilder();
generateModifiers(signatureBuffer, variable, false);
if (annotations) {
generateAnnotations(buffer, variable, SignaturePlace.Javadoc, true, false);
generateAnnotations(signatureBuffer, variable, SignaturePlace.Javadoc, true, false, true);
}
generateType(buffer, variable.getType(), variable);
buffer.append(" ");
appendStyledSpan(buffer, JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES, variable.getName());
appendInitializer(buffer, variable);
generateType(signatureBuffer, variable.getType(), variable);
signatureBuffer.append(" ");
appendStyledSpan(signatureBuffer, getHighlightingManager().getLocalVariableAttributes(), variable.getName());
buffer.append(signatureBuffer);
appendInitializer(buffer, variable, StringUtil.removeHtmlTags(signatureBuffer.toString()).length());
buffer.append(DocumentationMarkup.DEFINITION_END);
}
@@ -1051,7 +1109,7 @@ public class JavaDocInfoGenerator {
}
buffer.append(DocumentationMarkup.SECTIONS_START);
new NonCodeAnnotationGenerator(parameter, buffer).explainAnnotations();
new NonCodeAnnotationGenerator(parameter, buffer).explainAnnotations(isRendered(), doSyntaxHighlighting());
buffer.append(DocumentationMarkup.SECTIONS_END);
}
@@ -1091,8 +1149,6 @@ public class JavaDocInfoGenerator {
if (!isRendered()) {
buffer.append(DocumentationMarkup.DEFINITION_START);
generateMethodSignature(buffer, method, SignaturePlace.Javadoc);
generateLinkToParentIfNeeded(buffer, method);
buffer.append(DocumentationMarkup.DEFINITION_END);
}
@@ -1129,7 +1185,8 @@ public class JavaDocInfoGenerator {
startHeaderSection(buffer, JavaBundle.message(aClass.isInterface() ? "javadoc.description.copied.from.interface"
: "javadoc.description.copied.from.class"))
.append("<p>");
generateLink(buffer, aClass, getStyledSpan(getClassTextAttributes(aClass), JavaDocUtil.getShortestClassName(aClass, method)),
generateLink(buffer, aClass, getStyledSpan(getHighlightingManager().getClassDeclarationAttributes(aClass),
JavaDocUtil.getShortestClassName(aClass, method)),
false);
buffer.append(BR_TAG);
generateValue(buffer, elements, pair.second);
@@ -1147,7 +1204,8 @@ public class JavaDocInfoGenerator {
if (fieldDocComment != null && !isEmptyDescription(fieldDocComment)) {
startHeaderSection(buffer, JavaBundle.message("javadoc.description.copied.from.field"))
.append("<p>");
generateLink(buffer, field, getStyledSpan(getFieldTextAttributes(field), field.getName()), false);
generateLink(buffer, field, getStyledSpan(getHighlightingManager().getFieldDeclarationAttributes(field), field.getName()),
false);
buffer.append(BR_TAG);
generateValue(buffer, fieldDocComment.getDescriptionElements(), ourEmptyElementsProvider);
buffer.append(DocumentationMarkup.SECTION_END);
@@ -1181,7 +1239,7 @@ public class JavaDocInfoGenerator {
}
if (!isRendered()) {
new NonCodeAnnotationGenerator(method, buffer).explainAnnotations();
new NonCodeAnnotationGenerator(method, buffer).explainAnnotations(isRendered(), doSyntaxHighlighting());
}
buffer.append(DocumentationMarkup.SECTIONS_END);
@@ -1193,83 +1251,64 @@ public class JavaDocInfoGenerator {
.append(DocumentationMarkup.SECTION_SEPARATOR);
}
private void generateLinkToParentIfNeeded(StringBuilder buffer, PsiMember member) {
PsiClass parentClass = member.getContainingClass();
if (parentClass != null && !PsiUtil.isArrayClass(parentClass)) {
String qName = parentClass.getQualifiedName();
if (qName != null) {
appendDefinedInClause(buffer);
generateLink(buffer, qName, qName + generateTypeParameters(parentClass, true), member, false);
}
}
}
private static void appendDefinedInClause(StringBuilder buffer) {
buffer.append(BR_TAG);
buffer.append(DocumentationMarkup.GRAYED_START);
buffer.append(JavaBundle.message("javadoc.generate.defined.in"));
buffer.append(" ");
buffer.append(DocumentationMarkup.GRAYED_END);
}
public static @NotNull TextAttributesKey getMethodDeclarationTextAttributes(PsiMethod method) {
return method.isConstructor()
? JavaHighlightingColors.CONSTRUCTOR_DECLARATION_ATTRIBUTES
: JavaHighlightingColors.METHOD_DECLARATION_ATTRIBUTES;
}
private void generateMethodSignature(StringBuilder buffer, PsiMethod method, SignaturePlace place) {
boolean isTooltip = place == SignaturePlace.ToolTip;
boolean generateLink = place == SignaturePlace.Javadoc;
generateAnnotations(buffer, method, place, true, false);
generateAnnotations(buffer, method, place, true, false, true);
int modLength = isTooltip ? 0 : generateModifiers(buffer, method, true);
int indent = modLength == 0 ? 0 : modLength + 1;
if (!isTooltip) {
generateModifiers(buffer, method, true);
}
String typeParamsString = generateTypeParameters(method, isTooltip);
indent += StringUtil.unescapeXmlEntities(StringUtil.stripHtml(typeParamsString, true)).length();
if (!typeParamsString.isEmpty()) {
buffer.append(typeParamsString);
buffer.append(NBSP);
indent++;
}
if (method.getReturnType() != null) {
indent += generateType(buffer, method.getReturnType(), method, generateLink, isTooltip);
generateType(buffer, method.getReturnType(), method, generateLink, isTooltip);
buffer.append(NBSP);
indent++;
}
String name = method.getName();
appendStyledSpan(buffer, getMethodDeclarationTextAttributes(method), name);
indent += name.length();
appendStyledSpan(buffer, getHighlightingManager().getMethodDeclarationAttributes(method), name);
appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, "(");
appendStyledSpan(buffer, getHighlightingManager().getParenthesesAttributes(), "(");
PsiParameter[] parameters = method.getParameterList().getParameters();
PsiFile file = method.getContainingFile();
int indent = isTooltip ? 0 : file != null ? CodeStyle.getIndentSize(file) : 4;
if (parameters.length > 0 && !isTooltip) {
buffer.append(BR_TAG);
}
for (int i = 0; i < parameters.length; i++) {
buffer.append(StringUtil.repeatSymbol(' ', indent));
PsiParameter parm = parameters[i];
generateAnnotations(buffer, parm, place, false, false);
generateAnnotations(buffer, parm, place, false, false, true);
generateType(buffer, parm.getType(), method, generateLink, isTooltip);
if (!isTooltip) {
buffer.append(NBSP);
appendStyledSpan(buffer, JavaHighlightingColors.PARAMETER_ATTRIBUTES, parm.getName());
appendStyledSpan(buffer, getHighlightingManager().getParameterAttributes(), parm.getName());
}
if (i < parameters.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ",\n ");
buffer.append(StringUtil.repeatSymbol(' ', indent));
appendStyledSpan(buffer, getHighlightingManager().getCommaAttributes(), ",");
buffer.append("\n");
}
}
appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, ")");
if (parameters.length > 0 && !isTooltip) {
buffer.append(BR_TAG);
}
appendStyledSpan(buffer, getHighlightingManager().getParenthesesAttributes(), ")");
PsiClassType[] refs = method.getThrowsList().getReferencedTypes();
if (refs.length > 0) {
buffer.append('\n');
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "throws");
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), "throws");
buffer.append(NBSP);
for (int i = 0; i < refs.length; i++) {
generateLink(buffer, isTooltip ? refs[i].getPresentableText() : refs[i].getCanonicalText(), null, method, false);
if (i < refs.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ",");
appendStyledSpan(buffer, getHighlightingManager().getCommaAttributes(), ",");
buffer.append(NBSP);
}
}
@@ -1741,8 +1780,12 @@ public class JavaDocInfoGenerator {
String text = elements[0].getText();
StringBuilder buffer = new StringBuilder();
buffer.append(tag.presentableName);
buffer.append(" &ndash; ");
generateValue(buffer, tag, elements, text);
StringBuilder descriptionBuffer = new StringBuilder();
generateValue(descriptionBuffer, tag, elements, text);
if (!StringUtil.isEmptyOrSpaces(descriptionBuffer)) {
buffer.append(" &ndash; ");
buffer.append(descriptionBuffer);
}
return buffer.toString();
}
@@ -1814,7 +1857,7 @@ public class JavaDocInfoGenerator {
LinkedList<Pair<PsiDocTag, InheritDocProvider<PsiDocTag>>> collectedTags = new LinkedList<>();
List<PsiClassType> declaredThrows = isRendered() ? Collections.emptyList()
: new ArrayList<>(Arrays.asList(method.getThrowsList().getReferencedTypes()));
: new ArrayList<>(Arrays.asList(method.getThrowsList().getReferencedTypes()));
for (int i = thrownTags.length - 1; i > -1; i--) {
PsiDocTagValue valueElement = thrownTags[i].getValueElement();
@@ -1830,7 +1873,8 @@ public class JavaDocInfoGenerator {
}
Pair<PsiDocTag, InheritDocProvider<PsiDocTag>> tag = isRendered() ? null
: findInheritDocTag(method, exceptionLocator(valueElement.getText()));
: findInheritDocTag(method,
exceptionLocator(valueElement.getText()));
collectedTags.addFirst(new Pair<>(thrownTags[i], new InheritDocProvider<>() {
@Override
public Pair<PsiDocTag, InheritDocProvider<PsiDocTag>> getInheritDoc() {
@@ -1931,9 +1975,11 @@ public class JavaDocInfoGenerator {
StringBuilder methodBuffer = new StringBuilder();
generateLink(
methodBuffer, superMethod, getStyledSpan(JavaHighlightingColors.METHOD_DECLARATION_ATTRIBUTES, superMethod.getName()), false);
methodBuffer, superMethod,
getStyledSpan(getHighlightingManager().getMethodDeclarationAttributes(superMethod), superMethod.getName()), false);
StringBuilder classBuffer = new StringBuilder();
generateLink(classBuffer, superClass, getStyledSpan(getClassTextAttributes(superClass), superClass.getName()), false);
generateLink(classBuffer, superClass,
getStyledSpan(getHighlightingManager().getClassDeclarationAttributes(superClass), superClass.getName()), false);
if (superClass.isInterface()) {
buffer.append(JavaBundle.message("javadoc.method.in.interface", methodBuffer.toString(), classBuffer.toString()));
}
@@ -1980,7 +2026,7 @@ public class JavaDocInfoGenerator {
return StringUtil.stripHtml(label, true).length();
}
private void appendMaybeUnresolvedLink(
public void appendMaybeUnresolvedLink(
StringBuilder buffer,
@Nullable PsiElement target,
String label,
@@ -1998,27 +2044,29 @@ public class JavaDocInfoGenerator {
}
}
private static @NotNull String tryHighlightLinkLabel(@NotNull PsiElement element, @NotNull String label) {
private @NotNull String tryHighlightLinkLabel(@NotNull PsiElement element, @NotNull String label) {
if (element instanceof PsiClass) {
return getStyledSpan(getClassTextAttributes((PsiClass)element), label);
return getStyledSpan(getHighlightingManager().getClassDeclarationAttributes((PsiClass)element), label);
}
if (element instanceof PsiPackage) {
return getStyledSpan(JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, label);
return getStyledSpan(getHighlightingManager().getClassNameAttributes(), label);
}
else if (element instanceof PsiMethod) {
return tryHighlightLinkOnClassMember((PsiMember)element, getMethodDeclarationTextAttributes((PsiMethod)element), label);
return tryHighlightLinkOnClassMember((PsiMember)element, getHighlightingManager().getMethodDeclarationAttributes((PsiMethod)element),
label);
}
else if (element instanceof PsiField) {
return tryHighlightLinkOnClassMember((PsiField)element, getFieldTextAttributes((PsiField)element), label);
return tryHighlightLinkOnClassMember((PsiField)element, getHighlightingManager().getFieldDeclarationAttributes((PsiField)element),
label);
}
else {
return getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(element.getProject(), element.getLanguage(), label);
}
}
private static @NotNull String tryHighlightLinkOnClassMember(
private @NotNull String tryHighlightLinkOnClassMember(
@NotNull PsiMember member,
@NotNull TextAttributesKey attributesKey,
@NotNull TextAttributes labelAttributes,
@NotNull String label
) {
StringBuilder buffer = new StringBuilder();
@@ -2027,13 +2075,14 @@ public class JavaDocInfoGenerator {
int classNameIndex = label.substring(0, openParenIndex).lastIndexOf(".");
if (classNameIndex != -1) {
PsiClass containingClass = member.getContainingClass();
TextAttributesKey containingClassAttributes =
containingClass != null ? getClassTextAttributes(containingClass) : JavaHighlightingColors.CLASS_NAME_ATTRIBUTES;
TextAttributes containingClassAttributes =
containingClass != null ? getHighlightingManager().getClassDeclarationAttributes(containingClass)
: getHighlightingManager().getClassNameAttributes();
appendStyledSpan(buffer, containingClassAttributes, label.substring(0, classNameIndex));
appendStyledSpan(buffer, JavaHighlightingColors.DOT, ".");
appendStyledSpan(buffer, getHighlightingManager().getDotAttributes(), ".");
}
classNameIndex++;
appendStyledSpan(buffer, attributesKey, label.substring(classNameIndex, openParenIndex));
appendStyledSpan(buffer, labelAttributes, label.substring(classNameIndex, openParenIndex));
if (openParenIndex == label.length()) return buffer.toString();
appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
buffer, member.getProject(), member.getLanguage(), label.substring(openParenIndex));
@@ -2061,22 +2110,22 @@ public class JavaDocInfoGenerator {
if (type instanceof PsiArrayType) {
int rest = generateType(buffer, ((PsiArrayType)type).getComponentType(), context, generateLink, useShortNames);
int len = generateTypeAnnotations(buffer, type, context, true);
int len = generateTypeAnnotations(buffer, type, context, generateLink, true);
if (type instanceof PsiEllipsisType) {
buffer.append("...");
return len + rest + 3;
}
else {
appendStyledSpan(buffer, JavaHighlightingColors.BRACKETS, "[]");
appendStyledSpan(buffer, getHighlightingManager().getBracketsAttributes(), "[]");
return len + rest + 2;
}
}
int typAnnoLength = generateTypeAnnotations(buffer, type, context, false);
int typAnnoLength = generateTypeAnnotations(buffer, type, context, generateLink, false);
if (type instanceof PsiPrimitiveType) {
String text = type.getCanonicalText();
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, StringUtil.escapeXmlEntities(text));
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), StringUtil.escapeXmlEntities(text));
return typAnnoLength + text.length();
}
@@ -2086,11 +2135,11 @@ public class JavaDocInfoGenerator {
if (type instanceof PsiWildcardType) {
PsiWildcardType wt = (PsiWildcardType)type;
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, "?");
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), "?");
PsiType bound = wt.getBound();
if (bound != null) {
String keyword = wt.isExtends() ? " extends " : " super ";
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, keyword);
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), keyword);
return typAnnoLength + generateType(buffer, bound, context, generateLink, useShortNames) + 1 + keyword.length();
}
else {
@@ -2127,7 +2176,7 @@ public class JavaDocInfoGenerator {
if (qName == null || psiClass instanceof PsiTypeParameter) {
String typeText = useShortNames ? type.getPresentableText() : type.getCanonicalText();
appendStyledSpan(
buffer, JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES, StringUtil.escapeXmlEntities(typeText));
buffer, getHighlightingManager().getTypeParameterNameAttributes(), StringUtil.escapeXmlEntities(typeText));
return typAnnoLength + typeText.length();
}
@@ -2138,7 +2187,7 @@ public class JavaDocInfoGenerator {
length += generateLink(buffer, name, null, context, false);
}
else {
appendStyledSpan(buffer, getClassTextAttributes(psiClass), name);
appendStyledSpan(buffer, getHighlightingManager().getClassDeclarationAttributes(psiClass), name);
length += name.length();
}
@@ -2147,7 +2196,7 @@ public class JavaDocInfoGenerator {
PsiTypeParameter[] params = psiClass.getTypeParameters();
appendStyledSpan(subst, JavaHighlightingColors.OPERATION_SIGN, LT);
appendStyledSpan(subst, getHighlightingManager().getOperationSignAttributes(), LT);
length += 1;
boolean goodSubst = true;
for (int i = 0; i < params.length; i++) {
@@ -2161,12 +2210,12 @@ public class JavaDocInfoGenerator {
length += generateType(subst, t, context, generateLink, useShortNames);
if (i < params.length - 1) {
appendStyledSpan(subst, JavaHighlightingColors.COMMA, ", ");
appendStyledSpan(subst, getHighlightingManager().getCommaAttributes(), ", ");
length += 2;
}
}
appendStyledSpan(subst, JavaHighlightingColors.OPERATION_SIGN, GT);
appendStyledSpan(subst, getHighlightingManager().getOperationSignAttributes(), GT);
length++;
if (goodSubst) {
buffer.append(subst);
@@ -2194,7 +2243,7 @@ public class JavaDocInfoGenerator {
int length = typAnnoLength;
for (PsiType psiType : componentTypes) {
if (length > 0) {
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, separator);
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), separator);
length += 3;
}
length += generateType(buffer, psiType, context, true, useShortNames);
@@ -2222,35 +2271,35 @@ public class JavaDocInfoGenerator {
PsiTypeParameter[] parameters = owner.getTypeParameters();
StringBuilder buffer = new StringBuilder();
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, LT);
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), LT);
for (int i = 0; i < parameters.length; i++) {
PsiTypeParameter p = parameters[i];
generateTypeAnnotations(buffer, p, p, false);
generateTypeAnnotations(buffer, p, p, true, false);
appendStyledSpan(
buffer,
JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES,
getHighlightingManager().getTypeParameterNameAttributes(),
Objects.requireNonNullElse(p.getName(), CommonBundle.getErrorTitle()));
PsiClassType[] refs = JavaDocUtil.getExtendsList(p);
if (refs.length > 0) {
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " extends ");
appendStyledSpan(buffer, getHighlightingManager().getKeywordAttributes(), " extends ");
for (int j = 0; j < refs.length; j++) {
generateType(buffer, refs[j], owner, true, useShortNames);
if (j < refs.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " & ");
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), " & ");
}
}
}
if (i < parameters.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", ");
appendStyledSpan(buffer, getHighlightingManager().getCommaAttributes(), ", ");
}
}
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, GT);
appendStyledSpan(buffer, getHighlightingManager().getOperationSignAttributes(), GT);
return buffer.toString();
}
@@ -2429,7 +2478,7 @@ public class JavaDocInfoGenerator {
@Override
public void visitNewExpression(PsiNewExpression expression) {
appendStyledSpan(myBuffer, JavaHighlightingColors.KEYWORD, "new ");
appendStyledSpan(myBuffer, getHighlightingManager().getKeywordAttributes(), "new ");
PsiType type = expression.getType();
if (type != null) {
generateType(myBuffer, type, expression);
@@ -2443,9 +2492,9 @@ public class JavaDocInfoGenerator {
for (int i = 0; i < dimensions.length; i++) {
PsiExpression dimension = dimensions[i];
dimension.accept(this);
if (i + 1 != dimensions.length) appendStyledSpan(myBuffer, JavaHighlightingColors.COMMA, ", ");
if (i + 1 != dimensions.length) appendStyledSpan(myBuffer, getHighlightingManager().getCommaAttributes(), ", ");
}
appendStyledSpan(myBuffer, JavaHighlightingColors.BRACKETS, "]");
appendStyledSpan(myBuffer, getHighlightingManager().getBracketsAttributes(), "]");
}
else {
expression.acceptChildren(this);
@@ -2454,22 +2503,22 @@ public class JavaDocInfoGenerator {
@Override
public void visitExpressionList(PsiExpressionList list) {
appendStyledSpan(myBuffer, JavaHighlightingColors.PARENTHESES, "(");
appendStyledSpan(myBuffer, getHighlightingManager().getParenthesesAttributes(), "(");
String separator = ", ";
PsiExpression[] expressions = list.getExpressions();
for (int i = 0; i < expressions.length; i++) {
PsiExpression expression = expressions[i];
expression.accept(this);
if (i + 1 != expressions.length) appendStyledSpan(myBuffer, JavaHighlightingColors.COMMA, separator);
if (i + 1 != expressions.length) appendStyledSpan(myBuffer, getHighlightingManager().getCommaAttributes(), separator);
}
appendStyledSpan(myBuffer, JavaHighlightingColors.PARENTHESES, ")");
appendStyledSpan(myBuffer, getHighlightingManager().getParenthesesAttributes(), ")");
}
@Override
public void visitMethodCallExpression(PsiMethodCallExpression expression) {
appendStyledSpan(
myBuffer,
JavaHighlightingColors.METHOD_CALL_ATTRIBUTES,
getHighlightingManager().getMethodCallAttributes(),
StringUtil.escapeXmlEntities(expression.getMethodExpression().getText()));
expression.getArgumentList().accept(this);
}
@@ -2487,8 +2536,8 @@ public class JavaDocInfoGenerator {
}
}
public static void generateTooltipAnnotations(PsiModifierListOwner owner, @Nls StringBuilder buffer) {
generateAnnotations(buffer, owner, SignaturePlace.ToolTip, true, true);
public void generateTooltipAnnotations(PsiModifierListOwner owner, @Nls StringBuilder buffer) {
generateAnnotations(buffer, owner, SignaturePlace.ToolTip, true, true, false);
}
private enum SignaturePlace {
@@ -2,6 +2,7 @@
package com.intellij.codeInsight.javadoc;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull;
@@ -13,20 +14,37 @@ public class JavaDocInfoGeneratorFactory {
}
protected JavaDocInfoGenerator createImpl(@NotNull Project project, @Nullable PsiElement element) {
return new JavaDocInfoGenerator(project, element, false);
return new JavaDocInfoGenerator(
project,
element,
JavaDocHighlightingManagerImpl.getInstance(),
false,
EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled());
}
protected JavaDocInfoGenerator createImpl(@NotNull Project project, @Nullable PsiElement element, boolean isGenerationForRenderedDoc) {
return new JavaDocInfoGenerator(project, element, isGenerationForRenderedDoc);
protected JavaDocInfoGenerator createImpl(
@NotNull Project project,
@Nullable PsiElement element,
@NotNull JavaDocHighlightingManager highlightingManager,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting
) {
return new JavaDocInfoGenerator(project, element, highlightingManager, isGenerationForRenderedDoc, doSyntaxHighlighting);
}
@NotNull
public static JavaDocInfoGenerator create(@NotNull Project project, @Nullable PsiElement element) {
return getInstance().createImpl(project, element, false);
return getInstance().createImpl(project, element);
}
@NotNull
public static JavaDocInfoGenerator create(@NotNull Project project, @Nullable PsiElement element, boolean isGenerationForRenderedDoc) {
return getInstance().createImpl(project, element, isGenerationForRenderedDoc);
public static JavaDocInfoGenerator create(
@NotNull Project project,
@Nullable PsiElement element,
@NotNull JavaDocHighlightingManager highlightingManager,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting
) {
return getInstance().createImpl(project, element, highlightingManager, isGenerationForRenderedDoc, doSyntaxHighlighting);
}
}
@@ -27,7 +27,7 @@ public class NonCodeAnnotationGenerator {
myOutput = output;
}
void explainAnnotations() {
void explainAnnotations(boolean isForRenderedFoc, boolean doSyntaxHighlighting) {
MultiMap<PsiModifierListOwner, AnnotationDocGenerator> generators = getSignatureNonCodeAnnotations(myOwner);
if (generators.isEmpty()) return;
@@ -38,12 +38,12 @@ public class NonCodeAnnotationGenerator {
generators.keySet().forEach(owner -> {
myOutput.append("<p>");
if (generators.size() > 1) {
myOutput.append(getKind(owner)).append(" <code>").append(((PsiNamedElement)owner).getName()).append("</code>: ");
myOutput.append(getKind(owner)).append(" <code>").append(((PsiNamedElement)owner).getName()).append("</code>: ").append("<br>");
}
List<AnnotationDocGenerator> annotations = new ArrayList<>(generators.get(owner));
for (int i = 0; i < annotations.size(); i++) {
if (i > 0) myOutput.append(" ");
annotations.get(i).generateAnnotation(myOutput, AnnotationFormat.JavaDocComplete);
if (i > 0) myOutput.append("<br>");
annotations.get(i).generateAnnotation(myOutput, AnnotationFormat.JavaDocComplete, true, isForRenderedFoc, doSyntaxHighlighting);
}
});
myOutput.append(DocumentationMarkup.SECTION_END);
@@ -6,24 +6,23 @@ import com.intellij.codeInsight.CodeInsightSettings;
import com.intellij.codeInsight.completion.CompletionMemory;
import com.intellij.codeInsight.daemon.impl.analysis.JavaModuleGraphUtil;
import com.intellij.codeInsight.documentation.DocumentationManagerProtocol;
import com.intellij.codeInsight.documentation.DocumentationManagerUtil;
import com.intellij.codeInsight.documentation.PlatformDocumentationUtil;
import com.intellij.codeInsight.documentation.QuickDocUtil;
import com.intellij.codeInsight.editorActions.CodeDocumentationUtil;
import com.intellij.codeInsight.javadoc.JavaDocExternalFilter;
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator;
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory;
import com.intellij.codeInsight.javadoc.JavaDocUtil;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.codeInsight.javadoc.*;
import com.intellij.ide.util.PackageUtil;
import com.intellij.java.JavaBundle;
import com.intellij.lang.CodeDocumentationAwareCommenter;
import com.intellij.lang.LanguageCommenters;
import com.intellij.lang.documentation.CodeDocumentationProvider;
import com.intellij.lang.documentation.CompositeDocumentationProvider;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.lang.documentation.DocumentationProviderEx;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.ProcessCanceledException;
@@ -35,6 +34,7 @@ import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.HtmlChunk;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
@@ -61,7 +61,6 @@ import org.jetbrains.builtInWebServer.BuiltInWebBrowserUrlProviderKt;
import java.util.*;
import java.util.function.Consumer;
import static com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil.*;
import static com.intellij.util.ObjectUtils.notNull;
/**
@@ -78,6 +77,37 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
public static final String HTML_EXTENSION = ".html";
public static final String PACKAGE_SUMMARY_FILE = "package-summary.html";
protected static @NotNull StringBuilder appendStyledSpan(
@NotNull StringBuilder buffer,
@NotNull TextAttributes attributes,
@Nullable String value
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value);
}
else {
buffer.append(value);
}
return buffer;
}
private static void appendStyledSpan(
@NotNull StringBuilder buffer,
@Nullable String value,
String @NotNull ... properties
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, value, properties);
}
else {
buffer.append(value);
}
}
protected static boolean doSyntaxHighlighting() {
return EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled();
}
@Override
public @Nls String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) {
return QuickDocUtil.inferLinkFromFullDocumentation(this, element, originalElement,
@@ -119,6 +149,65 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
return substitutor;
}
@Override
public @Nullable HtmlChunk getLocationInfo(@Nullable PsiElement element) {
if (element == null) return null;
HtmlChunk baseInfo = DocumentationProviderEx.getDefaultLocationInfo(element);
JavaDocHighlightingManager highlightingManager = JavaDocHighlightingManagerImpl.getInstance();
@NlsSafe String ownerLink = null;
String ownerIcon = null;
if (element instanceof PsiClass) {
PsiFile file = element.getContainingFile();
if (file instanceof PsiJavaFile) {
String packageName = ((PsiJavaFile)file).getPackageName();
if (!packageName.isEmpty()) {
PsiPackage aPackage = JavaPsiFacade.getInstance(file.getProject()).findPackage(packageName);
StringBuilder packageFqnBuilder = new StringBuilder();
appendStyledSpan(packageFqnBuilder, highlightingManager.getClassNameAttributes(), packageName);
ownerLink = generateLink(aPackage, packageFqnBuilder.toString(), false, false);
ownerIcon = "AllIcons.Nodes.Package";
}
}
}
else if (element instanceof PsiMember) {
PsiClass parentClass = ((PsiMember)element).getContainingClass();
if (parentClass != null && !PsiUtil.isArrayClass(parentClass)) {
String qName = parentClass.getQualifiedName();
if (qName != null) {
StringBuilder classFqnBuilder = new StringBuilder();
appendStyledSpan(classFqnBuilder, highlightingManager.getClassNameAttributes(), qName);
generateTypeParameters(parentClass, classFqnBuilder, highlightingManager);
ownerLink = generateLink(parentClass, classFqnBuilder.toString(), false, false);
ownerIcon = "AllIcons.Nodes.Class";
}
}
}
if (ownerLink != null) {
return HtmlChunk.fragment(
HtmlChunk.tag("icon").attr("src", ownerIcon),
HtmlChunk.nbsp(),
HtmlChunk.raw(ownerLink),
HtmlChunk.br(),
baseInfo != null ? baseInfo : HtmlChunk.empty()
);
}
return baseInfo;
}
private static String generateLink(PsiElement element, String label, boolean plainLink, boolean isRenderedDoc) {
String refText = JavaDocUtil.getReferenceText(element.getProject(), element);
if (refText != null) {
StringBuilder linkBuilder = new StringBuilder();
DocumentationManagerUtil.createHyperlink(linkBuilder, element, refText, label, plainLink, isRenderedDoc);
return linkBuilder.toString();
}
return null;
}
@Override
public List<String> getUrlFor(final PsiElement element, final PsiElement originalElement) {
return getExternalJavaDocUrl(element);
@@ -132,16 +221,17 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
private static void generateInitializer(StringBuilder buffer, PsiVariable variable) {
PsiExpression initializer = variable.getInitializer();
if (initializer != null) {
JavaDocInfoGenerator.appendExpressionValue(buffer, initializer);
JavaDocInfoGenerator generator = JavaDocInfoGeneratorFactory.create(variable.getProject(), null);
generator.appendExpressionValue(buffer, initializer);
PsiExpression constantInitializer = JavaDocInfoGenerator.calcInitializerExpression(variable);
if (constantInitializer != null) {
JavaDocInfoGenerator.appendExpressionValue(buffer, constantInitializer);
generator.appendExpressionValue(buffer, constantInitializer);
}
}
}
private static void generateModifiers(StringBuilder buffer, PsiModifierListOwner element) {
JavaDocInfoGenerator.generateModifiers(buffer, element, false);
JavaDocInfoGeneratorFactory.create(element.getProject(), null).generateModifiers(buffer, element, false);
}
private static @NlsSafe String generatePackageInfo(PsiPackage aPackage) {
@@ -170,12 +260,13 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
if (index.isInLibrary(file)) {
index.getOrderEntriesForFile(file).stream()
.filter(LibraryOrSdkOrderEntry.class::isInstance).findFirst()
.ifPresent(entry -> buffer.append('[').append(StringUtil.escapeXmlEntities(entry.getPresentableName())).append("] "));
.ifPresent(
entry -> appendStyledSpan(buffer, "[" + StringUtil.escapeXmlEntities(entry.getPresentableName()) + "] ", "color: #909090"));
}
else {
Module module = index.getModuleForFile(file);
if (module != null) {
buffer.append('[').append(module.getName()).append("] ");
appendStyledSpan(buffer, "[" + module.getName() + "] ", "color: #909090");
}
}
}
@@ -186,94 +277,121 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
if (aClass instanceof PsiAnonymousClass) return JavaElementKind.ANONYMOUS_CLASS.subject();
JavaDocInfoGenerator docInfoGenerator = JavaDocInfoGeneratorFactory.create(
aClass.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), false, doSyntaxHighlighting());
generateOrderEntryAndPackageInfo(buffer, aClass);
JavaDocInfoGenerator.generateTooltipAnnotations(aClass, buffer);
docInfoGenerator.generateTooltipAnnotations(aClass, buffer);
generateModifiers(buffer, aClass);
JavaDocHighlightingManagerImpl highlightingManager = JavaDocHighlightingManagerImpl.getInstance();
final String classString = aClass.isAnnotationType() ? '@' + PsiKeyword.INTERFACE :
aClass.isInterface() ? PsiKeyword.INTERFACE :
aClass instanceof PsiTypeParameter ? JavaBundle.message("java.terms.type.parameter") :
aClass.isEnum() ? PsiKeyword.ENUM :
aClass.isRecord() ? PsiKeyword.RECORD :
PsiKeyword.CLASS;
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, classString).append(" ");
appendStyledSpan(buffer, highlightingManager.getKeywordAttributes(), classString).append(" ");
appendStyledSpan(buffer, JavaDocInfoGenerator.getClassTextAttributes(aClass), JavaDocUtil.getShortestClassName(aClass, aClass));
appendStyledSpan(
buffer,
highlightingManager.getClassDeclarationAttributes(aClass),
JavaDocUtil.getShortestClassName(aClass, aClass));
generateTypeParameters(aClass, buffer);
generateTypeParameters(aClass, buffer, highlightingManager);
if (!aClass.isEnum() && !aClass.isAnnotationType()) {
PsiReferenceList extendsList = aClass.getExtendsList();
writeExtends(aClass, buffer, extendsList == null ? PsiClassType.EMPTY_ARRAY : extendsList.getReferencedTypes());
writeExtends(aClass, buffer, extendsList == null ? PsiClassType.EMPTY_ARRAY : extendsList.getReferencedTypes(), highlightingManager);
}
writeImplements(aClass, buffer, aClass.getImplementsListTypes());
writeImplements(aClass, buffer, aClass.getImplementsListTypes(), highlightingManager);
return buffer.toString();
}
public static void writeImplements(PsiClass aClass, StringBuilder buffer, PsiClassType[] refs) {
public static void writeImplements(
PsiClass aClass,
StringBuilder buffer,
PsiClassType[] refs,
JavaDocHighlightingManager highlightingManager
) {
if (refs.length > 0) {
newLine(buffer);
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "implements "); // <- Groovy keyword
writeTypeRefs(aClass, buffer, refs);
appendStyledSpan(buffer, highlightingManager.getKeywordAttributes(), "implements "); // <- Groovy keyword
writeTypeRefs(aClass, buffer, refs, highlightingManager);
}
}
public static void writeExtends(PsiClass aClass, StringBuilder buffer, PsiClassType[] refs) {
public static void writeExtends(
PsiClass aClass,
StringBuilder buffer,
PsiClassType[] refs,
JavaDocHighlightingManager highlightingManager
) {
if (refs.length > 0 || !aClass.isInterface() && !CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) {
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " extends "); // <- Groovy keyword
appendStyledSpan(buffer, highlightingManager.getKeywordAttributes(), " extends "); // <- Groovy keyword
if (refs.length == 0) {
appendStyledSpan(buffer, JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, "Object");
appendStyledSpan(buffer, highlightingManager.getClassNameAttributes(), "Object");
}
else {
writeTypeRefs(aClass, buffer, refs);
writeTypeRefs(aClass, buffer, refs, highlightingManager);
}
}
}
private static void writeTypeRefs(PsiClass aClass, StringBuilder buffer, PsiClassType[] refs) {
private static void writeTypeRefs(
PsiClass aClass,
StringBuilder buffer,
PsiClassType[] refs,
JavaDocHighlightingManager highlightingManager
) {
for (int i = 0; i < refs.length; i++) {
new JavaDocInfoGenerator(aClass.getProject(), null, false)
JavaDocInfoGeneratorFactory.create(aClass.getProject(), null, highlightingManager, false, doSyntaxHighlighting())
.generateType(buffer, refs[i], aClass, false, true);
if (i < refs.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", ");
appendStyledSpan(buffer, highlightingManager.getCommaAttributes(), ", ");
}
}
}
public static void generateTypeParameters(PsiTypeParameterListOwner typeParameterOwner, StringBuilder buffer) {
public static void generateTypeParameters(
PsiTypeParameterListOwner typeParameterOwner,
StringBuilder buffer,
JavaDocHighlightingManager highlightingManager
) {
if (typeParameterOwner.hasTypeParameters()) {
PsiTypeParameter[] params = typeParameterOwner.getTypeParameters();
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, "&lt;");
appendStyledSpan(buffer, highlightingManager.getOperationSignAttributes(), "&lt;");
for (int i = 0; i < params.length; i++) {
PsiTypeParameter p = params[i];
buffer.append(p.getName());
appendStyledSpan(buffer, highlightingManager.getTypeParameterNameAttributes(), p.getName());
PsiClassType[] refs = p.getExtendsList().getReferencedTypes();
if (refs.length > 0) {
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " extends "); // <- Groovy keyword
appendStyledSpan(buffer, highlightingManager.getKeywordAttributes(), " extends "); // <- Groovy keyword
for (int j = 0; j < refs.length; j++) {
new JavaDocInfoGenerator(typeParameterOwner.getProject(), null, false)
JavaDocInfoGeneratorFactory.create(typeParameterOwner.getProject(), null)
.generateType(buffer, refs[j], typeParameterOwner, false, true);
if (j < refs.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " & ");
appendStyledSpan(buffer, highlightingManager.getOperationSignAttributes(), " & ");
}
}
}
if (i < params.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", ");
appendStyledSpan(buffer, highlightingManager.getCommaAttributes(), ", ");
}
}
appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, "&gt;");
appendStyledSpan(buffer, highlightingManager.getOperationSignAttributes(), "&gt;");
}
}
@@ -282,53 +400,62 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
PsiClass parentClass = method.getContainingClass();
JavaDocInfoGenerator docInfoGenerator = JavaDocInfoGeneratorFactory.create(
method.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), false, doSyntaxHighlighting());
JavaDocHighlightingManagerImpl highlightingManager = JavaDocHighlightingManagerImpl.getInstance();
if (parentClass != null && !(parentClass instanceof PsiAnonymousClass)) {
if (method.isConstructor()) {
generateOrderEntryAndPackageInfo(buffer, parentClass);
}
appendStyledSpan(
buffer, JavaDocInfoGenerator.getClassTextAttributes(parentClass), JavaDocUtil.getShortestClassName(parentClass, method));
buffer,
highlightingManager.getClassDeclarationAttributes(parentClass),
JavaDocUtil.getShortestClassName(parentClass, method)
);
newLine(buffer);
}
JavaDocInfoGenerator.generateTooltipAnnotations(method, buffer);
docInfoGenerator.generateTooltipAnnotations(method, buffer);
generateModifiers(buffer, method);
generateTypeParameters(method, buffer);
if (method.getReturnType() != null) {
new JavaDocInfoGenerator(method.getProject(), null, false)
.generateType(buffer, substitutor.substitute(method.getReturnType()), method, false, true);
generateTypeParameters(method, buffer, highlightingManager);
if (method.hasTypeParameters()) {
buffer.append(" ");
}
appendStyledSpan(buffer, JavaDocInfoGenerator.getMethodDeclarationTextAttributes(method), method.getName());
if (method.getReturnType() != null) {
docInfoGenerator.generateType(buffer, substitutor.substitute(method.getReturnType()), method, false, true);
buffer.append(" ");
}
appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, "(");
appendStyledSpan(buffer, highlightingManager.getMethodDeclarationAttributes(method), method.getName());
appendStyledSpan(buffer, highlightingManager.getParenthesesAttributes(), "(");
PsiParameter[] params = method.getParameterList().getParameters();
for (int i = 0; i < params.length; i++) {
PsiParameter param = params[i];
new JavaDocInfoGenerator(method.getProject(), null, false)
.generateType(buffer, substitutor.substitute(param.getType()), method, false, true);
docInfoGenerator.generateType(buffer, substitutor.substitute(param.getType()), method, false, true);
buffer.append(" ");
appendStyledSpan(buffer, JavaHighlightingColors.PARAMETER_ATTRIBUTES, param.getName());
appendStyledSpan(buffer, highlightingManager.getParameterAttributes(), param.getName());
if (i < params.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", ");
appendStyledSpan(buffer, highlightingManager.getCommaAttributes(), ", ");
}
}
appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, ")");
appendStyledSpan(buffer, highlightingManager.getParenthesesAttributes(), ")");
PsiClassType[] refs = method.getThrowsList().getReferencedTypes();
if (refs.length > 0) {
newLine(buffer);
appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " throws ");
appendStyledSpan(buffer, highlightingManager.getKeywordAttributes(), " throws ");
for (int i = 0; i < refs.length; i++) {
PsiClass throwsClass = refs[i].resolve();
if (throwsClass != null) {
appendStyledSpan(buffer, JavaDocInfoGenerator.getClassTextAttributes(throwsClass),
appendStyledSpan(buffer, highlightingManager.getClassDeclarationAttributes(throwsClass),
JavaDocUtil.getShortestClassName(throwsClass, method));
}
else {
@@ -336,7 +463,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
}
if (i < refs.length - 1) {
appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", ");
appendStyledSpan(buffer, highlightingManager.getCommaAttributes(), ", ");
}
}
}
@@ -350,17 +477,22 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
if (parentClass != null && !(parentClass instanceof PsiAnonymousClass)) {
appendStyledSpan(
buffer, JavaDocInfoGenerator.getClassTextAttributes(parentClass), JavaDocUtil.getShortestClassName(parentClass, field));
buffer,
JavaDocHighlightingManagerImpl.getInstance().getClassDeclarationAttributes(parentClass),
JavaDocUtil.getShortestClassName(parentClass, field)
);
newLine(buffer);
}
JavaDocInfoGenerator.generateTooltipAnnotations(field, buffer);
JavaDocInfoGenerator docInfoGenerator = JavaDocInfoGeneratorFactory.create(
field.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), false, doSyntaxHighlighting());
docInfoGenerator.generateTooltipAnnotations(field, buffer);
generateModifiers(buffer, field);
new JavaDocInfoGenerator(field.getProject(), null, false)
.generateType(buffer, substitutor.substitute(field.getType()), field, false, true);
docInfoGenerator.generateType(buffer, substitutor.substitute(field.getType()), field, false, true);
buffer.append(" ");
appendStyledSpan(buffer, JavaDocInfoGenerator.getFieldTextAttributes(field), field.getName());
appendStyledSpan(buffer, JavaDocHighlightingManagerImpl.getInstance().getFieldDeclarationAttributes(field), field.getName());
generateInitializer(buffer, field);
@@ -373,12 +505,12 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
generateModifiers(buffer, variable);
new JavaDocInfoGenerator(variable.getProject(), null, false)
JavaDocInfoGeneratorFactory.create(variable.getProject(), null)
.generateType(buffer, variable.getType(), variable, false, true);
buffer.append(" ");
appendStyledSpan(buffer, JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES, variable.getName());
appendStyledSpan(buffer, JavaDocHighlightingManagerImpl.getInstance().getLocalVariableAttributes(), variable.getName());
generateInitializer(buffer, variable);
return buffer.toString();
@@ -391,9 +523,9 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
VirtualFile file = PsiImplUtil.getModuleVirtualFile(module);
generateOrderEntryInfo(sb, file, module.getProject());
appendStyledSpan(sb, JavaHighlightingColors.KEYWORD, PsiKeyword.MODULE);
appendStyledSpan(sb, JavaDocHighlightingManagerImpl.getInstance().getKeywordAttributes(), PsiKeyword.MODULE);
sb.append(' ');
appendStyledSpan(sb, JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, module.getName());
appendStyledSpan(sb, JavaDocHighlightingManagerImpl.getInstance().getClassNameAttributes(), module.getName());
return sb.toString();
}
@@ -595,7 +727,8 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
public @Nls @Nullable String generateRenderedDoc(@NotNull PsiDocCommentBase comment) {
PsiElement target = comment.getOwner();
if (target == null) target = comment;
JavaDocInfoGenerator generator = JavaDocInfoGeneratorFactory.create(target.getProject(), target, true);
JavaDocInfoGenerator generator =
JavaDocInfoGeneratorFactory.create(target.getProject(), target, JavaDocHighlightingManagerImpl.getInstance(), true, doSyntaxHighlighting());
return JavaDocExternalFilter.filterInternalDocInfo(generator.generateRenderedDocInfo());
}
@@ -656,7 +789,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
@Nullable
public static String generateExternalJavadoc(@NotNull final PsiElement element, @Nullable List<String> docURLs) {
final JavaDocInfoGenerator javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(element.getProject(), element, false);
final JavaDocInfoGenerator javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(element.getProject(), element);
return generateExternalJavadoc(javaDocInfoGenerator, docURLs);
}
@@ -26,4 +26,4 @@
</ul>
</div>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`genericMethod(Class&lt;?&gt;)` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://com.jetbrains.GenericClass"><code><span style="color:#000000;">com.jetbrains.GenericClass</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`genericMethod(Class&lt;?&gt;)` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -19,4 +19,4 @@
<div class="block"><a href="psi_element://com.jetbrains.LinkBetweenMethods#m2()"><code>m2()</code></a></div>
</li>
</ul>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`m1()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://com.jetbrains.LinkBetweenMethods"><code><span style="color:#000000;">com.jetbrains.LinkBetweenMethods</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`m1()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -24,4 +24,4 @@
</ul>
</div>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`SimpleInterface` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<a href="psi_element://com.jetbrains"><code><span style="color:#000000;">com.jetbrains</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`SimpleInterface` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -32,4 +32,4 @@ extends java.lang.Object</pre>
</li>
</ul>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`ClassWithRefLink` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<a href="psi_element://com.jetbrains"><code><span style="color:#000000;">com.jetbrains</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`ClassWithRefLink` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -26,4 +26,4 @@
</ul>
</div>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`param()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://com.jetbrains.TestAnnotation"><code><span style="color:#000000;">com.jetbrains.TestAnnotation</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`param()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><font color=red>@</font>&nbsp;
<span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code style='font-size:96%;'><span style="color:#808000;">Deprecated</span></code></a>&nbsp;
<span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">null</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><table class='sections'></table>
<span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;
<span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">null</span></pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code style='font-size:96%;'><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">s</span><span style="">,
</span> <span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code style='font-size:96%;'><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">p</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">s</span><span style="">,</span>
<span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">p</span><br><span style="">)</span></pre></div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>API Note:</td><td valign='top'><p> my api note </td><tr><td valign='top' class='section'><p>Implementation<br>Requirements:</td><td valign='top'><p> my impl spec </td><tr><td valign='top' class='section'><p>Implementation<br>Note:</td><td valign='top'><p> my impl note</td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>API Note:</td><td valign='top'><p> my api note </td><tr><td valign='top' class='section'><p>Implementation<br>Requirements:</td><td valign='top'><p> my impl spec </td><tr><td valign='top' class='section'><p>Implementation<br>Note:</td><td valign='top'><p> my impl note</td></table>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">MethodTypeParam</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">T</span>&gt; &ndash; type param</td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">MethodTypeParam</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">T</span>&gt; &ndash; type param</td></table>
@@ -1 +1 @@
[&lt; java 1.7 &gt;] <a href="psi_element://java.util">java.util</a><br/> <span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">ArrayList</span><span style="">&lt;</span>E<span style="">&gt;</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#000000;"><a href="psi_element://java.util.AbstractList">AbstractList</a></span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span><br/> <span style="color:#000080;font-weight:bold;">implements </span><span style="color:#000000;"><a href="psi_element://java.util.List">List</a></span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span><span style="">, </span><span style="color:#000000;"><a href="psi_element://java.util.RandomAccess">RandomAccess</a></span><span style="">, </span><span style="color:#000000;"><a href="psi_element://java.lang.Cloneable">Cloneable</a></span><span style="">, </span><span style="color:#000000;"><a href="psi_element://java.io.Serializable">Serializable</a></span>
<span style="color: #909090">[&lt; java 1.7 &gt;] </span>java.util<br/> <span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">ArrayList</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#000000;"><a href="psi_element://java.util.AbstractList">AbstractList</a></span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span><br/> <span style="color:#000080;font-weight:bold;">implements </span><span style="color:#000000;"><a href="psi_element://java.util.List">List</a></span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span><span style="">, </span><span style="color:#000000;"><a href="psi_element://java.util.RandomAccess">RandomAccess</a></span><span style="">, </span><span style="color:#000000;"><a href="psi_element://java.lang.Cloneable">Cloneable</a></span><span style="">, </span><span style="color:#000000;"><a href="psi_element://java.io.Serializable">Serializable</a></span>
@@ -1,3 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://Bar"><code style='font-size:96%;'><span style="color:#808000;">Bar</span></code></a><span style="">(</span><a href="psi_element://Baz#CONST"><code style='font-size:96%;'><span style="color:#000000;">Baz</span><span style="">.</span><span style="color:#660e7a;font-style:italic;">CONST</span></code></a><span style="">,&nbsp;</span><span style="">value</span><span style=""> = </span><span style="">{</span><a href="psi_element://Baz#CONST"><code style='font-size:96%;'><span style="color:#000000;">Baz</span><span style="">.</span><span style="color:#660e7a;font-style:italic;">CONST</span></code></a><span style="">}</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://Bar"><code><span style="color:#808000;">Bar</span></code></a><span style="">(</span><a href="psi_element://Baz#CONST"><code><span style="color:#000000;">Baz</span><span style="">.</span><span style="color:#660e7a;font-style:italic;">CONST</span></code></a><span style="">,&nbsp;</span><span style="">value</span><span style=""> = </span><span style="">{</span><a href="psi_element://Baz#CONST"><code><span style="color:#000000;">Baz</span><span style="">.</span><span style="color:#660e7a;font-style:italic;">CONST</span></code></a><span style="">}</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span></pre></div><table class='sections'></table>
@@ -1,4 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">foo</span><br><span class='grayed'>defined in </span><a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">foo</span></pre></div><div class='content'>
<pre>
<code><span style=""><span style="color:#000080;font-weight:bold;">class&#32;</span><span style="">Clazzz&#32;{</span><span style="">&#32;&#32;def&#32;f[U](u:&#32;U)&#32;{}</span><span style=""></span><span style="">&#32;&#32;val&#32;a&#32;=&#32;</span><span style="color:#0000ff;">1</span><span style="">}</span></span></code>
</pre>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span><span style=""> = </span><span style="color:#000000;">foo</span><span style="">(</span><span style="color:#008000;font-weight:bold;">""</span><span style="">, </span><span style="color:#008000;font-weight:bold;">""</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000000;">foo</span><span style="">(</span><span style="color:#008000;font-weight:bold;">""</span><span style="">, </span><span style="color:#008000;font-weight:bold;">""</span><span style="">)</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static final</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;">field</span><span style=""> = </span><span style="color:#0000ff;">1&#32;</span><span style="">+&#32;</span><span style="color:#0000ff;">1</span><span class='grayed'><span style=""> = </span><span style="color:#0000ff;">2</span></span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static final</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;">field</span> <span style="">= </span><span style="color:#0000ff;">1&#32;</span><span style="">+&#32;</span><span style="color:#0000ff;">1</span><span class='grayed'><span style=""> = </span><span style="color:#0000ff;">2</span></span></pre></div><table class='sections'></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">getMyFoo</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://FooBar"><code><span style="color:#000000;">FooBar</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From field:</td><td valign='top'><p><a href="psi_element://FooBar#myFoo"><code><span style="color:#660e7a;font-weight:bold;">myFoo</span></code></a><br>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">getMyFoo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From field:</td><td valign='top'><p><a href="psi_element://FooBar#myFoo"><code><span style="color:#660e7a;font-weight:bold;">myFoo</span></code></a><br>
foo bar baz
</td></table>
</td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://FooBar"><code><span style="color:#000000;">FooBar</span></code></a><br/></div>
@@ -1,6 +1,5 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public final</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">String</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>
<span style="color:#000080;font-weight:bold;">implements </span><a href="psi_element://java.io.Serializable"><code><span style="color:#000000;">java.io.Serializable</span></code></a><span style="">,</span>&nbsp;<a href="psi_element://java.lang.Comparable"><code><span style="color:#000000;">Comparable</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">,</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">CharSequence</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://java.lang"><code><span style="color:#000000;">java.lang</span></code></a></pre></div><div class='content'>
<span style="color:#000080;font-weight:bold;">implements</span> <a href="psi_element://java.io.Serializable"><code><span style="color:#000000;">java.io.Serializable</span></code></a><span style="">,</span>&nbsp;<a href="psi_element://java.lang.Comparable"><code><span style="color:#000000;">Comparable</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">,</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">CharSequence</span></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.
@@ -1,8 +1,8 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code style='font-size:96%;'><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">public abstract</span>&nbsp;<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">o</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://java.util.List"><code><span style="color:#000000;">java.util.List<span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span></span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">public abstract</span>&nbsp;<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><br> <a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">o</span><br><span style="">)</span></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>.
</div><table class='sections'><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this list is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this list contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#000000;">ClassCastException</span></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><span style="color:#000000;">NullPointerException</span></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>External<br> annotations:</td><td valign='top'><p><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></td></table><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>
</div><table class='sections'><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this list is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this list contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#000000;">ClassCastException</span></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><span style="color:#000000;">NullPointerException</span></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>External<br> annotations:</td><td valign='top'><p><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></td></table><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">java.util.List</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>
@@ -1,8 +1,8 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code style='font-size:96%;'><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">o</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://My"><code><span style="color:#000000;">My</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From interface:</td><td valign='top'><p><a href="psi_element://java.util.Collection"><code><span style="color:#000000;">java.util.Collection</span></code></a><br>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><br> <a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">o</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From interface:</td><td valign='top'><p><a href="psi_element://java.util.Collection"><code><span style="color:#000000;">java.util.Collection</span></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>.
</td><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a><br><a href="psi_element://I#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://I"><code><span style="color:#000000;">I</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this collection is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this collection contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#000000;">ClassCastException</span></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><span style="color:#000000;">NullPointerException</span></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><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
</td><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a><br><a href="psi_element://I#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://I"><code><span style="color:#000000;">I</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this collection is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this collection contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#000000;">ClassCastException</span></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><span style="color:#000000;">NullPointerException</span></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><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://My"><code><span style="color:#000000;">My</span></code></a><br/></div>
@@ -1,4 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">C</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">C</span></pre></div><div class='content'>
a &lt;&lt; b
</div><table class='sections'><p></table>
@@ -1,5 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">C</span>
<span style="color:#000080;font-weight:bold;">extends </span>java.lang.Object</pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">C</span></pre></div><div class='content'>
some text
</div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p>System.out</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a> <span style="color:#660e7a;">A</span><br><span class='grayed'>defined in </span><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a>
<span class='grayed'>Enum constant ordinal: 0</span></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a> <span style="color:#660e7a;">A</span>
<span class='grayed'>// Enum constant ordinal: 0</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<span style="color:#000000;"><a href="psi_element://E">E</a></span><br/> <span style="color:#000000;"><a href="psi_element://E">E</a></span> <span style="color:#660e7a;">A</span><br/><span class='grayed'>Enum constant ordinal: 0</span>
<span style="color:#000000;"><a href="psi_element://E">E</a></span><br/> <span style="color:#000000;"><a href="psi_element://E">E</a></span> <span style="color:#660e7a;">A</span><br/><span class='grayed'>// Enum constant ordinal: 0</span>
@@ -1,4 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code style='font-size:96%;'><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_&#32;-&gt;&#32;param1"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">static</span>&nbsp;<span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="color:#000000;">valueOf</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">i</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://En"><code><span style="color:#000000;">En</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_&#32;-&gt;&#32;param1"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">static</span>&nbsp;<span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="color:#000000;">valueOf</span><span style="">(</span><br> <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">i</span><br><span style="">)</span></pre></div><div class='content'>
myjavadoc
</div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">i</span> &ndash; </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p></td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_&#32;-&gt;&#32;param1"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
</div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">i</span></td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p></td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_&#32;-&gt;&#32;param1"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
@@ -1,4 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Pattern</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Pattern</span></pre></div><div class='content'>
\W \n
</div><table class='sections'><p></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">foo</span><br><span class='grayed'>defined in </span><a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">foo</span></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"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><div class='content'> The value of B is <a href="psi_element://A#B">"a&lt;b"</a>. </div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span></pre></div><div class='content'> The value of B is <a href="psi_element://A#B">"a&lt;b"</a>. </div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span><span style="">[]</span> <span style="color:#660e7a;font-style:italic;">x</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">new </span><span style="color:#000080;font-weight:bold;">int</span><span style="">[]</span><span style="">{</span><span style="color:#0000ff;">1</span><span style="">,&#32;</span><span style="color:#0000ff;">2</span><span style="">,&#32;</span><span style="color:#0000ff;">3</span><span style="">}</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span><span style="">[]</span> <span style="color:#660e7a;font-style:italic;">x</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><span style="color:#000080;font-weight:bold;">int</span><span style="">[]</span><span style="">{</span><span style="color:#0000ff;">1</span><span style="">,&#32;</span><span style="color:#0000ff;">2</span><span style="">,&#32;</span><span style="color:#0000ff;">3</span><span style="">}</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <font color=red>java.util.function.Consumer&lt;Integer&gt;</font> <span style="color:#660e7a;font-style:italic;">F</span><span style=""> = </span><span style="">i&#32;-&gt;&#32;System.out.println(i)</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <font color=red>java.util.function.Consumer&lt;Integer&gt;</font> <span style="color:#660e7a;font-style:italic;">F</span> <span style="">= </span><span style="">i&#32;-&gt;&#32;System.out.println(i)</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span><span style="">[]</span> <span style="color:#660e7a;font-style:italic;">x</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">new </span><span style="color:#000080;font-weight:bold;">int</span><span style="">[<span style="color:#0000ff;">1</span><span style="">]</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span><span style="">[]</span> <span style="color:#660e7a;font-style:italic;">x</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><span style="color:#000080;font-weight:bold;">int</span><span style="">[<span style="color:#0000ff;">1</span><span style="">]</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-style:italic;">JAVADOC_ME</span><span style=""> = </span><span style="color:#0000ff;">23</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><div class='content'> The value of the field is 23. </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-style:italic;">JAVADOC_ME</span> <span style="">= </span><span style="color:#0000ff;">23</span></pre></div><div class='content'> The value of the field is 23. </div><table class='sections'><p></table>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">htmlLink</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'> <a href="psi_element://other">link</a> </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">htmlLink</span></pre></div><div class='content'> <a href="psi_element://other">link</a> </div><table class='sections'><p></table>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">htmlLinkDeep</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://pack"><code><span style="color:#000000;">pack</span></code></a></pre></div><div class='content'> <a href="psi_element://other">link</a> </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">htmlLinkDeep</span></pre></div><div class='content'> <a href="psi_element://other">link</a> </div><table class='sections'><p></table>
@@ -1,4 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">A</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://pack"><code><span style="color:#000000;">pack</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">A</span></pre></div><div class='content'>
<a href="psi_element://pack###section2">link</a>
</div><table class='sections'><p></table>
@@ -1,5 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span></pre></div><div class='content'>
<a name="section1">section one</a>
text
<a href="psi_element://Test###section1">link up</a>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">read</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://Idea4780"><code><span style="color:#000000;">Idea4780</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; if an I/O error occurs while reading. <p><a href="psi_element://java.io.EOFException"><code><span style="color:#000000;">EOFException</span></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>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; if an I/O error occurs while reading. <p><a href="psi_element://java.io.EOFException"><code><span style="color:#000000;">EOFException</span></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"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://InheritedDocInThrows"><code><span style="color:#000000;">InheritedDocInThrows</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; la-la-la</td></table>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; la-la-la</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://InheritedDocInThrows1"><code><span style="color:#000000;">InheritedDocInThrows1</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; comment</td></table>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; comment</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">strings</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"A&lt;BLANK&gt;B"</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">strings</span> <span style="">= </span><span style="color:#008000;font-weight:bold;">"A&lt;BLANK&gt;B"</span></pre></div><table class='sections'></table>
@@ -1 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#660e7a;font-weight:bold;">strings</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">, </span><span style="color:#000000;">Collections.singleton</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Double"><code><span style="color:#000000;">Double</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">)</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#660e7a;font-weight:bold;">strings</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">, </span><span style="color:#000000;">Collections.singleton</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Double"><code><span style="color:#000000;">Double</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">)</span><span style="">)</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">field</span><span style=""> = </span><span style="">anotherField</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="">anotherField</span></pre></div><table class='sections'></table>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'> <pre>abc</pre> </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span></pre></div><div class='content'> <pre>abc</pre> </div><table class='sections'><p></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">foo</span><br><span class='grayed'>defined in </span><a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-weight:bold;">foo</span></pre></div><div class='content'>
foo&lt;&gt;
</div><table class='sections'><p></table>
@@ -1,5 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span></pre></div><div class='content'>
<pre>
<code><span style=""><span style="">{@literal&#32;@Inject}</span><span style="color:#000080;font-weight:bold;">public&#32;class&#32;</span><span style="">Foo</span></span></code>
</pre>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span></pre></div>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">m</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">bar</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Bar"><code><span style="color:#000000;">Bar</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://Foo#m(int)"><code><span style="color:#000000;">m</span></code></a> in class <a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">bar</span> &ndash; description</td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">m</span><span style="">(</span><br> <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">bar</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://Foo#m(int)"><code><span style="color:#000000;">m</span></code></a> in class <a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">bar</span> &ndash; description</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">U</span><span style="">&gt;</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">m</span><span style="">(</span><span style="color:#20999d;">U</span>&nbsp;<span style="">u</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Bar"><code><span style="color:#000000;">Bar</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://Foo#m(java.lang.Object)"><code><span style="color:#000000;">m</span></code></a> in class <a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></td><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">U</span>&gt; &ndash; description</td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">U</span><span style="">&gt;</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">m</span><span style="">(</span><br> <span style="color:#20999d;">U</span>&nbsp;<span style="">u</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://Foo#m(java.lang.Object)"><code><span style="color:#000000;">m</span></code></a> in class <a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></td><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">U</span>&gt; &ndash; description</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">byte</span><span style="">[]</span> <span style="color:#660e7a;font-weight:bold;">bytes</span><span style=""> = </span><span style="color:#000000;">&quot;&amp;amp;&quot;.getBytes</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">byte</span><span style="">[]</span> <span style="color:#660e7a;font-weight:bold;">bytes</span> <span style="">= </span><span style="color:#000000;">&quot;&amp;amp;&quot;.getBytes</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.lang.Exception"><code><span style="color:#000000;">Exception</span></code></a><span style="">&gt;</span>&nbsp;<font color=red>@</font>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">drainTo</span><span style="">(</span><a href="psi_element://Consumer"><code><span style="color:#000000;">Consumer</span></code></a><span style="">&lt;</span><span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#20999d;">T</span><span style="">, </span><span style="color:#20999d;">E</span><span style="">&gt;</span>&nbsp;<span style="">consumer</span><span style="">,
</span> <a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">someParameter</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a><br><span class='grayed'>defined in </span><a href="psi_element://Producer"><code><span style="color:#000000;">Producer<span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span></span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a></td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.lang.Exception"><code><span style="color:#000000;">Exception</span></code></a><span style="">&gt;</span>&nbsp;<font color=red>@</font>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">drainTo</span><span style="">(</span><br> <a href="psi_element://Consumer"><code><span style="color:#000000;">Consumer</span></code></a><span style="">&lt;</span><span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#20999d;">T</span><span style="">, </span><span style="color:#20999d;">E</span><span style="">&gt;</span>&nbsp;<span style="">consumer</span><span style="">,</span>
<a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">someParameter</span><br><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a></td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="color:#20999d;">T</span>&nbsp;<span style="">t</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://MethodTypeParam"><code><span style="color:#000000;">MethodTypeParam</span></code></a></pre></div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <span style="color:#20999d;">T</span>&nbsp;<span style="">t</span><br><span style="">)</span></pre></div><table class='sections'><p></table>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'> <pre>a bc</pre> </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span></pre></div><div class='content'> <pre>a bc</pre> </div><table class='sections'><p></table>
@@ -1,2 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'> foobar </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Foo</span></pre></div><div class='content'> foobar </div><table class='sections'><p></table>
@@ -1,4 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">null</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">null</span></pre></div><div class='content'>
<pre>
foo
<p></p>
@@ -1,4 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">record</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends </span><font color=red>java.lang.Record</font></pre></div><div class='content'>
<span style="color:#000080;font-weight:bold;">extends</span> <font color=red>java.lang.Record</font></pre></div><div class='content'>
main comment
</div><table class='sections'><p><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">test</span> &ndash; simple description</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-style:italic;">JAVADOC_ME</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><div class='content'> Test </div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span> <span style="color:#000080;font-weight:bold;">int</span> <span style="color:#660e7a;font-style:italic;">JAVADOC_ME</span></pre></div><div class='content'> Test </div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a>&nbsp;<span style="">idx</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test<span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.lang.Number"><code><span style="color:#000000;">Number</span></code></a><span style="">&gt;</span></span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(java.lang.Number)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#000000;">remove</span><span style="">(Number)</span></code></a></td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><br> <a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a>&nbsp;<span style="">idx</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(java.lang.Number)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#000000;">remove</span><span style="">(Number)</span></code></a></td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#000000;">Number</span><span style="">&gt;</span></code></a><br/></div>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">idx</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test<span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span></span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(int)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#000000;">remove</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span><span style="">)</span></code></a></td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><br> <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">idx</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(int)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#000000;">remove</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span><span style="">)</span></code></a></td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span></code></a><br/></div>
@@ -1,5 +1,5 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code style='font-size:96%;'><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">values</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">values</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
Returns an array containing the constants of this enum
type, in the order they're declared. This method may be
used to iterate over the constants as follows:
@@ -8,4 +8,4 @@
System.out.println(c);
</pre>
</div><table class='sections'><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p>an array containing the constants of this enum type, in the order they're declared</td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
</div><table class='sections'><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p>an array containing the constants of this enum type, in the order they're declared</td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a><br/></div>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">CharSequence</span></code></a><span style=""> & </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.Cloneable"><code><span style="color:#000000;">Cloneable</span></code></a><span style="">&gt;</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">4</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">5</span><span style="">)</span>&nbsp;<span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">6</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="">&gt;</span>&nbsp;<span style="color:#000000;">bar</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">CharSequence</span></code></a><span style=""> & </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.Cloneable"><code><span style="color:#000000;">Cloneable</span></code></a><span style="">&gt;</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">4</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">5</span><span style="">)</span>&nbsp;<span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">6</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="">&gt;</span>&nbsp;<span style="color:#000000;">bar</span><span style="">(</span><span style="">)</span></pre></div><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a><br/></div>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a></pre></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a><br/></div>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends </span><span style="color:#808000;">@</span><a href="psi_element://Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Foo"><code style='font-size:96%;'><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span></pre></div><table class='sections'></table>
<span style="color:#000080;font-weight:bold;">extends</span> <span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span></pre></div><table class='sections'></table>
@@ -1,4 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span></pre></div><div class='content'>
a@b c@d
</div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><div class='content'> The value of A is <a href="psi_element://A#A">23</a>. </div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span></pre></div><div class='content'> The value of A is <a href="psi_element://A#A">23</a>. </div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></pre></div><div class='content'> The value of A is <a href="psi_element://A#A">23</a>. </div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">JAVADOC_ME</span><span style="">(</span><span style="">)</span></pre></div><div class='content'> The value of A is <a href="psi_element://A#A">23</a>. </div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">a</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span></pre></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">a</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span></pre></div>
@@ -75,7 +75,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(exprList, null)
def expected =
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">doFoo</span><span style=\"\">(</span><span style=\"\">)</span><br><span class=\'grayed\'>defined in </span><a href=\"psi_element://Foo\"><code><span style=\"color:#000000;\">Foo</span></code></a></pre></div><table class=\'sections\'><p></table>"
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">doFoo</span><span style=\"\">(</span><span style=\"\">)</span></pre></div><table class=\'sections\'><p></table>"
assert doc == expected
}
@@ -87,7 +87,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
class Foo {{
new Bar<String>().f<caret>oo();
}}""",
"<span style=\"color:#000000;\"><a href=\"psi_element://Bar\">Bar</a></span><br/> <span style=\"color:#000000;\"><a href=\"psi_element://java.util.List\">List</a></span><span style=\"\">&lt;</span><span style=\"color:#000000;\">String</span><span style=\"\">&gt;</span> <span style=\"color:#000000;\">foo</span><span style=\"\">(</span><span style=\"color:#000000;\">String</span> <span style=\"\">param</span><span style=\"\">)</span>")
"<span style=\"color:#000000;\">Bar</span><br/> <span style=\"color:#000000;\"><a href=\"psi_element://java.util.List\">List</a></span><span style=\"\">&lt;</span><span style=\"color:#000000;\">String</span><span style=\"\">&gt;</span> <span style=\"color:#000000;\">foo</span><span style=\"\">(</span><span style=\"color:#000000;\">String</span> <span style=\"\">param</span><span style=\"\">)</span>")
}
void testGenericField() {
@@ -97,7 +97,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
class Foo {{
new Bar<Integer>().fi<caret>eld
}}""",
"<span style=\"color:#000000;\"><a href=\"psi_element://Bar\">Bar</a></span><br/> <span style=\"color:#000000;\">Integer</span> <span style=\"color:#660e7a;font-weight:bold;\">field</span>")
"<span style=\"color:#000000;\">Bar</span><br/> <span style=\"color:#000000;\">Integer</span> <span style=\"color:#660e7a;font-weight:bold;\">field</span>")
}
void testMethodInAnonymousClass() {
@@ -124,7 +124,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
}
@java.lang.annotation.Documented
@interface Anno {} """,
"<span style=\"color:#000000;\"><a href=\"psi_element://Foo\">Foo</a></span><br/> <span style=\"color:#808000;\">@</span><span style=\"color:#808000;\"><a href=\"psi_element://Anno\">Anno</a></span>&nbsp;<br/><span style=\"color:#000080;font-weight:bold;\">private</span> <span style=\"color:#000080;font-weight:bold;\">void</span> <span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span>")
"<span style=\"color:#000000;\">Foo</span><br/> <span style=\"color:#808000;\">@</span><span style=\"color:#808000;\"><a href=\"psi_element://Anno\">Anno</a></span>&nbsp;<br/><span style=\"color:#000080;font-weight:bold;\">private</span> <span style=\"color:#000080;font-weight:bold;\">void</span> <span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span>")
}
void testInnerClass() {
@@ -139,7 +139,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
class Outer {
class Inner {}
}""",
"<span style=\"color:#000000;\"><a href=\"psi_element://C\">C</a></span><br/> <span style=\"color:#000000;\"><a href=\"psi_element://Outer.Inner\">Outer.Inner</a></span> <span style=\"color:#660e7a;font-weight:bold;\">field</span>")
"<span style=\"color:#000000;\">C</span><br/> <span style=\"color:#000000;\"><a href=\"psi_element://Outer.Inner\">Outer.Inner</a></span> <span style=\"color:#660e7a;font-weight:bold;\">field</span>")
}
void testAsterisksFiltering() {
@@ -157,7 +157,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">public</span>&nbsp;<span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span><br><span class=\'grayed\'>defined in </span><a href=\"psi_element://C\"><code><span style=\"color:#000000;\">C</span></code></a></pre></div><div class=\'content\'>\n For example, <a href=\"psi_element://java.lang.String#String(byte[], int, int, java.lang.String)\"><code><span style=\"color:#000000;\">String</span><span style=\"\">.</span><span style=\"color:#000000;\">String</span><span style=\"\">(</span><span style=\"color:#000080;font-weight:bold;\">byte</span><span style=\"\">[],&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;String)</span></code></a>.\n </div><table class=\'sections\'></table>"
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">public</span>&nbsp;<span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span></pre></div><div class=\'content\'>\n For example, <a href=\"psi_element://java.lang.String#String(byte[], int, int, java.lang.String)\"><code><span style=\"color:#000000;\">String</span><span style=\"\">.</span><span style=\"color:#000000;\">String</span><span style=\"\">(</span><span style=\"color:#000080;font-weight:bold;\">byte</span><span style=\"\">[],&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;String)</span></code></a>.\n </div><table class=\'sections\'></table>"
assert doc == expected
}
@@ -173,7 +173,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">public</span>&nbsp;<span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span><br><span class=\'grayed\'>defined in </span><a href=\"psi_element://C\"><code><span style=\"color:#000000;\">C</span></code></a></pre></div><div class=\'content\'> Visit the \"<code><span style=\"\"><span style=\"\">/login</span></span></code>\" URL. </div><table class=\'sections\'></table>"
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">public</span>&nbsp;<span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span></pre></div><div class=\'content\'> Visit the \"<code><span style=\"\"><span style=\"\">/login</span></span></code>\" URL. </div><table class=\'sections\'></table>"
assert doc == expected
}
@@ -217,7 +217,7 @@ class Bar {
def method = PsiTreeUtil.getParentOfType(myFixture.file.findElementAt(myFixture.editor.caretModel.offset), PsiMethod.class)
def doc = new JavaDocumentationProvider().generateDoc(method, null)
String expected = "<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">foo</span><span style=\"\">(</span><span style=\"\">)</span><br><span class=\'grayed\'>defined in </span><a href=\"psi_element://Bar\"><code><span style=\"color:#000000;\">Bar</span></code></a></pre></div><table class=\'sections\'><p><tr><td valign=\'top\' class=\'section\'><p>From class:</td><td valign=\'top\'><p><a href=\"psi_element://Foo\"><code><span style=\"color:#000000;\">Foo</span></code></a><br>\n Some doc\n </td></table>"
String expected = "<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">foo</span><span style=\"\">(</span><span style=\"\">)</span></pre></div><table class=\'sections\'><p><tr><td valign=\'top\' class=\'section\'><p>From class:</td><td valign=\'top\'><p><a href=\"psi_element://Foo\"><code><span style=\"color:#000000;\">Foo</span></code></a><br>\n Some doc\n </td></table>"
assert doc == expected
}
@@ -270,7 +270,7 @@ class Bar {
}
// Here we check that the covering module (SDK in this case) is rendered in decorated info
assert component.decoratedText.contains('<div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>')
assert component.decoratedText.contains('<div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">java.lang.String</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>')
}
@@ -117,11 +117,10 @@ public class JavaDocInfoGeneratorTest extends JavaCodeInsightTestCase {
public void testRepeatableAnnotations() {
useJava8();
assertEquals(
"<span style=\"color:#808000;\">@</span><span style=\"color:#808000;\">R</span><span style=\"\">(</span><span style=\"color:#008000;font-weight:bold;\">\"a\"</span><span style=\"\">)</span>&nbsp;\n" +
"<span style=\"color:#808000;\">@</span><span style=\"color:#808000;\">R</span><span style=\"\">(</span><span style=\"color:#008000;font-weight:bold;\">\"b\"</span><span style=\"\">)</span>&nbsp;\n" +
"<span style=\"color:#000080;font-weight:bold;\">class</span> <span style=\"color:#000000;\">repeatableAnnotations</span>\n" +
"<span style=\"color:#000080;font-weight:bold;\">extends </span><a href=\"psi_element://java.lang.Object\"><code><span style=\"color:#000000;\">Object</span></code></a>",
new JavaDocInfoGenerator(getProject(), getTestClass(), false).generateSignature(getTestClass()));
"<span style=\"color:#808000;\">@</span><a href=\"psi_element://R\"><code><span style=\"color:#808000;\">R</span></code></a><span style=\"\">(</span><span style=\"color:#008000;font-weight:bold;\">\"a\"</span><span style=\"\">)</span>&nbsp;\n" +
"<span style=\"color:#808000;\">@</span><a href=\"psi_element://R\"><code><span style=\"color:#808000;\">R</span></code></a><span style=\"\">(</span><span style=\"color:#008000;font-weight:bold;\">\"b\"</span><span style=\"\">)</span>&nbsp;\n" +
"<span style=\"color:#000080;font-weight:bold;\">class</span> <span style=\"color:#000000;\">repeatableAnnotations</span>",
new JavaDocInfoGenerator(getProject(), getTestClass()).generateSignature(getTestClass()));
}
public void testAnonymousAndSuperJavadoc() {
@@ -16,7 +16,7 @@ class LightJavadocGeneratorTest : LightJavaCodeInsightFixtureTestCase() {
fun testDocumentedModule() = doTestModule(
"/** One humble module. */\n@Deprecated\nmodule M.N { }",
"<div class='definition'><pre><span style=\"color:#808000;\">@</span><a href=\"psi_element://java.lang.Deprecated\"><code style='font-size:96%;'><span style=\"color:#808000;\">Deprecated</span></code></a> \n" +
"<div class='definition'><pre><span style=\"color:#808000;\">@</span><a href=\"psi_element://java.lang.Deprecated\"><code><span style=\"color:#808000;\">Deprecated</span></code></a> \n" +
"<span style=\"color:#000080;font-weight:bold;\">module </span><span style=\"color:#000000;\">M.N</span></pre></div><div class='content'> One humble module. </div>")
fun testRootedClassLink() = doTestLink("{@docRoot}/java/lang/Character.html#unicode", "psi_element://java.lang.Character###unicode")
@@ -38,7 +38,7 @@ class LightJavadocGeneratorTest : LightJavaCodeInsightFixtureTestCase() {
private fun doTestLink(link: String, expected: String) {
doTestClass(
"package a.b;\n/** A <a href=\"${link}\">link</a>. */\ninterface I { }",
"<div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">interface</span> <span style=\"color:#000000;\">I</span><br><span class='grayed'>defined in </span><font color=red>a.b</font></pre></div><div class='content'> A <a href=\"${expected}\">link</a>. </div>")
"<div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">interface</span> <span style=\"color:#000000;\">I</span></pre></div><div class='content'> A <a href=\"$expected\">link</a>. </div>")
}
private fun doTestClass(text: String, expected: String) {
@@ -47,7 +47,7 @@ class LightJavadocGeneratorTest : LightJavaCodeInsightFixtureTestCase() {
}
private fun generateDoc(element: PsiElement): String? =
JavaDocInfoGeneratorFactory.create(project, element, false).generateDocInfo(null)
JavaDocInfoGeneratorFactory.create(project, element).generateDocInfo(null)
?.replace("&nbsp;", " ")
?.substringBeforeLast("<table class='sections'><p></table>")
//</editor-fold>
@@ -106,18 +106,18 @@ public class BytecodeAnalysisIntegrationTest extends LightJavaCodeInsightFixture
checkHasGutter("org.apache.velocity.util.ExceptionUtils",
"<html><i>Inferred</i> annotations available. Full signature:<p>\n" +
"<b><i><span style=\"color:#808000;\">@</span><span style=\"color:#808000;\">Contract</span><span style=\"\">(</span><span style=\"color:#008000;font-weight:bold;\">\"null,_,_->null\"</span><span style=\"\">)</span></i></b> \n" +
"<span style=\"color:#000000;\">Throwable</span> <span style=\"color:#000000;\">createWithCause</span><span style=\"\">(</span><span style=\"color:#000000;\">Class</span><span style=\"\">,\n" +
" </span> <span style=\"color:#000000;\">String</span><span style=\"\">,\n" +
" </span> <span style=\"color:#000000;\">Throwable</span><span style=\"\">)</span></html>");
"<b><i><span style=\"color:#808000;\">@</span><a href=\"psi_element://org.jetbrains.annotations.Contract\"><code><span style=\"color:#808000;\">Contract</span></code></a><span style=\"\">(</span><span style=\"color:#008000;font-weight:bold;\">\"null,_,_->null\"</span><span style=\"\">)</span></i></b> \n" +
"<span style=\"color:#000000;\">Throwable</span> <span style=\"color:#000000;\">createWithCause</span><span style=\"\">(</span><span style=\"color:#000000;\">Class</span><span style=\"\">,</span>\n" +
"<span style=\"color:#000000;\">String</span><span style=\"\">,</span>\n" +
"<span style=\"color:#000000;\">Throwable</span><span style=\"\">)</span></html>");
}
public void testExternalAnnoGutter() {
checkHasGutter("java.lang.String",
"<html>External annotations available. Full signature:<p>\n" +
"<b><span style=\"color:#808000;\">@</span><span style=\"color:#808000;\">Contract</span><span style=\"\">(</span><span style=\"\">pure</span><span style=\"\"> = </span><span style=\"color:#000080;font-weight:bold;\">true</span><span style=\"\">)</span></b> \n" +
"<span style=\"color:#000000;\">String</span><span style=\"\">(</span><span style=\"color:#000080;font-weight:bold;\">char</span><span style=\"\">[]</span><span style=\"\">,\n" +
" </span> <span style=\"color:#000080;font-weight:bold;\">boolean</span><span style=\"\">)</span></html>");
"<span style=\"color:#000000;\">String</span><span style=\"\">(</span><b><span style=\"color:#808000;\">@</span><a href=\"psi_element://org.jetbrains.annotations.NotNull\"><code><span style=\"color:#808000;\">NotNull</span></code></a></b> <span style=\"color:#000080;font-weight:bold;\">char</span><span style=\"\">[]</span><span style=\"\">,</span>\n" +
"<span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,</span>\n" +
"<span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">)</span></html>");
}
private void checkHasGutter(String className, String expectedText) {
@@ -6,6 +6,7 @@ import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.HtmlChunk;
import com.intellij.psi.PsiDocCommentBase;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
@@ -122,6 +123,18 @@ public final class CompositeDocumentationProvider implements DocumentationProvid
return null;
}
@Override
public @Nullable HtmlChunk getLocationInfo(@Nullable PsiElement element) {
for (DocumentationProvider provider : getAllProviders()) {
HtmlChunk result = provider.getLocationInfo(element);
if (result != null) {
LOG.debug("getLocationInfo: ", provider);
return result;
}
}
return null;
}
@Override
public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
for (DocumentationProvider provider : getAllProviders()) {
@@ -5,13 +5,22 @@ import com.intellij.codeInsight.documentation.DocumentationManagerProtocol;
import com.intellij.codeInsight.documentation.DocumentationManagerUtil;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.ExtensionPointName;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.HtmlChunk;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDocCommentBase;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import com.intellij.util.concurrency.annotations.RequiresReadLock;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -60,6 +69,13 @@ public interface DocumentationProvider {
return null;
}
@ApiStatus.Experimental
@RequiresReadLock
@RequiresBackgroundThread
default @Nullable HtmlChunk getLocationInfo(@Nullable PsiElement element) {
return null;
}
/**
* Returns the list of possible URLs to show as external documentation for the specified element.
*
@@ -146,7 +162,7 @@ public interface DocumentationProvider {
* documentation view to work correctly.
*/
@ApiStatus.Experimental
default void collectDocComments(@NotNull PsiFile file, @NotNull Consumer<? super @NotNull PsiDocCommentBase> sink) {}
default void collectDocComments(@NotNull PsiFile file, @NotNull Consumer<? super @NotNull PsiDocCommentBase> sink) { }
/**
* This method is needed to support rendered representation of documentation comments in editor. It should return doc comment located at
@@ -187,8 +203,8 @@ public interface DocumentationProvider {
* referenced at target offset) isn't suitable for your language. For example, it could be a keyword where there's no
* {@link com.intellij.psi.PsiReference}, but for which users might benefit from context help.
*
* @param targetOffset equals to caret offset for 'Quick Documentation' action, and to offset under mouse cursor for documentation shown
* on mouse hover
* @param targetOffset equals to caret offset for 'Quick Documentation' action, and to offset under mouse cursor for documentation shown
* on mouse hover
* @param contextElement the leaf PSI element in {@code file} at target offset
* @return target PSI element to show documentation for, or {@code null} if it should be determined by standard platform's logic (default
* behaviour)
@@ -2,8 +2,20 @@
package com.intellij.lang.documentation;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.roots.JdkOrderEntry;
import com.intellij.openapi.roots.LibraryOrderEntry;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.text.HtmlChunk;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.util.concurrency.annotations.RequiresBackgroundThread;
import com.intellij.util.concurrency.annotations.RequiresReadLock;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -30,4 +42,40 @@ public class DocumentationProviderEx implements DocumentationProvider {
public Image getLocalImageForElement(@NotNull PsiElement element, @NotNull String imageSpec) {
return null;
}
@ApiStatus.Experimental
@RequiresReadLock
@RequiresBackgroundThread
public static @Nullable HtmlChunk getDefaultLocationInfo(@Nullable PsiElement element) {
if (element == null) return null;
PsiFile file = element.getContainingFile();
VirtualFile vfile = file == null ? null : file.getVirtualFile();
if (vfile == null) return null;
if (element.getUseScope() instanceof LocalSearchScope) return null;
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(element.getProject()).getFileIndex();
Module module = fileIndex.getModuleForFile(vfile);
if (module != null) {
if (ModuleManager.getInstance(element.getProject()).getModules().length == 1) return null;
return HtmlChunk.fragment(
HtmlChunk.tag("icon").attr("src", "AllIcons.Nodes.Module"),
HtmlChunk.nbsp(),
HtmlChunk.text(module.getName())
);
}
else {
return fileIndex.getOrderEntriesForFile(vfile).stream()
.filter(it -> it instanceof LibraryOrderEntry || it instanceof JdkOrderEntry)
.findFirst()
.map(it -> HtmlChunk.fragment(
HtmlChunk.tag("icon").attr("src", "AllIcons.Nodes.PpLibFolder"),
HtmlChunk.nbsp(),
HtmlChunk.text(it.getPresentableName())
))
.orElse(null);
}
}
}
@@ -39,6 +39,7 @@ private val myFocusModeCheckBox get() = CheckboxDescriptor
private val myCbShowIntentionBulbCheckBox get() = CheckboxDescriptor(ApplicationBundle.message("checkbox.show.intention.bulb"), PropertyBinding(model::isShowIntentionBulb, model::setShowIntentionBulb))
private val myCodeLensCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.show.editor.preview.popup"), uiSettings::showEditorToolTip)
private val myRenderedDocCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.show.rendered.doc.comments"), PropertyBinding(model::isDocCommentRenderingEnabled, model::setDocCommentRenderingEnabled))
private val myDocSyntaxHighlightingCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.enable.doc.syntax.highlighting"), PropertyBinding(model::isDocSyntaxHighlightingEnabled, model::setDocSyntaxHighlightingEnabled))
// @formatter:on
class EditorAppearanceConfigurable : BoundCompositeSearchableConfigurable<UnnamedConfigurable>(
@@ -100,6 +101,9 @@ class EditorAppearanceConfigurable : BoundCompositeSearchableConfigurable<Unname
checkBox(myRenderedDocCheckBox)
component(createReaderModeComment()).withLargeLeftGap()
}
row {
checkBox(myDocSyntaxHighlightingCheckBox)
}
for (configurable in configurables) {
appendDslConfigurableRow(configurable)
@@ -77,7 +77,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
private static final int PREFERRED_HEIGHT_MAX_EM = 10;
static final JBDimension MIN_DEFAULT = new JBDimension(300, 36);
static final JBDimension MAX_DEFAULT = new JBDimension(650, 500);
static final JBDimension MAX_DEFAULT = new JBDimension(950, 500);
private final ExternalDocAction myExternalDocAction;
@@ -111,16 +111,17 @@ public class DocumentationEditorPane extends JEditorPane {
}
private int definitionPreferredWidth() {
int preferredDefinitionWidth = getPreferredDefinitionWidth();
int preferredDefinitionWidth = getPreferredSectionWidth("definition");
int preferredLocationWidth = Math.max(getPreferredSectionWidth("bottom-no-content"), getPreferredSectionWidth("bottom"));
if (preferredDefinitionWidth < 0) {
return -1;
}
int preferredContentWidth = getPreferredContentWidth(getDocument().getLength());
return Math.max(preferredContentWidth, preferredDefinitionWidth);
return Math.max(preferredContentWidth, Math.max(preferredDefinitionWidth, preferredLocationWidth));
}
private int getPreferredDefinitionWidth() {
View definition = findDefinition(getUI().getRootView(this));
private int getPreferredSectionWidth(String sectionClassName) {
View definition = findSection(getUI().getRootView(this), sectionClassName);
return definition == null ? -1 : (int)definition.getPreferredSpan(View.X_AXIS);
}
@@ -142,12 +143,12 @@ public class DocumentationEditorPane extends JEditorPane {
return contentLengthPreferredSize;
}
private static @Nullable View findDefinition(@NotNull View view) {
if ("definition".equals(view.getElement().getAttributes().getAttribute(HTML.Attribute.CLASS))) {
private static @Nullable View findSection(@NotNull View view, @NotNull String sectionClassName) {
if (sectionClassName.equals(view.getElement().getAttributes().getAttribute(HTML.Attribute.CLASS))) {
return view;
}
for (int i = 0; i < view.getViewCount(); i++) {
View definition = findDefinition(view.getView(i));
View definition = findSection(view.getView(i), sectionClassName);
if (definition != null) {
return definition;
}
@@ -464,17 +464,17 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
/**
* Asks to show quick doc for the target element.
*
* @param editor editor with an element for which quick do should be shown
* @param element target element which documentation should be shown
* @param original element that was used as a quick doc anchor. Example: consider a code like {@code Runnable task;}.
* A user wants to see javadoc for the {@code Runnable}, so, original element is a class name from the variable
* declaration but {@code 'element'} argument is a {@code Runnable} descriptor
* @param closeCallback callback to be notified on target hint close (if any)
* @param documentation precalculated documentation
* @param closeOnSneeze flag that defines whether quick doc control should be as non-obtrusive as possible. E.g. there are at least
* two possible situations - the quick doc is shown automatically on mouse over element; the quick doc is shown
* on explicit action call (Ctrl+Q). We want to close the doc on, say, editor viewport position change
* at the first situation but don't want to do that at the second
* @param editor editor with an element for which quick do should be shown
* @param element target element which documentation should be shown
* @param original element that was used as a quick doc anchor. Example: consider a code like {@code Runnable task;}.
* A user wants to see javadoc for the {@code Runnable}, so, original element is a class name from the variable
* declaration but {@code 'element'} argument is a {@code Runnable} descriptor
* @param closeCallback callback to be notified on target hint close (if any)
* @param documentation precalculated documentation
* @param closeOnSneeze flag that defines whether quick doc control should be as non-obtrusive as possible. E.g. there are at least
* two possible situations - the quick doc is shown automatically on mouse over element; the quick doc is shown
* on explicit action call (Ctrl+Q). We want to close the doc on, say, editor viewport position change
* at the first situation but don't want to do that at the second
* @param useStoredPopupSize whether popup size previously set by user (via mouse-dragging) should be used, or default one should be used
*/
public void showJavaDocInfo(@NotNull Editor editor,
@@ -1425,7 +1425,8 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
return LibraryUtil.findLibraryEntry(virtualFile, project);
}
protected ActionCallback cancelAndFetchDocInfoByLink(@NotNull DocumentationComponent component, @NotNull DocumentationCollector provider) {
protected ActionCallback cancelAndFetchDocInfoByLink(@NotNull DocumentationComponent component,
@NotNull DocumentationCollector provider) {
return cancelAndFetchDocInfo(component, provider);
}
@@ -1802,7 +1803,10 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
@NlsSafe @Nullable String externalUrl,
@Nullable DocumentationProvider provider
) {
return decorate(text, getLocationText(element), getExternalText(element, externalUrl, provider));
HtmlChunk locationInfo = Optional.ofNullable(provider)
.map(it -> it.getLocationInfo(element))
.orElseGet(() -> DocumentationProviderEx.getDefaultLocationInfo(element));
return decorate(text, locationInfo, getExternalText(element, externalUrl, provider));
}
@Internal
@@ -1928,7 +1932,8 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
try {
return new URL(url).toURI().getHost();
}
catch (URISyntaxException | MalformedURLException ignored) { }
catch (URISyntaxException | MalformedURLException ignored) {
}
return null;
}
@@ -1955,46 +1960,4 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
public static String addExternalLinksIcon(String text) {
return EXTERNAL_LINK_PATTERN.matcher(text).replaceAll(EXTERNAL_LINK_REPLACEMENT);
}
@RequiresReadLock
@RequiresBackgroundThread
private static @Nullable HtmlChunk getLocationText(@Nullable PsiElement element) {
if (element != null) {
PsiFile file = element.getContainingFile();
VirtualFile vfile = file == null ? null : file.getVirtualFile();
if (vfile == null) return null;
SearchScope scope = element.getUseScope();
if (scope instanceof LocalSearchScope) {
return null;
}
ProjectFileIndex fileIndex = ProjectRootManager.getInstance(element.getProject()).getFileIndex();
Module module = fileIndex.getModuleForFile(vfile);
if (module != null && !ModuleType.isInternal(module)) {
if (ModuleManager.getInstance(element.getProject()).getModules().length == 1) return null;
return HtmlChunk.fragment(
HtmlChunk.tag("icon").attr("src", ModuleType.get(module).getId()),
HtmlChunk.nbsp(),
HtmlChunk.text(module.getName())
);
}
else {
List<OrderEntry> entries = fileIndex.getOrderEntriesForFile(vfile);
for (OrderEntry order : entries) {
if (order instanceof LibraryOrderEntry || order instanceof JdkOrderEntry) {
return HtmlChunk.fragment(
HtmlChunk.tag("icon").attr("src", "AllIcons.Nodes.PpLibFolder"),
HtmlChunk.nbsp(),
HtmlChunk.text(order.getPresentableName())
);
}
}
}
}
return null;
}
}
@@ -10,7 +10,7 @@ import java.awt.*;
final class CombinedPopupLayout implements LayoutManager {
private static final int MAX_POPUP_WIDTH = 650;
private static final int MAX_POPUP_WIDTH = 950;
private final @Nullable JComponent highlightInfoComponent;
private final @Nullable JComponent quickDocComponent;
@@ -39,6 +39,10 @@ public final class HtmlSyntaxInfoUtil {
return appendStyledSpan(new StringBuilder(), attributesKey, value).toString();
}
public static @NotNull String getStyledSpan(@NotNull TextAttributes attributes, @Nullable String value) {
return appendStyledSpan(new StringBuilder(), attributes, value).toString();
}
public static @NotNull String getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
@NotNull Project project,
@NotNull Language language,
@@ -86,9 +90,20 @@ public final class HtmlSyntaxInfoUtil {
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet
) {
return appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet, true);
}
public static @NotNull StringBuilder appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
@NotNull StringBuilder buffer,
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet,
boolean doTrimIndent
) {
codeSnippet = StringUtil.notNullize(codeSnippet);
String zeroIndentCode = StringsKt.trimIndent(codeSnippet).replace("\t", " ");
String trimmed = doTrimIndent ? StringsKt.trimIndent(codeSnippet) : codeSnippet;
String zeroIndentCode = trimmed.replace("\t", " ");
PsiFile fakePsiFile = PsiFileFactory.getInstance(project).createFileFromText(language, codeSnippet);
EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
if (!zeroIndentCode.isEmpty()) {
@@ -506,6 +506,7 @@ checkbox.left.toolwindow.layout=Side-by-side layout on the left
checkbox.right.toolwindow.layout=Side-by-side layout on the right
checkbox.show.editor.preview.popup=Show code lens on scrollbar hover
checkbox.show.rendered.doc.comments=Render documentation comments
checkbox.enable.doc.syntax.highlighting=Enable code highlighting in documentation components
checkbox.also.in.reader.mode=Also in <hyperlink>Reader mode</hyperlink>
checkbox.smooth.scrolling=Smooth scrolling
checkbox.smooth.scrolling.description=When using the mouse wheel/touchpad, the entire interface will scroll smoothly instead of line by line
@@ -68,6 +68,7 @@ public class EditorSettingsExternalizable implements PersistentStateComponent<Ed
public boolean SHOW_BREADCRUMBS_ABOVE = false;
public boolean SHOW_BREADCRUMBS = true;
public boolean ENABLE_RENDERED_DOC = false;
public boolean ENABLE_DOC_SYNTAX_HIGHLIGHTING = true;
public boolean SMART_HOME = true;
@@ -344,6 +345,14 @@ public class EditorSettingsExternalizable implements PersistentStateComponent<Ed
}
}
public boolean isDocSyntaxHighlightingEnabled() {
return myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING;
}
public void setDocSyntaxHighlightingEnabled(boolean value) {
myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING = value;
}
public boolean isBlockCursor() {
return myOptions.IS_BLOCK_CURSOR;
}
@@ -80,7 +80,7 @@ public class ThemeJsonDocumentationProvider extends AbstractDocumentationProvide
final PsiClassType type = JavaPsiFacade.getElementFactory(element.getProject()).createTypeByFQClassName(source);
StringBuilder typeBuilder = new StringBuilder();
JavaDocInfoGeneratorFactory.create(element.getProject(), null, false).generateType(typeBuilder, type, element);
JavaDocInfoGeneratorFactory.create(element.getProject(), null).generateType(typeBuilder, type, element);
return typeBuilder.toString(); //NON-NLS
});
}
@@ -49,10 +49,9 @@ public class ExtensionPointDocumentationProviderTest extends LightJavaCodeInsigh
assertEquals(
"<div class=\"definition\"><pre><b>foo.bar</b><br/>" +
pluginXml +
"<div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">public</span> <span style=\"color:#000080;font-weight:bold;\">class</span> <span style=\"color:#000000;\">MyExtensionPoint</span>\n" +
"<span style=\"color:#000080;font-weight:bold;\">extends </span><a href=\"psi_element://java.lang.Object\"><code><span style=\"color:#000000;\">Object</span></code></a><br><span class='grayed'>defined in </span><a href=\"psi_element://bar\"><code><span style=\"color:#000000;\">bar</span></code></a></pre></div><div class='content'>\n" +
"<div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">public</span> <span style=\"color:#000080;font-weight:bold;\">class</span> <span style=\"color:#000000;\">MyExtensionPoint</span></pre></div><div class='content'>\n" +
" MyExtensionPoint JavaDoc.\n" +
" </div><table class='sections'><p></table><table class=\"sections\"><tr><td class=\"section\" valign=\"top\"><p><a href=\"psi_element://bar.MyExtensionPoint#implementationClass\"><code>implementationClass</code></a></p></td><td valign=\"top\">String (required)</td></tr><tr><td class=\"section\" valign=\"top\"><p><a href=\"psi_element://bar.MyExtensionPoint#stringCanBeEmpty\"><code>stringCanBeEmpty</code></a></p></td><td valign=\"top\">String (required, empty allowed)</td></tr><tr><td class=\"section\" valign=\"top\"><p><a href=\"psi_element://bar.MyExtensionPoint#intValue\"><code>&lt;intValue&gt;</code></a></p></td><td valign=\"top\">Integer</td></tr><br/></table></pre></div><div class=\"content\"><a href=\"https://jb.gg/ipe?extensions=foo.bar\">Show Usages in IntelliJ Platform Explorer</a></div><div class=\"content\"><h2>Extension Point Implementation</h2><div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">public</span> <span style=\"color:#000080;font-weight:bold;\">interface</span> <span style=\"color:#000000;\">MyExtension</span><br><span class='grayed'>defined in </span><a href=\"psi_element://bar\"><code><span style=\"color:#000000;\">bar</span></code></a></pre></div><div class='content'>\n" +
" </div><table class='sections'><p></table><table class=\"sections\"><tr><td class=\"section\" valign=\"top\"><p><a href=\"psi_element://bar.MyExtensionPoint#implementationClass\"><code>implementationClass</code></a></p></td><td valign=\"top\">String (required)</td></tr><tr><td class=\"section\" valign=\"top\"><p><a href=\"psi_element://bar.MyExtensionPoint#stringCanBeEmpty\"><code>stringCanBeEmpty</code></a></p></td><td valign=\"top\">String (required, empty allowed)</td></tr><tr><td class=\"section\" valign=\"top\"><p><a href=\"psi_element://bar.MyExtensionPoint#intValue\"><code>&lt;intValue&gt;</code></a></p></td><td valign=\"top\">Integer</td></tr><br/></table></pre></div><div class=\"content\"><a href=\"https://jb.gg/ipe?extensions=foo.bar\">Show Usages in IntelliJ Platform Explorer</a></div><div class=\"content\"><h2>Extension Point Implementation</h2><div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">public</span> <span style=\"color:#000080;font-weight:bold;\">interface</span> <span style=\"color:#000000;\">MyExtension</span></pre></div><div class='content'>\n" +
" My Extension Javadoc.\n" +
" </div><table class='sections'><p></table></div>",
provider.generateDoc(docElement, getOriginalElement()));
@@ -74,7 +73,7 @@ public class ExtensionPointDocumentationProviderTest extends LightJavaCodeInsigh
provider.getQuickNavigateInfo(docElement, getOriginalElement()));
assertEquals(
"<div class=\"definition\"><pre><b>foo.bar</b><br/>interfaceExtensionPointDocumentation.xml</pre></div><div class=\"content\"><a href=\"https://jb.gg/ipe?extensions=foo.bar\">Show Usages in IntelliJ Platform Explorer</a></div><div class=\"content\"><h2>Extension Point Implementation</h2><div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">public</span> <span style=\"color:#000080;font-weight:bold;\">interface</span> <span style=\"color:#000000;\">MyExtension</span><br><span class='grayed'>defined in </span><a href=\"psi_element://bar\"><code><span style=\"color:#000000;\">bar</span></code></a></pre></div><div class='content'>\n" +
"<div class=\"definition\"><pre><b>foo.bar</b><br/>interfaceExtensionPointDocumentation.xml</pre></div><div class=\"content\"><a href=\"https://jb.gg/ipe?extensions=foo.bar\">Show Usages in IntelliJ Platform Explorer</a></div><div class=\"content\"><h2>Extension Point Implementation</h2><div class='definition'><pre><span style=\"color:#000080;font-weight:bold;\">public</span> <span style=\"color:#000080;font-weight:bold;\">interface</span> <span style=\"color:#000000;\">MyExtension</span></pre></div><div class='content'>\n" +
" My Extension Javadoc.\n" +
" </div><table class='sections'><p></table></div>",
provider.generateDoc(docElement, getOriginalElement()));
@@ -29,7 +29,7 @@ class GradleGroovyProperty(
val value = myProperty.value
val result = StringBuilder()
result.append("<PRE>")
JavaDocInfoGeneratorFactory.create(context.project, null, false).generateType(result, propertyType, context, true)
JavaDocInfoGeneratorFactory.create(context.project, null).generateType(result, propertyType, context, true)
result.append(" " + myProperty.name)
val hasInitializer = !value.isNullOrBlank()
if (hasInitializer) {
@@ -27,7 +27,7 @@ class GradleTaskProperty(
private val doc by lazyPub {
val result = StringBuilder()
result.append("<PRE>")
JavaDocInfoGeneratorFactory.create(context.project, null, false).generateType(result, propertyType, myContext, true)
JavaDocInfoGeneratorFactory.create(context.project, null).generateType(result, propertyType, myContext, true)
result.append(" " + task.name)
result.append("</PRE>")
task.description?.let(result::append)
@@ -1,6 +1,10 @@
// Copyright 2000-2020 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 org.jetbrains.plugins.groovy.lang.documentation;
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiAnnotation;
import com.intellij.psi.PsiElement;
@@ -10,11 +14,13 @@ import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.MethodSignature;
import com.intellij.util.ArrayUtilRt;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyBundle;
import org.jetbrains.plugins.groovy.highlighter.GroovySyntaxHighlighter;
import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement;
import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.modifiers.GrModifier;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrReferenceExpression;
import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameter;
import org.jetbrains.plugins.groovy.lang.psi.impl.PsiImplUtil;
import org.jetbrains.plugins.groovy.lang.psi.util.PsiUtil;
import org.jetbrains.plugins.groovy.transformations.impl.namedVariant.NamedParamData;
import org.jetbrains.plugins.groovy.transformations.impl.namedVariant.NamedParamsUtil;
@@ -30,22 +36,39 @@ import java.util.Set;
public final class GroovyPresentationUtil {
private static final int CONSTRAINTS_NUMBER = 2;
public static void appendParameterPresentation(GrParameter parameter,
PsiSubstitutor substitutor,
TypePresentation typePresentation,
StringBuilder builder) {
if (presentNamedParameters(builder, parameter)) return;
public static void appendParameterPresentation(
GrParameter parameter,
PsiSubstitutor substitutor,
TypePresentation typePresentation,
StringBuilder builder,
boolean doHighlighting
) {
if (presentNamedParameters(builder, parameter, doHighlighting)) return;
for (PsiAnnotation annotation : parameter.getModifierList().getAnnotations()) {
builder.append(annotation.getText()).append(' ');
appendStyledSpan(doHighlighting, builder, GroovySyntaxHighlighter.ANNOTATION, annotation.getText());
builder.append(' ');
}
PsiType type = parameter.getTypeGroovy();
type = substitutor.substitute(type);
if (typePresentation == TypePresentation.LINK) {
PsiImplUtil.appendTypeString(builder, type, parameter);
builder.append(' ').append(parameter.getName());
if (type != null) {
StringBuilder typeBuilder = new StringBuilder();
JavaDocInfoGeneratorFactory.create(parameter.getProject(), null).generateType(typeBuilder, type, parameter);
if (doHighlighting) {
builder.append(typeBuilder);
}
else {
builder.append(StringUtil.removeHtmlTags(typeBuilder.toString(), true));
}
}
else {
appendStyledSpan(doHighlighting, builder, GroovySyntaxHighlighter.KEYWORD, GrModifier.DEF);
}
builder.append(' ');
appendStyledSpan(doHighlighting, builder, GroovySyntaxHighlighter.PARAMETER, parameter.getName());
return;
}
@@ -97,12 +120,6 @@ public final class GroovyPresentationUtil {
}
}
private static boolean presentNamedParameters(@NotNull StringBuilder buffer, @NotNull GrParameter parameter) {
List<NamedParamData> pairs = NamedParamsUtil.collectNamedParams(parameter);
StringUtil.join(pairs, namedParam -> namedParam.getName() + ": " + namedParam.getType().getPresentableText(), ", ", buffer);
return !pairs.isEmpty();
}
public static String getSignaturePresentation(MethodSignature signature) {
StringBuilder builder = new StringBuilder();
builder.append(signature.getName()).append('(');
@@ -114,4 +131,33 @@ public final class GroovyPresentationUtil {
builder.append(")");
return builder.toString();
}
private static @NotNull StringBuilder appendStyledSpan(
boolean doHighlighting,
@NotNull StringBuilder buffer,
@NotNull TextAttributesKey attributesKey,
@Nullable String value
) {
if (doHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributesKey, value);
}
else {
buffer.append(value);
}
return buffer;
}
private static boolean presentNamedParameters(@NotNull StringBuilder buffer, @NotNull GrParameter parameter, boolean doHighlighting) {
List<NamedParamData> pairs = NamedParamsUtil.collectNamedParams(parameter);
for (int i = 0; i < pairs.size(); i++) {
NamedParamData namedParam = pairs.get(i);
appendStyledSpan(doHighlighting, buffer, GroovySyntaxHighlighter.PARAMETER, namedParam.getName());
appendStyledSpan(doHighlighting, buffer, JavaHighlightingColors.OPERATION_SIGN, ": ");
appendStyledSpan(doHighlighting, buffer, GroovySyntaxHighlighter.CLASS_REFERENCE, namedParam.getType().getPresentableText());
if (i != pairs.size() - 1) {
appendStyledSpan(doHighlighting, buffer, JavaHighlightingColors.COMMA, ", ");
}
}
return !pairs.isEmpty();
}
}
@@ -26,6 +26,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.codeInspection.utils.ControlFlowUtils;
import org.jetbrains.plugins.groovy.lang.groovydoc.highlighter.GroovyDocSyntaxHighlighter;
import org.jetbrains.plugins.groovy.lang.lexer.GroovyTokenTypes;
import org.jetbrains.plugins.groovy.lang.lexer.TokenSets;
import org.jetbrains.plugins.groovy.lang.psi.*;
@@ -798,7 +799,7 @@ public final class PsiImplUtil {
public static void appendTypeString(StringBuilder buffer, final PsiType type, PsiElement context) {
if (type != null) {
JavaDocInfoGeneratorFactory.create(context.getProject(), null, false).generateType(buffer, type, context);
JavaDocInfoGeneratorFactory.create(context.getProject(), null).generateType(buffer, type, context);
}
else {
buffer.append(GrModifier.DEF);
@@ -0,0 +1,135 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.plugins.groovy.lang.documentation;
import com.intellij.codeInsight.javadoc.JavaDocHighlightingManager;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.psi.*;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.groovy.highlighter.GroovySyntaxHighlighter;
public class GroovyDocHighlightingManager implements JavaDocHighlightingManager {
private static final @NotNull GroovyDocHighlightingManager INSTANCE = new GroovyDocHighlightingManager();
public static @NotNull GroovyDocHighlightingManager getInstance() {
return INSTANCE;
}
private static @NotNull TextAttributes resolveAttributes(@NotNull TextAttributesKey attributesKey) {
return EditorColorsManager.getInstance().getGlobalScheme().getAttributes(attributesKey);
}
@Override
public @NotNull TextAttributes getClassDeclarationAttributes(@NotNull PsiClass aClass) {
if (aClass.isInterface()) return getInterfaceNameAttributes();
if (aClass.isEnum()) return getEnumNameAttributes();
if (aClass instanceof PsiAnonymousClass) return getAnonymousClassNameAttributes();
if (aClass.hasModifierProperty(PsiModifier.ABSTRACT)) return getAbstractClassNameAttributes();
return getClassNameAttributes();
}
@Override
public @NotNull TextAttributes getMethodDeclarationAttributes(@NotNull PsiMethod method) {
return method.isConstructor()
? getConstructorDeclarationAttributes()
: getMethodDeclarationAttributes();
}
@Override
public @NotNull TextAttributes getFieldDeclarationAttributes(@NotNull PsiField field) {
boolean isStatic = field.hasModifierProperty(PsiModifier.STATIC);
return isStatic ? getStaticFieldAttributes() : getInstanceFieldAttributes();
}
public @NotNull TextAttributes getInterfaceNameAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.INTERFACE_NAME);
}
public @NotNull TextAttributes getEnumNameAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.ENUM_NAME);
}
public @NotNull TextAttributes getAnonymousClassNameAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.ANONYMOUS_CLASS_NAME);
}
public @NotNull TextAttributes getAbstractClassNameAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.ABSTRACT_CLASS_NAME);
}
@Override
public @NotNull TextAttributes getClassNameAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.CLASS_REFERENCE);
}
@Override
public @NotNull TextAttributes getKeywordAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.KEYWORD);
}
@Override
public @NotNull TextAttributes getCommaAttributes() {
return resolveAttributes(JavaHighlightingColors.COMMA);
}
@Override
public @NotNull TextAttributes getParameterAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.PARAMETER);
}
@Override
public @NotNull TextAttributes getTypeParameterNameAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.TYPE_PARAMETER);
}
public @NotNull TextAttributes getStaticFieldAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.STATIC_FIELD);
}
public @NotNull TextAttributes getInstanceFieldAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.INSTANCE_FIELD);
}
@Override
public @NotNull TextAttributes getOperationSignAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.OPERATION_SIGN);
}
@Override
public @NotNull TextAttributes getLocalVariableAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.LOCAL_VARIABLE);
}
public @NotNull TextAttributes getConstructorDeclarationAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.CONSTRUCTOR_DECLARATION);
}
public @NotNull TextAttributes getMethodDeclarationAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.METHOD_DECLARATION);
}
@Override
public @NotNull TextAttributes getParenthesesAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.PARENTHESES);
}
@Override
public @NotNull TextAttributes getDotAttributes() {
return resolveAttributes(JavaHighlightingColors.DOT);
}
@Override
public @NotNull TextAttributes getBracketsAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.BRACKETS);
}
@Override
public @NotNull TextAttributes getMethodCallAttributes() {
return resolveAttributes(GroovySyntaxHighlighter.METHOD_CALL);
}
}
@@ -1,4 +1,4 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
// 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 org.jetbrains.plugins.groovy.lang.documentation;
import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator;
@@ -11,8 +11,8 @@ import static org.jetbrains.plugins.groovy.lang.groovydoc.lexer.GroovyDocTokenTy
public class GroovyDocInfoGenerator extends JavaDocInfoGenerator {
public GroovyDocInfoGenerator(PsiElement element, boolean isGenerationForRenderedDoc) {
super(element.getProject(), element, isGenerationForRenderedDoc);
public GroovyDocInfoGenerator(PsiElement element, boolean isGenerationForRenderedDoc, boolean doSyntaxHighlighting) {
super(element.getProject(), element, GroovyDocHighlightingManager.getInstance(), isGenerationForRenderedDoc, doSyntaxHighlighting);
}
@Override
@@ -14,6 +14,9 @@ import com.intellij.lang.documentation.CodeDocumentationProvider;
import com.intellij.lang.documentation.CompositeDocumentationProvider;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.text.HtmlChunk;
@@ -57,6 +60,7 @@ import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* @author ven
*/
@@ -67,6 +71,36 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@NonNls private static final String THROWS_TAG = "@throws";
private static final String BODY_HTML = "</body></html>";
private static void appendStyledSpan(
@NotNull StringBuilder buffer,
@NotNull TextAttributes attributes,
@Nullable String value
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value);
}
else {
buffer.append(value);
}
}
private static void appendStyledSpan(
@NotNull StringBuilder buffer,
@Nullable String value,
String @NotNull ... properties
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, value, properties);
}
else {
buffer.append(value);
}
}
private static boolean doSyntaxHighlighting() {
return EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled();
}
private static PsiSubstitutor calcSubstitutor(PsiElement originalElement) {
PsiSubstitutor substitutor = PsiSubstitutor.EMPTY;
if (originalElement instanceof GrReferenceExpression) {
@@ -75,7 +109,6 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
return substitutor;
}
@Override
@Nullable
public @Nls String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) {
@@ -84,7 +117,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
PsiVariable variable = (PsiVariable)element;
if (originalElement instanceof GrVariableDeclaration && ((GrVariableDeclaration)originalElement).getVariables().length > 1) {
for (GrVariable var :((GrVariableDeclaration)originalElement).getVariables()) {
for (GrVariable var : ((GrVariableDeclaration)originalElement).getVariables()) {
generateVariableInfo(originalElement, buffer, var);
buffer.append("\n\n");
}
@@ -98,14 +131,15 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@Nls StringBuilder buffer = new StringBuilder();
PsiMethod method = (PsiMethod)element;
if (method instanceof GrGdkMethod) {
buffer.append("[").append(GroovyBundle.message("documentation.gdk.label")).append("] ");
appendStyledSpan(buffer, "[" + GroovyBundle.message("documentation.gdk.label") + "]", "color: #909090");
}
else {
PsiClass hisClass = method.getContainingClass();
if (hisClass != null) {
String qName = hisClass.getQualifiedName();
if (qName != null) {
buffer.append(qName).append("\n");
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getClassDeclarationAttributes(hisClass), qName);
buffer.append("\n");
}
}
}
@@ -113,34 +147,36 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
PsiSubstitutor substitutor = calcSubstitutor(originalElement);
if (!method.isConstructor()) {
final PsiType substituted = substitutor.substitute(PsiUtil.getSmartReturnType(method));
PsiImplUtil.appendTypeString(buffer, substituted, originalElement);
appendTypeString(buffer, substituted, originalElement, false);
buffer.append(" ");
}
buffer.append(method.getName()).append(" ");
buffer.append("(");
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getMethodDeclarationAttributes(method), method.getName());
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getParenthesesAttributes(), "(");
PsiParameter[] parameters = method.getParameterList().getParameters();
for (int i = 0; i < parameters.length; i++) {
PsiParameter parameter = parameters[i];
if (i > 0) buffer.append(", ");
if (i > 0) appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getCommaAttributes(), ", ");
if (parameter instanceof GrParameter) {
GroovyPresentationUtil.appendParameterPresentation((GrParameter)parameter, substitutor, TypePresentation.LINK, buffer);
GroovyPresentationUtil.appendParameterPresentation((GrParameter)parameter, substitutor, TypePresentation.LINK, buffer, doSyntaxHighlighting());
}
else {
PsiType type = parameter.getType();
PsiImplUtil.appendTypeString(buffer, substitutor.substitute(type), originalElement);
appendTypeString(buffer, substitutor.substitute(type), originalElement, false);
buffer.append(" ");
buffer.append(parameter.getName());
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getParameterAttributes(), parameter.getName());
}
}
buffer.append(")");
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getParenthesesAttributes(), ")");
final PsiClassType[] referencedTypes = method.getThrowsList().getReferencedTypes();
if (referencedTypes.length > 0) {
buffer.append("\nthrows ");
for (PsiClassType referencedType : referencedTypes) {
PsiImplUtil.appendTypeString(buffer, referencedType, originalElement);
buffer.append(", ");
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getKeywordAttributes(), "\nthrows ");
for (int i = 0; i < referencedTypes.length; i++) {
PsiClassType referencedType = referencedTypes[i];
appendTypeString(buffer, referencedType, originalElement, false);
if (i != referencedTypes.length - 1) {
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getCommaAttributes(), ", ");
}
}
buffer.delete(buffer.length() - 2, buffer.length());
}
return buffer.toString();
}
@@ -155,15 +191,19 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
if (variable instanceof PsiField) {
final PsiClass parentClass = ((PsiField)variable).getContainingClass();
if (parentClass != null) {
buffer.append(JavaDocUtil.getShortestClassName(parentClass, variable));
appendElementLink(buffer, parentClass, JavaDocUtil.getShortestClassName(parentClass, variable));
newLine(buffer);
}
generateModifiers(buffer, variable);
}
final PsiType type = variable instanceof GrVariable ? ((GrVariable)variable).getDeclaredType() : variable.getType();
PsiImplUtil.appendTypeString(buffer, calcSubstitutor(originalElement).substitute(type), originalElement);
appendTypeString(buffer, calcSubstitutor(originalElement).substitute(type), originalElement, false);
buffer.append(" ");
buffer.append(variable.getName());
TextAttributes varAttributes =
variable instanceof PsiField
? GroovyDocHighlightingManager.getInstance().getFieldDeclarationAttributes((PsiField)variable)
: GroovyDocHighlightingManager.getInstance().getLocalVariableAttributes();
appendStyledSpan(buffer, varAttributes, variable.getName());
if (variable instanceof GrVariable) {
newLine(buffer);
@@ -176,12 +216,12 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
}
if (originalElement != null) {
appendInferredType(originalElement, (GrVariable)variable, buffer);
appendInferredType(originalElement, (GrVariable)variable, buffer, false);
}
}
}
private static void appendInferredType(PsiElement originalElement, GrVariable variable, @Nls StringBuilder buffer) {
private static void appendInferredType(PsiElement originalElement, GrVariable variable, @Nls StringBuilder buffer, boolean isRendered) {
PsiType inferredType = null;
if (PsiImplUtil.isWhiteSpaceOrNls(originalElement)) {
originalElement = PsiTreeUtil.prevLeaf(originalElement);
@@ -199,19 +239,20 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
inferredType = ((GrVariable)originalElement).getTypeGroovy();
}
String typeLabel = inferredType != null
? GroovyBundle.message("documentation.inferred.type.label")
: GroovyBundle.message("documentation.cannot.infer.type.label");
appendStyledSpan(buffer, "[" + typeLabel + "]", "color: #909090");
if (inferredType != null) {
buffer.append("[").append(GroovyBundle.message("documentation.inferred.type.label")).append("]").append(" ");
appendTypeString(buffer, inferredType, originalElement);
}
else {
buffer.append("[").append(GroovyBundle.message("documentation.cannot.infer.type.label")).append("]");
buffer.append(" ");
appendTypeString(buffer, inferredType, originalElement, isRendered);
}
}
private static void generateModifiers(@Nls StringBuilder buffer, PsiModifierListOwner element) {
String modifiers = PsiFormatUtil.formatModifiers(element, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY);
if (!modifiers.isEmpty()) {
buffer.append(modifiers);
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getKeywordAttributes(), modifiers);
buffer.append(" ");
}
}
@@ -224,9 +265,12 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@Nls StringBuilder buffer = new StringBuilder();
GroovyFile file = (GroovyFile)aClass.getContainingFile();
GroovyDocHighlightingManager highlightingManager = GroovyDocHighlightingManager.getInstance();
String packageName = file.getPackageName();
if (!packageName.isEmpty()) {
buffer.append(packageName).append("\n");
appendStyledSpan(buffer, highlightingManager.getClassNameAttributes(), packageName);
buffer.append("\n");
}
final String classString = aClass.isInterface()
@@ -236,36 +280,42 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
: aClass.isEnum()
? GroovyBundle.message("groovy.term.enum")
: GroovyBundle.message("groovy.term.class");
buffer.append(classString).append(" ").append(aClass.getName());
appendStyledSpan(buffer, highlightingManager.getKeywordAttributes(), classString);
buffer.append(" ");
appendStyledSpan(buffer, highlightingManager.getClassDeclarationAttributes(aClass), aClass.getName());
JavaDocumentationProvider.generateTypeParameters(aClass, buffer);
JavaDocumentationProvider.generateTypeParameters(aClass, buffer, highlightingManager);
JavaDocumentationProvider.writeExtends(aClass, buffer, aClass.getExtendsListTypes());
JavaDocumentationProvider.writeImplements(aClass, buffer, aClass.getImplementsListTypes());
JavaDocumentationProvider.writeExtends(aClass, buffer, aClass.getExtendsListTypes(), highlightingManager);
JavaDocumentationProvider.writeImplements(aClass, buffer, aClass.getImplementsListTypes(), highlightingManager);
return buffer.toString();
}
public static void appendTypeString(@Nls @NotNull StringBuilder buffer, @Nullable PsiType type, PsiElement context) {
public static void appendTypeString(@Nls @NotNull StringBuilder buffer, @Nullable PsiType type, PsiElement context, boolean isRendered) {
if (type instanceof GrTraitType) {
generateTraitType(buffer, ((GrTraitType)type), context);
generateTraitType(buffer, ((GrTraitType)type), context, isRendered);
}
else if (type != null) {
JavaDocInfoGeneratorFactory.create(context.getProject(), null, false).generateType(buffer, type, context);
JavaDocInfoGeneratorFactory.create(context.getProject(), null, GroovyDocHighlightingManager.getInstance(), isRendered, doSyntaxHighlighting())
.generateType(buffer, type, context);
}
else {
buffer.append(GrModifier.DEF);
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getKeywordAttributes(), GrModifier.DEF);
}
}
private static void generateTraitType(@NotNull StringBuilder buffer, @NotNull GrTraitType type, PsiElement context) {
appendTypeString(buffer, type.getExprType(), context);
buffer.append(" as "); // <- Groovy keyword
for (PsiType traitType : type.getTraitTypes()) {
appendTypeString(buffer, traitType, context);
buffer.append(", ");
private static void generateTraitType(@NotNull StringBuilder buffer, @NotNull GrTraitType type, PsiElement context, boolean isRendered) {
appendTypeString(buffer, type.getExprType(), context, isRendered);
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getKeywordAttributes(), " as "); // <- Groovy keyword
@NotNull List<PsiType> types = type.getTraitTypes();
for (int i = 0; i < types.size(); i++) {
PsiType traitType = types.get(i);
appendTypeString(buffer, traitType, context, isRendered);
if (i != types.size() - 1) {
appendStyledSpan(buffer, GroovyDocHighlightingManager.getInstance().getCommaAttributes(), ", ");
}
}
buffer.delete(buffer.length() - 2, buffer.length());
}
@Override
@@ -286,32 +336,27 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@Override
@Nullable
public @Nls String generateDoc(PsiElement element, PsiElement originalElement) {
GroovyDocHighlightingManager highlightingManager = GroovyDocHighlightingManager.getInstance();
if (element instanceof GdslNamedParameter) {
String name = ((GdslNamedParameter)element).getName();
if (name == null) {
return null;
}
HtmlChunk nameAndType;
StringBuilder buffer = new StringBuilder("<pre>");
String parameterTypeText = ((GdslNamedParameter)element).myParameterTypeText;
appendStyledSpan(buffer, highlightingManager.getParameterAttributes(), name);
if (parameterTypeText != null) {
nameAndType = HtmlChunk.fragment(
HtmlChunk.text(name + ":").wrapWith("b"),
HtmlChunk.text(" "),
HtmlChunk.text(parameterTypeText)
);
appendStyledSpan(buffer, highlightingManager.getOperationSignAttributes(), ":");
buffer.append(" ");
appendStyledSpan(buffer, highlightingManager.getClassNameAttributes(), parameterTypeText);
}
else {
nameAndType = HtmlChunk.text(name).wrapWith("b");
}
HtmlChunk pre = nameAndType.wrapWith("pre");
buffer.append("</pre>");
String docString = ((GdslNamedParameter)element).docString;
if (docString == null) {
return pre.toString();
if (docString != null) {
buffer.append("<p>").append(HtmlChunk.text(docString)).append("</p>");
}
return HtmlChunk.fragment(
pre,
HtmlChunk.text(docString).wrapWith("p")
).toString();
return buffer.toString(); //NON-NLS
}
if (element instanceof GrReferenceExpression) {
@@ -330,12 +375,12 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
final String truncated = StringUtil.trimEnd(standard, BODY_HTML);
@Nls StringBuilder buffer = new StringBuilder(truncated);
buffer.append("<p>");
buffer.append("<p style='padding-left:8px;'>");
if (originalElement != null) {
appendInferredType(originalElement, (GrVariable)element, buffer);
appendInferredType(originalElement, (GrVariable)element, buffer, false);
}
else if (element.getParent() instanceof GrVariableDeclaration) {
appendInferredType(element.getParent(), (GrVariable)element, buffer);
appendInferredType(element.getParent(), (GrVariable)element, buffer, false);
}
if (!truncated.equals(standard)) {
@@ -361,7 +406,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
}
protected static @Nls @Nullable String generateExternalJavaDoc(@NotNull PsiElement element) {
JavaDocInfoGenerator generator = new GroovyDocInfoGenerator(element, false);
JavaDocInfoGenerator generator = new GroovyDocInfoGenerator(element, false, doSyntaxHighlighting());
return JavaDocumentationProvider.generateExternalJavadoc(element, generator);
}
@@ -434,20 +479,18 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
.formatMethod((PsiMethod)element, candidate.getSubstitutor(),
PsiFormatUtilBase.SHOW_NAME | PsiFormatUtilBase.SHOW_TYPE | PsiFormatUtilBase.SHOW_PARAMETERS,
PsiFormatUtilBase.SHOW_TYPE);
createElementLink(sb, element, str);
sb.append("&nbsp;&nbsp;");
appendElementLink(sb, element, str);
sb.append("<br>");
}
return CodeInsightBundle.message("javadoc.candidates", text, sb);
}
return JavaBundle.message("javadoc.candidates.not.found", text);
}
private static void createElementLink(@NonNls final StringBuilder sb, final PsiElement element, final String str) {
sb.append("&nbsp;&nbsp;<a href=\"psi_element://");
sb.append(JavaDocUtil.getReferenceText(element.getProject(), element));
sb.append("\">");
sb.append(str);
sb.append("</a>");
sb.append("<br>");
private static void appendElementLink(@NonNls StringBuilder sb, PsiElement element, String label) {
new GroovyDocInfoGenerator(element, false, doSyntaxHighlighting())
.appendMaybeUnresolvedLink(sb, element, label, element.getProject(), false);
}
@Override
@@ -564,7 +607,8 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@Override
public @Nls @Nullable String generateRenderedDoc(@NotNull PsiDocCommentBase comment) {
PsiElement owner = comment.getOwner();
String html = new GroovyDocInfoGenerator(owner == null ? comment : owner, true).generateRenderedDocInfo();
String html = new GroovyDocInfoGenerator(owner == null ? comment : owner, true, doSyntaxHighlighting())
.generateRenderedDocInfo();
return JavaDocExternalFilter.filterInternalDocInfo(html);
}
}
@@ -403,7 +403,7 @@ public class GroovyParameterInfoHandler implements ParameterInfoHandlerWithTabAc
private static void appendParameterText(PsiParameter param, PsiSubstitutor substitutor, StringBuilder buffer) {
if (param instanceof GrParameter) {
GrParameter grParam = (GrParameter)param;
GroovyPresentationUtil.appendParameterPresentation(grParam, substitutor, TypePresentation.PRESENTABLE, buffer);
GroovyPresentationUtil.appendParameterPresentation(grParam, substitutor, TypePresentation.PRESENTABLE, buffer, false);
final GrExpression initializer = grParam.getInitializerGroovy();
if (initializer != null) {
@@ -19,9 +19,8 @@ class Bar<T> { java.util.List<T> foo(T param); }
new Bar<String>().f<caret>oo();
'''
def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset)
assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) == """\
Bar
<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> foo (<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> param)"""
assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) ==
"""<span style="color:#000000;">Bar</span>\n<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">foo</span><span style="">(</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="">param</span><span style="">)</span>"""
}
void testGenericField() {
@@ -30,9 +29,8 @@ class Bar<T> { T field; }
new Bar<Integer>().fi<caret>eld
'''
def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset)
assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) == """\
Bar
<a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a> getField ()"""
assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) ==
"""<span style="color:#000000;">Bar</span>\n<a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a> <span style="color:#000000;">getField</span><span style="">(</span><span style="">)</span>"""
}
void testLink() {
@@ -46,7 +44,7 @@ class Gr {
}
new Gr().fo<caret>o()
''', '''\
<div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Gr"><code><span style="color:#000000;">Gr</span></code></a></pre></div><div class='content'>
<div class='definition'><pre><span style="color:#000043;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
Use <a href="psi_element://Gr#bar()"><code><span style="color:#000000;">bar</span><span style="">()</span></code></a> from class <a href="psi_element://Gr"><code><span style="color:#000000;">Gr</span></code></a> instead
</div><table class='sections'></table>'''
}
@@ -59,7 +57,7 @@ new Gr().fo<caret>o()
def docs() {}
<caret>docs()
''', '''<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://_"><code><span style="color:#000000;">_</span></code></a></pre></div><div class='content'>
''', '''<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
check this out <a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">character sequences</span></code></a>
</div><table class='sections'></table>'''
}
@@ -81,7 +79,7 @@ class Main {
}
Main.<caret>docs()
''', '''\
<div class='definition'><pre><span style="color:#000080;font-weight:bold;">static</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Main"><code><span style="color:#000000;">Main</span></code></a></pre></div><div class='content'>
<div class='definition'><pre><span style="color:#000043;font-weight:bold;">static</span>&nbsp;<span style="color:#000043;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
Link 1: <a href="psi_element://Main#foo(java.lang.String[])"><code><span style="color:#000000;">foo</span><span style="">(String[])</span></code></a>
<p>
Link 2: <a href="psi_element://Main#bar(java.lang.String[])"><code><span style="color:#000000;">bar</span><span style="">(String[])</span></code></a>
@@ -96,7 +94,7 @@ Main.<caret>docs()
def aa = 1
a<caret>a
''', '''\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a> <span style="color:#000000;">aa</span></pre></div><table class='sections'></table><p>[Inferred type] <a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a>'''
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a> <span style="color:#000000;">aa</span></pre></div><table class='sections'></table><p style='padding-left:8px;'><span style="color: #909090">[Inferred type]</span> <a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a>'''
}
void 'test implicit closure parameter'() {
@@ -104,7 +102,7 @@ a<caret>a
List<String> ss = []
ss.collect { i<caret>t }
''', '''\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a> <span style="color:#000000;">it</span></pre></div><table class='sections'></table><p>[Inferred type] <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>'''
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a> <span style="color:#000000;">it</span></pre></div><table class='sections'></table><p style='padding-left:8px;'><span style="color: #909090">[Inferred type]</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>'''
}
void 'test code tag'() {
@@ -119,7 +117,7 @@ class Foo {
}
new Foo().<caret>foo()
''', '''\
<div class='definition'><pre><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://Foo"><code><span style="color:#000000;">Foo</span></code></a></pre></div><div class='content'>
<div class='definition'><pre><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
May return <code><span style=""><span style="color:#000043;font-weight:bold;">null</span></span></code>
</div><table class='sections'></table>\
'''
@@ -134,7 +132,7 @@ def foo() {}
f<caret>oo()""",
"""\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span><br><span class='grayed'>defined in </span><a href="psi_element://_"><code><span style="color:#000000;">_</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><code> lorem ipsum </code></td></table>\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><code> lorem ipsum </code></td></table>\
"""
}
@@ -146,8 +144,7 @@ f<caret>oo()""",
class GroovyDocTest<T> { }
new Gr<caret>oovyDocTest<Integer>()""", """\
<div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">GroovyDocTest</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="https://google.com">ref</a></td></table>\
<div class='definition'><pre><span style="color:#000043;font-weight:bold;">class</span> <span style="color:#000000;">GroovyDocTest</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="https://google.com">ref</a></td></table>\
"""
}
@@ -160,8 +157,7 @@ new Gr<caret>oovyDocTest<Integer>()""", """\
class GroovyDocTest<T> { }
new Gr<caret>oovyDocTest<Integer>()""", """\
<div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">GroovyDocTest</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span>
<span style="color:#000080;font-weight:bold;">extends </span><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">T</span>&gt; &ndash; kej</td></table>\
<div class='definition'><pre><span style="color:#000043;font-weight:bold;">class</span> <span style="color:#000000;">GroovyDocTest</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">T</span>&gt; &ndash; kej</td></table>\
"""
}

Some files were not shown because too many files have changed in this diff Show More