From 6552646d41b880216dda378b8ef68e38d0003b42 Mon Sep 17 00:00:00 2001 From: Alexander Bashkirov Date: Wed, 1 Sep 2021 14:01:28 +0300 Subject: [PATCH] [javadoc] Implemented syntax highlighting for javadocs GitOrigin-RevId: 4544b607c251f14c294cbf6b25d689c7350f6f01 --- .../impl/analysis/HighlightNamesUtil.java | 2 +- .../NonCodeAnnotationsLineMarkerProvider.java | 2 +- .../javadoc/AnnotationDocGenerator.java | 48 +- .../{ColorUtil.java => JavaDocColorUtil.java} | 4 +- .../javadoc/JavaDocExternalFilter.java | 3 +- .../javadoc/JavaDocInfoGenerator.java | 622 ++++++++++++------ .../javadoc/JavaDocInfoGeneratorFactory.java | 18 +- .../lang/java/JavaDocumentationProvider.java | 86 +-- .../ctrlMouse/lambdaParameter.html | 2 +- .../codeInsight/ctrlMouse/varVariable.html | 2 +- .../codeInsight/javadocIG/annotations.html | 6 +- .../javadocIG/annotationsInParams.html | 4 +- .../javadocIG/anonymousAndSuperJavadoc.html | 4 +- .../codeInsight/javadocIG/apiNotes.html | 2 +- .../javadocIG/classTypeParameter.html | 4 +- .../classTypeParamsPresentation.html | 2 +- .../javadocIG/clickableFieldReference.html | 6 +- .../testData/codeInsight/javadocIG/code.html | 10 +- .../javadocIG/commaInsideArgsList.html | 2 +- .../javadocIG/constantFieldInitializer.html | 2 +- .../documentationForGetterByField.html | 2 +- ...JdkClassWhenExternalDocIsNotAvailable.html | 15 +- ...ssWithReferencesToClassesFromJavaLang.html | 6 +- ...ntationForUncheckedExceptionsInSupers.html | 6 +- .../codeInsight/javadocIG/doubleLt.html | 4 +- .../codeInsight/javadocIG/dumbMode.html | 4 +- .../javadocIG/enumConstantOrdinal.html | 4 +- .../javadocIG/enumConstantOrdinal_quick.html | 2 +- .../codeInsight/javadocIG/enumValueOf.html | 6 +- .../codeInsight/javadocIG/escapeValues.html | 4 +- .../javadocIG/escapingInLiteral.html | 2 +- .../javadocIG/escapingStringValue.html | 2 +- .../javadocIG/fieldInitializedWithArray.html | 2 +- .../javadocIG/fieldInitializedWithLambda.html | 2 +- .../fieldInitializedWithSizedArray.html | 2 +- .../codeInsight/javadocIG/fieldValue.html | 2 +- .../javadocIG/htmlLinkProject/htmlLink.html | 4 +- .../htmlLinkProject/pack/htmlLinkDeep.html | 4 +- .../htmlLinkToPackageInfo/pack/A.html | 4 +- .../javadocIG/htmlLinkWithRef.html | 4 +- .../codeInsight/javadocIG/ideadev2326.html | 4 +- .../javadocIG/inheritedDocInThrows.html | 4 +- .../javadocIG/inheritedDocInThrows1.html | 4 +- .../javadocIG/inheritedParameter.html | 2 +- .../javadocIG/initializerWithLiteral.html | 2 +- .../javadocIG/initializerWithNew.html | 2 +- .../javadocIG/initializerWithReference.html | 2 +- .../javadocIG/lambdaParameter.html | 2 +- .../javadocIG/legacySpacesInLiteral.html | 4 +- .../codeInsight/javadocIG/literal.html | 2 +- .../javadocIG/literalInsideCode.html | 9 +- .../javadocIG/localClassInsideAnonymous.html | 4 +- .../matchingParameterNameFromParent.html | 2 +- .../matchingTypeParameterNameFromParent.html | 2 +- .../methodExpressionWithLiteral.html | 2 +- .../javadocIG/methodFormatting.html | 6 +- .../javadocIG/methodTypeParameter.html | 2 +- .../javadocIG/multipleSpacesInLiteral.html | 4 +- .../javadocIG/noSpaceAfterTagName.html | 4 +- .../codeInsight/javadocIG/pInsidePre.html | 2 +- .../codeInsight/javadocIG/paramInJavadoc.html | 2 +- .../javadocIG/recordParameters.html | 6 +- .../codeInsight/javadocIG/simpleField.html | 2 +- .../javadocIG/superJavadocErasureResolve.html | 2 +- .../javadocIG/superJavadocExactResolve.html | 2 +- .../javadocIG/syntheticEnumValues.html | 6 +- .../codeInsight/javadocIG/typeAnnotation.html | 2 +- .../javadocIG/typeAnnotationArray.html | 2 +- .../javadocIG/typeAnnotationClass.html | 6 +- .../codeInsight/javadocIG/unicodeEscapes.html | 4 +- .../codeInsight/javadocIG/valueInMethod.html | 2 +- .../javadocIG/valueInMethodNoHash.html | 2 +- .../codeInsight/javadocIG/variableDoc.html | 2 +- .../codeInsight/JavaDocumentationTest.groovy | 22 +- .../javadoc/JavaDocInfoGeneratorTest.java | 11 +- .../javadoc/LightJavadocGeneratorTest.kt | 10 +- .../BytecodeAnalysisIntegrationTest.java | 13 +- .../resources/messages/JavaBundle.properties | 5 +- .../DocumentationManagerUtil.java | 38 +- .../DocumentationHtmlEditorKit.java | 2 +- .../documentation/DocumentationManager.java | 2 +- .../editor/richcopy/HtmlSyntaxInfoUtil.java | 198 +++++- .../com/intellij/util/ui/JBHtmlEditorKit.java | 122 +++- .../ThemeJsonDocumentationProvider.java | 3 +- ...tensionPointDocumentationProviderTest.java | 8 +- .../service/resolve/GradleGroovyProperty.kt | 5 +- .../src/service/resolve/GradleTaskProperty.kt | 4 +- .../groovy/lang/psi/impl/PsiImplUtil.java | 3 +- .../GroovyDocumentationProvider.java | 3 +- .../groovy/GroovyDocumentationTest.groovy | 66 +- .../plugins/groovy/dsl/GroovyDslTest.groovy | 2 +- .../idea/KotlinDocumentationProvider.kt | 6 +- .../kotlin/idea/kdoc/KDocRenderer.kt | 8 +- .../editor/quickDoc/JavadocNavigationTest.kt | 6 +- .../renderingKDoc/difficultKDoc.kt | 2 +- .../quickDoc/AtConstantWithUnderscore.kt | 2 +- .../editor/quickDoc/AtTypeParameter.kt | 2 +- .../quickDoc/ConstructorVarParameter.kt | 2 +- .../JavaClassConstructorUsedInKotlin.kt | 6 +- .../editor/quickDoc/JavaClassUsedInKotlin.kt | 6 +- .../quickDoc/JavaDocFromOverridenClass.kt | 4 +- .../quickDoc/JavaDocFromOverridenInterface.kt | 4 +- .../editor/quickDoc/JavaMethodUsedInKotlin.kt | 8 +- .../quickDoc/JavaMethodUsedInKotlinInParen.kt | 10 +- .../quickDoc/KotlinClassUsedFromJava.java | 2 +- .../KotlinPackageClassUsedFromJava.java | 4 +- .../testData/editor/quickDoc/LateinitName.kt | 2 +- .../editor/quickDoc/MethodFromStdLib.kt | 4 +- .../quickDoc/OnEmptySecondaryConstructor.kt | 2 +- .../testData/editor/quickDoc/OnEnumEntry.kt | 2 +- .../editor/quickDoc/OnEnumEntryUsage.kt | 2 +- .../editor/quickDoc/OnEnumValueOfFunction.kt | 4 +- .../editor/quickDoc/OnEnumValuesFunction.kt | 2 +- .../OnFunctionDeclarationWithPackage.kt | 2 +- .../editor/quickDoc/OnInheritedMethodUsage.kt | 2 +- .../quickDoc/OnInheritedPropertyUsage.kt | 2 +- .../OnMethodUsageWithReturnAndThrows.kt | 2 +- .../editor/quickDoc/OnMethodUsageWithSee.kt | 2 +- .../tests/testData/editor/quickDoc/Samples.kt | 6 +- .../testData/editor/quickDoc/TailrecName.kt | 2 +- .../quickDoc/TopLevelMethodFromJava.java | 2 +- .../multiModuleSamples/fqName/code/usage.kt | 8 +- .../multiModuleSamples/simple/code/usage.kt | 2 +- .../code/usageNestedTypeParameters.kt | 2 +- .../code/usageSingleTypeParameter.kt | 2 +- 125 files changed, 1080 insertions(+), 578 deletions(-) rename java/java-impl/src/com/intellij/codeInsight/javadoc/{ColorUtil.java => JavaDocColorUtil.java} (98%) diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java index 4e89292e1ac4..a58fc28603d2 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightNamesUtil.java @@ -80,7 +80,7 @@ public final class HighlightNamesUtil { return false; } - private static boolean isStaticallyImported(@NotNull PsiElement elementToHighlight) { + public static boolean isStaticallyImported(@NotNull PsiElement elementToHighlight) { PsiReferenceExpression referenceExpression = PsiTreeUtil.getParentOfType(elementToHighlight, PsiReferenceExpression.class); if (referenceExpression != null) { JavaResolveResult result = referenceExpression.advancedResolve(false); diff --git a/java/java-impl/src/com/intellij/codeInsight/NonCodeAnnotationsLineMarkerProvider.java b/java/java-impl/src/com/intellij/codeInsight/NonCodeAnnotationsLineMarkerProvider.java index 348f053ecf53..a3e64a353f0c 100644 --- a/java/java-impl/src/com/intellij/codeInsight/NonCodeAnnotationsLineMarkerProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/NonCodeAnnotationsLineMarkerProvider.java @@ -92,7 +92,7 @@ public abstract class NonCodeAnnotationsLineMarkerProvider extends LineMarkerPro String tooltip = XmlStringUtil.wrapInHtml( NonCodeAnnotationGenerator.getNonCodeHeaderAvalable(nonCodeAnnotations) + CommonXmlStrings.NBSP + JavaBundle.message("non.code.annotations.explanation.full.signature") + "

\n" + - JavaDocInfoGenerator.generateSignature(owner)); + new JavaDocInfoGenerator(owner.getProject(), owner, false).generateSignature(owner)); return new LineMarkerInfo<>(element, element.getTextRange(), AllIcons.Gutter.ExtAnnotation, __ -> tooltip, MyIconGutterHandler.INSTANCE, GutterIconRenderer.Alignment.RIGHT); } diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/AnnotationDocGenerator.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/AnnotationDocGenerator.java index 7880da53fff1..418b0e263561 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/AnnotationDocGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/AnnotationDocGenerator.java @@ -3,12 +3,13 @@ package com.intellij.codeInsight.javadoc; import com.intellij.codeInsight.AnnotationTargetUtil; import com.intellij.codeInsight.AnnotationUtil; +import com.intellij.ide.highlighter.JavaHighlightingColors; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.psi.*; import com.intellij.util.ObjectUtils; import com.intellij.util.containers.ContainerUtil; -import com.intellij.xml.util.XmlStringUtil; import one.util.streamex.StreamEx; import org.intellij.lang.annotations.Flow; import org.jetbrains.annotations.NotNull; @@ -18,6 +19,9 @@ 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); @NotNull private final PsiAnnotation myAnnotation; @@ -85,12 +89,19 @@ public final class AnnotationDocGenerator { boolean generateLink = format != AnnotationFormat.ToolTip; boolean forceShortNames = format != AnnotationFormat.JavaDocComplete; - buffer.append("@"); + if (red) { + buffer.append("@"); + } else { + appendStyledSpan(buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, "@"); + } String name = forceShortNames ? myNameReference.getReferenceName() : myNameReference.getText(); if (type != null && generateLink) { - JavaDocInfoGenerator.generateLink(buffer, myTargetClass, name, format == AnnotationFormat.JavaDocComplete); - } else { - buffer.append(name); + String styledName = getStyledSpan(JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name); + new JavaDocInfoGenerator(myContext.getProject(), null, format != AnnotationFormat.JavaDocComplete) + .generateLink(buffer, myTargetClass, styledName, format == AnnotationFormat.JavaDocComplete); + } + else if (!red && name != null) { + appendStyledSpan(buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name); } if (red) buffer.append(""); @@ -102,34 +113,36 @@ public final class AnnotationDocGenerator { private void generateAnnotationAttributes(StringBuilder buffer, boolean generateLink) { final PsiNameValuePair[] attributes = myAnnotation.getParameterList().getAttributes(); if (attributes.length > 0) { - buffer.append("("); + appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, "("); boolean first = true; for (PsiNameValuePair pair : attributes) { - if (!first) buffer.append(", "); + if (!first) appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", "); first = false; generateAnnotationAttribute(buffer, generateLink, pair); } - buffer.append(")"); + appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, ")"); } } private static void generateAnnotationAttribute(StringBuilder buffer, boolean generateLink, PsiNameValuePair pair) { final String name = pair.getName(); if (name != null) { - buffer.append(name); - buffer.append(" = "); + appendStyledSpan(buffer, JavaHighlightingColors.ANNOTATION_ATTRIBUTE_NAME_ATTRIBUTES, name); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " = "); } final PsiAnnotationMemberValue value = pair.getValue(); if (value != null) { if (value instanceof PsiArrayInitializerMemberValue) { - buffer.append("{"); + appendStyledSpan(buffer, JavaHighlightingColors.BRACES, "{"); boolean firstMember = true; for(PsiAnnotationMemberValue memberValue:((PsiArrayInitializerMemberValue)value).getInitializers()) { - if (!firstMember) buffer.append(","); + if (!firstMember) { + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ","); + } firstMember = false; appendLinkOrText(buffer, memberValue, generateLink); } - buffer.append("}"); + appendStyledSpan(buffer, JavaHighlightingColors.BRACES, "}"); } else { appendLinkOrText(buffer, value, generateLink); @@ -161,12 +174,17 @@ public final class AnnotationDocGenerator { else { if (aClass != null) text = aClass.getQualifiedName() + '#' + field.getName(); } - JavaDocInfoGenerator.generateLink(buffer, text, aClass != null? aClass.getName() + '.' + field.getName():null, memberValue, false); + new JavaDocInfoGenerator(field.getProject(), null, true) + .generateLink(buffer, text, aClass != null? aClass.getName() + '.' + field.getName():null, memberValue, false); return; } } - buffer.append(XmlStringUtil.escapeString(memberValue.getText())); + HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet( + buffer, + memberValue.getProject(), + memberValue.getLanguage(), + memberValue.getText()); } public static List getAnnotationsToShow(@NotNull PsiAnnotationOwner owner, @NotNull PsiElement context) { diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/ColorUtil.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocColorUtil.java similarity index 98% rename from java/java-impl/src/com/intellij/codeInsight/javadoc/ColorUtil.java rename to java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocColorUtil.java index 3eecefe907ed..9dbfcbc22cfd 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/ColorUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocColorUtil.java @@ -12,8 +12,8 @@ import java.awt.*; /** * @author spleaner */ -public final class ColorUtil { - private ColorUtil() { +public final class JavaDocColorUtil { + private JavaDocColorUtil() { } public static String generatePreviewHtml(@NotNull final Color color) { diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java index dd15dff25c22..bc6472cf554a 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocExternalFilter.java @@ -116,7 +116,8 @@ public class JavaDocExternalFilter extends AbstractExternalFilter { PsiClass aClass = ((PsiMethod)element).getContainingClass(); if (aClass != null) { String qName = aClass.getQualifiedName(); - return pair(qName, qName + JavaDocInfoGenerator.generateTypeParameters(aClass, true)); + return pair(qName, qName + new JavaDocInfoGenerator(aClass.getProject(), null, false) + .generateTypeParameters(aClass, true)); } return null; } diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java index 87121dd5fd7f..fe8cd10c5696 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGenerator.java @@ -1,17 +1,24 @@ // 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.CommonBundle; 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.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.project.DumbService; import com.intellij.openapi.project.IndexNotReadyException; import com.intellij.openapi.project.Project; @@ -49,24 +56,29 @@ import java.io.InputStream; import java.net.URL; import java.nio.charset.StandardCharsets; import java.util.*; +import java.util.List; import java.util.function.Supplier; 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); private interface InheritDocProvider { Pair> getInheritDoc(); + PsiClass getElement(); } @FunctionalInterface - private interface DocTagLocator { + private interface DocTagLocator { T find(PsiDocCommentOwner owner, PsiDocComment comment); } - private static final String THROWS_KEYWORD = "throws"; private static final String BR_TAG = "
"; private static final String LINK_TAG = "link"; private static final String LITERAL_TAG = "literal"; @@ -97,19 +109,28 @@ public class JavaDocInfoGenerator { private static final InheritDocProvider ourEmptyElementsProvider = mapProvider(ourEmptyProvider, false); - @NotNull - private final Project myProject; - private final PsiElement myElement; - private final JavaSdkVersion mySdkVersion; + private final @NotNull Project myProject; + private final @Nullable PsiElement myElement; + private final boolean myIsRendered; + private final @Nullable JavaSdkVersion mySdkVersion; - public JavaDocInfoGenerator(@NotNull Project project, PsiElement element) { + public JavaDocInfoGenerator(@NotNull Project project, @Nullable PsiElement element) { + this(project, element, false); + } + + public JavaDocInfoGenerator(@NotNull Project project, @Nullable PsiElement element, boolean isGenerationForRenderedDoc) { myProject = project; myElement = element; + myIsRendered = isGenerationForRenderedDoc; Sdk jdk = JavadocGeneratorRunProfile.getSdk(myProject); mySdkVersion = jdk == null ? null : JavaSdk.getInstance().getVersion(jdk); } + public boolean isRendered() { + return myIsRendered; + } + private static InheritDocProvider mapProvider(InheritDocProvider i, boolean dropFirst) { return new InheritDocProvider<>() { @Override @@ -343,16 +364,16 @@ public class JavaDocInfoGenerator { public boolean generateDocInfoCore(StringBuilder buffer, boolean generatePrologue) { if (myElement instanceof PsiClass) { - generateClassJavaDoc(buffer, (PsiClass)myElement, generatePrologue, false); + generateClassJavaDoc(buffer, (PsiClass)myElement, generatePrologue); } else if (myElement instanceof PsiMethod) { - generateMethodJavaDoc(buffer, (PsiMethod)myElement, generatePrologue, false); + generateMethodJavaDoc(buffer, (PsiMethod)myElement, generatePrologue); } else if (myElement instanceof PsiParameter) { generateMethodParameterJavaDoc(buffer, (PsiParameter)myElement, generatePrologue); } else if (myElement instanceof PsiField) { - generateFieldJavaDoc(buffer, (PsiField)myElement, generatePrologue, false); + generateFieldJavaDoc(buffer, (PsiField)myElement, generatePrologue); } else if (myElement instanceof PsiVariable) { generateVariableJavaDoc(buffer, (PsiVariable)myElement, generatePrologue); @@ -366,7 +387,7 @@ public class JavaDocInfoGenerator { generatePackageJavaDoc(buffer, (PsiPackage)myElement, generatePrologue); } else if (myElement instanceof PsiJavaModule) { - generateModuleJavaDoc(buffer, (PsiJavaModule)myElement, generatePrologue, false); + generateModuleJavaDoc(buffer, (PsiJavaModule)myElement, generatePrologue); } else { return false; @@ -375,7 +396,7 @@ public class JavaDocInfoGenerator { return true; } - public static @NlsSafe String generateSignature(PsiElement element) { + public @NlsSafe String generateSignature(PsiElement element) { StringBuilder buf = new StringBuilder(); if (element instanceof PsiClass) { if (generateClassSignature(buf, (PsiClass)element, SignaturePlace.ToolTip)) return null; @@ -417,16 +438,16 @@ public class JavaDocInfoGenerator { StringBuilder buffer = new StringBuilder(); if (myElement instanceof PsiClass) { - generateClassJavaDoc(buffer, (PsiClass)myElement, true, true); + generateClassJavaDoc(buffer, (PsiClass)myElement, true); } else if (myElement instanceof PsiMethod) { - generateMethodJavaDoc(buffer, (PsiMethod)myElement, true, true); + generateMethodJavaDoc(buffer, (PsiMethod)myElement, true); } else if (myElement instanceof PsiField) { - generateFieldJavaDoc(buffer, (PsiField)myElement, true, true); + generateFieldJavaDoc(buffer, (PsiField)myElement, true); } else if (myElement instanceof PsiJavaModule) { - generateModuleJavaDoc(buffer, (PsiJavaModule)myElement, true, true); + generateModuleJavaDoc(buffer, (PsiJavaModule)myElement, true); } else if (myElement instanceof PsiDocComment) { // package-info case generatePackageJavaDoc(buffer, (PsiDocComment)myElement, true); @@ -451,7 +472,7 @@ public class JavaDocInfoGenerator { else { PsiFile containingFile = myElement.getNavigationElement().getContainingFile(); if (containingFile == null) return false; - items = new PsiFileSystemItem[] {containingFile}; + items = new PsiFileSystemItem[]{containingFile}; } ProjectFileIndex projectFileIndex = ProjectFileIndex.SERVICE.getInstance(myProject); for (PsiFileSystemItem item : items) { @@ -461,40 +482,41 @@ public class JavaDocInfoGenerator { return false; } - private void generateClassJavaDoc(StringBuilder buffer, PsiClass aClass, boolean generatePrologue, boolean rendered) { + private void generateClassJavaDoc(StringBuilder buffer, PsiClass aClass, boolean generatePrologue) { if (aClass instanceof PsiAnonymousClass) return; if (generatePrologue) generatePrologue(buffer); - if (!rendered) { + 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()) { - buffer.append(packageName); - buffer.append(BR_TAG); + appendDefinedInClause(buffer); + PsiPackage aPackage = JavaPsiFacade.getInstance(file.getProject()).findPackage(packageName); + appendMaybeUnresolvedLink(buffer, aPackage, packageName, file.getProject(), false); } } - - if (generateClassSignature(buffer, aClass, SignaturePlace.Javadoc)) return; buffer.append(DocumentationMarkup.DEFINITION_END); } PsiDocComment comment = getDocComment(aClass); if (comment != null) { generateCommonSection(buffer, comment); - if (rendered) { + if (isRendered()) { generateAuthorAndVersionSections(buffer, comment); } generateRecordParametersSection(buffer, aClass, comment); - generateTypeParametersSection(buffer, aClass, rendered); + generateTypeParametersSection(buffer, aClass); } else { buffer.append(DocumentationMarkup.SECTIONS_START); } - if (!rendered) { + if (!isRendered()) { new NonCodeAnnotationGenerator(aClass, buffer).explainAnnotations(); } buffer.append(DocumentationMarkup.SECTIONS_END); @@ -506,32 +528,40 @@ public class JavaDocInfoGenerator { List collectedTags = new ArrayList<>(); for (PsiRecordComponent component : recordClass.getRecordComponents()) { PsiDocTag localTag = getTagByName(localTags, component.getName()); + String presentableName = generateOneParameterPresentableName(component); if (localTag != null) { - collectedTags.add(new ParamInfo(component.getName(), localTag, ourEmptyProvider)); + collectedTags.add(new ParamInfo(component.getName(), presentableName, localTag, ourEmptyProvider)); } } 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 static boolean generateClassSignature(StringBuilder buffer, PsiClass aClass, SignaturePlace place) { + private boolean generateClassSignature(StringBuilder buffer, PsiClass aClass, SignaturePlace place) { boolean generateLink = place == SignaturePlace.Javadoc; + String classKeyword = + aClass.isInterface() ? PsiKeyword.INTERFACE : + aClass.isEnum() ? PsiKeyword.ENUM : + aClass.isRecord() ? PsiKeyword.RECORD : PsiKeyword.CLASS; + generateAnnotations(buffer, aClass, place, true, false); generateModifiers(buffer, aClass, false); - buffer.append(aClass.isInterface() ? PsiKeyword.INTERFACE : - aClass.isEnum() ? PsiKeyword.ENUM : - aClass.isRecord() ? PsiKeyword.RECORD : - PsiKeyword.CLASS); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, classKeyword); buffer.append(' '); String refText = JavaDocUtil.getReferenceText(aClass.getProject(), aClass); if (refText == null) { buffer.setLength(0); return true; } - String labelText = JavaDocUtil.getLabelText(aClass.getProject(), aClass.getManager(), refText, aClass); - buffer.append(""); - buffer.append(labelText); - buffer.append(""); + String className = JavaDocUtil.getLabelText(aClass.getProject(), aClass.getManager(), refText, aClass); + appendStyledSpan(buffer, getClassTextAttributes(aClass), className); buffer.append(generateTypeParameters(aClass, false)); @@ -539,7 +569,7 @@ public class JavaDocInfoGenerator { PsiClassType[] refs = aClass.getExtendsListTypes(); if (refs.length > 0 || !aClass.isInterface() && !CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) { - buffer.append("extends "); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "extends "); if (refs.length == 0) { generateLink(buffer, CommonClassNames.JAVA_LANG_OBJECT, null, aClass, false); } @@ -551,7 +581,7 @@ public class JavaDocInfoGenerator { refs = aClass.getImplementsListTypes(); if (refs.length > 0) { - buffer.append("implements "); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "implements "); generateRefList(buffer, aClass, generateLink, refs); buffer.append('\n'); } @@ -561,59 +591,80 @@ public class JavaDocInfoGenerator { return false; } - private static void generateRefList(StringBuilder buffer, PsiClass aClass, boolean generateLink, PsiClassType[] refs) { + private void generateRefList(StringBuilder buffer, PsiClass aClass, boolean generateLink, PsiClassType[] refs) { for (int i = 0; i < refs.length; i++) { generateType(buffer, refs[i], aClass, generateLink); if (i < refs.length - 1) { - buffer.append(',').append(NBSP); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ","); + buffer.append(NBSP); } } } - private void generateTypeParametersSection(StringBuilder buffer, PsiClass aClass, boolean rendered) { + private void generateTypeParametersSection(StringBuilder buffer, PsiClass aClass) { List result = new ArrayList<>(); PsiTypeParameter[] typeParameters = aClass.getTypeParameters(); for (int i = 0; i < typeParameters.length; i++) { PsiTypeParameter typeParameter = typeParameters[i]; - String name = '<' + typeParameter.getName() + '>'; + String presentableParamName = generateOneTypeParameterPresentableName(typeParameter); DocTagLocator locator = typeParameterLocator(i); - Pair> inClassComment = findInClassComment(aClass, locator, rendered); + Pair> inClassComment = findInClassComment(aClass, locator); if (inClassComment != null) { - result.add(new ParamInfo(name, inClassComment)); + result.add(new ParamInfo(typeParameter.getName(), presentableParamName, inClassComment)); } - else if (!rendered) { + else if (!isRendered()) { Pair> inHierarchy = findInHierarchy(aClass, locator); if (inHierarchy != null) { - result.add(new ParamInfo(name, inHierarchy)); + result.add(new ParamInfo(typeParameter.getName(), presentableParamName, inHierarchy)); } } } generateParametersSection(buffer, JavaBundle.message("javadoc.type.parameters"), result); } + @NotNull + private static String generateOneParameterPresentableName(PsiNamedElement parameter) { + StringBuilder paramName = new StringBuilder(); + appendStyledSpan( + paramName, + JavaHighlightingColors.PARAMETER_ATTRIBUTES, + Objects.requireNonNullElse(parameter.getName(), CommonBundle.getErrorTitle())); + return paramName.toString(); + } + + @NotNull + private static String generateOneTypeParameterPresentableName(PsiTypeParameter typeParameter) { + StringBuilder paramName = new StringBuilder(); + paramName.append(LT); + appendStyledSpan( + paramName, + JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES, + Objects.requireNonNullElse(typeParameter.getName(), CommonBundle.getErrorTitle())); + paramName.append(GT); + return paramName.toString(); + } + @Nullable - private static Pair> findInHierarchy(PsiClass psiClass, DocTagLocator locator) { + private Pair> findInHierarchy(PsiClass psiClass, DocTagLocator locator) { for (PsiClass superClass : psiClass.getSupers()) { - Pair> pair = findInClassComment(superClass, locator, false); + Pair> pair = findInClassComment(superClass, locator); if (pair != null) return pair; } for (PsiClass superInterface : psiClass.getInterfaces()) { - Pair> pair = findInClassComment(superInterface, locator, false); + Pair> pair = findInClassComment(superInterface, locator); if (pair != null) return pair; } return null; } @Nullable - private static Pair> findInClassComment(PsiClass psiClass, - DocTagLocator locator, - boolean rendered) { + private Pair> findInClassComment(PsiClass psiClass, DocTagLocator locator) { PsiDocTag tag = locator.find(psiClass, getDocComment(psiClass)); if (tag != null) { return new Pair<>(tag, new InheritDocProvider<>() { @Override public Pair> getInheritDoc() { - return rendered ? null : findInHierarchy(psiClass, locator); + return isRendered() ? null : findInHierarchy(psiClass, locator); } @Override @@ -645,20 +696,21 @@ public class JavaDocInfoGenerator { return comment; } - private void generateFieldJavaDoc(StringBuilder buffer, PsiField field, boolean generatePrologue, boolean rendered) { + private void generateFieldJavaDoc(StringBuilder buffer, PsiField field, boolean generatePrologue) { if (generatePrologue) generatePrologue(buffer); - if (!rendered) { + if (!isRendered()) { buffer.append(DocumentationMarkup.DEFINITION_START); - generateLinkToParentIfNeeded(buffer, field); generateFieldSignature(buffer, field, SignaturePlace.Javadoc); + generateLinkToParentIfNeeded(buffer, field); + enumConstantOrdinal(buffer, field, field.getContainingClass(), "\n"); buffer.append(DocumentationMarkup.DEFINITION_END); } PsiDocComment comment = getDocComment(field); if (comment != null) { generateCommonSection(buffer, comment); - if (rendered) { + if (isRendered()) { generateAuthorAndVersionSections(buffer, comment); } } @@ -666,23 +718,39 @@ public class JavaDocInfoGenerator { buffer.append(DocumentationMarkup.SECTIONS_START); } - if (!rendered) { - ColorUtil.appendColorPreview(field, buffer); + if (!isRendered()) { + JavaDocColorUtil.appendColorPreview(field, buffer); new NonCodeAnnotationGenerator(field, buffer).explainAnnotations(); } buffer.append(DocumentationMarkup.SECTIONS_END); } - private static void generateFieldSignature(StringBuilder buffer, PsiField field, SignaturePlace place) { + 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(" "); - buffer.append(field.getName()); - buffer.append(""); + buffer.append(" "); + appendStyledSpan(buffer, getFieldTextAttributes(field), field.getName()); appendInitializer(buffer, field); - enumConstantOrdinal(buffer, field, field.getContainingClass(), "\n"); } public static void enumConstantOrdinal(@Nls StringBuilder buffer, PsiField field, PsiClass parentClass, String newLine) { @@ -691,7 +759,10 @@ public class JavaDocInfoGenerator { int idx = ArrayUtilRt.find(fields, field); if (idx >= 0) { buffer.append(newLine); - buffer.append(JavaBundle.message("enum.constant.ordinal")).append(idx); + buffer.append(DocumentationMarkup.GRAYED_START); + buffer.append(JavaBundle.message("enum.constant.ordinal")); + buffer.append(idx); + buffer.append(DocumentationMarkup.GRAYED_END); } } } @@ -703,7 +774,7 @@ public class JavaDocInfoGenerator { generateVariableDefinition(buffer, variable, false); buffer.append(DocumentationMarkup.SECTIONS_START); - ColorUtil.appendColorPreview(variable, buffer); + JavaDocColorUtil.appendColorPreview(variable, buffer); buffer.append(DocumentationMarkup.SECTIONS_END); } @@ -734,13 +805,14 @@ public class JavaDocInfoGenerator { buffer.append(DocumentationMarkup.SECTIONS_END); } - private void generateModuleJavaDoc(StringBuilder buffer, PsiJavaModule module, boolean generatePrologue, boolean rendered) { + private void generateModuleJavaDoc(StringBuilder buffer, PsiJavaModule module, boolean generatePrologue) { if (generatePrologue) generatePrologue(buffer); - if (!rendered) { + if (!isRendered()) { buffer.append(DocumentationMarkup.DEFINITION_START); generateAnnotations(buffer, module, SignaturePlace.Javadoc, true, false); - buffer.append("module ").append(module.getName()).append(""); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "module "); + appendStyledSpan(buffer, JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, module.getName()); buffer.append(DocumentationMarkup.DEFINITION_END); } @@ -799,7 +871,8 @@ public class JavaDocInfoGenerator { htmlText = subTag.getValue(); } } - catch (JDOMException | IOException ignore) {} + catch (JDOMException | IOException ignore) { + } htmlText = StringUtil.replace(htmlText, "*/", "*/"); @@ -840,7 +913,8 @@ public class JavaDocInfoGenerator { } try { return instance.getElementFactory().createExpressionFromText(text, variable); - } catch (IncorrectOperationException ex) { + } + catch (IncorrectOperationException ex) { LOG.info("type:" + type.getCanonicalText() + "; text: " + text, ex); } } @@ -850,23 +924,23 @@ public class JavaDocInfoGenerator { } public static void appendExpressionValue(StringBuilder buffer, PsiExpression initializer) { - buffer.append(" = "); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " = "); String text = initializer.getText().trim(); int index = newLineIndex(text); boolean trunc = index < text.length(); if (trunc) { text = text.substring(0, index); } - buffer.append(StringUtil.escapeXmlEntities(text)); + appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, initializer.getProject(), initializer.getLanguage(), text); if (trunc) { buffer.append("..."); } } - private static void appendInitializer(StringBuilder buffer, PsiVariable variable) { + private void appendInitializer(StringBuilder buffer, PsiVariable variable) { PsiExpression initializer = variable.getInitializer(); if (initializer != null) { - buffer.append(" = "); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " = "); String text = initializer.getText().trim(); int index = newLineIndex(text); if (index < text.length()) { @@ -894,16 +968,11 @@ public class JavaDocInfoGenerator { return Math.min(index1, index2); } - private static int generateModifiers(StringBuilder buffer, PsiModifierListOwner owner, boolean nbsp) { + public static int generateModifiers(StringBuilder buffer, PsiModifierListOwner owner, boolean nbsp) { String modifiers = PsiFormatUtil.formatModifiers(owner, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY); if (!modifiers.isEmpty()) { - buffer.append(modifiers); - if (nbsp) { - buffer.append(NBSP); - } - else { - buffer.append(' '); - } + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, modifiers); + buffer.append(nbsp ? NBSP : ' '); } return modifiers.length(); } @@ -949,17 +1018,16 @@ public class JavaDocInfoGenerator { AnnotationUtil.isAnnotated((PsiClass)annotationType, CommonClassNames.JAVA_LANG_ANNOTATION_REPEATABLE, 0); } - private static void generateVariableDefinition(StringBuilder buffer, PsiVariable variable, boolean annotations) { + private void generateVariableDefinition(StringBuilder buffer, PsiVariable variable, boolean annotations) { buffer.append(DocumentationMarkup.DEFINITION_START); generateModifiers(buffer, variable, false); if (annotations) { generateAnnotations(buffer, variable, SignaturePlace.Javadoc, true, false); } generateType(buffer, variable.getType(), variable); - buffer.append(" "); - buffer.append(variable.getName()); + buffer.append(" "); + appendStyledSpan(buffer, JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES, variable.getName()); appendInitializer(buffer, variable); - buffer.append(""); buffer.append(DocumentationMarkup.DEFINITION_END); } @@ -976,7 +1044,7 @@ public class JavaDocInfoGenerator { ParamInfo tagInfoProvider = findTagInfoProvider(parameter, psiMethod, parameterList); if (tagInfoProvider != null) { buffer.append(DocumentationMarkup.CONTENT_START); - buffer.append(generateOneParameter( tagInfoProvider)); + buffer.append(generateOneParameter(tagInfoProvider)); buffer.append(DocumentationMarkup.CONTENT_END); } } @@ -1013,17 +1081,18 @@ public class JavaDocInfoGenerator { PsiDocComment docComment = getDocComment(method); PsiDocTag[] localTags = docComment != null ? docComment.getTags() : PsiDocTag.EMPTY_ARRAY; int parameterIndex = parameterList.getParameterIndex(parameter); - return findDocTag(localTags, parameter.getName(), method, parameterLocator(parameterIndex), false); + return findDocTag(localTags, parameter.getName(), generateOneParameterPresentableName(parameter), + method, parameterLocator(parameterIndex)); } - private void generateMethodJavaDoc(StringBuilder buffer, PsiMethod method, boolean generatePrologue, boolean rendered) { + private void generateMethodJavaDoc(StringBuilder buffer, PsiMethod method, boolean generatePrologue) { if (generatePrologue) generatePrologue(buffer); - if (!rendered) { + if (!isRendered()) { buffer.append(DocumentationMarkup.DEFINITION_START); - generateLinkToParentIfNeeded(buffer, method); - generateMethodSignature(buffer, method, SignaturePlace.Javadoc); + + generateLinkToParentIfNeeded(buffer, method); buffer.append(DocumentationMarkup.DEFINITION_END); } @@ -1044,15 +1113,13 @@ public class JavaDocInfoGenerator { return method.getContainingClass(); } }); - if (!rendered) buffer.append("

"); buffer.append(DocumentationMarkup.CONTENT_END); buffer.append(DocumentationMarkup.SECTIONS_START); - if (!rendered) buffer.append("

"); } else { buffer.append(DocumentationMarkup.SECTIONS_START); - if (!rendered) { + if (!isRendered()) { buffer.append("

"); Pair> pair = findInheritDocTag(method, descriptionLocator); if (pair != null) { @@ -1062,7 +1129,8 @@ public class JavaDocInfoGenerator { startHeaderSection(buffer, JavaBundle.message(aClass.isInterface() ? "javadoc.description.copied.from.interface" : "javadoc.description.copied.from.class")) .append("

"); - generateLink(buffer, aClass, JavaDocUtil.getShortestClassName(aClass, method), false); + generateLink(buffer, aClass, getStyledSpan(getClassTextAttributes(aClass), JavaDocUtil.getShortestClassName(aClass, method)), + false); buffer.append(BR_TAG); generateValue(buffer, elements, pair.second); buffer.append(DocumentationMarkup.SECTION_END); @@ -1079,7 +1147,7 @@ public class JavaDocInfoGenerator { if (fieldDocComment != null && !isEmptyDescription(fieldDocComment)) { startHeaderSection(buffer, JavaBundle.message("javadoc.description.copied.from.field")) .append("

"); - generateLink(buffer, field, field.getName(), false); + generateLink(buffer, field, getStyledSpan(getFieldTextAttributes(field), field.getName()), false); buffer.append(BR_TAG); generateValue(buffer, fieldDocComment.getDescriptionElements(), ourEmptyElementsProvider); buffer.append(DocumentationMarkup.SECTION_END); @@ -1089,7 +1157,7 @@ public class JavaDocInfoGenerator { } } - if (!rendered) { + if (!isRendered()) { generateSuperMethodsSection(buffer, method, false); generateSuperMethodsSection(buffer, method, true); } @@ -1098,21 +1166,21 @@ public class JavaDocInfoGenerator { generateDeprecatedSection(buffer, comment); } - generateParametersSection(buffer, method, comment, rendered); - generateTypeParametersSection(buffer, method, comment, rendered); - generateReturnsSection(buffer, method, comment, rendered); - generateThrowsSection(buffer, method, comment, rendered); + generateParametersSection(buffer, method, comment); + generateTypeParametersSection(buffer, method, comment); + generateReturnsSection(buffer, method, comment); + generateThrowsSection(buffer, method, comment); if (comment != null) { generateApiSection(buffer, comment); generateSinceSection(buffer, comment); generateSeeAlsoSection(buffer, comment); - if (rendered) { + if (isRendered()) { generateAuthorAndVersionSections(buffer, comment); } } - if (!rendered) { + if (!isRendered()) { new NonCodeAnnotationGenerator(method, buffer).explainAnnotations(); } @@ -1121,22 +1189,36 @@ public class JavaDocInfoGenerator { private static StringBuilder startHeaderSection(StringBuilder buffer, String message) { return buffer.append(DocumentationMarkup.SECTION_HEADER_START) - .append(message) - .append(DocumentationMarkup.SECTION_SEPARATOR); + .append(message) + .append(DocumentationMarkup.SECTION_SEPARATOR); } - private static void generateLinkToParentIfNeeded(StringBuilder buffer, PsiMember member) { + 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); - buffer.append(BR_TAG); } } } - private static void generateMethodSignature(StringBuilder buffer, PsiMethod method, SignaturePlace place) { + 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; @@ -1158,13 +1240,11 @@ public class JavaDocInfoGenerator { buffer.append(NBSP); indent++; } - buffer.append(""); String name = method.getName(); - buffer.append(name); - buffer.append(""); + appendStyledSpan(buffer, getMethodDeclarationTextAttributes(method), name); indent += name.length(); - buffer.append('('); + appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, "("); PsiParameter[] parameters = method.getParameterList().getParameters(); for (int i = 0; i < parameters.length; i++) { PsiParameter parm = parameters[i]; @@ -1172,24 +1252,25 @@ public class JavaDocInfoGenerator { generateType(buffer, parm.getType(), method, generateLink, isTooltip); if (!isTooltip) { buffer.append(NBSP); - buffer.append(parm.getName()); + appendStyledSpan(buffer, JavaHighlightingColors.PARAMETER_ATTRIBUTES, parm.getName()); } if (i < parameters.length - 1) { - buffer.append(",\n "); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ",\n "); buffer.append(StringUtil.repeatSymbol(' ', indent)); } } - buffer.append(')'); + appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, ")"); PsiClassType[] refs = method.getThrowsList().getReferencedTypes(); if (refs.length > 0) { buffer.append('\n'); - buffer.append(THROWS_KEYWORD); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "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) { - buffer.append(',').append(NBSP); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ","); + buffer.append(NBSP); } } } @@ -1325,7 +1406,7 @@ public class JavaDocInfoGenerator { generateLinkValue(tag, buffer, false); } else if (tagName.equals(LITERAL_TAG)) { - generateLiteralValue(buffer, tag); + generateLiteralValue(buffer, tag, true); } else if (tagName.equals(CODE_TAG) || tagName.equals(SYSTEM_PROPERTY_TAG)) { generateCodeValue(tag, buffer); @@ -1352,15 +1433,58 @@ public class JavaDocInfoGenerator { } } + private static boolean isCodeBlock(PsiInlineDocTag tag) { + PsiElement prevSibling = tag.getPrevSibling(); + return CODE_TAG.equals(tag.getName()) + && (prevSibling instanceof PsiDocToken) + && StringUtil.endsWithIgnoreCase(StringUtil.trim(prevSibling.getText()), "

");
+  }
+
   private void generateCodeValue(PsiInlineDocTag tag, StringBuilder buffer) {
-    buffer.append("");
+    boolean isCodeBlock = isCodeBlock(tag);
+
+    if (isCodeBlock) {
+      // remove excess whitespaces between tags e.g. in `
  {@code`
+      int lastNonWhite = buffer.length() - 1;
+      while (buffer.charAt(lastNonWhite) == ' ') lastNonWhite--;
+      buffer.setLength(lastNonWhite + 1);
+    }
+
+    buffer.append(isRendered() ? "" : "");
     int pos = buffer.length();
-    generateLiteralValue(buffer, tag);
+
+    StringBuilder codeSnippetBuilder = new StringBuilder();
+    generateLiteralValue(codeSnippetBuilder, tag, false);
+    String codeSnippet = codeSnippetBuilder.toString();
+
+    codeSnippetBuilder.setLength(0);
+    appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
+      codeSnippetBuilder, tag.getProject(), tag.getLanguage(), codeSnippet);
+    codeSnippet = codeSnippetBuilder.toString();
+
+    codeSnippetBuilder.setLength(0);
+    TextAttributes codeAttributes = EditorColorsManager.getInstance().getGlobalScheme().getAttributes(HighlighterColors.TEXT).clone();
+    codeAttributes.setBackgroundColor(null);
+    appendStyledSpan(codeSnippetBuilder, codeAttributes, codeSnippet);
+    codeSnippet = codeSnippetBuilder.toString();
+
+    if (isCodeBlock) {
+      // indent code block
+      codeSnippet = Arrays.stream(codeSnippet.split(BR_TAG))
+        .map(it -> "  " + it)
+        .collect(Collectors.joining(BR_TAG));
+    }
+    else {
+      // we are in inline @code block, we should remove all new lines
+      codeSnippet = codeSnippet.replace(BR_TAG, "");
+    }
+
+    buffer.append(codeSnippet);
     buffer.append("");
     if (buffer.charAt(pos) == '\n') buffer.insert(pos, ' '); // line break immediately after opening tag is ignored by JEditorPane
   }
 
-  private void generateLiteralValue(StringBuilder buffer, PsiDocTag tag) {
+  private void generateLiteralValue(StringBuilder buffer, PsiDocTag tag, boolean doEscaping) {
     StringBuilder tmpBuffer = new StringBuilder();
     PsiElement[] children = tag.getChildren();
     for (int i = 2; i < children.length - 1; i++) { // process all children except tag opening/closing elements
@@ -1371,7 +1495,7 @@ public class JavaDocInfoGenerator {
         int pos = elementText.lastIndexOf('\n');
         if (pos >= 0) elementText = elementText.substring(0, pos + 1); // skip whitespace before leading asterisk
       }
-      appendPlainText(tmpBuffer, StringUtil.escapeXmlEntities(elementText));
+      appendPlainText(tmpBuffer, doEscaping ? StringUtil.escapeXmlEntities(elementText) : elementText);
     }
     if ((mySdkVersion == null || mySdkVersion.isAtLeast(JavaSdkVersion.JDK_1_8)) && isInPre(tag)) {
       buffer.append(tmpBuffer);
@@ -1389,8 +1513,10 @@ public class JavaDocInfoGenerator {
         int pos = text.lastIndexOf("pre>");
         if (pos > 0) {
           switch (text.charAt(pos - 1)) {
-            case '<' : return true;
-            case '/' : return false;
+            case '<':
+              return true;
+            case '/':
+              return false;
           }
         }
       }
@@ -1415,7 +1541,7 @@ public class JavaDocInfoGenerator {
     String text = createLinkText(tag.getDataElements());
     PsiField valueField = null;
     if (text.isEmpty()) {
-      if (myElement instanceof PsiField) valueField = (PsiField) myElement;
+      if (myElement instanceof PsiField) valueField = (PsiField)myElement;
     }
     else {
       if (text.indexOf('#') == -1) {
@@ -1429,7 +1555,7 @@ public class JavaDocInfoGenerator {
         LOG.debug(e);
       }
       if (target instanceof PsiField) {
-        valueField = (PsiField) target;
+        valueField = (PsiField)target;
       }
     }
 
@@ -1442,8 +1568,12 @@ public class JavaDocInfoGenerator {
     if (value != null) {
       String valueText = StringUtil.escapeXmlEntities(value.toString());
       if (value instanceof String) valueText = '"' + valueText + '"';
-      if (valueField.equals(myElement)) buffer.append(valueText); // don't generate link to itself
-      else generateLink(buffer, valueField, valueText, true);
+      if (valueField.equals(myElement)) {
+        buffer.append(valueText); // don't generate link to itself
+      }
+      else {
+        generateLink(buffer, valueField, valueText, true);
+      }
     }
     else {
       buffer.append(element.getText());
@@ -1516,7 +1646,8 @@ public class JavaDocInfoGenerator {
           }
         }
         if (i < tags.length - 1) {
-          buffer.append(",\n");
+          buffer.append(",");
+          buffer.append(BR_TAG);
         }
       }
       buffer.append(DocumentationMarkup.SECTION_END);
@@ -1539,15 +1670,15 @@ public class JavaDocInfoGenerator {
     }
   }
 
-  private void generateParametersSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment, boolean rendered) {
+  private void generateParametersSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment) {
     PsiParameter[] params = method.getParameterList().getParameters();
     PsiDocTag[] localTags = comment != null ? comment.findTagsByName("param") : PsiDocTag.EMPTY_ARRAY;
     List collectedTags = new ArrayList<>();
     for (int i = 0; i < params.length; i++) {
       PsiParameter param = params[i];
-      String paramName = param.getName();
+      String presentableName = generateOneParameterPresentableName(param);
       DocTagLocator tagLocator = parameterLocator(i);
-      ParamInfo parmTag = findDocTag(localTags, paramName, method, tagLocator, rendered);
+      ParamInfo parmTag = findDocTag(localTags, param.getName(), presentableName, method, tagLocator);
       if (parmTag != null) {
         collectedTags.add(parmTag);
       }
@@ -1555,15 +1686,15 @@ public class JavaDocInfoGenerator {
     generateParametersSection(buffer, CodeInsightBundle.message("javadoc.parameters"), collectedTags);
   }
 
-  private void generateTypeParametersSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment, boolean rendered) {
+  private void generateTypeParametersSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment) {
     PsiDocTag[] localTags = comment == null ? PsiDocTag.EMPTY_ARRAY : comment.findTagsByName("param");
     PsiTypeParameter[] typeParameters = method.getTypeParameters();
     List collectedTags = new ArrayList<>();
     for (int i = 0; i < typeParameters.length; i++) {
       PsiTypeParameter typeParameter = typeParameters[i];
-      String paramName = '<' + typeParameter.getName() + '>';
+      String presentableName = generateOneTypeParameterPresentableName(typeParameter);
       DocTagLocator tagLocator = typeParameterLocator(i);
-      ParamInfo parmTag = findDocTag(localTags, paramName, method, tagLocator, rendered);
+      ParamInfo parmTag = findDocTag(localTags, typeParameter.getName(), presentableName, method, tagLocator);
       if (parmTag != null) {
         collectedTags.add(parmTag);
       }
@@ -1574,23 +1705,23 @@ public class JavaDocInfoGenerator {
   private void generateParametersSection(StringBuilder buffer, String titleMessage, List collectedTags) {
     if (!collectedTags.isEmpty()) {
       startHeaderSection(buffer, titleMessage)
-            .append(StringUtil.join(collectedTags, tag -> generateOneParameter(tag), "

")) - .append(DocumentationMarkup.SECTION_END); + .append(StringUtil.join(collectedTags, tag -> generateOneParameter(tag), "

")) + .append(DocumentationMarkup.SECTION_END); } } @Nullable private ParamInfo findDocTag(PsiDocTag[] localTags, String paramName, + String presentableName, PsiMethod method, - DocTagLocator tagLocator, - boolean rendered) { + DocTagLocator tagLocator) { PsiDocTag localTag = getTagByName(localTags, paramName); if (localTag != null) { - return new ParamInfo(paramName, localTag, new InheritDocProvider<>() { + return new ParamInfo(paramName, presentableName, localTag, new InheritDocProvider<>() { @Override public Pair> getInheritDoc() { - return rendered ? null : findInheritDocTag(method, tagLocator); + return isRendered() ? null : findInheritDocTag(method, tagLocator); } @Override @@ -1599,9 +1730,9 @@ public class JavaDocInfoGenerator { } }); } - if (rendered) return null; + if (isRendered()) return null; Pair> tag = findInheritDocTag(method, tagLocator); - return tag == null ? null : new ParamInfo(paramName, tag); + return tag == null ? null : new ParamInfo(paramName, presentableName, tag); } private String generateOneParameter(ParamInfo tag) { @@ -1609,18 +1740,18 @@ public class JavaDocInfoGenerator { if (elements.length == 0) return ""; String text = elements[0].getText(); StringBuilder buffer = new StringBuilder(); - buffer.append(StringUtil.escapeXmlEntities(tag.name)); + buffer.append(tag.presentableName); buffer.append(" – "); generateValue(buffer, tag, elements, text); return buffer.toString(); } - private void generateReturnsSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment, boolean rendered) { + private void generateReturnsSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment) { PsiDocTag tag = comment == null ? null : new ReturnTagLocator().find(method, comment); Pair> pair = tag == null ? null : new Pair<>(tag, new InheritDocProvider<>() { @Override public Pair> getInheritDoc() { - return rendered ? null : findInheritDocTag(method, new ReturnTagLocator()); + return isRendered() ? null : findInheritDocTag(method, new ReturnTagLocator()); } @Override @@ -1629,13 +1760,13 @@ public class JavaDocInfoGenerator { } }); - if (!rendered && pair == null && myElement instanceof PsiMethod) { + if (!isRendered() && pair == null && myElement instanceof PsiMethod) { pair = findInheritDocTag((PsiMethod)myElement, new ReturnTagLocator()); } if (pair != null) { startHeaderSection(buffer, CodeInsightBundle.message("javadoc.returns")) - .append("

"); + .append("

"); generateValue(buffer, pair.first.getDataElements(), mapProvider(pair.second, false)); buffer.append(DocumentationMarkup.SECTION_END); } @@ -1643,7 +1774,7 @@ public class JavaDocInfoGenerator { private static PsiDocTag[] getThrowsTags(PsiDocComment comment) { if (comment == null) return PsiDocTag.EMPTY_ARRAY; - PsiDocTag[] tags1 = comment.findTagsByName(THROWS_KEYWORD); + PsiDocTag[] tags1 = comment.findTagsByName("throws"); PsiDocTag[] tags2 = comment.findTagsByName("exception"); return ArrayUtil.mergeArrays(tags1, tags2); } @@ -1652,13 +1783,13 @@ public class JavaDocInfoGenerator { return one.equals(two) || one.endsWith('.' + two) || two.endsWith('.' + one); } - private void generateThrowsSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment, boolean rendered) { + private void generateThrowsSection(StringBuilder buffer, PsiMethod method, PsiDocComment comment) { PsiDocTag[] localTags = getThrowsTags(comment); PsiDocTag[] thrownTags = localTags; JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(method.getProject()); Set reported = new HashSet<>(); - if (!rendered) { + if (!isRendered()) { for (HierarchicalMethodSignature signature : method.getHierarchicalMethodSignature().getSuperSignatures()) { PsiMethod superMethod = ObjectUtils.tryCast(signature.getMethod().getNavigationElement(), PsiMethod.class); PsiDocComment docComment = superMethod != null ? superMethod.getDocComment() : null; @@ -1682,14 +1813,14 @@ public class JavaDocInfoGenerator { } LinkedList>> collectedTags = new LinkedList<>(); - List declaredThrows = rendered ? Collections.emptyList() + List declaredThrows = isRendered() ? Collections.emptyList() : new ArrayList<>(Arrays.asList(method.getThrowsList().getReferencedTypes())); for (int i = thrownTags.length - 1; i > -1; i--) { PsiDocTagValue valueElement = thrownTags[i].getValueElement(); if (valueElement != null) { - for (Iterator iterator = declaredThrows.iterator(); iterator.hasNext();) { + for (Iterator iterator = declaredThrows.iterator(); iterator.hasNext(); ) { PsiClassType classType = iterator.next(); if (Comparing.strEqual(valueElement.getText(), classType.getClassName()) || Comparing.strEqual(valueElement.getText(), classType.getCanonicalText())) { @@ -1698,7 +1829,7 @@ public class JavaDocInfoGenerator { } } - Pair> tag = rendered ? null + Pair> tag = isRendered() ? null : findInheritDocTag(method, exceptionLocator(valueElement.getText())); collectedTags.addFirst(new Pair<>(thrownTags[i], new InheritDocProvider<>() { @Override @@ -1768,12 +1899,12 @@ public class JavaDocInfoGenerator { } } - private static void generateSuperMethodsSection(StringBuilder buffer, PsiMethod method, boolean overrides) { + private void generateSuperMethodsSection(StringBuilder buffer, PsiMethod method, boolean overrides) { PsiClass parentClass = method.getContainingClass(); if (parentClass == null) return; if (parentClass.isInterface() && !overrides) return; PsiMethod[] supers = method.findSuperMethods(); - Arrays.sort(supers, Comparator.comparing(m-> { + Arrays.sort(supers, Comparator.comparing(m -> { PsiClass aClass = m.getContainingClass(); return aClass == null ? null : aClass.getName(); })); @@ -1799,9 +1930,10 @@ public class JavaDocInfoGenerator { } StringBuilder methodBuffer = new StringBuilder(); - generateLink(methodBuffer, superMethod, superMethod.getName(), false); + generateLink( + methodBuffer, superMethod, getStyledSpan(JavaHighlightingColors.METHOD_DECLARATION_ATTRIBUTES, superMethod.getName()), false); StringBuilder classBuffer = new StringBuilder(); - generateLink(classBuffer, superClass, superClass.getName(), false); + generateLink(classBuffer, superClass, getStyledSpan(getClassTextAttributes(superClass), superClass.getName()), false); if (superClass.isInterface()) { buffer.append(JavaBundle.message("javadoc.method.in.interface", methodBuffer.toString(), classBuffer.toString())); } @@ -1814,24 +1946,24 @@ public class JavaDocInfoGenerator { } } - private static void generateLink(StringBuilder buffer, String linkText, @NotNull PsiElement context, boolean plainLink) { + private void generateLink(StringBuilder buffer, String linkText, @NotNull PsiElement context, boolean plainLink) { int index = JavaDocUtil.extractReference(linkText); String refText = linkText.substring(0, index).trim(); String label = StringUtil.nullize(linkText.substring(index).trim()); generateLink(buffer, refText, label, context, plainLink); } - static void generateLink(StringBuilder buffer, PsiElement element, String label, boolean plainLink) { + void generateLink(StringBuilder buffer, PsiElement element, String label, boolean plainLink) { String refText = JavaDocUtil.getReferenceText(element.getProject(), element); if (refText != null) { - DocumentationManagerUtil.createHyperlink(buffer, element, refText, label, plainLink); + DocumentationManagerUtil.createHyperlink(buffer, element, refText, label, plainLink, isRendered()); } } /** * @return Length of the generated label. */ - static int generateLink(StringBuilder buffer, String refText, String label, @NotNull PsiElement context, boolean plainLink) { + int generateLink(StringBuilder buffer, String refText, String label, @NotNull PsiElement context, boolean plainLink) { if (label == null) { PsiManager manager = context.getManager(); label = JavaDocUtil.getLabelText(manager.getProject(), manager, refText, context); @@ -1844,36 +1976,88 @@ public class JavaDocInfoGenerator { catch (IndexNotReadyException e) { LOG.debug(e); } - if (target == null && DumbService.isDumb(context.getProject())) { + appendMaybeUnresolvedLink(buffer, target, label, context.getProject(), plainLink); + return StringUtil.stripHtml(label, true).length(); + } + + private void appendMaybeUnresolvedLink( + StringBuilder buffer, + @Nullable PsiElement target, + String label, + @NotNull Project project, + boolean plainLink + ) { + if (target == null && DumbService.isDumb(project)) { buffer.append(label); } else if (target == null) { buffer.append("").append(label).append(""); } else { - generateLink(buffer, target, label, plainLink); + generateLink(buffer, target, tryHighlightLinkLabel(target, label), plainLink); } - return StringUtil.stripHtml(label, true).length(); + } + + private static @NotNull String tryHighlightLinkLabel(@NotNull PsiElement element, @NotNull String label) { + if (element instanceof PsiClass) { + return getStyledSpan(getClassTextAttributes((PsiClass)element), label); + } + if (element instanceof PsiPackage) { + return getStyledSpan(JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, label); + } + else if (element instanceof PsiMethod) { + return tryHighlightLinkOnClassMember((PsiMember)element, getMethodDeclarationTextAttributes((PsiMethod)element), label); + } + else if (element instanceof PsiField) { + return tryHighlightLinkOnClassMember((PsiField)element, getFieldTextAttributes((PsiField)element), label); + } + else { + return getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(element.getProject(), element.getLanguage(), label); + } + } + + private static @NotNull String tryHighlightLinkOnClassMember( + @NotNull PsiMember member, + @NotNull TextAttributesKey attributesKey, + @NotNull String label + ) { + StringBuilder buffer = new StringBuilder(); + int openParenIndex = label.indexOf("("); + if (openParenIndex == -1) openParenIndex = label.length(); + int classNameIndex = label.substring(0, openParenIndex).lastIndexOf("."); + if (classNameIndex != -1) { + PsiClass containingClass = member.getContainingClass(); + TextAttributesKey containingClassAttributes = + containingClass != null ? getClassTextAttributes(containingClass) : JavaHighlightingColors.CLASS_NAME_ATTRIBUTES; + appendStyledSpan(buffer, containingClassAttributes, label.substring(0, classNameIndex)); + appendStyledSpan(buffer, JavaHighlightingColors.DOT, "."); + } + classNameIndex++; + appendStyledSpan(buffer, attributesKey, label.substring(classNameIndex, openParenIndex)); + if (openParenIndex == label.length()) return buffer.toString(); + appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet( + buffer, member.getProject(), member.getLanguage(), label.substring(openParenIndex)); + return buffer.toString(); } /** * @return Length of the generated label. */ - public static int generateType(StringBuilder buffer, PsiType type, PsiElement context) { + public int generateType(StringBuilder buffer, PsiType type, PsiElement context) { return generateType(buffer, type, context, true); } /** * @return Length of the generated label. */ - public static int generateType(StringBuilder buffer, PsiType type, PsiElement context, boolean generateLink) { + public int generateType(StringBuilder buffer, PsiType type, PsiElement context, boolean generateLink) { return generateType(buffer, type, context, generateLink, false); } /** * @return Length of the generated label. */ - public static int generateType(StringBuilder buffer, PsiType type, PsiElement context, boolean generateLink, boolean useShortNames) { + public int generateType(StringBuilder buffer, PsiType type, PsiElement context, boolean generateLink, boolean useShortNames) { if (type instanceof PsiArrayType) { int rest = generateType(buffer, ((PsiArrayType)type).getComponentType(), context, generateLink, useShortNames); @@ -1883,7 +2067,7 @@ public class JavaDocInfoGenerator { return len + rest + 3; } else { - buffer.append("[]"); + appendStyledSpan(buffer, JavaHighlightingColors.BRACKETS, "[]"); return len + rest + 2; } } @@ -1892,7 +2076,7 @@ public class JavaDocInfoGenerator { if (type instanceof PsiPrimitiveType) { String text = type.getCanonicalText(); - buffer.append(StringUtil.escapeXmlEntities(text)); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, StringUtil.escapeXmlEntities(text)); return typAnnoLength + text.length(); } @@ -1902,11 +2086,11 @@ public class JavaDocInfoGenerator { if (type instanceof PsiWildcardType) { PsiWildcardType wt = (PsiWildcardType)type; - buffer.append('?'); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, "?"); PsiType bound = wt.getBound(); if (bound != null) { String keyword = wt.isExtends() ? " extends " : " super "; - buffer.append(keyword); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, keyword); return typAnnoLength + generateType(buffer, bound, context, generateLink, useShortNames) + 1 + keyword.length(); } else { @@ -1942,7 +2126,8 @@ public class JavaDocInfoGenerator { if (qName == null || psiClass instanceof PsiTypeParameter) { String typeText = useShortNames ? type.getPresentableText() : type.getCanonicalText(); - buffer.append(StringUtil.escapeXmlEntities(typeText)); + appendStyledSpan( + buffer, JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES, StringUtil.escapeXmlEntities(typeText)); return typAnnoLength + typeText.length(); } @@ -1953,7 +2138,7 @@ public class JavaDocInfoGenerator { length += generateLink(buffer, name, null, context, false); } else { - buffer.append(name); + appendStyledSpan(buffer, getClassTextAttributes(psiClass), name); length += name.length(); } @@ -1962,7 +2147,7 @@ public class JavaDocInfoGenerator { PsiTypeParameter[] params = psiClass.getTypeParameters(); - subst.append(LT); + appendStyledSpan(subst, JavaHighlightingColors.OPERATION_SIGN, LT); length += 1; boolean goodSubst = true; for (int i = 0; i < params.length; i++) { @@ -1976,13 +2161,13 @@ public class JavaDocInfoGenerator { length += generateType(subst, t, context, generateLink, useShortNames); if (i < params.length - 1) { - subst.append(", "); + appendStyledSpan(subst, JavaHighlightingColors.COMMA, ", "); length += 2; } } - subst.append(GT); - length ++; + appendStyledSpan(subst, JavaHighlightingColors.OPERATION_SIGN, GT); + length++; if (goodSubst) { buffer.append(subst); } @@ -2009,7 +2194,7 @@ public class JavaDocInfoGenerator { int length = typAnnoLength; for (PsiType psiType : componentTypes) { if (length > 0) { - buffer.append(separator); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, separator); length += 3; } length += generateType(buffer, psiType, context, true, useShortNames); @@ -2032,37 +2217,40 @@ public class JavaDocInfoGenerator { return result.toString(); } - static String generateTypeParameters(PsiTypeParameterListOwner owner, boolean useShortNames) { + String generateTypeParameters(PsiTypeParameterListOwner owner, boolean useShortNames) { if (owner.hasTypeParameters()) { PsiTypeParameter[] parameters = owner.getTypeParameters(); StringBuilder buffer = new StringBuilder(); - buffer.append(LT); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, LT); for (int i = 0; i < parameters.length; i++) { PsiTypeParameter p = parameters[i]; generateTypeAnnotations(buffer, p, p, false); - buffer.append(p.getName()); + appendStyledSpan( + buffer, + JavaHighlightingColors.TYPE_PARAMETER_NAME_ATTRIBUTES, + Objects.requireNonNullElse(p.getName(), CommonBundle.getErrorTitle())); PsiClassType[] refs = JavaDocUtil.getExtendsList(p); if (refs.length > 0) { - buffer.append(" extends "); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " extends "); for (int j = 0; j < refs.length; j++) { generateType(buffer, refs[j], owner, true, useShortNames); if (j < refs.length - 1) { - buffer.append(" & "); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " & "); } } } if (i < parameters.length - 1) { - buffer.append(", "); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", "); } } - buffer.append(GT); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, GT); return buffer.toString(); } @@ -2071,7 +2259,7 @@ public class JavaDocInfoGenerator { private Pair> searchDocTagInOverriddenMethod(PsiMethod method, PsiClass aSuper, DocTagLocator loc) { if (aSuper != null) { - PsiMethod overridden = findMethodInSuperClass(method, aSuper); + PsiMethod overridden = findMethodInSuperClass(method, aSuper); if (overridden != null) { T tag = loc.find(overridden, getDocComment(overridden)); if (tag != null) { @@ -2191,17 +2379,23 @@ public class JavaDocInfoGenerator { private static final class ParamInfo { private final String name; + private final String presentableName; private final PsiDocTag docTag; private final InheritDocProvider inheritDocTagProvider; - private ParamInfo(String paramName, PsiDocTag tag, InheritDocProvider provider) { + private ParamInfo(String paramName, String presentableName, PsiDocTag tag, InheritDocProvider provider) { name = paramName; + this.presentableName = presentableName; docTag = tag; inheritDocTagProvider = provider; } - private ParamInfo(String paramName, @NotNull Pair> tagWithInheritProvider) { - this(paramName, tagWithInheritProvider.first, tagWithInheritProvider.second); + private ParamInfo( + String paramName, + String presentableName, + @NotNull Pair> tagWithInheritProvider + ) { + this(paramName, presentableName, tagWithInheritProvider.first, tagWithInheritProvider.second); } } @@ -2225,7 +2419,8 @@ public class JavaDocInfoGenerator { } } - private static class MyVisitor extends JavaElementVisitor { + + private class MyVisitor extends JavaElementVisitor { private final StringBuilder myBuffer; MyVisitor(@NotNull StringBuilder buffer) { @@ -2234,21 +2429,23 @@ public class JavaDocInfoGenerator { @Override public void visitNewExpression(PsiNewExpression expression) { - myBuffer.append("new "); + appendStyledSpan(myBuffer, JavaHighlightingColors.KEYWORD, "new "); PsiType type = expression.getType(); if (type != null) { generateType(myBuffer, type, expression); } PsiExpression[] dimensions = expression.getArrayDimensions(); if (dimensions.length > 0) { - LOG.assertTrue(myBuffer.charAt(myBuffer.length() - 1) == ']'); - myBuffer.setLength(myBuffer.length() - 1); - for (PsiExpression dimension : dimensions) { + int closeBracketIndex = myBuffer.length() - 1; + while (closeBracketIndex > 0 && myBuffer.charAt(closeBracketIndex) != ']') closeBracketIndex--; + LOG.assertTrue(myBuffer.charAt(closeBracketIndex) == ']'); + myBuffer.setLength(closeBracketIndex); + for (int i = 0; i < dimensions.length; i++) { + PsiExpression dimension = dimensions[i]; dimension.accept(this); - myBuffer.append(", "); + if (i + 1 != dimensions.length) appendStyledSpan(myBuffer, JavaHighlightingColors.COMMA, ", "); } - myBuffer.setLength(myBuffer.length() - 2); - myBuffer.append(']'); + appendStyledSpan(myBuffer, JavaHighlightingColors.BRACKETS, "]"); } else { expression.acceptChildren(this); @@ -2257,40 +2454,43 @@ public class JavaDocInfoGenerator { @Override public void visitExpressionList(PsiExpressionList list) { - myBuffer.append('('); + appendStyledSpan(myBuffer, JavaHighlightingColors.PARENTHESES, "("); String separator = ", "; PsiExpression[] expressions = list.getExpressions(); - for (PsiExpression expression : expressions) { + for (int i = 0; i < expressions.length; i++) { + PsiExpression expression = expressions[i]; expression.accept(this); - myBuffer.append(separator); + if (i + 1 != expressions.length) appendStyledSpan(myBuffer, JavaHighlightingColors.COMMA, separator); } - if (expressions.length > 0) { - myBuffer.setLength(myBuffer.length() - separator.length()); - } - myBuffer.append(')'); + appendStyledSpan(myBuffer, JavaHighlightingColors.PARENTHESES, ")"); } @Override public void visitMethodCallExpression(PsiMethodCallExpression expression) { - myBuffer.append(StringUtil.escapeXmlEntities(expression.getMethodExpression().getText())); + appendStyledSpan( + myBuffer, + JavaHighlightingColors.METHOD_CALL_ATTRIBUTES, + StringUtil.escapeXmlEntities(expression.getMethodExpression().getText())); expression.getArgumentList().accept(this); } @Override public void visitExpression(PsiExpression expression) { - myBuffer.append(StringUtil.escapeXmlEntities(expression.getText())); + appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet( + myBuffer, expression.getProject(), expression.getLanguage(), expression.getText()); } @Override public void visitReferenceExpression(PsiReferenceExpression expression) { - myBuffer.append(StringUtil.escapeXmlEntities(expression.getText())); + appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet( + myBuffer, expression.getProject(), expression.getLanguage(), expression.getText()); } } public static void generateTooltipAnnotations(PsiModifierListOwner owner, @Nls StringBuilder buffer) { generateAnnotations(buffer, owner, SignaturePlace.ToolTip, true, true); } - + private enum SignaturePlace { Javadoc, ToolTip } diff --git a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorFactory.java b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorFactory.java index 7ab6f4b1aa0b..326740a5a675 100644 --- a/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorFactory.java +++ b/java/java-impl/src/com/intellij/codeInsight/javadoc/JavaDocInfoGeneratorFactory.java @@ -5,18 +5,28 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiElement; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; public class JavaDocInfoGeneratorFactory { public static JavaDocInfoGeneratorFactory getInstance() { return ApplicationManager.getApplication().getService(JavaDocInfoGeneratorFactory.class); } - protected JavaDocInfoGenerator createImpl(Project project, PsiElement element) { - return new JavaDocInfoGenerator(project, element); + protected JavaDocInfoGenerator createImpl(@NotNull Project project, @Nullable PsiElement element) { + return new JavaDocInfoGenerator(project, element, false); + } + + protected JavaDocInfoGenerator createImpl(@NotNull Project project, @Nullable PsiElement element, boolean isGenerationForRenderedDoc) { + return new JavaDocInfoGenerator(project, element, isGenerationForRenderedDoc); } @NotNull - public static JavaDocInfoGenerator create(Project project, PsiElement element) { - return getInstance().createImpl(project, element); + public static JavaDocInfoGenerator create(@NotNull Project project, @Nullable PsiElement element) { + return getInstance().createImpl(project, element, false); + } + + @NotNull + public static JavaDocInfoGenerator create(@NotNull Project project, @Nullable PsiElement element, boolean isGenerationForRenderedDoc) { + return getInstance().createImpl(project, element, isGenerationForRenderedDoc); } } diff --git a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java index ea958c8560f2..3750c20f6faa 100644 --- a/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java +++ b/java/java-impl/src/com/intellij/lang/java/JavaDocumentationProvider.java @@ -13,6 +13,7 @@ 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.ide.util.PackageUtil; import com.intellij.java.JavaBundle; import com.intellij.lang.CodeDocumentationAwareCommenter; @@ -23,6 +24,7 @@ import com.intellij.lang.documentation.DocumentationMarkup; import com.intellij.lang.documentation.ExternalDocumentationProvider; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.editor.Editor; +import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil; import com.intellij.openapi.module.Module; import com.intellij.openapi.progress.ProcessCanceledException; import com.intellij.openapi.project.IndexNotReadyException; @@ -59,6 +61,7 @@ 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; /** @@ -132,19 +135,13 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext JavaDocInfoGenerator.appendExpressionValue(buffer, initializer); PsiExpression constantInitializer = JavaDocInfoGenerator.calcInitializerExpression(variable); if (constantInitializer != null) { - buffer.append(DocumentationMarkup.GRAYED_START); JavaDocInfoGenerator.appendExpressionValue(buffer, constantInitializer); - buffer.append(DocumentationMarkup.GRAYED_END); } } } private static void generateModifiers(StringBuilder buffer, PsiModifierListOwner element) { - String modifiers = PsiFormatUtil.formatModifiers(element, PsiFormatUtilBase.JAVADOC_MODIFIERS_ONLY); - if (modifiers.length() > 0) { - buffer.append(modifiers); - buffer.append(" "); - } + JavaDocInfoGenerator.generateModifiers(buffer, element, false); } private static @NlsSafe String generatePackageInfo(PsiPackage aPackage) { @@ -199,9 +196,9 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext aClass.isEnum() ? PsiKeyword.ENUM : aClass.isRecord() ? PsiKeyword.RECORD : PsiKeyword.CLASS; - buffer.append(classString).append(" "); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, classString).append(" "); - buffer.append(JavaDocUtil.getShortestClassName(aClass, aClass)); + appendStyledSpan(buffer, JavaDocInfoGenerator.getClassTextAttributes(aClass), JavaDocUtil.getShortestClassName(aClass, aClass)); generateTypeParameters(aClass, buffer); @@ -218,16 +215,16 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext public static void writeImplements(PsiClass aClass, StringBuilder buffer, PsiClassType[] refs) { if (refs.length > 0) { newLine(buffer); - buffer.append("implements "); // <- Groovy keyword + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, "implements "); // <- Groovy keyword writeTypeRefs(aClass, buffer, refs); } } public static void writeExtends(PsiClass aClass, StringBuilder buffer, PsiClassType[] refs) { if (refs.length > 0 || !aClass.isInterface() && !CommonClassNames.JAVA_LANG_OBJECT.equals(aClass.getQualifiedName())) { - buffer.append(" extends "); // <- Groovy keyword + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " extends "); // <- Groovy keyword if (refs.length == 0) { - buffer.append("Object"); + appendStyledSpan(buffer, JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, "Object"); } else { writeTypeRefs(aClass, buffer, refs); @@ -237,10 +234,11 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext private static void writeTypeRefs(PsiClass aClass, StringBuilder buffer, PsiClassType[] refs) { for (int i = 0; i < refs.length; i++) { - JavaDocInfoGenerator.generateType(buffer, refs[i], aClass, false, true); + new JavaDocInfoGenerator(aClass.getProject(), null, false) + .generateType(buffer, refs[i], aClass, false, true); if (i < refs.length - 1) { - buffer.append(", "); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", "); } } } @@ -249,7 +247,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext if (typeParameterOwner.hasTypeParameters()) { PsiTypeParameter[] params = typeParameterOwner.getTypeParameters(); - buffer.append("<"); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, "<"); for (int i = 0; i < params.length; i++) { PsiTypeParameter p = params[i]; @@ -258,23 +256,24 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext PsiClassType[] refs = p.getExtendsList().getReferencedTypes(); if (refs.length > 0) { - buffer.append(" extends "); // <- Groovy keyword + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " extends "); // <- Groovy keyword for (int j = 0; j < refs.length; j++) { - JavaDocInfoGenerator.generateType(buffer, refs[j], typeParameterOwner, false, true); + new JavaDocInfoGenerator(typeParameterOwner.getProject(), null, false) + .generateType(buffer, refs[j], typeParameterOwner, false, true); if (j < refs.length - 1) { - buffer.append(" & "); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, " & "); } } } if (i < params.length - 1) { - buffer.append(", "); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", "); } } - buffer.append(">"); + appendStyledSpan(buffer, JavaHighlightingColors.OPERATION_SIGN, ">"); } } @@ -288,7 +287,8 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext generateOrderEntryAndPackageInfo(buffer, parentClass); } - buffer.append(JavaDocUtil.getShortestClassName(parentClass, method)); + appendStyledSpan( + buffer, JavaDocInfoGenerator.getClassTextAttributes(parentClass), JavaDocUtil.getShortestClassName(parentClass, method)); newLine(buffer); } @@ -298,42 +298,45 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext generateTypeParameters(method, buffer); if (method.getReturnType() != null) { - JavaDocInfoGenerator.generateType(buffer, substitutor.substitute(method.getReturnType()), method, false, true); + new JavaDocInfoGenerator(method.getProject(), null, false) + .generateType(buffer, substitutor.substitute(method.getReturnType()), method, false, true); buffer.append(" "); } - buffer.append(method.getName()); + appendStyledSpan(buffer, JavaDocInfoGenerator.getMethodDeclarationTextAttributes(method), method.getName()); - buffer.append("("); + appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, "("); PsiParameter[] params = method.getParameterList().getParameters(); for (int i = 0; i < params.length; i++) { PsiParameter param = params[i]; - JavaDocInfoGenerator.generateType(buffer, substitutor.substitute(param.getType()), method, false, true); + new JavaDocInfoGenerator(method.getProject(), null, false) + .generateType(buffer, substitutor.substitute(param.getType()), method, false, true); buffer.append(" "); - buffer.append(param.getName()); + appendStyledSpan(buffer, JavaHighlightingColors.PARAMETER_ATTRIBUTES, param.getName()); if (i < params.length - 1) { - buffer.append(", "); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", "); } } - buffer.append(")"); + appendStyledSpan(buffer, JavaHighlightingColors.PARENTHESES, ")"); PsiClassType[] refs = method.getThrowsList().getReferencedTypes(); if (refs.length > 0) { newLine(buffer); - buffer.append(" throws "); + appendStyledSpan(buffer, JavaHighlightingColors.KEYWORD, " throws "); for (int i = 0; i < refs.length; i++) { PsiClass throwsClass = refs[i].resolve(); if (throwsClass != null) { - buffer.append(JavaDocUtil.getShortestClassName(throwsClass, method)); + appendStyledSpan(buffer, JavaDocInfoGenerator.getClassTextAttributes(throwsClass), + JavaDocUtil.getShortestClassName(throwsClass, method)); } else { buffer.append(refs[i].getPresentableText()); } if (i < refs.length - 1) { - buffer.append(", "); + appendStyledSpan(buffer, JavaHighlightingColors.COMMA, ", "); } } } @@ -346,16 +349,18 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext PsiClass parentClass = field.getContainingClass(); if (parentClass != null && !(parentClass instanceof PsiAnonymousClass)) { - buffer.append(JavaDocUtil.getShortestClassName(parentClass, field)); + appendStyledSpan( + buffer, JavaDocInfoGenerator.getClassTextAttributes(parentClass), JavaDocUtil.getShortestClassName(parentClass, field)); newLine(buffer); } JavaDocInfoGenerator.generateTooltipAnnotations(field, buffer); generateModifiers(buffer, field); - JavaDocInfoGenerator.generateType(buffer, substitutor.substitute(field.getType()), field, false, true); + new JavaDocInfoGenerator(field.getProject(), null, false) + .generateType(buffer, substitutor.substitute(field.getType()), field, false, true); buffer.append(" "); - buffer.append(field.getName()); + appendStyledSpan(buffer, JavaDocInfoGenerator.getFieldTextAttributes(field), field.getName()); generateInitializer(buffer, field); @@ -368,11 +373,12 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext generateModifiers(buffer, variable); - JavaDocInfoGenerator.generateType(buffer, variable.getType(), variable, false, true); + new JavaDocInfoGenerator(variable.getProject(), null, false) + .generateType(buffer, variable.getType(), variable, false, true); buffer.append(" "); - buffer.append(variable.getName()); + appendStyledSpan(buffer, JavaHighlightingColors.LOCAL_VARIABLE_ATTRIBUTES, variable.getName()); generateInitializer(buffer, variable); return buffer.toString(); @@ -385,7 +391,9 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext VirtualFile file = PsiImplUtil.getModuleVirtualFile(module); generateOrderEntryInfo(sb, file, module.getProject()); - sb.append(PsiKeyword.MODULE).append(' ').append(module.getName()); + appendStyledSpan(sb, JavaHighlightingColors.KEYWORD, PsiKeyword.MODULE); + sb.append(' '); + appendStyledSpan(sb, JavaHighlightingColors.CLASS_NAME_ATTRIBUTES, module.getName()); return sb.toString(); } @@ -587,7 +595,7 @@ 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); + JavaDocInfoGenerator generator = JavaDocInfoGeneratorFactory.create(target.getProject(), target, true); return JavaDocExternalFilter.filterInternalDocInfo(generator.generateRenderedDocInfo()); } @@ -648,7 +656,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext @Nullable public static String generateExternalJavadoc(@NotNull final PsiElement element, @Nullable List docURLs) { - final JavaDocInfoGenerator javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(element.getProject(), element); + final JavaDocInfoGenerator javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(element.getProject(), element, false); return generateExternalJavadoc(javaDocInfoGenerator, docURLs); } diff --git a/java/java-tests/testData/codeInsight/ctrlMouse/lambdaParameter.html b/java/java-tests/testData/codeInsight/ctrlMouse/lambdaParameter.html index 1040be0d936f..426bd16cb2be 100644 --- a/java/java-tests/testData/codeInsight/ctrlMouse/lambdaParameter.html +++ b/java/java-tests/testData/codeInsight/ctrlMouse/lambdaParameter.html @@ -1 +1 @@ -String item \ No newline at end of file +String item \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/ctrlMouse/varVariable.html b/java/java-tests/testData/codeInsight/ctrlMouse/varVariable.html index 8cbe17cff1ec..a71df07f35af 100644 --- a/java/java-tests/testData/codeInsight/ctrlMouse/varVariable.html +++ b/java/java-tests/testData/codeInsight/ctrlMouse/varVariable.html @@ -1 +1 @@ -String a = "aaa" \ No newline at end of file +String a = "aaa" \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/annotations.html b/java/java-tests/testData/codeInsight/javadocIG/annotations.html index 122078550006..1866d04d7809 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/annotations.html +++ b/java/java-tests/testData/codeInsight/javadocIG/annotations.html @@ -1,3 +1,3 @@ -

Test
@Nullable  -@Deprecated  -public String field = null
\ No newline at end of file +
@ 
+@Deprecated 
+public String field = null
defined in Test
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html b/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html index 9a38ef65b82f..0b7ef486bfca 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html +++ b/java/java-tests/testData/codeInsight/javadocIG/annotationsInParams.html @@ -1,2 +1,2 @@ -
Test
public void foo(@Deprecated String s, - @Deprecated String p)

\ No newline at end of file +
public void foo(@Deprecated String s,
+                @Deprecated String p)
defined in Test

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/anonymousAndSuperJavadoc.html b/java/java-tests/testData/codeInsight/javadocIG/anonymousAndSuperJavadoc.html index 05bcf7c1bcdf..7c1cbcee1599 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/anonymousAndSuperJavadoc.html +++ b/java/java-tests/testData/codeInsight/javadocIG/anonymousAndSuperJavadoc.html @@ -1,3 +1,3 @@ -
public void foo()

From interface:

Foo
+

public void foo()

From interface:

Foo
some javadoc -

Specified by:

foo in interface Foo

\ No newline at end of file +

Specified by:

foo in interface Foo

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/apiNotes.html b/java/java-tests/testData/codeInsight/javadocIG/apiNotes.html index 3fc5069ecb82..bc0b28725666 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/apiNotes.html +++ b/java/java-tests/testData/codeInsight/javadocIG/apiNotes.html @@ -1 +1 @@ -
Test
public void foo()

API Note:

my api note

Implementation Requirements:

my impl spec

Implementation Note:

my impl note

\ No newline at end of file +
public void foo()
defined in Test

API Note:

my api note

Implementation
Requirements:

my impl spec

Implementation
Note:

my impl note

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/classTypeParameter.html b/java/java-tests/testData/codeInsight/javadocIG/classTypeParameter.html index 692f28a6f872..f22939328f7a 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/classTypeParameter.html +++ b/java/java-tests/testData/codeInsight/javadocIG/classTypeParameter.html @@ -1,2 +1,2 @@ -
class MethodTypeParam<T>
-extends Object

Type parameters:

<T> – type param
\ No newline at end of file +
class MethodTypeParam<T>
+extends Object

Type parameters:

<T> – type param
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html b/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html index 24c28c181c99..5c88949e36b2 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html +++ b/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html @@ -1 +1 @@ -[< java 1.7 >] java.util
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable \ No newline at end of file +[< java 1.7 >] java.util
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/clickableFieldReference.html b/java/java-tests/testData/codeInsight/javadocIG/clickableFieldReference.html index a969a9048a28..c225ecd50566 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/clickableFieldReference.html +++ b/java/java-tests/testData/codeInsight/javadocIG/clickableFieldReference.html @@ -1,3 +1,3 @@ -
@Bar(Baz.CONST, value = {Baz.CONST}) 
-class Foo
-extends Object
\ No newline at end of file +
@Bar(Baz.CONST, value = {Baz.CONST}) 
+class Foo
+extends Object
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/code.html b/java/java-tests/testData/codeInsight/javadocIG/code.html index 11253f029e15..a4918d8f2a87 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/code.html +++ b/java/java-tests/testData/codeInsight/javadocIG/code.html @@ -1,11 +1,5 @@ -
Foo
int foo
+
int foo
defined in Foo
-      
-   class Clazzz {
-     def f[U](u: U) {}
-
-     val a = 1
-   }
- 
+     class Clazzz {  def f[U](u: U) {}  val a = 1}
      

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/commaInsideArgsList.html b/java/java-tests/testData/codeInsight/javadocIG/commaInsideArgsList.html index 11c866740626..54b8eaeb1de5 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/commaInsideArgsList.html +++ b/java/java-tests/testData/codeInsight/javadocIG/commaInsideArgsList.html @@ -1 +1 @@ -
Test
public String field = foo("", "")
\ No newline at end of file +
public String field = foo("", "")
defined in Test
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/constantFieldInitializer.html b/java/java-tests/testData/codeInsight/javadocIG/constantFieldInitializer.html index 65438bb51922..6bda0b9aa863 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/constantFieldInitializer.html +++ b/java/java-tests/testData/codeInsight/javadocIG/constantFieldInitializer.html @@ -1 +1 @@ -
Test
public static final int field = 1 + 1 = 2
\ No newline at end of file +
public static final int field = 1 + 1 = 2
defined in Test
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/documentationForGetterByField.html b/java/java-tests/testData/codeInsight/javadocIG/documentationForGetterByField.html index 78a0b8ddbc5e..61e759d9f2c1 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/documentationForGetterByField.html +++ b/java/java-tests/testData/codeInsight/javadocIG/documentationForGetterByField.html @@ -1,3 +1,3 @@ -
FooBar
public String getMyFoo()

From field:

myFoo
+

public String getMyFoo()
defined in FooBar

From field:

myFoo
foo bar baz

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html b/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html index 21ba321aa87a..0aee586ecc43 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html +++ b/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWhenExternalDocIsNotAvailable.html @@ -1,6 +1,6 @@ -
java.lang
public final class String -extends Object -implements java.io.Serializable, Comparable<String>, CharSequence
+
public final class String
+extends Object
+implements java.io.Serializable, Comparable<String>, CharSequence
defined in java.lang
The String class represents character strings. All string literals in Java programs, such as "abc", are implemented as instances of this class. @@ -30,7 +30,7 @@ implements java.io.Serializab searching strings, for extracting substrings, and for creating a copy of a string with all characters translated to uppercase or to lowercase. Case mapping is based on the Unicode Standard version - specified by the Character class. + specified by the Character class.

The Java language provides special support for the string concatenation operator ( + ), and for conversion of @@ -44,7 +44,7 @@ implements java.io.Serializab The Java Language Specification.

Unless otherwise noted, passing a null argument to a constructor - or method in this class will cause a NullPointerException to be + or method in this class will cause a NullPointerException to be thrown.

A String represents a string in the UTF-16 format @@ -58,7 +58,4 @@ implements java.io.Serializab Unicode code points (i.e., characters), in addition to those for dealing with Unicode code units (i.e., char values). -

Since:

JDK1.0

See Also:

Object.toString(), -StringBuffer, -StringBuilder, -java.nio.charset.Charset

\ No newline at end of file +

Since:

JDK1.0

See Also:

Object.toString(),
StringBuffer,
StringBuilder,
java.nio.charset.Charset

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWithReferencesToClassesFromJavaLang.html b/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWithReferencesToClassesFromJavaLang.html index 7ddb6044511a..7f4089a01227 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWithReferencesToClassesFromJavaLang.html +++ b/java/java-tests/testData/codeInsight/javadocIG/documentationForJdkClassWithReferencesToClassesFromJavaLang.html @@ -1,8 +1,8 @@ -
java.util.List<E>
@Contract(pure = true)  -public abstract boolean contains(Object o)
+
@Contract(pure = true) 
+public abstract boolean contains(Object o)
defined in java.util.List<E>
Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e)). -

Overrides:

contains in interface Collection

Params:

o – element whose presence in this list is to be tested

Returns:

true if this list contains the specified element

Throws:

ClassCastException – if the type of the specified element is incompatible with this list (optional)

NullPointerException – if the specified element is null and this list does not permit null elements (optional)

External
annotations:

@org.jetbrains.annotations.Contract(pure = true)

 < java 1.7 >
\ No newline at end of file +

Overrides:

contains in interface Collection

Params:

o – element whose presence in this list is to be tested

Returns:

true if this list contains the specified element

Throws:

ClassCastException – if the type of the specified element is incompatible with this list (optional)

NullPointerException – if the specified element is null and this list does not permit null elements (optional)

External
annotations:

@org.jetbrains.annotations.Contract(pure = true)

 < java 1.7 >
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/documentationForUncheckedExceptionsInSupers.html b/java/java-tests/testData/codeInsight/javadocIG/documentationForUncheckedExceptionsInSupers.html index a8b7a9236c36..42ed83695024 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/documentationForUncheckedExceptionsInSupers.html +++ b/java/java-tests/testData/codeInsight/javadocIG/documentationForUncheckedExceptionsInSupers.html @@ -1,8 +1,8 @@ -
My
@Contract(pure = true)  -boolean contains(Object o)

From interface:

java.util.Collection
+

@Contract(pure = true) 
+boolean contains(Object o)
defined in My

From interface:

java.util.Collection
Returns true if this collection contains the specified element. More formally, returns true if and only if this collection contains at least one element e such that (o==null ? e==null : o.equals(e)). -

Overrides:

contains in interface Collection
contains in interface I

Params:

o – element whose presence in this collection is to be tested

Returns:

true if this collection contains the specified element

Throws:

ClassCastException – if the type of the specified element is incompatible with this collection (optional)

NullPointerException – if the specified element is null and this collection does not permit null elements (optional)

Inferred
annotations:

@org.jetbrains.annotations.Contract(pure = true)

\ No newline at end of file +

Overrides:

contains in interface Collection
contains in interface I

Params:

o – element whose presence in this collection is to be tested

Returns:

true if this collection contains the specified element

Throws:

ClassCastException – if the type of the specified element is incompatible with this collection (optional)

NullPointerException – if the specified element is null and this collection does not permit null elements (optional)

Inferred
annotations:

@org.jetbrains.annotations.Contract(pure = true)

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/doubleLt.html b/java/java-tests/testData/codeInsight/javadocIG/doubleLt.html index fad5c57b5a0d..9874c6c0732e 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/doubleLt.html +++ b/java/java-tests/testData/codeInsight/javadocIG/doubleLt.html @@ -1,4 +1,4 @@ -
class C
-extends Object
+
class C
+extends Object
a << b

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/dumbMode.html b/java/java-tests/testData/codeInsight/javadocIG/dumbMode.html index 2e1a34b96077..23dc7b4f93c9 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/dumbMode.html +++ b/java/java-tests/testData/codeInsight/javadocIG/dumbMode.html @@ -1,5 +1,5 @@ -
class C
-extends java.lang.Object
+
class C
+extends java.lang.Object
some text

See Also:

System.out

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal.html b/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal.html index 4f56e6aab42a..d4ffc8a30d6f 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal.html +++ b/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal.html @@ -1,2 +1,2 @@ -
E
E A -Enum constant ordinal: 0
\ No newline at end of file +
E A
defined in E +Enum constant ordinal: 0
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal_quick.html b/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal_quick.html index a1b1eec9a550..9284f2831532 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal_quick.html +++ b/java/java-tests/testData/codeInsight/javadocIG/enumConstantOrdinal_quick.html @@ -1 +1 @@ -E
E A
Enum constant ordinal: 0 \ No newline at end of file +E
E A
Enum constant ordinal: 0 \ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/enumValueOf.html b/java/java-tests/testData/codeInsight/javadocIG/enumValueOf.html index 0bf11772d5bd..996d62274f31 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/enumValueOf.html +++ b/java/java-tests/testData/codeInsight/javadocIG/enumValueOf.html @@ -1,4 +1,4 @@ -
En
@Contract(value = "_ -> param1", pure = true)  -static int valueOf(int i)
+
@Contract(value = "_ -> param1", pure = true) 
+static int valueOf(int i)
defined in En
myjavadoc -

Params:

i –

Returns:

Inferred
annotations:

@org.jetbrains.annotations.Contract(value = "_ -> param1", pure = true)

\ No newline at end of file +

Params:

i –

Returns:

Inferred
annotations:

@org.jetbrains.annotations.Contract(value = "_ -> param1", pure = true)

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html b/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html index fd182e30bab4..2be3e984da18 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html +++ b/java/java-tests/testData/codeInsight/javadocIG/escapeValues.html @@ -1,4 +1,4 @@ -
class Pattern
-extends Object
+
class Pattern
+extends Object
\W \n

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/escapingInLiteral.html b/java/java-tests/testData/codeInsight/javadocIG/escapingInLiteral.html index 44d35d7c35d0..724a2a5bc43b 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/escapingInLiteral.html +++ b/java/java-tests/testData/codeInsight/javadocIG/escapingInLiteral.html @@ -1,3 +1,3 @@ -
Foo
int foo
+
int foo
defined in Foo
&gt; is > &lt; is < &quot; is "

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/escapingStringValue.html b/java/java-tests/testData/codeInsight/javadocIG/escapingStringValue.html index 6dfd6c1c323f..2eb09d8a4334 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/escapingStringValue.html +++ b/java/java-tests/testData/codeInsight/javadocIG/escapingStringValue.html @@ -1 +1 @@ -
A
public static void JAVADOC_ME()
The value of B is "a<b".

\ No newline at end of file +
public static void JAVADOC_ME()
defined in A
The value of B is "a<b".
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithArray.html b/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithArray.html index 4ed39874d955..06d471720ede 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithArray.html +++ b/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithArray.html @@ -1 +1 @@ -
A
public static int[] x = new int[]{1, 2, 3}
\ No newline at end of file +
public static int[] x = new int[]{1, 2, 3}
defined in A
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithLambda.html b/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithLambda.html index 17e0a1ab9cbc..e23d1bbb28d2 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithLambda.html +++ b/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithLambda.html @@ -1 +1 @@ -
A
public static java.util.function.Consumer<Integer> F = i -> System.out.println(i)
\ No newline at end of file +
public static java.util.function.Consumer<Integer> F = i -> System.out.println(i)
defined in A
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithSizedArray.html b/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithSizedArray.html index 63f2c9eaf4aa..1fcd4a614920 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithSizedArray.html +++ b/java/java-tests/testData/codeInsight/javadocIG/fieldInitializedWithSizedArray.html @@ -1 +1 @@ -
A
public static int[] x = new int[1]
\ No newline at end of file +
public static int[] x = new int[1]
defined in A
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/fieldValue.html b/java/java-tests/testData/codeInsight/javadocIG/fieldValue.html index 1d6aebcf95dc..5fcd9b1bb34c 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/fieldValue.html +++ b/java/java-tests/testData/codeInsight/javadocIG/fieldValue.html @@ -1 +1 @@ -
A
public static int JAVADOC_ME = 23
The value of the field is 23.

\ No newline at end of file +
public static int JAVADOC_ME = 23
defined in A
The value of the field is 23.

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/htmlLink.html b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/htmlLink.html index eb9fbc2c51fc..bc3d46b92d3c 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/htmlLink.html +++ b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/htmlLink.html @@ -1,2 +1,2 @@ -
class htmlLink
-extends Object

\ No newline at end of file +
class htmlLink
+extends Object

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/pack/htmlLinkDeep.html b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/pack/htmlLinkDeep.html index 0a45e0888376..ed3480decdc0 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/pack/htmlLinkDeep.html +++ b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkProject/pack/htmlLinkDeep.html @@ -1,2 +1,2 @@ -
pack
class htmlLinkDeep -extends Object

\ No newline at end of file +
class htmlLinkDeep
+extends Object
defined in pack

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkToPackageInfo/pack/A.html b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkToPackageInfo/pack/A.html index 5bae901580aa..95e27fb7975f 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkToPackageInfo/pack/A.html +++ b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkToPackageInfo/pack/A.html @@ -1,4 +1,4 @@ -
pack
class A -extends Object
+
class A
+extends Object
defined in pack

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkWithRef.html b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkWithRef.html index 44797aae22fe..ae58f683a681 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/htmlLinkWithRef.html +++ b/java/java-tests/testData/codeInsight/javadocIG/htmlLinkWithRef.html @@ -1,5 +1,5 @@ -
class Test
-extends Object
+
class Test
+extends Object
section one text link up diff --git a/java/java-tests/testData/codeInsight/javadocIG/ideadev2326.html b/java/java-tests/testData/codeInsight/javadocIG/ideadev2326.html index 217055333f05..32872a0950a3 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/ideadev2326.html +++ b/java/java-tests/testData/codeInsight/javadocIG/ideadev2326.html @@ -1,2 +1,2 @@ -
Idea4780
public Object read() -throws IOException

Throws:

IOException – if an I/O error occurs while reading.

EOFException – if this source is already closed when the read() is called, or is closed during the read().

InterruptedIOException – if the reading thread is interrupted.

\ No newline at end of file +
public Object read()
+throws IOException
defined in Idea4780

Throws:

IOException – if an I/O error occurs while reading.

EOFException – if this source is already closed when the read() is called, or is closed during the read().

InterruptedIOException – if the reading thread is interrupted.

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows.html b/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows.html index f59a4599803b..3ccbb68a0d9d 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows.html +++ b/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows.html @@ -1,2 +1,2 @@ -
InheritedDocInThrows
void foo() -throws IOException

Overrides:

foo in class A

Throws:

IOException – la-la-la

\ No newline at end of file +
void foo()
+throws IOException
defined in InheritedDocInThrows

Overrides:

foo in class A

Throws:

IOException – la-la-la

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows1.html b/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows1.html index 70138ee0aa11..c52163f8c151 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows1.html +++ b/java/java-tests/testData/codeInsight/javadocIG/inheritedDocInThrows1.html @@ -1,2 +1,2 @@ -

Overrides:

foo in class A

Throws:

IOException – comment

\ No newline at end of file +
void foo()
+throws IOException
defined in InheritedDocInThrows1

Overrides:

foo in class A

Throws:

IOException – comment

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/inheritedParameter.html b/java/java-tests/testData/codeInsight/javadocIG/inheritedParameter.html index 7def2a916edf..20c92327b2d1 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/inheritedParameter.html +++ b/java/java-tests/testData/codeInsight/javadocIG/inheritedParameter.html @@ -1 +1 @@ -
s – String parameter.
\ No newline at end of file +
s – String parameter.
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/initializerWithLiteral.html b/java/java-tests/testData/codeInsight/javadocIG/initializerWithLiteral.html index e88d4b4d1e91..de8dcd148648 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/initializerWithLiteral.html +++ b/java/java-tests/testData/codeInsight/javadocIG/initializerWithLiteral.html @@ -1 +1 @@ -
A
public String strings = "A<BLANK>B"
\ No newline at end of file +
public String strings = "A<BLANK>B"
defined in A
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/initializerWithNew.html b/java/java-tests/testData/codeInsight/javadocIG/initializerWithNew.html index c441e3a0b229..ba01f5516be3 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/initializerWithNew.html +++ b/java/java-tests/testData/codeInsight/javadocIG/initializerWithNew.html @@ -1 +1 @@ -
A
public List<String> strings = new ArrayList<String>(new ArrayList<Integer>(), Collections.singleton(new ArrayList<Double>()))
\ No newline at end of file +
public List<String> strings = new ArrayList<String>(new ArrayList<Integer>(), Collections.singleton(new ArrayList<Double>()))
defined in A
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/initializerWithReference.html b/java/java-tests/testData/codeInsight/javadocIG/initializerWithReference.html index 15243bcc0331..1ee2c488cf5c 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/initializerWithReference.html +++ b/java/java-tests/testData/codeInsight/javadocIG/initializerWithReference.html @@ -1 +1 @@ -
Test
public int field = anotherField
\ No newline at end of file +
public int field = anotherField
defined in Test
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/lambdaParameter.html b/java/java-tests/testData/codeInsight/javadocIG/lambdaParameter.html index cf03d04f839f..28a798b75f01 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/lambdaParameter.html +++ b/java/java-tests/testData/codeInsight/javadocIG/lambdaParameter.html @@ -1 +1 @@ -
int a
\ No newline at end of file +
int a
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html b/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html index bcb19d8bdc4c..7362663e32c2 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html +++ b/java/java-tests/testData/codeInsight/javadocIG/legacySpacesInLiteral.html @@ -1,2 +1,2 @@ -
class Test
-extends Object
abc

\ No newline at end of file +
class Test
+extends Object
abc

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/literal.html b/java/java-tests/testData/codeInsight/javadocIG/literal.html index 604778920356..5c70f7163863 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/literal.html +++ b/java/java-tests/testData/codeInsight/javadocIG/literal.html @@ -1,3 +1,3 @@ -
Foo
int foo
+
int foo
defined in Foo
foo<>

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/literalInsideCode.html b/java/java-tests/testData/codeInsight/javadocIG/literalInsideCode.html index 4f6f2980b806..e1bda32fb1a3 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/literalInsideCode.html +++ b/java/java-tests/testData/codeInsight/javadocIG/literalInsideCode.html @@ -1,9 +1,6 @@ -
class Foo
-extends Object
+
class Foo
+extends Object
-    
- {@literal @Inject}
- public class Foo
- 
+   {@literal @Inject}public class Foo
    

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/localClassInsideAnonymous.html b/java/java-tests/testData/codeInsight/javadocIG/localClassInsideAnonymous.html index 15b4d6bd7d57..a7aeb9a8d116 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/localClassInsideAnonymous.html +++ b/java/java-tests/testData/codeInsight/javadocIG/localClassInsideAnonymous.html @@ -1,2 +1,2 @@ -
class Foo
-extends Object
\ No newline at end of file +
class Foo
+extends Object
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/matchingParameterNameFromParent.html b/java/java-tests/testData/codeInsight/javadocIG/matchingParameterNameFromParent.html index 4d5d36f909e9..97cdb5079848 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/matchingParameterNameFromParent.html +++ b/java/java-tests/testData/codeInsight/javadocIG/matchingParameterNameFromParent.html @@ -1 +1 @@ -
Bar
void m(int bar)

Overrides:

m in class Foo

Params:

bar – description
\ No newline at end of file +
void m(int bar)
defined in Bar

Overrides:

m in class Foo

Params:

bar – description
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/matchingTypeParameterNameFromParent.html b/java/java-tests/testData/codeInsight/javadocIG/matchingTypeParameterNameFromParent.html index 336858010418..2b303c3c268a 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/matchingTypeParameterNameFromParent.html +++ b/java/java-tests/testData/codeInsight/javadocIG/matchingTypeParameterNameFromParent.html @@ -1 +1 @@ -
Bar
<U> void m(U u)

Overrides:

m in class Foo

Type parameters:

<U> – description
\ No newline at end of file +
<U> void m(U u)
defined in Bar

Overrides:

m in class Foo

Type parameters:

<U> – description
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/methodExpressionWithLiteral.html b/java/java-tests/testData/codeInsight/javadocIG/methodExpressionWithLiteral.html index 12aa441f7bc3..3ebb2ec620b9 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/methodExpressionWithLiteral.html +++ b/java/java-tests/testData/codeInsight/javadocIG/methodExpressionWithLiteral.html @@ -1 +1 @@ -
A
public byte[] bytes = "&amp;".getBytes()
\ No newline at end of file +
public byte[] bytes = "&amp;".getBytes()
defined in A
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/methodFormatting.html b/java/java-tests/testData/codeInsight/javadocIG/methodFormatting.html index f08ae526bbb8..202fb6633787 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/methodFormatting.html +++ b/java/java-tests/testData/codeInsight/javadocIG/methodFormatting.html @@ -1,3 +1,3 @@ -
Producer<T>
<E extends Exception> @Anno String drainTo(Consumer<? super T, E> consumer, - Object someParameter) -throws E

Throws:

E

\ No newline at end of file +
<E extends Exception> @ String drainTo(Consumer<? super T, E> consumer,
+                                       Object someParameter)
+throws E
defined in Producer<T>

Throws:

E

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/methodTypeParameter.html b/java/java-tests/testData/codeInsight/javadocIG/methodTypeParameter.html index 6db5bc497212..d4233424182e 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/methodTypeParameter.html +++ b/java/java-tests/testData/codeInsight/javadocIG/methodTypeParameter.html @@ -1 +1 @@ -
MethodTypeParam
<T> void foo(T t)

Type parameters:

<T> – type param
\ No newline at end of file +
<T> void foo(T t)
defined in MethodTypeParam

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/multipleSpacesInLiteral.html b/java/java-tests/testData/codeInsight/javadocIG/multipleSpacesInLiteral.html index ede9d99663b4..f0365abef086 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/multipleSpacesInLiteral.html +++ b/java/java-tests/testData/codeInsight/javadocIG/multipleSpacesInLiteral.html @@ -1,2 +1,2 @@ -
class Test
-extends Object
a  bc

\ No newline at end of file +
class Test
+extends Object
a  bc

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/noSpaceAfterTagName.html b/java/java-tests/testData/codeInsight/javadocIG/noSpaceAfterTagName.html index 84c3b92036da..3378a61d1bea 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/noSpaceAfterTagName.html +++ b/java/java-tests/testData/codeInsight/javadocIG/noSpaceAfterTagName.html @@ -1,2 +1,2 @@ -
class Foo
-extends Object
foobar

\ No newline at end of file +
class Foo
+extends Object
foobar

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html index 40f5f1fd369a..3327a1edab46 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html +++ b/java/java-tests/testData/codeInsight/javadocIG/pInsidePre.html @@ -1,4 +1,4 @@ -
Test
public String field = null
+
public String field = null
defined in Test
          foo
          

diff --git a/java/java-tests/testData/codeInsight/javadocIG/paramInJavadoc.html b/java/java-tests/testData/codeInsight/javadocIG/paramInJavadoc.html index b3418ad2e5cf..e501a091db81 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/paramInJavadoc.html +++ b/java/java-tests/testData/codeInsight/javadocIG/paramInJavadoc.html @@ -1 +1 @@ -
int i
i – input
\ No newline at end of file +
int i
i – input
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/recordParameters.html b/java/java-tests/testData/codeInsight/javadocIG/recordParameters.html index fe7f1a47a7f1..e1fe0405c274 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/recordParameters.html +++ b/java/java-tests/testData/codeInsight/javadocIG/recordParameters.html @@ -1,4 +1,4 @@ -
record Test
-extends java.lang.Record
+
record Test
+extends java.lang.Record
main comment -

Params:

test – simple description
\ No newline at end of file +

Params:

test – simple description
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/simpleField.html b/java/java-tests/testData/codeInsight/javadocIG/simpleField.html index 12bb9732c91a..3d0617e1a752 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/simpleField.html +++ b/java/java-tests/testData/codeInsight/javadocIG/simpleField.html @@ -1 +1 @@ -
A
public static int JAVADOC_ME
Test

\ No newline at end of file +
public static int JAVADOC_ME
defined in A
Test

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/superJavadocErasureResolve.html b/java/java-tests/testData/codeInsight/javadocIG/superJavadocErasureResolve.html index c979386688ac..44977d47f08d 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/superJavadocErasureResolve.html +++ b/java/java-tests/testData/codeInsight/javadocIG/superJavadocErasureResolve.html @@ -1 +1 @@ -

See Also:

TestImpl.remove(Number)

\ No newline at end of file +
E remove(Integer idx)
defined in Test<E extends Number>

See Also:

TestImpl.remove(Number)

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/superJavadocExactResolve.html b/java/java-tests/testData/codeInsight/javadocIG/superJavadocExactResolve.html index 8b227ab54b8d..a953f53a6d5a 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/superJavadocExactResolve.html +++ b/java/java-tests/testData/codeInsight/javadocIG/superJavadocExactResolve.html @@ -1 +1 @@ -
Test<E>
E remove(int idx)

See Also:

TestImpl.remove(int)

\ No newline at end of file +
E remove(int idx)
defined in Test<E>

See Also:

TestImpl.remove(int)

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/syntheticEnumValues.html b/java/java-tests/testData/codeInsight/javadocIG/syntheticEnumValues.html index 5635d2cafabc..55ea68c0ab08 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/syntheticEnumValues.html +++ b/java/java-tests/testData/codeInsight/javadocIG/syntheticEnumValues.html @@ -1,5 +1,5 @@ -
E
@Contract(value = " -> new", pure = true)  -public static E[] values()
+
@Contract(value = " -> new", pure = true) 
+public static E[] values()
defined in E
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 @@ public static E[] values System.out.println(c);
-

Returns:

an array containing the constants of this enum type, in the order they're declared

Inferred
annotations:

@org.jetbrains.annotations.Contract(value = " -> new", pure = true)

\ No newline at end of file +

Returns:

an array containing the constants of this enum type, in the order they're declared

Inferred
annotations:

@org.jetbrains.annotations.Contract(value = " -> new", pure = true)

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/typeAnnotation.html b/java/java-tests/testData/codeInsight/javadocIG/typeAnnotation.html index 4208ae2af04e..192713fc5188 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/typeAnnotation.html +++ b/java/java-tests/testData/codeInsight/javadocIG/typeAnnotation.html @@ -1 +1 @@ -
Test
public <@Foo(1) T extends @Foo(2) CharSequence & @Foo(3) Cloneable> @Foo(4) List<@Foo(5) ? super @Foo(6) T> bar()
\ No newline at end of file +
public <@Foo(1) T extends @Foo(2) CharSequence & @Foo(3) Cloneable> @Foo(4) List<@Foo(5) ? super @Foo(6) T> bar()
defined in Test
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationArray.html b/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationArray.html index ec4ef5b18ede..456139b4355f 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationArray.html +++ b/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationArray.html @@ -1 +1 @@ -
Test
public @Foo(1) String @Foo(2) [] foo()
\ No newline at end of file +
public @Foo(1) String @Foo(2) [] foo()
defined in Test
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationClass.html b/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationClass.html index ba33671386d8..e4f2c919cab9 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationClass.html +++ b/java/java-tests/testData/codeInsight/javadocIG/typeAnnotationClass.html @@ -1,3 +1,3 @@ -
@Foo(1) 
-class Test
-extends @Foo(2) List<@Foo(3) String>
\ No newline at end of file +
@Foo(1) 
+class Test
+extends @Foo(2) List<@Foo(3) String>
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html index 04371770292a..c9b26c1abc94 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html +++ b/java/java-tests/testData/codeInsight/javadocIG/unicodeEscapes.html @@ -1,4 +1,4 @@ -
class Test
-extends Object
+
class Test
+extends Object
a@b c@d

\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/valueInMethod.html b/java/java-tests/testData/codeInsight/javadocIG/valueInMethod.html index c1d456fc20d3..d0cc2a864671 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/valueInMethod.html +++ b/java/java-tests/testData/codeInsight/javadocIG/valueInMethod.html @@ -1 +1 @@ -
A
public static void JAVADOC_ME()
The value of A is 23.

\ No newline at end of file +
public static void JAVADOC_ME()
defined in A
The value of A is 23.
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/valueInMethodNoHash.html b/java/java-tests/testData/codeInsight/javadocIG/valueInMethodNoHash.html index c1d456fc20d3..d0cc2a864671 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/valueInMethodNoHash.html +++ b/java/java-tests/testData/codeInsight/javadocIG/valueInMethodNoHash.html @@ -1 +1 @@ -
A
public static void JAVADOC_ME()
The value of A is 23.

\ No newline at end of file +
public static void JAVADOC_ME()
defined in A
The value of A is 23.
\ No newline at end of file diff --git a/java/java-tests/testData/codeInsight/javadocIG/variableDoc.html b/java/java-tests/testData/codeInsight/javadocIG/variableDoc.html index e49cb5287da5..795b2d26fabe 100644 --- a/java/java-tests/testData/codeInsight/javadocIG/variableDoc.html +++ b/java/java-tests/testData/codeInsight/javadocIG/variableDoc.html @@ -1 +1 @@ -
A<String> a = new A<String>()
\ No newline at end of file +
A<String> a = new A<String>()
\ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.groovy index cc6734a3b101..ae61032924fc 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.groovy @@ -75,7 +75,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { def doc = new JavaDocumentationProvider().generateDoc(exprList, null) def expected = - "
Foo
void doFoo()

" + "
void doFoo()
defined in Foo

" assert doc == expected } @@ -87,7 +87,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { class Foo {{ new Bar().foo(); }}""", - "Bar
List<String> foo(String param)") + "Bar
List<String> foo(String param)") } void testGenericField() { @@ -97,7 +97,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { class Foo {{ new Bar().field }}""", - "Bar
Integer field") + "Bar
Integer field") } void testMethodInAnonymousClass() { @@ -112,7 +112,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { private void m() {} }.run(); }}""", - "private void m()") + "private void m()") } void testAnnotationInCtrlHoverDoc() { @@ -124,7 +124,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { } @java.lang.annotation.Documented @interface Anno {} """, - "Foo
@Anno 
private void m()") + "Foo
@Anno 
private void m()") } void testInnerClass() { @@ -139,7 +139,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { class Outer { class Inner {} }""", - "C
Outer.Inner field") + "C
Outer.Inner field") } void testAsterisksFiltering() { @@ -157,9 +157,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { def doc = new JavaDocumentationProvider().generateDoc(method, null) def expected = - "
C
public void m()
\n" + - " For example, String.String(byte[], int, int, String).\n" + - "

" + "
public void m()
defined in C
" assert doc == expected } @@ -175,7 +173,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase { def doc = new JavaDocumentationProvider().generateDoc(method, null) def expected = - "
C
public void m()
Visit the \"/login\" URL.

" + "
public void m()
defined in C
Visit the \"/login\" URL.
" assert doc == expected } @@ -219,9 +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 = "
Bar
void foo()

From class:

Foo
\n" + - " Some doc\n" + - "

" + String expected = "
void foo()
defined in Bar

From class:

Foo
\n Some doc\n

" assert doc == expected } diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java index 813def97ab97..e25a6ca651fd 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/JavaDocInfoGeneratorTest.java @@ -116,11 +116,12 @@ public class JavaDocInfoGeneratorTest extends JavaCodeInsightTestCase { public void testRepeatableAnnotations() { useJava8(); - assertEquals("@R("a") \n" + - "@R("b") \n" + - "class repeatableAnnotations\n" + - "extends Object", - JavaDocInfoGenerator.generateSignature(getTestClass())); + assertEquals( + "@R(\"a\") \n" + + "@R(\"b\") \n" + + "class repeatableAnnotations\n" + + "extends Object", + new JavaDocInfoGenerator(getProject(), getTestClass(), false).generateSignature(getTestClass())); } public void testAnonymousAndSuperJavadoc() { diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/LightJavadocGeneratorTest.kt b/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/LightJavadocGeneratorTest.kt index be4140d7c1af..c69e6fa8a5ab 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/LightJavadocGeneratorTest.kt +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/javadoc/LightJavadocGeneratorTest.kt @@ -12,12 +12,12 @@ class LightJavadocGeneratorTest : LightJavaCodeInsightFixtureTestCase() { fun testPlainModule() = doTestModule( "module M.N { }", - "
module M.N
") + "
module M.N
") fun testDocumentedModule() = doTestModule( "/** One humble module. */\n@Deprecated\nmodule M.N { }", - "
@Deprecated \n" +
-    "module M.N
One humble module.
") + "
@Deprecated \n" +
+    "module M.N
One humble module.
") fun testRootedClassLink() = doTestLink("{@docRoot}/java/lang/Character.html#unicode", "psi_element://java.lang.Character###unicode") fun testRootedPackageLink() = doTestLink("{@docRoot}/java/util/package-summary.html", "psi_element://java.util") @@ -38,7 +38,7 @@ class LightJavadocGeneratorTest : LightJavaCodeInsightFixtureTestCase() { private fun doTestLink(link: String, expected: String) { doTestClass( "package a.b;\n/** A link. */\ninterface I { }", - "
a.b
interface I
A link.
") + "
interface I
defined in a.b
A link.
") } private fun doTestClass(text: String, expected: String) { @@ -47,7 +47,7 @@ class LightJavadocGeneratorTest : LightJavaCodeInsightFixtureTestCase() { } private fun generateDoc(element: PsiElement): String? = - JavaDocInfoGeneratorFactory.create(project, element).generateDocInfo(null) + JavaDocInfoGeneratorFactory.create(project, element, false).generateDocInfo(null) ?.replace(" ", " ") ?.substringBeforeLast("

") // diff --git a/java/java-tests/testSrc/com/intellij/java/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java b/java/java-tests/testSrc/com/intellij/java/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java index 95c3f68f9261..673e4f0064e0 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInspection/bytecodeAnalysis/BytecodeAnalysisIntegrationTest.java @@ -106,15 +106,18 @@ public class BytecodeAnalysisIntegrationTest extends LightJavaCodeInsightFixture checkHasGutter("org.apache.velocity.util.ExceptionUtils", "Inferred annotations available. Full signature:

\n" + - "@Contract('null,_,_->null') \n" + - "Throwable createWithCause(Class,\n String,\n Throwable)"); + "@Contract(\"null,_,_->null\") \n" + + "Throwable createWithCause(Class,\n" + + " String,\n" + + " Throwable)"); } public void testExternalAnnoGutter() { checkHasGutter("java.lang.String", - "External and inferred annotations available. Full signature:

\n" + - "@Contract(pure = true) \n" + - "String(@NotNull String)"); + "External annotations available. Full signature:

\n" + + "@Contract(pure = true) \n" + + "String(char[],\n" + + " boolean)"); } private void checkHasGutter(String className, String expectedText) { diff --git a/java/openapi/resources/messages/JavaBundle.properties b/java/openapi/resources/messages/JavaBundle.properties index bd135a20833b..de3de234278d 100644 --- a/java/openapi/resources/messages/JavaBundle.properties +++ b/java/openapi/resources/messages/JavaBundle.properties @@ -910,6 +910,7 @@ javadoc.deprecated=Deprecated javadoc.description.copied.from.class=From class: javadoc.description.copied.from.field=From field: javadoc.description.copied.from.interface=From interface: +javadoc.generate.defined.in=defined in javadoc.generate.arguments=&Other command line arguments: javadoc.generate.exited=\n"javadoc" finished with exit code $EXIT_CODE$ javadoc.generate.heap.size=&Maximum heap size (Mb): @@ -943,8 +944,8 @@ javadoc.since=Since: javadoc.author=Author: javadoc.version=Version: javadoc.apiNote=API Note: -javadoc.implNote=Implementation Note: -javadoc.implSpec=Implementation Requirements: +javadoc.implNote=Implementation
Note: +javadoc.implSpec=Implementation
Requirements: javadoc.type.parameters=Type parameters: jrt.node.short=[JRT] label.add.math.max.0.count.to.avoid.possible.semantics.change=Add Math.max(0, count) to avoid possible semantics change diff --git a/platform/core-api/src/com/intellij/codeInsight/documentation/DocumentationManagerUtil.java b/platform/core-api/src/com/intellij/codeInsight/documentation/DocumentationManagerUtil.java index d31fecb4ca27..1eb2ad7294d4 100644 --- a/platform/core-api/src/com/intellij/codeInsight/documentation/DocumentationManagerUtil.java +++ b/platform/core-api/src/com/intellij/codeInsight/documentation/DocumentationManagerUtil.java @@ -10,13 +10,20 @@ public class DocumentationManagerUtil { } @SuppressWarnings({"HardCodedStringLiteral", "UnusedParameters"}) - protected void createHyperlinkImpl(StringBuilder buffer, PsiElement refElement, String refText, String label, boolean plainLink) { + protected void createHyperlinkImpl( + StringBuilder buffer, + PsiElement refElement, + String refText, + String label, + boolean plainLink, + boolean isRendered + ) { buffer.append(""); if (!plainLink) { - buffer.append(""); + buffer.append(isRendered ? "" : ""); } buffer.append(label); if (!plainLink) { @@ -26,7 +33,21 @@ public class DocumentationManagerUtil { } public static void createHyperlink(StringBuilder buffer, String refText, String label, boolean plainLink) { - getInstance().createHyperlinkImpl(buffer, null, refText, label, plainLink); + getInstance().createHyperlinkImpl(buffer, null, refText, label, plainLink, false); + } + + public static void createHyperlink(StringBuilder buffer, String refText, String label, boolean plainLink, boolean isRendered) { + getInstance().createHyperlinkImpl(buffer, null, refText, label, plainLink, isRendered); + } + + public static void createHyperlink( + StringBuilder buffer, + PsiElement refElement, + String refText, + String label, + boolean plainLink + ) { + getInstance().createHyperlinkImpl(buffer, refElement, refText, label, plainLink, false); } /** @@ -38,7 +59,14 @@ public class DocumentationManagerUtil { * @param label the label for the hyperlink * @param plainLink if false, the label of the link is wrapped in the <code> tag. */ - public static void createHyperlink(StringBuilder buffer, PsiElement refElement, String refText, String label, boolean plainLink) { - getInstance().createHyperlinkImpl(buffer, refElement, refText, label, plainLink); + public static void createHyperlink( + StringBuilder buffer, + PsiElement refElement, + String refText, + String label, + boolean plainLink, + boolean isRendered + ) { + getInstance().createHyperlinkImpl(buffer, refElement, refText, label, plainLink, isRendered); } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationHtmlEditorKit.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationHtmlEditorKit.java index cff2c44773be..d507ec858c60 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationHtmlEditorKit.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationHtmlEditorKit.java @@ -57,7 +57,7 @@ final class DocumentationHtmlEditorKit extends JBHtmlEditorKit { String linkColor = ColorUtil.toHtmlColor(JBUI.CurrentTheme.Link.Foreground.ENABLED); String borderColor = ColorUtil.toHtmlColor(UIUtil.getTooltipSeparatorColor()); String sectionColor = ColorUtil.toHtmlColor(SECTION_COLOR); - String editorFontStyle = "{font-family:\"" + EditorCssFontResolver.EDITOR_FONT_NAME_NO_LIGATURES_PLACEHOLDER + "\"; font-size: 96%;}"; + String editorFontStyle = "{font-family:\"" + EditorCssFontResolver.EDITOR_FONT_NAME_NO_LIGATURES_PLACEHOLDER + "\";}"; StyleSheet styleSheet = editorKit.getStyleSheet(); styleSheet.addRule("tt" + editorFontStyle); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java index e419833a4087..2fa163e4888c 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java @@ -1410,7 +1410,7 @@ public class DocumentationManager extends DockablePopupManager aRange = findRangeOfParentTagWithGivenAttribute(element, href, HTML.Tag.A, HTML.Attribute.HREF); + a.addAttribute(CSS.Attribute.TEXT_DECORATION, underlined ? "underline" : "none"); - ((StyledDocument)element.getDocument()).setCharacterAttributes(element.getStartOffset(), - element.getEndOffset() - element.getStartOffset(), - a, false); + ((StyledDocument)element.getDocument()).setCharacterAttributes(aRange.first, aRange.second - aRange.first, a, false); } } + + /** + * There was a bug that if the anchor tag contained some span block, e.g. + * {@code Objects.equals()} then only one block + * was underlined on mouse hover. + * + *

That was due to the receiver of the {@code HyperlinkEvent} was only one of child blocks + * and we need to properly find the range occupied by the whole parent.

+ */ + private @NotNull Pair findRangeOfParentTagWithGivenAttribute( + @NotNull Element element, + Object elementAttributeValue, + @NotNull HTML.Tag tag, + @NotNull HTML.Attribute attribute + ) { + HtmlIteratorWrapper anchorTagIterator = new HtmlIteratorWrapper(((HTMLDocument)element.getDocument()).getIterator(tag)); + return StreamSupport.stream(anchorTagIterator.spliterator(), false) + .filter(it -> Objects.equals(it.getAttributes().getAttribute(attribute), elementAttributeValue)) + .filter(it -> it.getStartOffset() <= element.getStartOffset() && element.getStartOffset() <= it.getEndOffset()) + .map(it -> new Pair<>(it.getStartOffset(), it.getEndOffset())) + .findFirst() + .orElse(new Pair<>(element.getStartOffset(), element.getEndOffset())); + } }; } @@ -202,7 +233,8 @@ public class JBHtmlEditorKit extends HTMLEditorKit { private static class MouseExitSupportLinkController extends HTMLEditorKit.LinkController { @Override public void mouseExited(@NotNull MouseEvent e) { - mouseMoved(new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiersEx(), -1, -1, e.getClickCount(), e.isPopupTrigger(), e.getButton())); + mouseMoved(new MouseEvent(e.getComponent(), e.getID(), e.getWhen(), e.getModifiersEx(), -1, -1, e.getClickCount(), e.isPopupTrigger(), + e.getButton())); } } @@ -265,13 +297,16 @@ public class JBHtmlEditorKit extends HTMLEditorKit { if (width < 0 && height < 0) { this.width = myBufferedImage.getWidth(); this.height = myBufferedImage.getHeight(); - } else if (width < 0) { + } + else if (width < 0) { this.width = height * getAspectRatio(); this.height = height; - } else if (height < 0) { + } + else if (height < 0) { this.width = width; this.height = width / getAspectRatio(); - } else { + } + else { this.width = width; this.height = height; } @@ -355,7 +390,7 @@ public class JBHtmlEditorKit extends HTMLEditorKit { @Override public int viewToModel(float x, float y, Shape a, Position.Bias[] bias) { - Rectangle alloc = (Rectangle) a; + Rectangle alloc = (Rectangle)a; if (x < alloc.x + alloc.width) { bias[0] = Position.Bias.Forward; return getStartOffset(); @@ -462,7 +497,7 @@ public class JBHtmlEditorKit extends HTMLEditorKit { private final ParserCallback delegate; private int depth; - private CallbackWrapper(ParserCallback delegate) {this.delegate = delegate;} + private CallbackWrapper(ParserCallback delegate) { this.delegate = delegate; } @Override public void flush() throws BadLocationException { @@ -523,4 +558,69 @@ public class JBHtmlEditorKit extends HTMLEditorKit { */ @NotNull Font getFont(@NotNull Font defaultFont, @NotNull AttributeSet attributeSet); } + + + /** + * Implements {@code java.lang.Iterable} for {@code HTMLDocument.Iterator} + */ + public static final class HtmlIteratorWrapper implements Iterable { + + private final @NotNull HTMLDocument.Iterator myDelegate; + + public HtmlIteratorWrapper(@NotNull HTMLDocument.Iterator delegate) { + myDelegate = delegate; + } + + @NotNull + @Override + public Iterator iterator() { + return new Iterator<>() { + @Override + public boolean hasNext() { + return myDelegate.isValid(); + } + + @Override + public HTMLDocument.Iterator next() { + final AttributeSet attributeSet = myDelegate.getAttributes(); + final int startOffset = myDelegate.getStartOffset(); + final int endOffset = myDelegate.getEndOffset(); + final HTML.Tag tag = myDelegate.getTag(); + HTMLDocument.Iterator current = new HTMLDocument.Iterator() { + @Override + public AttributeSet getAttributes() { + return attributeSet; + } + + @Override + public int getStartOffset() { + return startOffset; + } + + @Override + public int getEndOffset() { + return endOffset; + } + + @Override + public HTML.Tag getTag() { + return tag; + } + + @Override + public void next() { + throw new IllegalStateException("Must not be called"); + } + + @Override + public boolean isValid() { + throw new IllegalStateException("Must not be called"); + } + }; + myDelegate.next(); + return current; + } + }; + } + } } diff --git a/plugins/devkit/devkit-core/src/themes/ThemeJsonDocumentationProvider.java b/plugins/devkit/devkit-core/src/themes/ThemeJsonDocumentationProvider.java index 4742b2b5085f..9cbdde458e5b 100644 --- a/plugins/devkit/devkit-core/src/themes/ThemeJsonDocumentationProvider.java +++ b/plugins/devkit/devkit-core/src/themes/ThemeJsonDocumentationProvider.java @@ -2,6 +2,7 @@ package org.jetbrains.idea.devkit.themes; import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator; +import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory; import com.intellij.ide.ui.UIThemeMetadata; import com.intellij.json.psi.JsonProperty; import com.intellij.lang.documentation.AbstractDocumentationProvider; @@ -79,7 +80,7 @@ public class ThemeJsonDocumentationProvider extends AbstractDocumentationProvide final PsiClassType type = JavaPsiFacade.getElementFactory(element.getProject()).createTypeByFQClassName(source); StringBuilder typeBuilder = new StringBuilder(); - JavaDocInfoGenerator.generateType(typeBuilder, type, element); + JavaDocInfoGeneratorFactory.create(element.getProject(), null, false).generateType(typeBuilder, type, element); return typeBuilder.toString(); //NON-NLS }); } diff --git a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/references/extensions/ExtensionPointDocumentationProviderTest.java b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/references/extensions/ExtensionPointDocumentationProviderTest.java index 2d9a9dab67d2..f84d84433a79 100644 --- a/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/references/extensions/ExtensionPointDocumentationProviderTest.java +++ b/plugins/devkit/devkit-java-tests/testSrc/org/jetbrains/idea/devkit/references/extensions/ExtensionPointDocumentationProviderTest.java @@ -49,10 +49,10 @@ public class ExtensionPointDocumentationProviderTest extends LightJavaCodeInsigh assertEquals( "
foo.bar
" + pluginXml + - "
bar
public class MyExtensionPoint\n" + - "extends Object
\n" + + "
public class MyExtensionPoint\n" +
+      "extends Object
defined in bar
\n" + " MyExtensionPoint JavaDoc.\n" + - "


implementationClass

String (required)

stringCanBeEmpty

String (required, empty allowed)

<intValue>

Integer

Extension Point Implementation

bar
public interface MyExtension
\n" + + "


implementationClass

String (required)

stringCanBeEmpty

String (required, empty allowed)

<intValue>

Integer

Extension Point Implementation

public interface MyExtension
defined in bar
\n" + " My Extension Javadoc.\n" + "

", provider.generateDoc(docElement, getOriginalElement())); @@ -74,7 +74,7 @@ public class ExtensionPointDocumentationProviderTest extends LightJavaCodeInsigh provider.getQuickNavigateInfo(docElement, getOriginalElement())); assertEquals( - "
foo.bar
interfaceExtensionPointDocumentation.xml

Extension Point Implementation

bar
public interface MyExtension
\n" + + "
foo.bar
interfaceExtensionPointDocumentation.xml

Extension Point Implementation

public interface MyExtension
defined in bar
\n" + " My Extension Javadoc.\n" + "

", provider.generateDoc(docElement, getOriginalElement())); diff --git a/plugins/gradle/java/src/service/resolve/GradleGroovyProperty.kt b/plugins/gradle/java/src/service/resolve/GradleGroovyProperty.kt index 7f01d5f59ac4..c45dd7b02b09 100644 --- a/plugins/gradle/java/src/service/resolve/GradleGroovyProperty.kt +++ b/plugins/gradle/java/src/service/resolve/GradleGroovyProperty.kt @@ -1,7 +1,7 @@ // Copyright 2000-2019 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.gradle.service.resolve -import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator +import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory import com.intellij.icons.AllIcons import com.intellij.ide.presentation.Presentation import com.intellij.openapi.util.Key @@ -9,7 +9,6 @@ import com.intellij.psi.OriginInfoAwareElement import com.intellij.psi.PsiElement import com.intellij.util.lazyPub import org.jetbrains.plugins.gradle.settings.GradleExtensionsSettings.GradleProp -import org.jetbrains.plugins.gradle.util.GradleBundle import org.jetbrains.plugins.gradle.util.GradleDocumentationBundle import org.jetbrains.plugins.groovy.dsl.holders.NonCodeMembersHolder import org.jetbrains.plugins.groovy.lang.resolve.api.LazyTypeProperty @@ -30,7 +29,7 @@ class GradleGroovyProperty( val value = myProperty.value val result = StringBuilder() result.append("
")
-    JavaDocInfoGenerator.generateType(result, propertyType, context, true)
+    JavaDocInfoGeneratorFactory.create(context.project, null, false).generateType(result, propertyType, context, true)
     result.append(" " + myProperty.name)
     val hasInitializer = !value.isNullOrBlank()
     if (hasInitializer) {
diff --git a/plugins/gradle/java/src/service/resolve/GradleTaskProperty.kt b/plugins/gradle/java/src/service/resolve/GradleTaskProperty.kt
index 51ff373b3eeb..2104bcfd29f4 100644
--- a/plugins/gradle/java/src/service/resolve/GradleTaskProperty.kt
+++ b/plugins/gradle/java/src/service/resolve/GradleTaskProperty.kt
@@ -1,7 +1,7 @@
 // Copyright 2000-2019 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.gradle.service.resolve
 
-import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator.generateType
+import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory
 import com.intellij.ide.presentation.Presentation
 import com.intellij.openapi.util.Key
 import com.intellij.psi.OriginInfoAwareElement
@@ -27,7 +27,7 @@ class GradleTaskProperty(
   private val doc by lazyPub {
     val result = StringBuilder()
     result.append("
")
-    generateType(result, propertyType, myContext, true)
+    JavaDocInfoGeneratorFactory.create(context.project, null, false).generateType(result, propertyType, myContext, true)
     result.append(" " + task.name)
     result.append("
") task.description?.let(result::append) diff --git a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java index f4f2446addc4..7b766770728b 100644 --- a/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java +++ b/plugins/groovy/groovy-psi/src/org/jetbrains/plugins/groovy/lang/psi/impl/PsiImplUtil.java @@ -2,6 +2,7 @@ package org.jetbrains.plugins.groovy.lang.psi.impl; import com.intellij.codeInsight.javadoc.JavaDocInfoGenerator; +import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory; import com.intellij.lang.ASTNode; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -797,7 +798,7 @@ public final class PsiImplUtil { public static void appendTypeString(StringBuilder buffer, final PsiType type, PsiElement context) { if (type != null) { - JavaDocInfoGenerator.generateType(buffer, type, context); + JavaDocInfoGeneratorFactory.create(context.getProject(), null, false).generateType(buffer, type, context); } else { buffer.append(GrModifier.DEF); diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java index 3c55de7a7a10..3ca68c185bd0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/documentation/GroovyDocumentationProvider.java @@ -5,6 +5,7 @@ import com.intellij.codeInsight.CodeInsightBundle; 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.java.JavaBundle; import com.intellij.lang.CodeDocumentationAwareCommenter; @@ -250,7 +251,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E generateTraitType(buffer, ((GrTraitType)type), context); } else if (type != null) { - JavaDocInfoGenerator.generateType(buffer, type, context); + JavaDocInfoGeneratorFactory.create(context.getProject(), null, false).generateType(buffer, type, context); } else { buffer.append(GrModifier.DEF); diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyDocumentationTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyDocumentationTest.groovy index a9c3ea41922f..460835b44572 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyDocumentationTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/GroovyDocumentationTest.groovy @@ -21,7 +21,7 @@ new Bar().foo(); def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset) assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) == """\ Bar -List<String> foo (String param)""" +List<String> foo (String param)""" } void testGenericField() { @@ -32,7 +32,7 @@ new Bar().field def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset) assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) == """\ Bar -Integer getField ()""" +Integer getField ()""" } void testLink() { @@ -46,9 +46,9 @@ class Gr { } new Gr().foo() ''', '''\ -
Gr
void foo()
- Use bar() from class Gr instead -

''' +
void foo()
defined in Gr
+ Use bar() from class Gr instead +
''' } void 'test link with label'() { @@ -59,13 +59,9 @@ new Gr().foo() def docs() {} docs() -''', '''
\
-_
\ -Object docs()
\ -
- check this out character sequences -

\ -

''' +''', '''
Object docs()
defined in _
+ check this out character sequences +
''' } void 'test link to method'() { @@ -85,19 +81,13 @@ class Main { } Main.docs() ''', '''\ -
\
-Main
\ -static void docs()\ -
\ -
- Link 1: foo(String[]) +
static void docs()
defined in Main
+ Link 1: foo(String[])

- Link 2: bar(String[]) + Link 2: bar(String[])

- Link 3: bar(String[], Integer) -

\ -

\ -

\ + Link 3: bar(String[], Integer) +
\ ''' } @@ -106,7 +96,7 @@ static void docs()\ def aa = 1 aa ''', '''\ -

[Inferred type] Integer''' +

[Inferred type] Integer''' } void 'test implicit closure parameter'() { @@ -114,7 +104,7 @@ aa List ss = [] ss.collect { it } ''', '''\ -

[Inferred type] String''' +

[Inferred type] String''' } void 'test code tag'() { @@ -129,11 +119,9 @@ class Foo { } new Foo().foo() ''', '''\ -

Foo
String foo()
\ -
- May return null -

\ -

\ +
String foo()
defined in Foo
+ May return null +
\ ''' } @@ -146,15 +134,7 @@ def foo() {} foo()""", """\ -
\ -
\
-_\
-
\ -Object foo()
\ -
\ -

\ -

\ -

Returns:

lorem ipsum

\ +
Object foo()
defined in _

Returns:

lorem ipsum

\ """ } @@ -166,8 +146,8 @@ foo()""", class GroovyDocTest { } new GroovyDocTest()""", """\ -
class GroovyDocTest<T>
-extends Object

See Also:

ref

\ +
class GroovyDocTest<T>
+extends Object

See Also:

ref

\ """ } @@ -180,8 +160,8 @@ extends Object
{ } new GroovyDocTest()""", """\ -
class GroovyDocTest<T>
-extends Object

Type parameters:

<T> – kej
\ +
class GroovyDocTest<T>
+extends Object

Type parameters:

<T> – kej
\ """ } diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy index 32ad534c1936..7c2d258de1a0 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/dsl/GroovyDslTest.groovy @@ -217,7 +217,7 @@ public class MyCategory { myFixture.completeBasic() assert generateDoc().contains('Some doc') assert generateDoc().contains('foo') - assert generateDoc().contains('()') + assert generateDoc().contains('()') } void testPropertyDoc() { diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt index c1d0fcee2808..55f472de4adf 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/KotlinDocumentationProvider.kt @@ -84,7 +84,7 @@ class HtmlClassifierNamePolicy(val base: ClassifierNamePolicy) : ClassifierNameP return name return buildString { val ref = classifier.fqNameUnsafe.toString() - DocumentationManagerUtil.createHyperlink(this, ref, name, true) + DocumentationManagerUtil.createHyperlink(this, ref, name, true, false) } } } @@ -444,7 +444,7 @@ class KotlinDocumentationProvider : AbstractDocumentationProvider() { if (containingDeclaration != null) { val fqName = containingDeclaration.fqNameSafe if (!fqName.isRoot) { - DocumentationManagerUtil.createHyperlink(this, fqName.asString(), fqName.asString(), false) + DocumentationManagerUtil.createHyperlink(this, fqName.asString(), fqName.asString(), false, true) } val fileName = descriptor @@ -475,7 +475,7 @@ class KotlinDocumentationProvider : AbstractDocumentationProvider() { val psi = declarationDescriptor.findPsi() as? KtFunction ?: return "" val lightElement = LightClassUtil.getLightClassMethod(psi) // Light method for super's scan in javadoc info gen - val javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(psi.project, lightElement) + val javaDocInfoGenerator = JavaDocInfoGeneratorFactory.create(psi.project, lightElement, false) val builder = StringBuilder() if (javaDocInfoGenerator.generateDocInfoCore(builder, false)) { val renderedJava = builder.toString() diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocRenderer.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocRenderer.kt index 559215c6dfbc..11c4f73512b7 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocRenderer.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/kdoc/KDocRenderer.kt @@ -66,7 +66,7 @@ object KDocRenderer { } private fun KDocLink.createHyperlink(to: StringBuilder) { - DocumentationManagerUtil.createHyperlink(to, getLinkText(), getLinkText(), false) + DocumentationManagerUtil.createHyperlink(to, getLinkText(), getLinkText(), false, true) } private fun KDocLink.getTargetElement(): PsiElement? { @@ -130,7 +130,7 @@ object KDocRenderer { val tag = iterator.next() val subjectName = tag.getSubjectName() if (subjectName != null) { - DocumentationManagerUtil.createHyperlink(this, subjectName, subjectName, false) + DocumentationManagerUtil.createHyperlink(this, subjectName, subjectName, false, true) } else { append(tag.getContent()) } @@ -150,7 +150,7 @@ object KDocRenderer { val subjectName = getSubjectName() if (subjectName != null) { append("

") - DocumentationManagerUtil.createHyperlink(this@renderSection, subjectName, subjectName, false) + DocumentationManagerUtil.createHyperlink(this@renderSection, subjectName, subjectName, false, true) append(" - ${markdownToHtml(getContent().trimStart())}") } } @@ -272,7 +272,7 @@ object KDocRenderer { if (linkLabelContent != null) { val label = linkLabelContent.joinToString(separator = "") { it.text } val linkText = node.child(MarkdownElementTypes.LINK_TEXT)?.toHtml() ?: label - DocumentationManagerUtil.createHyperlink(sb, label, linkText, true) + DocumentationManagerUtil.createHyperlink(sb, label, linkText, true, true) } else { sb.append(node.text) } diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/editor/quickDoc/JavadocNavigationTest.kt b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/editor/quickDoc/JavadocNavigationTest.kt index 66527f8c0e64..0fa40e7d04d3 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/editor/quickDoc/JavadocNavigationTest.kt +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/editor/quickDoc/JavadocNavigationTest.kt @@ -30,9 +30,9 @@ class JavadocNavigationTest() : KotlinLightCodeInsightFixtureTestCase() { val psiClass = (file as PsiJavaFile).classes[0] val docInfo = JavaDocInfoGenerator(project, psiClass).generateDocInfo(emptyList()) Assert.assertEquals( - """

class ExtMethod
-extends Super
- directory + """
class ExtMethod
+extends Super

""", docInfo) } diff --git a/plugins/kotlin/idea/tests/testData/codeInsight/renderingKDoc/difficultKDoc.kt b/plugins/kotlin/idea/tests/testData/codeInsight/renderingKDoc/difficultKDoc.kt index 91670a8eba47..0eaf04469443 100644 --- a/plugins/kotlin/idea/tests/testData/codeInsight/renderingKDoc/difficultKDoc.kt +++ b/plugins/kotlin/idea/tests/testData/codeInsight/renderingKDoc/difficultKDoc.kt @@ -54,4 +54,4 @@ class klass(val name: String, val name2: String) { } //RENDER:

This class has no useful logic; it's just a documentation example.

Params:

T - the type of a member in this class.

X - the type of a member in this class.

Properties:

name - is blablabla for name

name2 - is blublublu for name2

Constructor:

primary ctor for it
-//RENDER:

This method has no useful logic; it's just a documentation example.

Params:

M - the type of a member in this method.

K - the type of a member in this group.

Properties:

name - is blablabla for name

name2 - blublublu for name2

Returns:

returnMethod if Duck is Dark

Throws:

IndexOutOfBoundsException - if something wrong

ArrayIndexOutOfBoundsException - if else something wrong

java.io.IOException - if something else else wrong

Author:

DarkWing Duck

Suppress:

something to suppress

See Also:

method2, method3

Samples:

sample

//this is the sample

sample2

//this is the sample2
\ No newline at end of file +//RENDER:

This method has no useful logic; it's just a documentation example.

Params:

M - the type of a member in this method.

K - the type of a member in this group.

Properties:

name - is blablabla for name

name2 - blublublu for name2

Returns:

returnMethod if Duck is Dark

Throws:

IndexOutOfBoundsException - if something wrong

ArrayIndexOutOfBoundsException - if else something wrong

java.io.IOException - if something else else wrong

Author:

DarkWing Duck

Suppress:

something to suppress

See Also:

method2, method3

Samples:

sample

//this is the sample

sample2

//this is the sample2
\ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtConstantWithUnderscore.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtConstantWithUnderscore.kt index 90a7c6c4e824..52a4baf47183 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtConstantWithUnderscore.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtConstantWithUnderscore.kt @@ -9,4 +9,4 @@ class C { } } -//INFO:
C
public final fun foo(): Unit

Use SOME_REFERENCED_VAL to do something

+//INFO:
C
public final fun foo(): Unit

Use SOME_REFERENCED_VAL to do something

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtTypeParameter.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtTypeParameter.kt index 933b90acc265..df4b47f6c626 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtTypeParameter.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/AtTypeParameter.kt @@ -5,4 +5,4 @@ interface Base */ class Some<T: Base> -//INFO:
Some
<T : Base>

this is docs for T

+//INFO:
Some
<T : Base>

this is docs for T

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/ConstructorVarParameter.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/ConstructorVarParameter.kt index 7d73a1c15243..da68005bb5ff 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/ConstructorVarParameter.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/ConstructorVarParameter.kt @@ -4,4 +4,4 @@ class C(var v: Int) { } } -//INFO:
C
public final var v: Int
+//INFO:
C
public final var v: Int
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassConstructorUsedInKotlin.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassConstructorUsedInKotlin.kt index 548af6eff2b4..e3901d34ab1f 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassConstructorUsedInKotlin.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassConstructorUsedInKotlin.kt @@ -2,6 +2,6 @@ fun testing() { SomeClassWithParen("param", 1) } -//INFO:
SomeClassWithParen
@Contract(pure = true)  -//INFO: public SomeClassWithParen(String str, -//INFO: int num)

Inferred annotations:

@org.jetbrains.annotations.Contract(pure = true)

+//INFO:
@Contract(pure = true) 
+//INFO: public SomeClassWithParen(String str,
+//INFO:                           int num)
defined in SomeClassWithParen

Inferred
annotations:

@org.jetbrains.annotations.Contract(pure = true)

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassUsedInKotlin.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassUsedInKotlin.kt index 0a90ce35765b..38158cff2fa6 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassUsedInKotlin.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaClassUsedInKotlin.kt @@ -2,7 +2,7 @@ fun testing() { SomeClass>() } -//INFO:
public class SomeClass<T extends List>
-//INFO: extends Object
+//INFO:
public class SomeClass<T extends List>
+//INFO: extends Object
//INFO: Some Java Class -//INFO:

Type parameters:

<T> –
+//INFO:

Type parameters:

<T> –
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenClass.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenClass.kt index 8fd2a20f18c5..f3e6b9f0b02e 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenClass.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenClass.kt @@ -4,6 +4,6 @@ class A : OverrideMe() { } -//INFO:
A
protected open fun overrideMe(): Unit

From class:

OverrideMe
+//INFO:

A
protected open fun overrideMe(): Unit

From class:

OverrideMe
//INFO: Some comment -//INFO:

Overrides:

overrideMe in class OverrideMe

+//INFO:

Overrides:

overrideMe in class OverrideMe

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt index 154897c10572..e895aaedd4c3 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaDocFromOverridenInterface.kt @@ -4,6 +4,6 @@ class A : OverrideMe { } -//INFO:
A
public open fun overrideMe(): Unit

From interface:

OverrideMe
+//INFO:

A
public open fun overrideMe(): Unit

From interface:

OverrideMe
//INFO: Some comment -//INFO:

Specified by:

overrideMe in interface OverrideMe

+//INFO:

Specified by:

overrideMe in interface OverrideMe

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlin.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlin.kt index 5d36180c484b..f73a3adac6e2 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlin.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlin.kt @@ -2,8 +2,8 @@ fun ktTest() { Test.foo("SomeTest") } -//INFO:
Test
@Contract(value = "_ -> new", pure = true)  -//INFO: @NotNull  -//INFO: public static Object[] foo(String param)
+//INFO:
@Contract(value = "_ -> new", pure = true) 
+//INFO: @NotNull 
+//INFO: public static Object[] foo(String param)
defined in Test
//INFO: Java Method -//INFO:

Inferred annotations:

@org.jetbrains.annotations.Contract(value = "_ -> new", pure = true) @org.jetbrains.annotations.NotNull

+//INFO:

Inferred
annotations:

@org.jetbrains.annotations.Contract(value = "_ -> new", pure = true) @org.jetbrains.annotations.NotNull

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlinInParen.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlinInParen.kt index c1b4862a63ed..4cca7ee05569 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlinInParen.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/JavaMethodUsedInKotlinInParen.kt @@ -2,9 +2,9 @@ fun ktTestWithParen() { TestWithParen.foo("SomeTest", 1) } -//INFO:
TestWithParen
@Contract(value = "_, _ -> new", pure = true)  -//INFO: @NotNull  -//INFO: public static Object[] foo(String str, -//INFO: int num)
+//INFO:
@Contract(value = "_, _ -> new", pure = true) 
+//INFO: @NotNull 
+//INFO: public static Object[] foo(String str,
+//INFO:                            int num)
defined in TestWithParen
//INFO: Java Method -//INFO:

Inferred annotations:

@org.jetbrains.annotations.Contract(value = "_, _ -> new", pure = true) @org.jetbrains.annotations.NotNull

+//INFO:

Inferred
annotations:

@org.jetbrains.annotations.Contract(value = "_, _ -> new", pure = true) @org.jetbrains.annotations.NotNull

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinClassUsedFromJava.java b/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinClassUsedFromJava.java index e5270c0b60cd..82fdaff69852 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinClassUsedFromJava.java +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinClassUsedFromJava.java @@ -6,4 +6,4 @@ class KotlinClassUsedFromJava { } } -//INFO:
testing KotlinClassUsedFromJava_Data.kt
public final class Test

Some comment

+//INFO:
testing KotlinClassUsedFromJava_Data.kt
public final class Test

Some comment

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinPackageClassUsedFromJava.java b/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinPackageClassUsedFromJava.java index e69d1088020e..053cac74f2b7 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinPackageClassUsedFromJava.java +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/KotlinPackageClassUsedFromJava.java @@ -6,5 +6,5 @@ class KotlinPackageClassUsedFromJava { } } -//INFO:
testing
public final class KotlinPackageClassUsedFromJava_DataKt -//INFO: extends Object
+//INFO:
public final class KotlinPackageClassUsedFromJava_DataKt
+//INFO: extends Object
defined in testing
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/LateinitName.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/LateinitName.kt index f2d942a38651..7f6097a3a3d6 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/LateinitName.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/LateinitName.kt @@ -2,4 +2,4 @@ class Foo { val lateinit: String = "" } -//INFO:
Foo
public final val lateinit: String
\ No newline at end of file +//INFO:
Foo
public final val lateinit: String
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/MethodFromStdLib.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/MethodFromStdLib.kt index f00d1364862e..3e28c456f09c 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/MethodFromStdLib.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/MethodFromStdLib.kt @@ -2,6 +2,6 @@ fun test() { listOf(1, 2, 4).filter { it > 0 } } -//INFO:
kotlin.collections CollectionsKt.class
public inline fun <T> Iterable<T>.filter( +//INFO:
kotlin.collections CollectionsKt.class
public inline fun <T> Iterable<T>.filter( //INFO: predicate: (T) → Boolean -//INFO: ): List<T>

Returns a list containing only elements matching the given predicate.

Samples:

samples.collections.Collections.Filtering.filter

// Unresolved
+//INFO: ): List<T>

Returns a list containing only elements matching the given predicate.

Samples:

samples.collections.Collections.Filtering.filter

// Unresolved
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEmptySecondaryConstructor.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEmptySecondaryConstructor.kt index f957bca05796..0fecce3ab81f 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEmptySecondaryConstructor.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEmptySecondaryConstructor.kt @@ -12,6 +12,6 @@ class Foo { fun test() { val f = Foo(10) } -//INFO:
Foo
public constructor Foo( +//INFO:
Foo
public constructor Foo( //INFO: x: Int //INFO: )

Documentation is here.

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntry.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntry.kt index 6bec0f56d22f..e5640c348f3f 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntry.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntry.kt @@ -4,4 +4,4 @@ enum class TestEnum{ -//INFO:
TestEnum
enum entry C
Enum constant ordinal: 2
+//INFO:
TestEnum
enum entry C
Enum constant ordinal: 2
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntryUsage.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntryUsage.kt index 492705414d75..f077b07279e3 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntryUsage.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumEntryUsage.kt @@ -6,4 +6,4 @@ fun test() { TestEnum.C } -//INFO:
TestEnum
enum entry C
Enum constant ordinal: 2
+//INFO:
TestEnum
enum entry C
Enum constant ordinal: 2
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValueOfFunction.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValueOfFunction.kt index 4193976ce311..47d793636b0b 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValueOfFunction.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValueOfFunction.kt @@ -7,6 +7,6 @@ fun use() { } -//INFO:
E
public final fun valueOf( +//INFO:
E
public final fun valueOf( //INFO: value: String -//INFO: ): E

Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)

Throws:

IllegalArgumentException - if this enum type has no constant with the specified name

+//INFO: ): E

Returns the enum constant of this type with the specified name. The string must match exactly an identifier used to declare an enum constant in this type. (Extraneous whitespace characters are not permitted.)

Throws:

IllegalArgumentException - if this enum type has no constant with the specified name

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValuesFunction.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValuesFunction.kt index 58933a8f2ad6..385df39673d2 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValuesFunction.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnEnumValuesFunction.kt @@ -6,4 +6,4 @@ fun use() { E.values() } -//INFO:
E
public final fun values(): Array<E>

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.

+//INFO:
E
public final fun values(): Array<E>

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.

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnFunctionDeclarationWithPackage.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnFunctionDeclarationWithPackage.kt index abd712497d56..dfe462431ebb 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnFunctionDeclarationWithPackage.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnFunctionDeclarationWithPackage.kt @@ -12,7 +12,7 @@ package test */ fun testFun(first: String, second: Int) = 12 -//INFO:
test OnFunctionDeclarationWithPackage.kt
public fun testFun( +//INFO:
test OnFunctionDeclarationWithPackage.kt
public fun testFun( //INFO: first: String, //INFO: second: Int //INFO: ): Int

Test function

Params:

first - Some

second - Other

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedMethodUsage.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedMethodUsage.kt index 82df2d05232e..17e2f4b7f6d2 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedMethodUsage.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedMethodUsage.kt @@ -14,4 +14,4 @@ fun test() { D().foo() } -//INFO:
D
public open fun foo(): Int

This method returns zero.

+//INFO:
D
public open fun foo(): Int

This method returns zero.

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedPropertyUsage.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedPropertyUsage.kt index c01dc9042eec..5d2989cd8c03 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedPropertyUsage.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnInheritedPropertyUsage.kt @@ -14,4 +14,4 @@ fun test() { D().foo } -//INFO:
D
public open val foo: Int

This property returns zero.

+//INFO:
D
public open val foo: Int

This property returns zero.

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithReturnAndThrows.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithReturnAndThrows.kt index ad268ba8baee..72e8384f71af 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithReturnAndThrows.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithReturnAndThrows.kt @@ -17,4 +17,4 @@ fun test() { //INFO:
OnMethodUsageWithReturnAndThrows.kt
public fun testMethod( //INFO: a: Int, //INFO: b: String -//INFO: ): Unit

Some documentation

Params:

a - Some int

b - String

Returns:

Return value

Throws:

IllegalArgumentException - if the weather is bad

+//INFO: ): Unit

Some documentation

Params:

a - Some int

b - String

Returns:

Return value

Throws:

IllegalArgumentException - if the weather is bad

diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithSee.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithSee.kt index d31c54a102d6..ab365946e8b0 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithSee.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/OnMethodUsageWithSee.kt @@ -17,4 +17,4 @@ fun test() { testMethod(1, "value") } -//INFO:
OnMethodUsageWithSee.kt
public fun testMethod(): Unit

See Also:

C, D, kotlin
+//INFO:
OnMethodUsageWithSee.kt
public fun testMethod(): Unit

See Also:

C, D, kotlin
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/Samples.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/Samples.kt index bc732ca17b96..3e8166cb19fe 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/Samples.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/Samples.kt @@ -19,11 +19,11 @@ fun castTextSpell(spell: String) { throw SecurityException("Magic prohibited outside Hogwarts") } -//INFO:
magic Samples.kt
public fun castTextSpell( +//INFO:
magic Samples.kt
public fun castTextSpell( //INFO: spell: String -//INFO: ): Unit

Samples:

Samples.sampleMagic


+//INFO: ): Unit

Samples:

Samples.sampleMagic


 //INFO: castTextSpell("[asd] [dse] [asz]")
-//INFO: 

sampleScroll


+//INFO: 

sampleScroll


 //INFO: val reader = Scroll("[asd] [dse] [asz]").reader()
 //INFO: castTextSpell(reader.readAll())
 //INFO: 
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/TailrecName.kt b/plugins/kotlin/idea/tests/testData/editor/quickDoc/TailrecName.kt index b3388609fdf4..8ea6a7765152 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/TailrecName.kt +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/TailrecName.kt @@ -2,4 +2,4 @@ class Foo { val tailrec: String = "" } -//INFO:
Foo
public final val tailrec: String
\ No newline at end of file +//INFO:
Foo
public final val tailrec: String
diff --git a/plugins/kotlin/idea/tests/testData/editor/quickDoc/TopLevelMethodFromJava.java b/plugins/kotlin/idea/tests/testData/editor/quickDoc/TopLevelMethodFromJava.java index 1840ef404cf8..4bf079f30198 100644 --- a/plugins/kotlin/idea/tests/testData/editor/quickDoc/TopLevelMethodFromJava.java +++ b/plugins/kotlin/idea/tests/testData/editor/quickDoc/TopLevelMethodFromJava.java @@ -8,6 +8,6 @@ class Testing { } } -//INFO:
some TopLevelMethodFromJava_Data.kt
public fun foo( +//INFO:
some TopLevelMethodFromJava_Data.kt
public fun foo( //INFO: bar: Int //INFO: ): Unit

KDoc foo

diff --git a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/fqName/code/usage.kt b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/fqName/code/usage.kt index 3102674778ea..472619366743 100644 --- a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/fqName/code/usage.kt +++ b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/fqName/code/usage.kt @@ -9,10 +9,10 @@ fun some() { } -//INFO:
usage.kt
public fun some(): Unit

Samples:

samples.SampleGroup.mySample


+//INFO: 
usage.kt
public fun some(): Unit

Samples:

samples.SampleGroup.mySample


 //INFO: println("Hello, world")
-//INFO: 

samples.megasamples.MegaSamplesGroup.megaSample


+//INFO: 

samples.megasamples.MegaSamplesGroup.megaSample


 //INFO: println("...---...")
-//INFO: 

samples.notindir.NotInDirSamples.sssample


+//INFO: 

samples.notindir.NotInDirSamples.sssample


 //INFO: println("location is samplesTest/")
-//INFO: 

smaplez.a.b.c.Samplez.sssample

// Unresolved
+//INFO:

smaplez.a.b.c.Samplez.sssample

// Unresolved
diff --git a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/simple/code/usage.kt b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/simple/code/usage.kt index a10204ec83b9..686ecd413b0a 100644 --- a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/simple/code/usage.kt +++ b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/simple/code/usage.kt @@ -5,6 +5,6 @@ fun some() { } -//INFO:
usage.kt
public fun some(): Unit

Samples:

samples.sample


+//INFO: 
usage.kt
public fun some(): Unit

Samples:

samples.sample


 //INFO: println("Hello, world")
 //INFO: 
diff --git a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageNestedTypeParameters.kt b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageNestedTypeParameters.kt index 552a839cf5ad..76ecece3bd32 100644 --- a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageNestedTypeParameters.kt +++ b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageNestedTypeParameters.kt @@ -5,7 +5,7 @@ fun some() { } -//INFO:
usageNestedTypeParameters.kt
public fun some(): Unit

Samples:

samples.nestedTypeParameter


+//INFO: 
usageNestedTypeParameters.kt
public fun some(): Unit

Samples:

samples.nestedTypeParameter


 //INFO: val m = mapOf<String, Pair<Int, Long>>()
 //INFO: println(m)
 //INFO: 
diff --git a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageSingleTypeParameter.kt b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageSingleTypeParameter.kt index 9c456f389379..412ad0f8f978 100644 --- a/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageSingleTypeParameter.kt +++ b/plugins/kotlin/idea/tests/testData/kdoc/multiModuleSamples/typeParameters/code/usageSingleTypeParameter.kt @@ -5,7 +5,7 @@ fun some() { } -//INFO:
usageSingleTypeParameter.kt
public fun some(): Unit

Samples:

samples.singleTypeParameter


+//INFO: 
usageSingleTypeParameter.kt
public fun some(): Unit

Samples:

samples.singleTypeParameter


 //INFO: val l = listOf<String>()
 //INFO: println(l)
 //INFO: