[quickdoc] (IDEA-278104) Added settings for fine-grained highlighting and changing its saturation

GitOrigin-RevId: b98d3a4e5ce3cd9cd939a91c3c37959949785f93
This commit is contained in:
Alexander Bashkirov
2021-10-04 07:13:19 +00:00
committed by intellij-monorepo-bot
parent 48fde63fa0
commit 7a19bcbefd
72 changed files with 675 additions and 284 deletions
@@ -7,9 +7,11 @@ import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.lang.Language;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.*;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
@@ -73,6 +75,10 @@ public final class AnnotationDocGenerator {
return AnnotationUtil.isInferredAnnotation(myAnnotation);
}
private static float getHighlightingSaturation() {
return EditorSettingsExternalizable.getInstance().getDocSyntaxHighlightingSaturation() * 0.01f;
}
private static void appendStyledSpan(
boolean doSyntaxHighlighting,
@NotNull StringBuilder buffer,
@@ -80,7 +86,7 @@ public final class AnnotationDocGenerator {
@Nullable String value
) {
if (doSyntaxHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributesKey, value);
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributesKey, value, getHighlightingSaturation());
}
else {
buffer.append(value);
@@ -95,10 +101,11 @@ public final class AnnotationDocGenerator {
@Nullable String codeSnippet
) {
if (doSyntaxHighlighting) {
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet);
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
buffer, project, language, codeSnippet, getHighlightingSaturation());
}
else {
buffer.append(codeSnippet);
else if (codeSnippet != null) {
buffer.append(StringUtil.escapeXmlEntities(codeSnippet));
}
}
@@ -135,13 +142,11 @@ public final class AnnotationDocGenerator {
StringBuilder styledNameBuilder = new StringBuilder();
appendStyledSpan(doSyntaxHighlighting, styledNameBuilder, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name);
String styledName = styledNameBuilder.toString();
JavaDocInfoGeneratorFactory.create(
myContext.getProject(),
null,
JavaDocHighlightingManagerImpl.getInstance(),
isForRenderedDoc,
doSyntaxHighlighting
).generateLink(buffer, myTargetClass, styledName, format == AnnotationFormat.JavaDocComplete);
JavaDocInfoGeneratorFactory.getBuilder(myContext.getProject())
.setIsGenerationForRenderedDoc(isForRenderedDoc)
.setDoSyntaxHighlighting(doSyntaxHighlighting)
.create()
.generateLink(buffer, myTargetClass, styledName, format == AnnotationFormat.JavaDocComplete);
}
else if (!red && name != null) {
appendStyledSpan(doSyntaxHighlighting, buffer, JavaHighlightingColors.ANNOTATION_NAME_ATTRIBUTES, name);
@@ -233,8 +238,10 @@ public final class AnnotationDocGenerator {
else {
if (aClass != null) text = aClass.getQualifiedName() + '#' + field.getName();
}
JavaDocInfoGeneratorFactory.create(
field.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), isForRenderedDoc, doSyntaxHighlighting)
JavaDocInfoGeneratorFactory.getBuilder(field.getProject())
.setIsGenerationForRenderedDoc(isForRenderedDoc)
.setDoSyntaxHighlighting(doSyntaxHighlighting)
.create()
.generateLink(buffer, text, aClass != null ? aClass.getName() + '.' + field.getName() : null, memberValue, false);
}
else {
@@ -15,8 +15,12 @@ import com.intellij.lang.Language;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.lang.java.JavaDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.HighlighterColors;
import com.intellij.openapi.editor.colors.CodeInsightColors;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.editor.markup.TextAttributes;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.project.DumbService;
@@ -45,6 +49,7 @@ import com.intellij.util.ArrayUtilRt;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.ObjectUtils;
import com.intellij.util.containers.ContainerUtil;
import kotlin.text.StringsKt;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jetbrains.annotations.Nls;
@@ -56,7 +61,6 @@ 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;
@@ -114,9 +118,11 @@ public class JavaDocInfoGenerator {
private final boolean myIsRendered;
private final boolean myDoSyntaxHighlighting;
private final boolean myDoHighlightInlineCodeBlocks;
private final boolean myDoHighlightLinks;
public JavaDocInfoGenerator(@NotNull Project project, @Nullable PsiElement element) {
this(project, element, new JavaDocHighlightingManagerImpl(), false, true);
this(project, element, new JavaDocHighlightingManagerImpl(), false, true, true, true);
}
public JavaDocInfoGenerator(
@@ -124,13 +130,17 @@ public class JavaDocInfoGenerator {
@Nullable PsiElement element,
@NotNull JavaDocHighlightingManager highlightingManager,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting
boolean doSyntaxHighlighting,
boolean doHighlightInlineCodeBlocks,
boolean doHighlightLinks
) {
myProject = project;
myElement = element;
myIsRendered = isGenerationForRenderedDoc;
myDoSyntaxHighlighting = doSyntaxHighlighting;
myHighlightingManager = highlightingManager;
myDoSyntaxHighlighting = doSyntaxHighlighting;
myDoHighlightInlineCodeBlocks = doHighlightInlineCodeBlocks;
myDoHighlightLinks = doHighlightLinks;
Sdk jdk = JavadocGeneratorRunProfile.getSdk(myProject);
mySdkVersion = jdk == null ? null : JavaSdk.getInstance().getVersion(jdk);
@@ -144,6 +154,18 @@ public class JavaDocInfoGenerator {
return myDoSyntaxHighlighting;
}
public boolean doHighlightInlineCodeBlocks() {
return myDoHighlightInlineCodeBlocks;
}
public boolean doHighlightLinks() {
return myDoHighlightLinks;
}
public float getHighlightingSaturation() {
return EditorSettingsExternalizable.getInstance().getDocSyntaxHighlightingSaturation() * 0.01f;
}
public @NotNull JavaDocHighlightingManager getHighlightingManager() {
return myHighlightingManager;
}
@@ -154,7 +176,7 @@ public class JavaDocInfoGenerator {
@Nullable String value
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value);
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value, getHighlightingSaturation());
}
else {
buffer.append(value);
@@ -169,9 +191,13 @@ public class JavaDocInfoGenerator {
@Nullable String codeSnippet
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet);
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
buffer, project, language, codeSnippet, getHighlightingSaturation());
}
else {
else if (codeSnippet != null) {
codeSnippet = StringsKt.trimIndent(codeSnippet);
codeSnippet = StringUtil.escapeXmlEntities(codeSnippet);
codeSnippet = codeSnippet.replace("\n", BR_TAG);
buffer.append(codeSnippet);
}
return buffer;
@@ -1496,16 +1522,18 @@ public class JavaDocInfoGenerator {
generateLiteralValue(codeSnippetBuilder, tag, false);
String codeSnippet = codeSnippetBuilder.toString();
codeSnippetBuilder.setLength(0);
appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
codeSnippetBuilder, tag.getProject(), tag.getLanguage(), codeSnippet);
codeSnippet = codeSnippetBuilder.toString();
if (isCodeBlock || doHighlightInlineCodeBlocks()) {
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();
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
@@ -2040,24 +2068,42 @@ public class JavaDocInfoGenerator {
buffer.append("<font color=red>").append(label).append("</font>");
}
else {
generateLink(buffer, target, tryHighlightLinkLabel(target, label), plainLink);
generateLink(buffer, target, doHighlightLinks() ? tryHighlightLinkLabel(target, label) : label, plainLink);
}
}
/**
* If highlighted links has the same color as highlighted inline code blocks they will be indistinguishable.
* In this case we should change link color to standard hyperlink color which we believe is apriori different.
*/
private static @NotNull TextAttributes tuneAttributesForLink(@NotNull TextAttributes attributes) {
EditorColorsScheme globalScheme = EditorColorsManager.getInstance().getGlobalScheme();
TextAttributes defaultText = globalScheme.getAttributes(HighlighterColors.TEXT);
TextAttributes identifier = globalScheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER);
if (Objects.equals(attributes.getForegroundColor(), defaultText.getForegroundColor())
|| Objects.equals(attributes.getForegroundColor(), identifier.getForegroundColor())) {
TextAttributes tuned = attributes.clone();
tuned.setForegroundColor(globalScheme.getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES).getForegroundColor());
return tuned;
}
return attributes;
}
private @NotNull String tryHighlightLinkLabel(@NotNull PsiElement element, @NotNull String label) {
if (element instanceof PsiClass) {
return getStyledSpan(getHighlightingManager().getClassDeclarationAttributes((PsiClass)element), label);
return getStyledSpan(tuneAttributesForLink(getHighlightingManager().getClassDeclarationAttributes((PsiClass)element)), label);
}
if (element instanceof PsiPackage) {
return getStyledSpan(getHighlightingManager().getClassNameAttributes(), label);
return getStyledSpan(tuneAttributesForLink(getHighlightingManager().getClassNameAttributes()), label);
}
else if (element instanceof PsiMethod) {
return tryHighlightLinkOnClassMember((PsiMember)element, getHighlightingManager().getMethodDeclarationAttributes((PsiMethod)element),
label);
return tryHighlightLinkOnClassMember(
(PsiMember)element, tuneAttributesForLink(getHighlightingManager().getMethodDeclarationAttributes((PsiMethod)element)), label);
}
else if (element instanceof PsiField) {
return tryHighlightLinkOnClassMember((PsiField)element, getHighlightingManager().getFieldDeclarationAttributes((PsiField)element),
label);
return tryHighlightLinkOnClassMember(
(PsiField)element, tuneAttributesForLink(getHighlightingManager().getFieldDeclarationAttributes((PsiField)element)), label);
}
else {
return getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(element.getProject(), element.getLanguage(), label);
@@ -2,13 +2,16 @@
package com.intellij.codeInsight.javadoc;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Checks;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
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);
}
@@ -19,17 +22,9 @@ public class JavaDocInfoGeneratorFactory {
element,
JavaDocHighlightingManagerImpl.getInstance(),
false,
EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled());
}
protected JavaDocInfoGenerator createImpl(
@NotNull Project project,
@Nullable PsiElement element,
@NotNull JavaDocHighlightingManager highlightingManager,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting
) {
return new JavaDocInfoGenerator(project, element, highlightingManager, isGenerationForRenderedDoc, doSyntaxHighlighting);
EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled(),
EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfInlineCodeBlocksEnabled(),
EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfLinksEnabled());
}
@NotNull
@@ -37,14 +32,67 @@ public class JavaDocInfoGeneratorFactory {
return getInstance().createImpl(project, element);
}
@NotNull
public static JavaDocInfoGenerator create(
@NotNull Project project,
@Nullable PsiElement element,
@NotNull JavaDocHighlightingManager highlightingManager,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting
) {
return getInstance().createImpl(project, element, highlightingManager, isGenerationForRenderedDoc, doSyntaxHighlighting);
public static @NotNull JavaDocInfoGeneratorBuilder getBuilder(@NotNull Project project) {
return new JavaDocInfoGeneratorBuilder(project);
}
public static final class JavaDocInfoGeneratorBuilder {
private final @NotNull Project myProject;
private @Nullable PsiElement myElement;
private @NotNull JavaDocHighlightingManager myManager = new JavaDocHighlightingManagerImpl();
private boolean myIsRendered = false;
private boolean myDoHighlighting = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled();
private boolean myDoHighlightBlocks = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfInlineCodeBlocksEnabled();
private boolean myDoHighlightLinks = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfLinksEnabled();
private JavaDocInfoGeneratorBuilder(@NotNull Project project) {
myProject = project;
}
public JavaDocInfoGeneratorBuilder setPsiElement(@Nullable PsiElement element) {
myElement = element;
return this;
}
public JavaDocInfoGeneratorBuilder setHighlightingManager(@NotNull JavaDocHighlightingManager manager) {
myManager = manager;
return this;
}
public JavaDocInfoGeneratorBuilder setIsGenerationForRenderedDoc(boolean isRendered) {
myIsRendered = isRendered;
return this;
}
public JavaDocInfoGeneratorBuilder setDoSyntaxHighlighting(boolean doHighlighting) {
myDoHighlighting = doHighlighting;
return this;
}
public JavaDocInfoGeneratorBuilder setDoHighlightInlineCodeBlocks(boolean doHighlightBlocks) {
myDoHighlightBlocks = doHighlightBlocks;
return this;
}
public JavaDocInfoGeneratorBuilder setDoHighlightLinks(boolean doHighlightLinks) {
myDoHighlightLinks = doHighlightLinks;
return this;
}
public JavaDocInfoGenerator create() {
if (!myDoHighlighting) {
myDoHighlightBlocks = false;
myDoHighlightLinks = false;
}
return new JavaDocInfoGenerator(
myProject,
myElement,
myManager,
myIsRendered,
myDoHighlighting,
myDoHighlightBlocks,
myDoHighlightLinks);
}
}
}
@@ -17,7 +17,6 @@ import com.intellij.lang.CodeDocumentationAwareCommenter;
import com.intellij.lang.LanguageCommenters;
import com.intellij.lang.documentation.CodeDocumentationProvider;
import com.intellij.lang.documentation.CompositeDocumentationProvider;
import com.intellij.lang.documentation.DocumentationProviderEx;
import com.intellij.lang.documentation.ExternalDocumentationProvider;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Editor;
@@ -34,7 +33,6 @@ import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.text.HtmlChunk;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.JarFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
@@ -83,7 +81,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
@Nullable String value
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value);
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value, getHighlightingSaturation());
}
else {
buffer.append(value);
@@ -108,6 +106,10 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
return EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled();
}
protected static float getHighlightingSaturation() {
return EditorSettingsExternalizable.getInstance().getDocSyntaxHighlightingSaturation() * 0.01f;
}
@Override
public @Nls String getQuickNavigateInfo(PsiElement element, PsiElement originalElement) {
return QuickDocUtil.inferLinkFromFullDocumentation(this, element, originalElement,
@@ -223,13 +225,20 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
}
}
private static JavaDocInfoGenerator getDocInfoGenerator(@NotNull Project project, boolean isGenerationForRenderedDoc) {
return JavaDocInfoGeneratorFactory.getBuilder(project)
.setIsGenerationForRenderedDoc(isGenerationForRenderedDoc)
.setDoSyntaxHighlighting(doSyntaxHighlighting())
.create();
}
public static @Nls String generateClassInfo(PsiClass aClass) {
@Nls StringBuilder buffer = new StringBuilder();
if (aClass instanceof PsiAnonymousClass) return JavaElementKind.ANONYMOUS_CLASS.subject();
JavaDocInfoGenerator docInfoGenerator = JavaDocInfoGeneratorFactory.create(
aClass.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), false, doSyntaxHighlighting());
getDocInfoGenerator(aClass.getProject(), false);
JavaDocInfoGenerator docInfoGenerator = getDocInfoGenerator(aClass.getProject(), false);
generateOrderEntryAndPackageInfo(buffer, aClass);
docInfoGenerator.generateTooltipAnnotations(aClass, buffer);
@@ -299,7 +308,11 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
JavaDocHighlightingManager highlightingManager
) {
for (int i = 0; i < refs.length; i++) {
JavaDocInfoGeneratorFactory.create(aClass.getProject(), null, highlightingManager, false, doSyntaxHighlighting())
JavaDocInfoGeneratorFactory.getBuilder(aClass.getProject())
.setIsGenerationForRenderedDoc(false)
.setHighlightingManager(highlightingManager)
.setDoSyntaxHighlighting(doSyntaxHighlighting())
.create()
.generateType(buffer, refs[i], aClass, false, true);
if (i < refs.length - 1) {
@@ -351,9 +364,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
PsiClass parentClass = method.getContainingClass();
JavaDocInfoGenerator docInfoGenerator = JavaDocInfoGeneratorFactory.create(
method.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), false, doSyntaxHighlighting());
JavaDocInfoGenerator docInfoGenerator = getDocInfoGenerator(method.getProject(), false);
JavaDocHighlightingManagerImpl highlightingManager = JavaDocHighlightingManagerImpl.getInstance();
if (parentClass != null && !(parentClass instanceof PsiAnonymousClass)) {
@@ -435,8 +446,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
newLine(buffer);
}
JavaDocInfoGenerator docInfoGenerator = JavaDocInfoGeneratorFactory.create(
field.getProject(), null, JavaDocHighlightingManagerImpl.getInstance(), false, doSyntaxHighlighting());
JavaDocInfoGenerator docInfoGenerator = getDocInfoGenerator(field.getProject(), false);
docInfoGenerator.generateTooltipAnnotations(field, buffer);
generateModifiers(buffer, field);
@@ -497,7 +507,9 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
public Pair<PsiElement, PsiComment> parseContext(@NotNull PsiElement startPoint) {
PsiElement current = startPoint;
while (current != null) {
if (current instanceof PsiJavaDocumentedElement && !(current instanceof PsiTypeParameter) && !(current instanceof PsiAnonymousClass)) {
if (current instanceof PsiJavaDocumentedElement &&
!(current instanceof PsiTypeParameter) &&
!(current instanceof PsiAnonymousClass)) {
PsiDocComment comment = ((PsiJavaDocumentedElement)current).getDocComment();
return Pair.create(current, comment);
}
@@ -632,9 +644,11 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
if (element instanceof PsiJavaCodeReferenceElement) { // new Class<caret>
PsiElement resolve = ((PsiJavaCodeReferenceElement)element).resolve();
if (resolve instanceof PsiClass) targetClass = (PsiClass)resolve;
} else if (element instanceof PsiClass) { //Class in completion
}
else if (element instanceof PsiClass) { //Class in completion
targetClass = (PsiClass)element;
} else if (element instanceof PsiNewExpression) { // new Class(<caret>)
}
else if (element instanceof PsiNewExpression) { // new Class(<caret>)
PsiJavaCodeReferenceElement reference = ((PsiNewExpression)element).getClassReference();
if (reference != null) {
PsiElement resolve = reference.resolve();
@@ -648,7 +662,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
if (constructors.length == 1) return generateDoc(constructors[0], originalElement);
final StringBuilder sb = new StringBuilder();
for(PsiMethod constructor:constructors) {
for (PsiMethod constructor : constructors) {
final String str = PsiFormatUtil.formatMethod(constructor, PsiSubstitutor.EMPTY,
PsiFormatUtilBase.SHOW_NAME |
PsiFormatUtilBase.SHOW_TYPE |
@@ -678,8 +692,11 @@ 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, JavaDocHighlightingManagerImpl.getInstance(), true, doSyntaxHighlighting());
JavaDocInfoGenerator generator = JavaDocInfoGeneratorFactory.getBuilder(target.getProject())
.setPsiElement(target)
.setIsGenerationForRenderedDoc(true)
.setDoSyntaxHighlighting(doSyntaxHighlighting())
.create();
return JavaDocExternalFilter.filterInternalDocInfo(generator.generateRenderedDocInfo());
}
@@ -715,7 +732,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
List<PsiDocCommentOwner> children = PsiTreeUtil.getChildrenOfTypeAsList(aClass, PsiDocCommentOwner.class);
for (PsiDocCommentOwner child : children) {
if (child instanceof PsiClass) {
collectDocComments((PsiClass) child, sink);
collectDocComments((PsiClass)child, sink);
}
else {
collectDocComment(child, sink);
@@ -897,7 +914,8 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
VirtualFile virtualFile = file.getOriginalFile().getVirtualFile();
if (virtualFile != null) {
String pkgName = ((PsiJavaFile)file).getPackageName();
String relPath = (pkgName.isEmpty() ? qName : pkgName.replace('.', '/') + '/' + qName.substring(pkgName.length() + 1)) + HTML_EXTENSION;
String relPath =
(pkgName.isEmpty() ? qName : pkgName.replace('.', '/') + '/' + qName.substring(pkgName.length() + 1)) + HTML_EXTENSION;
return findUrlForVirtualFile(file.getProject(), virtualFile, relPath);
}
}
@@ -946,7 +964,8 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
String altRelPath = javaModule != null ? javaModule.getName() + '/' + relPath : null;
for (OrderEntry orderEntry : fileIndex.getOrderEntriesForFile(virtualFile)) {
boolean altUrl = orderEntry instanceof JdkOrderEntry && JavaSdkVersionUtil.isAtLeast(((JdkOrderEntry)orderEntry).getJdk(), JavaSdkVersion.JDK_11);
boolean altUrl =
orderEntry instanceof JdkOrderEntry && JavaSdkVersionUtil.isAtLeast(((JdkOrderEntry)orderEntry).getJdk(), JavaSdkVersion.JDK_11);
for (VirtualFile root : orderEntry.getFiles(JavadocOrderRootType.getInstance())) {
if (root.getFileSystem() == JarFileSystem.getInstance()) {
@@ -1018,6 +1037,7 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
* The method returns either class or interface or method or field or anything with a javadoc that is annotated with the keyword.
* The method inspects keywords in the modifier lists, the class-level keywords (e.g. class, interface, implements, record, sealed, permits, etc.)
* and primitive types
*
* @param contextElement element that is supposed to be a keyword
* @return an instance of {@link PsiJavaDocumentedElement} that has javadoc if the keyword is either on the class or method or field level,
* null otherwise
@@ -1027,7 +1047,8 @@ public class JavaDocumentationProvider implements CodeDocumentationProvider, Ext
private static PsiJavaDocumentedElement getDocumentedElementOfKeyword(@Nullable final PsiElement contextElement) {
if (!(contextElement instanceof PsiKeyword)) return null;
final PsiElement element = PsiTreeUtil.skipParentsOfType(contextElement, PsiModifierList.class, PsiReferenceList.class, PsiTypeElement.class);
final PsiElement element =
PsiTreeUtil.skipParentsOfType(contextElement, PsiModifierList.class, PsiReferenceList.class, PsiTypeElement.class);
if (!(element instanceof PsiJavaDocumentedElement)) return null;
return (PsiJavaDocumentedElement)element;
@@ -26,4 +26,4 @@
</ul>
</div>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://com.jetbrains.GenericClass"><code><span style="color:#000000;">com.jetbrains.GenericClass</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`genericMethod(Class&lt;?&gt;)` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`genericMethod(Class&lt;?&gt;)` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -19,4 +19,4 @@
<div class="block"><a href="psi_element://com.jetbrains.LinkBetweenMethods#m2()"><code>m2()</code></a></div>
</li>
</ul>
</div><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://com.jetbrains.LinkBetweenMethods"><code><span style="color:#000000;">com.jetbrains.LinkBetweenMethods</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`m1()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`m1()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -24,4 +24,4 @@
</ul>
</div>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<a href="psi_element://com.jetbrains"><code><span style="color:#000000;">com.jetbrains</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`SimpleInterface` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`SimpleInterface` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -32,4 +32,4 @@ extends java.lang.Object</pre>
</li>
</ul>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<a href="psi_element://com.jetbrains"><code><span style="color:#000000;">com.jetbrains</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`ClassWithRefLink` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`ClassWithRefLink` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -26,4 +26,4 @@
</ul>
</div>
</div>
</div><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://com.jetbrains.TestAnnotation"><code><span style="color:#000000;">com.jetbrains.TestAnnotation</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`param()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
</div><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;myLib</div><div class="bottom"><a href="placeholder">`param()` on localhost<icon src='AllIcons.Ide.External_link_arrow'></a></div>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><font color=red>@</font>&nbsp;
<span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;
<span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">null</span></pre></div><table class='sections'></table>
<span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">null</span></pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">s</span><span style="">,</span>
<span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">p</span><br><span style="">)</span></pre></div><table class='sections'><p></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="">s</span><span style="">,</span>
<span style="color:#808000;">@</span><a href="psi_element://java.lang.Deprecated"><code><span style="color:#808000;">Deprecated</span></code></a>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="">p</span><br><span style="">)</span></pre></div><table class='sections'><p></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000000;">foo</span><span style="">(</span><span style="color:#008000;font-weight:bold;">""</span><span style="">, </span><span style="color:#008000;font-weight:bold;">""</span><span style="">)</span></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000000;">foo</span><span style="">(</span><span style="color:#008000;font-weight:bold;">""</span><span style="">, </span><span style="color:#008000;font-weight:bold;">""</span><span style="">)</span></pre></div><table class='sections'></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">getMyFoo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From field:</td><td valign='top'><p><a href="psi_element://FooBar#myFoo"><code><span style="color:#660e7a;font-weight:bold;">myFoo</span></code></a><br>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="color:#000000;">getMyFoo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From field:</td><td valign='top'><p><a href="psi_element://FooBar#myFoo"><code><span style="color:#660e7a;font-weight:bold;">myFoo</span></code></a><br>
foo bar baz
</td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://FooBar"><code><span style="color:#000000;">FooBar</span></code></a><br/></div>
</td></table>
@@ -1,5 +1,5 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public final</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">String</span>
<span style="color:#000080;font-weight:bold;">implements</span> <a href="psi_element://java.io.Serializable"><code><span style="color:#000000;">java.io.Serializable</span></code></a><span style="">,</span>&nbsp;<a href="psi_element://java.lang.Comparable"><code><span style="color:#000000;">Comparable</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">,</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">CharSequence</span></code></a></pre></div><div class='content'>
<span style="color:#000080;font-weight:bold;">implements</span> <a href="psi_element://java.io.Serializable"><code><span style="color:#0000ff;">java.io.Serializable</span></code></a><span style="">,</span>&nbsp;<a href="psi_element://java.lang.Comparable"><code><span style="color:#0000ff;">Comparable</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span><span style="">,</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#0000ff;">CharSequence</span></code></a></pre></div><div class='content'>
The <code>String</code> class represents character strings. All
string literals in Java programs, such as <code>"abc"</code>, are
implemented as instances of this class.
@@ -29,7 +29,7 @@
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 <a href="psi_element://java.lang.Character"><code><span style="color:#000000;">Character</span></code></a> class.
specified by the <a href="psi_element://java.lang.Character"><code><span style="color:#0000ff;">Character</span></code></a> class.
<p>
The Java language provides special support for the string
concatenation operator (&nbsp;+&nbsp;), and for conversion of
@@ -43,7 +43,7 @@
<i>The Java Language Specification</i>.
<p> Unless otherwise noted, passing a <tt>null</tt> argument to a constructor
or method in this class will cause a <a href="psi_element://java.lang.NullPointerException"><code><span style="color:#000000;">NullPointerException</span></code></a> to be
or method in this class will cause a <a href="psi_element://java.lang.NullPointerException"><code><span style="color:#0000ff;">NullPointerException</span></code></a> to be
thrown.
<p>A <code>String</code> represents a string in the UTF-16 format
@@ -57,4 +57,4 @@
Unicode code points (i.e., characters), in addition to those for
dealing with Unicode code units (i.e., <code>char</code> values).
</div><table class='sections'><p><tr><td valign='top' class='section'><p>Since:</td><td valign='top'><p>JDK1.0</td><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://java.lang.Object#toString()"><code><span style="color:#000000;">Object</span><span style="">.</span><span style="color:#000000;">toString</span><span style="">()</span></code></a>,<br><a href="psi_element://java.lang.StringBuffer"><code><span style="color:#000000;">StringBuffer</span></code></a>,<br><a href="psi_element://java.lang.StringBuilder"><code><span style="color:#000000;">StringBuilder</span></code></a>,<br><font color=red>java.nio.charset.Charset</font></td></table>
</div><table class='sections'><p><tr><td valign='top' class='section'><p>Since:</td><td valign='top'><p>JDK1.0</td><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://java.lang.Object#toString()"><code><span style="color:#000000;">Object</span><span style="">.</span><span style="color:#0000ff;">toString</span><span style="">()</span></code></a>,<br><a href="psi_element://java.lang.StringBuffer"><code><span style="color:#0000ff;">StringBuffer</span></code></a>,<br><a href="psi_element://java.lang.StringBuilder"><code><span style="color:#0000ff;">StringBuilder</span></code></a>,<br><font color=red>java.nio.charset.Charset</font></td></table>
@@ -1,8 +1,8 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">public abstract</span>&nbsp;<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><br> <a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">o</span><br><span style="">)</span></pre></div><div class='content'>
<span style="color:#000080;font-weight:bold;">public abstract</span>&nbsp;<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><br> <a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a>&nbsp;<span style="">o</span><br><span style="">)</span></pre></div><div class='content'>
Returns <tt>true</tt> if this list contains the specified element.
More formally, returns <tt>true</tt> if and only if this list contains
at least one element <tt>e</tt> such that
<tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
</div><table class='sections'><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this list is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this list contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#000000;">ClassCastException</span></code></a> &ndash; if the type of the specified element is incompatible with this list (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>) <p><a href="psi_element://java.lang.NullPointerException"><code><span style="color:#000000;">NullPointerException</span></code></a> &ndash; if the specified element is null and this list does not permit null elements (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>)</td><tr><td valign='top' class='section'><p>External<br> annotations:</td><td valign='top'><p><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></td></table><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">java.util.List</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>
</div><table class='sections'><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this list is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this list contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#0000ff;">ClassCastException</span></code></a> &ndash; if the type of the specified element is incompatible with this list (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>) <p><a href="psi_element://java.lang.NullPointerException"><code><span style="color:#0000ff;">NullPointerException</span></code></a> &ndash; if the specified element is null and this list does not permit null elements (<a href="psi_element://java.util.Collection###optional-restrictions">optional</a>)</td><tr><td valign='top' class='section'><p>External<br> annotations:</td><td valign='top'><p><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></td></table><div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>
@@ -1,8 +1,8 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><br> <a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">o</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From interface:</td><td valign='top'><p><a href="psi_element://java.util.Collection"><code><span style="color:#000000;">java.util.Collection</span></code></a><br>
<span style="color:#000080;font-weight:bold;">boolean</span>&nbsp;<span style="color:#000000;">contains</span><span style="">(</span><br> <a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a>&nbsp;<span style="">o</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>From interface:</td><td valign='top'><p><a href="psi_element://java.util.Collection"><code><span style="color:#000000;">java.util.Collection</span></code></a><br>
Returns <tt>true</tt> if this collection contains the specified element.
More formally, returns <tt>true</tt> if and only if this collection
contains at least one element <tt>e</tt> such that
<tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
</td><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a><br><a href="psi_element://I#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://I"><code><span style="color:#000000;">I</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this collection is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this collection contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#000000;">ClassCastException</span></code></a> &ndash; if the type of the specified element is incompatible with this collection (<a href="psi_element://My###optional-restrictions">optional</a>) <p><a href="psi_element://java.lang.NullPointerException"><code><span style="color:#000000;">NullPointerException</span></code></a> &ndash; if the specified element is null and this collection does not permit null elements (<a href="psi_element://My###optional-restrictions">optional</a>)</td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://My"><code><span style="color:#000000;">My</span></code></a><br/></div>
</td><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://java.util.Collection#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://java.util.Collection"><code><span style="color:#000000;">Collection</span></code></a><br><a href="psi_element://I#contains(java.lang.Object)"><code><span style="color:#000000;">contains</span></code></a> in interface <a href="psi_element://I"><code><span style="color:#000000;">I</span></code></a></td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><span style="">o</span> &ndash; element whose presence in this collection is to be tested </td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><tt>true</tt> if this collection contains the specified element </td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.lang.ClassCastException"><code><span style="color:#0000ff;">ClassCastException</span></code></a> &ndash; if the type of the specified element is incompatible with this collection (<a href="psi_element://My###optional-restrictions">optional</a>) <p><a href="psi_element://java.lang.NullPointerException"><code><span style="color:#0000ff;">NullPointerException</span></code></a> &ndash; if the specified element is null and this collection does not permit null elements (<a href="psi_element://My###optional-restrictions">optional</a>)</td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a> <span style="color:#660e7a;">A</span>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><a href="psi_element://E"><code><span style="color:#0000ff;">E</span></code></a> <span style="color:#660e7a;">A</span>
<span class='grayed'>// Enum constant ordinal: 0</span></pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">read</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; if an I/O error occurs while reading. <p><a href="psi_element://java.io.EOFException"><code><span style="color:#000000;">EOFException</span></code></a> &ndash; if this source is already closed when the <code>read()</code> is called, or is closed during the <code>read()</code>. <p><font color=red>InterruptedIOException</font> &ndash; if the reading thread is interrupted.</td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a>&nbsp;<span style="color:#000000;">read</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#0000ff;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#0000ff;">IOException</span></code></a> &ndash; if an I/O error occurs while reading. <p><a href="psi_element://java.io.EOFException"><code><span style="color:#0000ff;">EOFException</span></code></a> &ndash; if this source is already closed when the <code>read()</code> is called, or is closed during the <code>read()</code>. <p><font color=red>InterruptedIOException</font> &ndash; if the reading thread is interrupted.</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; la-la-la</td></table>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#0000ff;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#0000ff;">IOException</span></code></a> &ndash; la-la-la</td></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#000000;">IOException</span></code></a> &ndash; comment</td></table>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://java.io.IOException"><code><span style="color:#0000ff;">IOException</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Overrides:</td><td valign='top'><p><a href="psi_element://A#foo()"><code><span style="color:#000000;">foo</span></code></a> in class <a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a></td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://java.io.IOException"><code><span style="color:#0000ff;">IOException</span></code></a> &ndash; comment</td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#000000;">s</span></pre></div><div class='content'><span style="">s</span> &ndash; String parameter.</div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a> <span style="color:#000000;">s</span></pre></div><div class='content'><span style="">s</span> &ndash; String parameter.</div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">strings</span> <span style="">= </span><span style="color:#008000;font-weight:bold;">"A&lt;BLANK&gt;B"</span></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">strings</span> <span style="">= </span><span style="color:#008000;font-weight:bold;">"A&lt;BLANK&gt;B"</span></pre></div><table class='sections'></table>
@@ -1,2 +1,2 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#660e7a;font-weight:bold;">strings</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">, </span><span style="color:#000000;">Collections.singleton</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#000000;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Double"><code><span style="color:#000000;">Double</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">)</span><span style="">)</span></pre></div><table class='sections'></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.util.List"><code><span style="color:#0000ff;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span> <span style="color:#660e7a;font-weight:bold;">strings</span>
&nbsp;&nbsp;&nbsp;&nbsp;<span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#0000ff;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#0000ff;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Integer"><code><span style="color:#0000ff;">Integer</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">, </span><span style="color:#000000;">Collections.singleton</span><span style="">(</span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://java.util.ArrayList"><code><span style="color:#0000ff;">ArrayList</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.Double"><code><span style="color:#0000ff;">Double</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span><span style="">)</span><span style="">)</span></pre></div><table class='sections'></table>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.lang.Exception"><code><span style="color:#000000;">Exception</span></code></a><span style="">&gt;</span>&nbsp;<font color=red>@</font>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">drainTo</span><span style="">(</span><br> <a href="psi_element://Consumer"><code><span style="color:#000000;">Consumer</span></code></a><span style="">&lt;</span><span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#20999d;">T</span><span style="">, </span><span style="color:#20999d;">E</span><span style="">&gt;</span>&nbsp;<span style="">consumer</span><span style="">,</span>
<a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="">someParameter</span><br><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a></td></table>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.lang.Exception"><code><span style="color:#0000ff;">Exception</span></code></a><span style="">&gt;</span>&nbsp;<font color=red>@</font>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="color:#000000;">drainTo</span><span style="">(</span><br> <a href="psi_element://Consumer"><code><span style="color:#0000ff;">Consumer</span></code></a><span style="">&lt;</span><span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#20999d;">T</span><span style="">, </span><span style="color:#20999d;">E</span><span style="">&gt;</span>&nbsp;<span style="">consumer</span><span style="">,</span>
<a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a>&nbsp;<span style="">someParameter</span><br><span style="">)</span>
<span style="color:#000080;font-weight:bold;">throws</span>&nbsp;<a href="psi_element://E"><code><span style="color:#0000ff;">E</span></code></a></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><a href="psi_element://E"><code><span style="color:#0000ff;">E</span></code></a></td></table>
@@ -1,4 +1,4 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">null</span></pre></div><div class='content'>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a> <span style="color:#660e7a;font-weight:bold;">field</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">null</span></pre></div><div class='content'>
<pre>
foo
<p></p>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><br> <a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a>&nbsp;<span style="">idx</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(java.lang.Number)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#000000;">remove</span><span style="">(Number)</span></code></a></td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#000000;">Number</span><span style="">&gt;</span></code></a><br/></div>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><br> <a href="psi_element://java.lang.Integer"><code><span style="color:#0000ff;">Integer</span></code></a>&nbsp;<span style="">idx</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(java.lang.Number)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#0000ff;">remove</span><span style="">(Number)</span></code></a></td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><br> <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">idx</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(int)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#000000;">remove</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span><span style="">)</span></code></a></td></table><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span><span style="">&lt;</span><span style="color:#20999d;">E</span><span style="">&gt;</span></code></a><br/></div>
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#20999d;">E</span>&nbsp;<span style="color:#000000;">remove</span><span style="">(</span><br> <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">idx</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><p><a href="psi_element://TestImpl#remove(int)"><code><span style="color:#000000;">TestImpl</span><span style="">.</span><span style="color:#0000ff;">remove</span><span style="">(</span><span style="color:#000080;font-weight:bold;">int</span><span style="">)</span></code></a></td></table>
@@ -1,5 +1,5 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
<span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">values</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
<span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://E"><code><span style="color:#0000ff;">E</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">values</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
Returns an array containing the constants of this enum
type, in the order they're declared. This method may be
used to iterate over the constants as follows:
@@ -8,4 +8,4 @@
System.out.println(c);
</pre>
</div><table class='sections'><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p>an array containing the constants of this enum type, in the order they're declared</td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://E"><code><span style="color:#000000;">E</span></code></a><br/></div>
</div><table class='sections'><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p>an array containing the constants of this enum type, in the order they're declared</td><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">CharSequence</span></code></a><span style=""> & </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.Cloneable"><code><span style="color:#000000;">Cloneable</span></code></a><span style="">&gt;</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">4</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">5</span><span style="">)</span>&nbsp;<span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">6</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="">&gt;</span>&nbsp;<span style="color:#000000;">bar</span><span style="">(</span><span style="">)</span></pre></div><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a><br/></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="color:#000080;font-weight:bold;"> extends </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.CharSequence"><code><span style="color:#0000ff;">CharSequence</span></code></a><span style=""> & </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.Cloneable"><code><span style="color:#0000ff;">Cloneable</span></code></a><span style="">&gt;</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">4</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#0000ff;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">5</span><span style="">)</span>&nbsp;<span style="">?</span><span style="color:#000080;font-weight:bold;"> super </span><span style="color:#808000;">@</span><a href="psi_element://Test.Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">6</span><span style="">)</span>&nbsp;<span style="color:#20999d;">T</span><span style="">&gt;</span>&nbsp;<span style="color:#000000;">bar</span><span style="">(</span><span style="">)</span></pre></div>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class="bottom-no-content"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://Test"><code><span style="color:#000000;">Test</span></code></a><br/></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div>
@@ -1,3 +1,3 @@
<html><head><base href="placeholder"></head><body><div class='definition'><pre><span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">1</span><span style="">)</span>&nbsp;
<span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">Test</span>
<span style="color:#000080;font-weight:bold;">extends</span> <span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span></pre></div><table class='sections'></table>
<span style="color:#000080;font-weight:bold;">extends</span> <span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">2</span><span style="">)</span>&nbsp;<a href="psi_element://java.util.List"><code><span style="color:#0000ff;">List</span></code></a><span style="">&lt;</span><span style="color:#808000;">@</span><a href="psi_element://Foo"><code><span style="color:#808000;">Foo</span></code></a><span style="">(</span><span style="color:#0000ff;">3</span><span style="">)</span>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span></pre></div><table class='sections'></table>
@@ -1 +1 @@
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">a</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://A"><code><span style="color:#000000;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span></pre></div>
<html><head><base href="placeholder"></head><body><div class='definition-only'><pre><a href="psi_element://A"><code><span style="color:#0000ff;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">a</span> <span style="">= </span><span style="color:#000080;font-weight:bold;">new </span><a href="psi_element://A"><code><span style="color:#0000ff;">A</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span><span style="">(</span><span style="">)</span></pre></div>
@@ -157,7 +157,7 @@ class JavaDocumentationTest extends LightJavaCodeInsightFixtureTestCase {
def doc = new JavaDocumentationProvider().generateDoc(method, null)
def expected =
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">public</span>&nbsp;<span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span></pre></div><div class=\'content\'>\n For example, <a href=\"psi_element://java.lang.String#String(byte[], int, int, java.lang.String)\"><code><span style=\"color:#000000;\">String</span><span style=\"\">.</span><span style=\"color:#000000;\">String</span><span style=\"\">(</span><span style=\"color:#000080;font-weight:bold;\">byte</span><span style=\"\">[],&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;String)</span></code></a>.\n </div><table class=\'sections\'></table>"
"<div class=\'definition\'><pre><span style=\"color:#000080;font-weight:bold;\">public</span>&nbsp;<span style=\"color:#000080;font-weight:bold;\">void</span>&nbsp;<span style=\"color:#000000;\">m</span><span style=\"\">(</span><span style=\"\">)</span></pre></div><div class=\'content\'>\n For example, <a href=\"psi_element://java.lang.String#String(byte[], int, int, java.lang.String)\"><code><span style=\"color:#000000;\">String</span><span style=\"\">.</span><span style=\"color:#0000ff;\">String</span><span style=\"\">(</span><span style=\"color:#000080;font-weight:bold;\">byte</span><span style=\"\">[],&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;</span><span style=\"color:#000080;font-weight:bold;\">int</span><span style=\"\">,&#32;String)</span></code></a>.\n </div><table class=\'sections\'></table>"
assert doc == expected
}
@@ -270,7 +270,7 @@ class Bar {
}
// Here we check that the covering module (SDK in this case) is rendered in decorated info
assert component.decoratedText.contains('<div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<a href="psi_element://java.lang.String"><code><span style="color:#000000;">java.lang.String</span></code></a><br/><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>')
assert component.decoratedText.contains('<div class="bottom"><icon src="AllIcons.Nodes.PpLibFolder"/>&nbsp;&lt; java 1.7 &gt;</div>')
}
@@ -19,6 +19,9 @@ import com.intellij.openapi.options.ex.ConfigurableWrapper
import com.intellij.openapi.ui.DialogPanel
import com.intellij.ui.layout.*
import com.intellij.util.PlatformUtils
import javax.swing.JSpinner
import javax.swing.SpinnerNumberModel
import kotlin.math.roundToInt
// @formatter:off
private val model = EditorSettingsExternalizable.getInstance()
@@ -40,6 +43,8 @@ private val myCbShowIntentionBulbCheckBox get() = CheckboxDescriptor
private val myCodeLensCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.show.editor.preview.popup"), uiSettings::showEditorToolTip)
private val myRenderedDocCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.show.rendered.doc.comments"), PropertyBinding(model::isDocCommentRenderingEnabled, model::setDocCommentRenderingEnabled))
private val myDocSyntaxHighlightingCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.enable.doc.syntax.highlighting"), PropertyBinding(model::isDocSyntaxHighlightingEnabled, model::setDocSyntaxHighlightingEnabled))
private val myDocSyntaxHighlightingOfInlineCode get() = CheckboxDescriptor(IdeBundle.message("checkbox.enable.doc.syntax.highlighting.of.inline.code.blocks"), PropertyBinding(model::isDocSyntaxHighlightingOfInlineCodeBlocksEnabled, model::setDocSyntaxHighlightingOfInlineCodeBlocksEnabled))
private val myDocSyntaxHighlightingOfLinksCheckBox get() = CheckboxDescriptor(IdeBundle.message("checkbox.enable.doc.syntax.highlighting.of.links"), PropertyBinding(model::isDocSyntaxHighlightingOfLinksEnabled, model::setDocSyntaxHighlightingOfLinksEnabled))
// @formatter:on
class EditorAppearanceConfigurable : BoundCompositeSearchableConfigurable<UnnamedConfigurable>(
@@ -94,15 +99,32 @@ class EditorAppearanceConfigurable : BoundCompositeSearchableConfigurable<Unname
row {
checkBox(myCbShowIntentionBulbCheckBox)
}
row {
checkBox(myCodeLensCheckBox)
}
fullRow {
checkBox(myRenderedDocCheckBox)
component(createReaderModeComment()).withLargeLeftGap()
}
row {
checkBox(myDocSyntaxHighlightingCheckBox)
checkBox(myCodeLensCheckBox)
largeGapAfter()
}
titledRow(IdeBundle.message("group.documentation.components")) {
row {
val highlighting = checkBox(myDocSyntaxHighlightingCheckBox)
row {
checkBox(myDocSyntaxHighlightingOfInlineCode).enableIf(highlighting.selected)
}
row {
checkBox(myDocSyntaxHighlightingOfLinksCheckBox).enableIf(highlighting.selected)
}
row(IdeBundle.message("spinner.doc.syntax.highlighting.saturation")) {
component(JSpinner())
.applyToComponent { this@applyToComponent.model = SpinnerNumberModel(1.0, 0.0, 1.0, 0.05) }
.withBinding({ ((it.value as Double) * 100).roundToInt() }, { it, value -> it.value = value * 0.01 },
PropertyBinding(model::getDocSyntaxHighlightingSaturation, model::setDocSyntaxHighlightingSaturation))
.enableIf(highlighting.selected)
}
}
largeGapAfter()
}
for (configurable in configurables) {
@@ -32,9 +32,12 @@ import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.extensions.ExtensionPointListener;
import com.intellij.openapi.extensions.PluginDescriptor;
import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.project.IndexNotReadyException;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.libraries.LibraryUtil;
import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService;
import com.intellij.openapi.ui.popup.JBPopup;
@@ -52,6 +55,8 @@ import com.intellij.openapi.wm.ex.ToolWindowEx;
import com.intellij.openapi.wm.ex.WindowManagerEx;
import com.intellij.psi.*;
import com.intellij.psi.presentation.java.SymbolPresentationUtil;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.scope.packageSet.NamedScope;
import com.intellij.psi.search.scope.packageSet.NamedScopesHolder;
import com.intellij.psi.search.scope.packageSet.PackageSet;
@@ -3,10 +3,13 @@ package com.intellij.openapi.editor.richcopy;
import com.intellij.ide.highlighter.HighlighterFactory;
import com.intellij.lang.Language;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.colors.ColorKey;
import com.intellij.openapi.editor.colors.EditorColorsManager;
import com.intellij.openapi.editor.colors.EditorColorsScheme;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.colors.impl.DelegateColorScheme;
import com.intellij.openapi.editor.highlighter.EditorHighlighter;
import com.intellij.openapi.editor.markup.EffectType;
import com.intellij.openapi.editor.markup.TextAttributes;
@@ -35,20 +38,22 @@ public final class HtmlSyntaxInfoUtil {
return appendStyledSpan(new StringBuilder(), value, properties).toString();
}
public static @NotNull String getStyledSpan(@NotNull TextAttributesKey attributesKey, @Nullable String value) {
return appendStyledSpan(new StringBuilder(), attributesKey, value).toString();
public static @NotNull String getStyledSpan(@NotNull TextAttributesKey attributesKey, @Nullable String value, float saturationFactor) {
return appendStyledSpan(new StringBuilder(), attributesKey, value, saturationFactor).toString();
}
public static @NotNull String getStyledSpan(@NotNull TextAttributes attributes, @Nullable String value) {
return appendStyledSpan(new StringBuilder(), attributes, value).toString();
public static @NotNull String getStyledSpan(@NotNull TextAttributes attributes, @Nullable String value, float saturationFactor) {
return appendStyledSpan(new StringBuilder(), attributes, value, saturationFactor).toString();
}
public static @NotNull String getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet
@Nullable String codeSnippet,
float saturationFactor
) {
return appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(new StringBuilder(), project, language, codeSnippet).toString();
return appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(new StringBuilder(), project, language, codeSnippet, saturationFactor)
.toString();
}
public static @NotNull StringBuilder appendStyledSpan(
@@ -65,21 +70,24 @@ public final class HtmlSyntaxInfoUtil {
public static @NotNull StringBuilder appendStyledSpan(
@NotNull StringBuilder buffer,
@NotNull TextAttributesKey attributesKey,
@Nullable String value
@Nullable String value,
float saturationFactor
) {
appendStyledSpan(
buffer,
Objects.requireNonNull(EditorColorsManager.getInstance().getGlobalScheme().getAttributes(attributesKey)),
value);
value,
saturationFactor);
return buffer;
}
public static @NotNull StringBuilder appendStyledSpan(
@NotNull StringBuilder buffer,
@NotNull TextAttributes attributes,
@Nullable String value
@Nullable String value,
float saturationFactor
) {
createHtmlSpanBlockStyledAsTextAttributes(attributes)
createHtmlSpanBlockStyledAsTextAttributes(attributes, saturationFactor)
.addRaw(StringUtil.notNullize(value)) //NON-NLS
.appendTo(buffer);
return buffer;
@@ -89,9 +97,10 @@ public final class HtmlSyntaxInfoUtil {
@NotNull StringBuilder buffer,
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet
@Nullable String codeSnippet,
float saturationFactor
) {
return appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet, true);
return appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(buffer, project, language, codeSnippet, true, saturationFactor);
}
public static @NotNull StringBuilder appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
@@ -99,14 +108,16 @@ public final class HtmlSyntaxInfoUtil {
@NotNull Project project,
@NotNull Language language,
@Nullable String codeSnippet,
boolean doTrimIndent
boolean doTrimIndent,
float saturationFactor
) {
codeSnippet = StringUtil.notNullize(codeSnippet);
String trimmed = doTrimIndent ? StringsKt.trimIndent(codeSnippet) : codeSnippet;
String zeroIndentCode = trimmed.replace("\t", " ");
PsiFile fakePsiFile = PsiFileFactory.getInstance(project).createFileFromText(language, codeSnippet);
EditorColorsScheme scheme = EditorColorsManager.getInstance().getGlobalScheme();
if (!zeroIndentCode.isEmpty()) {
PsiFile fakePsiFile = PsiFileFactory.getInstance(project).createFileFromText(language, codeSnippet);
EditorColorsScheme scheme =
new ColorsSchemeWithChangedSaturation(EditorColorsManager.getInstance().getGlobalScheme(), saturationFactor);
buffer.append(getHtmlContent(fakePsiFile, zeroIndentCode, null, scheme, 0, zeroIndentCode.length()));
}
return buffer;
@@ -159,11 +170,19 @@ public final class HtmlSyntaxInfoUtil {
return null;
}
private static @NotNull HtmlChunk.Element createHtmlSpanBlockStyledAsTextAttributes(@NotNull TextAttributes attributes) {
private static @NotNull HtmlChunk.Element createHtmlSpanBlockStyledAsTextAttributes(
@NotNull TextAttributes attributes,
float saturationFactor
) {
StringBuilder style = new StringBuilder();
Color foregroundColor = attributes.getForegroundColor();
Color backgroundColor = attributes.getBackgroundColor();
Color effectTypeColor = attributes.getEffectColor();
if (foregroundColor != null) foregroundColor = tuneSaturationEspeciallyGrey(foregroundColor, 1, saturationFactor);
if (backgroundColor != null) backgroundColor = tuneSaturationEspeciallyGrey(backgroundColor, 1, saturationFactor);
if (effectTypeColor != null) effectTypeColor = tuneSaturationEspeciallyGrey(effectTypeColor, 1, saturationFactor);
if (foregroundColor != null) appendProperty(style, "color", ColorUtil.toHtmlColor(foregroundColor));
if (backgroundColor != null) appendProperty(style, "background-color", ColorUtil.toHtmlColor(backgroundColor));
@@ -211,21 +230,20 @@ public final class HtmlSyntaxInfoUtil {
}
}
Color effectColor = attributes.getEffectColor();
if (attributes.hasEffects() && effectType != null && effectColor != null) {
if (attributes.hasEffects() && effectType != null && effectTypeColor != null) {
switch (effectType) {
case LINE_UNDERSCORE:
case WAVE_UNDERSCORE:
case BOLD_LINE_UNDERSCORE:
case BOLD_DOTTED_LINE:
case STRIKEOUT:
appendProperty(style, "text-decoration-color", ColorUtil.toHtmlColor(effectColor));
appendProperty(style, "text-decoration-color", ColorUtil.toHtmlColor(effectTypeColor));
break;
case BOXED:
case ROUNDED_BOX:
case SEARCH_MATCH:
case SLIGHTLY_WIDER_BOX:
appendProperty(style, "border-color", ColorUtil.toHtmlColor(effectColor));
appendProperty(style, "border-color", ColorUtil.toHtmlColor(effectTypeColor));
break;
}
}
@@ -239,9 +257,48 @@ public final class HtmlSyntaxInfoUtil {
builder.append(value);
builder.append(";");
}
private static @NotNull Color tuneSaturationEspeciallyGrey(@NotNull Color color, int howMuch, float saturationFactor) {
if (ApplicationManager.getApplication().isUnitTestMode()) {
return color;
}
return ColorUtil.tuneSaturationEspeciallyGrey(color, howMuch, saturationFactor);
}
private final static class SimpleHtmlSyntaxInfoReader extends HtmlSyntaxInfoReader {
private static final class ColorsSchemeWithChangedSaturation extends DelegateColorScheme {
private final float mySaturationFactor;
private ColorsSchemeWithChangedSaturation(@NotNull EditorColorsScheme delegate, float saturationFactor) {
super(delegate);
mySaturationFactor = saturationFactor;
}
@Override
public @NotNull Color getDefaultBackground() {
return tuneSaturationEspeciallyGrey(super.getDefaultBackground(), 1, mySaturationFactor);
}
@Override
public @NotNull Color getDefaultForeground() {
return tuneSaturationEspeciallyGrey(super.getDefaultForeground(), 1, mySaturationFactor);
}
@Override
public @Nullable Color getColor(ColorKey key) {
Color color = super.getColor(key);
return color != null ? tuneSaturationEspeciallyGrey(color, 1, mySaturationFactor) : null;
}
@Override
public void setColor(ColorKey key, @Nullable Color color) {
super.setColor(key, color != null ? tuneSaturationEspeciallyGrey(color, 1, mySaturationFactor) : null);
}
}
private static final class SimpleHtmlSyntaxInfoReader extends HtmlSyntaxInfoReader {
private SimpleHtmlSyntaxInfoReader(SyntaxInfo info) {
super(info, 2);
@@ -506,7 +506,11 @@ checkbox.left.toolwindow.layout=Side-by-side layout on the left
checkbox.right.toolwindow.layout=Side-by-side layout on the right
checkbox.show.editor.preview.popup=Show code lens on scrollbar hover
checkbox.show.rendered.doc.comments=Render documentation comments
group.documentation.components=Documentation Components
checkbox.enable.doc.syntax.highlighting=Enable code highlighting in documentation components
checkbox.enable.doc.syntax.highlighting.of.inline.code.blocks=Highlight inline code blocks
checkbox.enable.doc.syntax.highlighting.of.links=Highlight links
spinner.doc.syntax.highlighting.saturation=Highlighting saturation:
checkbox.also.in.reader.mode=Also in <hyperlink>Reader mode</hyperlink>
checkbox.smooth.scrolling=Smooth scrolling
checkbox.smooth.scrolling.description=When using the mouse wheel/touchpad, the entire interface will scroll smoothly instead of line by line
@@ -7,6 +7,7 @@ import com.intellij.lang.Language;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.*;
import com.intellij.openapi.diagnostic.Checks;
import com.intellij.openapi.editor.actions.CaretStopOptions;
import com.intellij.openapi.editor.impl.softwrap.SoftWrapAppliancePlaces;
import com.intellij.openapi.util.Disposer;
@@ -14,6 +15,7 @@ import com.intellij.openapi.util.registry.Registry;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.serviceContainer.NonInjectable;
import com.intellij.ui.breadcrumbs.BreadcrumbsProvider;
import com.intellij.util.MathUtil;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.intellij.lang.annotations.MagicConstant;
import org.jetbrains.annotations.ApiStatus;
@@ -69,6 +71,9 @@ public class EditorSettingsExternalizable implements PersistentStateComponent<Ed
public boolean SHOW_BREADCRUMBS = true;
public boolean ENABLE_RENDERED_DOC = false;
public boolean ENABLE_DOC_SYNTAX_HIGHLIGHTING = true;
public boolean ENABLE_DOC_SYNTAX_HIGHLIGHTING_OF_INLINE_CODE_BLOCKS = true;
public boolean ENABLE_DOC_SYNTAX_HIGHLIGHTING_OF_LINKS = true;
public int DOC_SYNTAX_HIGHLIGHTING_SATURATION = 65;
public boolean SMART_HOME = true;
@@ -353,6 +358,31 @@ public class EditorSettingsExternalizable implements PersistentStateComponent<Ed
myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING = value;
}
public boolean isDocSyntaxHighlightingOfInlineCodeBlocksEnabled() {
return isDocSyntaxHighlightingEnabled() && myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING_OF_INLINE_CODE_BLOCKS;
}
public void setDocSyntaxHighlightingOfInlineCodeBlocksEnabled(boolean value) {
myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING_OF_INLINE_CODE_BLOCKS = value;
}
public boolean isDocSyntaxHighlightingOfLinksEnabled() {
return isDocSyntaxHighlightingEnabled() && myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING_OF_LINKS;
}
public void setDocSyntaxHighlightingOfLinksEnabled(boolean value) {
myOptions.ENABLE_DOC_SYNTAX_HIGHLIGHTING_OF_LINKS = value;
}
public int getDocSyntaxHighlightingSaturation() {
return myOptions.DOC_SYNTAX_HIGHLIGHTING_SATURATION;
}
public void setDocSyntaxHighlightingSaturation(int value) {
Checks.require(0 <= value && value <= 100);
myOptions.DOC_SYNTAX_HIGHLIGHTING_SATURATION = value;
}
public boolean isBlockCursor() {
return myOptions.IS_BLOCK_CURSOR;
}
@@ -1,6 +1,7 @@
// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.ui;
import com.intellij.openapi.diagnostic.Checks;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.util.MathUtil;
import com.intellij.util.NotNullProducer;
@@ -53,19 +54,58 @@ public final class ColorUtil {
}
@NotNull
public static Color hackBrightness(@NotNull Color color, int howMuch, float hackValue) {
return hackBrightness(color.getRed(), color.getGreen(), color.getBlue(), howMuch, hackValue);
public static Color tuneHue(@NotNull Color color, int howMuch, float hackValue) {
return tuneHSBComponent(color, 0, howMuch, hackValue);
}
@NotNull
public static Color hackBrightness(int r, int g, int b, int howMuch, float hackValue) {
final float[] hsb = Color.RGBtoHSB(r, g, b, null);
float brightness = hsb[2];
for (int i = 0; i < howMuch; i++) {
brightness = MathUtil.clamp(brightness * hackValue, 0, 1);
if (brightness == 0 || brightness == 1) break;
public static Color tuneSaturation(@NotNull Color color, int howMuch, float hackValue) {
return tuneHSBComponent(color, 1, howMuch, hackValue);
}
/**
* All grey tones (including black) have 0 saturation so its saturation won't change.
* That is why we handle such tones in a special why. Suppose we want to decrease saturation, then:
* <ul>
* <li>For black tones we will increase brightness, making it more grey-ish.</li>
* <li>For white tones we will decrease brightness, making it more grey-ish.</li>
* <li>For remaining grey tones we will do nothing.</li>
* </ul>
*/
@NotNull
public static Color tuneSaturationEspeciallyGrey(@NotNull Color color, int howMuch, float hackValue) {
if (color.getRed() == color.getBlue() && color.getBlue() == color.getGreen()) {
return color.getGreen() <= 64 ? shiftHSBComponent(color, 2, howMuch * (1 - hackValue) / 1.5f) :
color.getGreen() >= 192 ? shiftHSBComponent(color, 2, howMuch * (hackValue - 1) / 1.5f) :
color;
}
return Color.getHSBColor(hsb[0], hsb[1], brightness);
return tuneHSBComponent(color, 1, howMuch, hackValue);
}
@NotNull
public static Color hackBrightness(@NotNull Color color, int howMuch, float hackValue) {
return tuneHSBComponent(color, 2, howMuch, hackValue);
}
@NotNull
private static Color tuneHSBComponent(@NotNull Color color, int componentIndex, int howMuch, float factor) {
Checks.checkIndex(componentIndex, 3);
float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
float component = hsb[componentIndex];
for (int i = 0; i < howMuch; i++) {
component = MathUtil.clamp(factor * component, 0, 1);
if (component == 0 || component == 1) break;
}
hsb[componentIndex] = component;
return Color.getHSBColor(hsb[0], hsb[1], hsb[2]);
}
@NotNull
private static Color shiftHSBComponent(@NotNull Color color, int componentIndex, float shift) {
Checks.checkIndex(componentIndex, 3);
float[] hsb = Color.RGBtoHSB(color.getRed(), color.getGreen(), color.getBlue(), null);
hsb[componentIndex] = MathUtil.clamp(hsb[componentIndex] + shift, 0, 1);
return Color.getHSBColor(hsb[0], hsb[1], hsb[2]);
}
@NotNull
@@ -123,10 +163,10 @@ public final class ColorUtil {
@NotNull
public static Color withPreAlpha(@NotNull Color c, double a) {
float [] rgba = new float[4];
float[] rgba = new float[4];
rgba = withAlpha(c, a).getRGBComponents(rgba);
return new Color(rgba[0]*rgba[3], rgba[1]*rgba[3], rgba[2]*rgba[3], 1.0f);
return new Color(rgba[0] * rgba[3], rgba[1] * rgba[3], rgba[2] * rgba[3], 1.0f);
}
@NotNull
@@ -148,7 +188,7 @@ public final class ColorUtil {
final String B = Integer.toHexString(c.getBlue());
final String rgbHex = (R.length() < 2 ? "0" : "") + R + (G.length() < 2 ? "0" : "") + G + (B.length() < 2 ? "0" : "") + B;
if (!withAlpha){
if (!withAlpha) {
return rgbHex;
}
@@ -158,7 +198,7 @@ public final class ColorUtil {
@NotNull
public static @NlsSafe String toHtmlColor(@NotNull final Color c) {
return "#"+toHex(c);
return "#" + toHex(c);
}
/**
@@ -197,6 +237,7 @@ public final class ColorUtil {
/**
* Contrast ratios can range from 1 to 21 (commonly written 1:1 to 21:1).
* Text foreground and background colors shall have contrast ration of at least 4.5:1, large-scale text - of at least 3:1.
*
* @see <a href="https://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef">W3C contrast ratio definition<a/>
*/
public static double getContrast(@NotNull Color c1, @NotNull Color c2) {
@@ -4,6 +4,7 @@ package org.jetbrains.plugins.groovy.lang.documentation;
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory;
import com.intellij.ide.highlighter.JavaHighlightingColors;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable;
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiAnnotation;
@@ -132,6 +133,10 @@ public final class GroovyPresentationUtil {
return builder.toString();
}
private static float getHighlightingSaturation() {
return EditorSettingsExternalizable.getInstance().getDocSyntaxHighlightingSaturation() * 0.01f;
}
private static @NotNull StringBuilder appendStyledSpan(
boolean doHighlighting,
@NotNull StringBuilder buffer,
@@ -139,7 +144,7 @@ public final class GroovyPresentationUtil {
@Nullable String value
) {
if (doHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributesKey, value);
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributesKey, value, getHighlightingSaturation());
}
else {
buffer.append(value);
@@ -11,8 +11,21 @@ import static org.jetbrains.plugins.groovy.lang.groovydoc.lexer.GroovyDocTokenTy
public class GroovyDocInfoGenerator extends JavaDocInfoGenerator {
public GroovyDocInfoGenerator(PsiElement element, boolean isGenerationForRenderedDoc, boolean doSyntaxHighlighting) {
super(element.getProject(), element, GroovyDocHighlightingManager.getInstance(), isGenerationForRenderedDoc, doSyntaxHighlighting);
public GroovyDocInfoGenerator(
PsiElement element,
boolean isGenerationForRenderedDoc,
boolean doSyntaxHighlighting,
boolean doHighlightInlineCodeBlocks,
boolean doHighlightLinks
) {
super(
element.getProject(),
element,
GroovyDocHighlightingManager.getInstance(),
isGenerationForRenderedDoc,
doSyntaxHighlighting,
doHighlightInlineCodeBlocks,
doHighlightLinks);
}
@Override
@@ -77,7 +77,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@Nullable String value
) {
if (doSyntaxHighlighting()) {
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value);
HtmlSyntaxInfoUtil.appendStyledSpan(buffer, attributes, value, getHighlightingSaturation());
}
else {
buffer.append(value);
@@ -101,6 +101,18 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
return EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled();
}
private static boolean doHighlightingOfInlineCodeBlocksEnabled() {
return EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfInlineCodeBlocksEnabled();
}
private static boolean doHighlightingOfLinksEnabled() {
return EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfLinksEnabled();
}
private static float getHighlightingSaturation() {
return EditorSettingsExternalizable.getInstance().getDocSyntaxHighlightingSaturation() * 0.01f;
}
private static PsiSubstitutor calcSubstitutor(PsiElement originalElement) {
PsiSubstitutor substitutor = PsiSubstitutor.EMPTY;
if (originalElement instanceof GrReferenceExpression) {
@@ -297,7 +309,11 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
generateTraitType(buffer, ((GrTraitType)type), context, isRendered);
}
else if (type != null) {
JavaDocInfoGeneratorFactory.create(context.getProject(), null, GroovyDocHighlightingManager.getInstance(), isRendered, doSyntaxHighlighting())
JavaDocInfoGeneratorFactory.getBuilder(context.getProject())
.setHighlightingManager(GroovyDocHighlightingManager.getInstance())
.setIsGenerationForRenderedDoc(isRendered)
.setDoSyntaxHighlighting(doSyntaxHighlighting())
.create()
.generateType(buffer, type, context);
}
else {
@@ -405,8 +421,17 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
return standard;
}
private static GroovyDocInfoGenerator getDocInfoGenerator(@NotNull PsiElement element, boolean isGenerationForRenderedDoc) {
return new GroovyDocInfoGenerator(
element,
isGenerationForRenderedDoc,
doSyntaxHighlighting(),
doHighlightingOfInlineCodeBlocksEnabled(),
doHighlightingOfLinksEnabled());
}
protected static @Nls @Nullable String generateExternalJavaDoc(@NotNull PsiElement element) {
JavaDocInfoGenerator generator = new GroovyDocInfoGenerator(element, false, doSyntaxHighlighting());
JavaDocInfoGenerator generator = getDocInfoGenerator(element, false);
return JavaDocumentationProvider.generateExternalJavadoc(element, generator);
}
@@ -489,7 +514,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
}
private static void appendElementLink(@NonNls StringBuilder sb, PsiElement element, String label) {
new GroovyDocInfoGenerator(element, false, doSyntaxHighlighting())
getDocInfoGenerator(element, false)
.appendMaybeUnresolvedLink(sb, element, label, element.getProject(), false);
}
@@ -607,8 +632,7 @@ public class GroovyDocumentationProvider implements CodeDocumentationProvider, E
@Override
public @Nls @Nullable String generateRenderedDoc(@NotNull PsiDocCommentBase comment) {
PsiElement owner = comment.getOwner();
String html = new GroovyDocInfoGenerator(owner == null ? comment : owner, true, doSyntaxHighlighting())
.generateRenderedDocInfo();
String html = getDocInfoGenerator(owner == null ? comment : owner, true).generateRenderedDocInfo();
return JavaDocExternalFilter.filterInternalDocInfo(html);
}
}
@@ -20,7 +20,7 @@ new Bar<String>().f<caret>oo();
'''
def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset)
assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) ==
"""<span style="color:#000000;">Bar</span>\n<a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">foo</span><span style="">(</span><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a> <span style="">param</span><span style="">)</span>"""
"""<span style="color:#000000;">Bar</span>\n<a href="psi_element://java.util.List"><code><span style="color:#0000ff;">List</span></code></a><span style="">&lt;</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a><span style="">&gt;</span> <span style="color:#000000;">foo</span><span style="">(</span><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a> <span style="">param</span><span style="">)</span>"""
}
void testGenericField() {
@@ -30,7 +30,7 @@ new Bar<Integer>().fi<caret>eld
'''
def ref = myFixture.file.findReferenceAt(myFixture.editor.caretModel.offset)
assert CtrlMouseHandler.getInfo(ref.resolve(), ref.element) ==
"""<span style="color:#000000;">Bar</span>\n<a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a> <span style="color:#000000;">getField</span><span style="">(</span><span style="">)</span>"""
"""<span style="color:#000000;">Bar</span>\n<a href="psi_element://java.lang.Integer"><code><span style="color:#0000ff;">Integer</span></code></a> <span style="color:#000000;">getField</span><span style="">(</span><span style="">)</span>"""
}
void testLink() {
@@ -45,7 +45,7 @@ class Gr {
new Gr().fo<caret>o()
''', '''\
<div class='definition'><pre><span style="color:#000043;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
Use <a href="psi_element://Gr#bar()"><code><span style="color:#000000;">bar</span><span style="">()</span></code></a> from class <a href="psi_element://Gr"><code><span style="color:#000000;">Gr</span></code></a> instead
Use <a href="psi_element://Gr#bar()"><code><span style="color:#0000ff;">bar</span><span style="">()</span></code></a> from class <a href="psi_element://Gr"><code><span style="color:#0000ff;">Gr</span></code></a> instead
</div><table class='sections'></table>'''
}
@@ -57,8 +57,8 @@ new Gr().fo<caret>o()
def docs() {}
<caret>docs()
''', '''<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
check this out <a href="psi_element://java.lang.CharSequence"><code><span style="color:#000000;">character sequences</span></code></a>
''', '''<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
check this out <a href="psi_element://java.lang.CharSequence"><code><span style="color:#0000ff;">character sequences</span></code></a>
</div><table class='sections'></table>'''
}
@@ -80,11 +80,11 @@ class Main {
Main.<caret>docs()
''', '''\
<div class='definition'><pre><span style="color:#000043;font-weight:bold;">static</span>&nbsp;<span style="color:#000043;font-weight:bold;">void</span>&nbsp;<span style="color:#000000;">docs</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
Link 1: <a href="psi_element://Main#foo(java.lang.String[])"><code><span style="color:#000000;">foo</span><span style="">(String[])</span></code></a>
Link 1: <a href="psi_element://Main#foo(java.lang.String[])"><code><span style="color:#0000ff;">foo</span><span style="">(String[])</span></code></a>
<p>
Link 2: <a href="psi_element://Main#bar(java.lang.String[])"><code><span style="color:#000000;">bar</span><span style="">(String[])</span></code></a>
Link 2: <a href="psi_element://Main#bar(java.lang.String[])"><code><span style="color:#0000ff;">bar</span><span style="">(String[])</span></code></a>
<p>
Link 3: <a href="psi_element://Main#bar(java.lang.String[], java.lang.Integer)"><code><span style="color:#000000;">bar</span><span style="">(String[],&#32;Integer)</span></code></a>
Link 3: <a href="psi_element://Main#bar(java.lang.String[], java.lang.Integer)"><code><span style="color:#0000ff;">bar</span><span style="">(String[],&#32;Integer)</span></code></a>
</div><table class='sections'></table>\
'''
}
@@ -94,7 +94,7 @@ Main.<caret>docs()
def aa = 1
a<caret>a
''', '''\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a> <span style="color:#000000;">aa</span></pre></div><table class='sections'></table><p style='padding-left:8px;'><span style="color: #909090">[Inferred type]</span> <a href="psi_element://java.lang.Integer"><code><span style="color:#000000;">Integer</span></code></a>'''
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a> <span style="color:#000000;">aa</span></pre></div><table class='sections'></table><p style='padding-left:8px;'><span style="color: #909090">[Inferred type]</span> <a href="psi_element://java.lang.Integer"><code><span style="color:#0000ff;">Integer</span></code></a>'''
}
void 'test implicit closure parameter'() {
@@ -102,7 +102,7 @@ a<caret>a
List<String> ss = []
ss.collect { i<caret>t }
''', '''\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a> <span style="color:#000000;">it</span></pre></div><table class='sections'></table><p style='padding-left:8px;'><span style="color: #909090">[Inferred type]</span> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>'''
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a> <span style="color:#000000;">it</span></pre></div><table class='sections'></table><p style='padding-left:8px;'><span style="color: #909090">[Inferred type]</span> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>'''
}
void 'test code tag'() {
@@ -117,7 +117,7 @@ class Foo {
}
new Foo().<caret>foo()
''', '''\
<div class='definition'><pre><a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
<div class='definition'><pre><a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><div class='content'>
May return <code><span style=""><span style="color:#000043;font-weight:bold;">null</span></span></code>
</div><table class='sections'></table>\
'''
@@ -132,7 +132,7 @@ def foo() {}
f<caret>oo()""",
"""\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><code> lorem ipsum </code></td></table>\
<div class='definition'><pre><a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><p><code> lorem ipsum </code></td></table>\
"""
}
@@ -8,18 +8,17 @@ import com.intellij.codeInsight.javadoc.JavaDocExternalFilter
import com.intellij.codeInsight.javadoc.JavaDocInfoGeneratorFactory
import com.intellij.lang.documentation.AbstractDocumentationProvider
import com.intellij.lang.documentation.DocumentationMarkup.*
import com.intellij.lang.documentation.DocumentationProviderEx
import com.intellij.lang.java.JavaDocumentationProvider
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.openapi.editor.Editor
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.NlsSafe
import com.intellij.openapi.util.text.HtmlChunk
import com.intellij.psi.*
import com.intellij.psi.impl.compiled.ClsMethodImpl
import com.intellij.psi.util.PsiTreeUtil
@@ -65,7 +64,6 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.resolve.source.getPsi
import org.jetbrains.kotlin.utils.addToStdlib.constant
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import java.util.function.Consumer
class HtmlClassifierNamePolicy(val base: ClassifierNamePolicy) : ClassifierNamePolicy {
@@ -229,10 +227,13 @@ class KotlinDocumentationProvider : AbstractDocumentationProvider() {
private data class TextAttributesAdapter(val attributes: TextAttributes) :
KotlinIdeDescriptorRendererHighlightingManager.Companion.Attributes
private fun createHighlightingManager(project: Project?) =
object : KotlinIdeDescriptorRendererHighlightingManager<TextAttributesAdapter> {
private fun createHighlightingManager(project: Project?): KotlinIdeDescriptorRendererHighlightingManager<KotlinIdeDescriptorRendererHighlightingManager.Companion.Attributes> {
if (!doSyntaxHighlighting) {
return KotlinIdeDescriptorRendererHighlightingManager.NO_HIGHLIGHTING
}
return object : KotlinIdeDescriptorRendererHighlightingManager<TextAttributesAdapter> {
override fun StringBuilder.appendHighlighted(value: String, attributes: TextAttributesAdapter) {
HtmlSyntaxInfoUtil.appendStyledSpan(this, attributes.attributes, value)
HtmlSyntaxInfoUtil.appendStyledSpan(this, attributes.attributes, value, highlightingSaturation)
}
override fun StringBuilder.appendCodeSnippetHighlightedByLexer(codeSnippet: String) {
@@ -240,7 +241,8 @@ class KotlinDocumentationProvider : AbstractDocumentationProvider() {
this,
project!!,
KotlinLanguage.INSTANCE,
codeSnippet
codeSnippet,
highlightingSaturation
)
}
@@ -278,6 +280,13 @@ class KotlinDocumentationProvider : AbstractDocumentationProvider() {
override val asFunCall get() = resolveKey(KotlinHighlightingColors.FUNCTION_CALL)
}
.eraseTypeParameter()
}
private val doSyntaxHighlighting : Boolean get() =
EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled
private val highlightingSaturation : Float get() =
EditorSettingsExternalizable.getInstance().docSyntaxHighlightingSaturation * 0.01f
private fun StringBuilder.appendHighlighted(
value: String,
@@ -295,16 +304,6 @@ class KotlinDocumentationProvider : AbstractDocumentationProvider() {
}
}
private fun highlight(
value: String,
attributesBuilder: KotlinIdeDescriptorRendererHighlightingManager<KotlinIdeDescriptorRendererHighlightingManager.Companion.Attributes>.()
-> KotlinIdeDescriptorRendererHighlightingManager.Companion.Attributes
): String {
return with(createHighlightingManager(project = null)) {
buildString { appendHighlighted(value, attributesBuilder()) }
}
}
internal fun StringBuilder.renderKDoc(
contentTag: KDocTag,
sections: List<KDocSection> = if (contentTag is KDocSection) listOf(contentTag) else emptyList()
@@ -6,12 +6,17 @@ import com.intellij.codeInsight.documentation.DocumentationManagerUtil
import com.intellij.lang.Language
import com.intellij.lang.documentation.DocumentationMarkup.*
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors
import com.intellij.openapi.editor.HighlighterColors
import com.intellij.openapi.editor.colors.CodeInsightColors
import com.intellij.openapi.editor.colors.EditorColorsManager
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.editor.ex.EditorSettingsExternalizable
import com.intellij.openapi.editor.markup.TextAttributes
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.text.StringUtil
import com.intellij.psi.*
import com.intellij.psi.PsiElement
import org.intellij.markdown.IElementType
import org.intellij.markdown.MarkdownElementTypes
import org.intellij.markdown.MarkdownTokenTypes
@@ -30,12 +35,24 @@ import org.jetbrains.kotlin.kdoc.psi.impl.KDocLink
import org.jetbrains.kotlin.kdoc.psi.impl.KDocName
import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection
import org.jetbrains.kotlin.kdoc.psi.impl.KDocTag
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.KtBlockExpression
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType
import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType
object KDocRenderer {
private val doSyntaxHighlighting: Boolean get() = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled
private val doHighlightInlineCodeBlocks: Boolean
get() = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfInlineCodeBlocksEnabled
private val doHighlightLinks: Boolean
get() = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingOfLinksEnabled
private val highlightingSaturation: Float get() = EditorSettingsExternalizable.getInstance().docSyntaxHighlightingSaturation * 0.01F
fun StringBuilder.appendKDocContent(docComment: KDocTag): StringBuilder =
append(markdownToHtml(docComment, allowSingleParagraph = true))
@@ -74,19 +91,29 @@ object KDocRenderer {
}
private fun StringBuilder.appendHyperlink(kDocLink: KDocLink) {
DocumentationManagerUtil.createHyperlink(
this,
kDocLink.getLinkText(),
highlightQualifiedName(kDocLink.getLinkText(), getTargetLinkElementAttributes(kDocLink.getTargetElement())),
false,
true
)
if (DumbService.isDumb(kDocLink.project)) {
append(kDocLink.getLinkText())
} else {
DocumentationManagerUtil.createHyperlink(
this,
kDocLink.getLinkText(),
highlightQualifiedName(kDocLink.getLinkText(), getTargetLinkElementAttributes(kDocLink.getTargetElement())),
false,
true
)
}
}
private fun getTargetLinkElementAttributes(element: PsiElement?) =
element?.let { textAttributesKeyForKtElement(it) } ?: DefaultLanguageHighlighterColors.IDENTIFIER
private fun getTargetLinkElementAttributes(element: PsiElement?): TextAttributes {
val key = element?.let { textAttributesKeyForKtElement(it) } ?: CodeInsightColors.HYPERLINK_ATTRIBUTES
return getTargetLinkElementAttributes(key)
}
private fun highlightQualifiedName(qualifiedName: String, lastSegmentAttributes: TextAttributesKey): String {
private fun getTargetLinkElementAttributes(key: TextAttributesKey): TextAttributes {
return tuneAttributesForLink(EditorColorsManager.getInstance().globalScheme.getAttributes(key))
}
private fun highlightQualifiedName(qualifiedName: String, lastSegmentAttributes: TextAttributes): String {
val linkComponents = qualifiedName.split(".")
val qualifiedPath = linkComponents.subList(0, linkComponents.lastIndex)
val elementName = linkComponents.last()
@@ -96,10 +123,10 @@ object KDocRenderer {
pathSegment.first().isLowerCase() -> DefaultLanguageHighlighterColors.IDENTIFIER
else -> KotlinHighlightingColors.CLASS
}
appendStyledSpan(segmentAttributes, pathSegment)
appendStyledSpan(KotlinHighlightingColors.DOT, ".")
appendStyledSpan(doHighlightLinks, segmentAttributes, pathSegment)
appendStyledSpan(doHighlightLinks, KotlinHighlightingColors.DOT, ".")
}
appendStyledSpan(lastSegmentAttributes, elementName)
appendStyledSpan(doHighlightLinks, lastSegmentAttributes, elementName)
}
}
@@ -139,16 +166,19 @@ object KDocRenderer {
it.getSubjectLink()?.let { subjectLink ->
append("<p>")
this@appendSamplesList.appendHyperlink(subjectLink)
val target = subjectLink.getTargetElement()
wrapTag("pre") {
wrapTag("code") {
val codeSnippet = when (target) {
null -> "// " + KotlinBundle.message("kdoc.comment.unresolved")
else -> trimCommonIndent(target.extractExampleText()).htmlEscape()
if (DumbService.isDumb(subjectLink.project)) {
append("// " + KotlinBundle.message("kdoc.comment.unresolved"))
} else {
val codeSnippet = when (val target = subjectLink.getTargetElement()) {
null -> "// " + KotlinBundle.message("kdoc.comment.unresolved")
else -> trimCommonIndent(target.extractExampleText()).htmlEscape()
}
this@appendSamplesList.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
doSyntaxHighlighting, subjectLink.project, KotlinLanguage.INSTANCE, codeSnippet
)
}
this@appendSamplesList.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
subjectLink.project, KotlinLanguage.INSTANCE, codeSnippet
)
}
}
}
@@ -187,7 +217,8 @@ object KDocRenderer {
val subjectName = getSubjectName()
if (subjectName != null) {
append("<p><code>")
val highlightedLinkLabel = highlightQualifiedName(subjectName, KotlinHighlightingColors.CLASS)
val highlightedLinkLabel =
highlightQualifiedName(subjectName, getTargetLinkElementAttributes(KotlinHighlightingColors.CLASS))
DocumentationManagerUtil.createHyperlink(this@appendSection, subjectName, highlightedLinkLabel, false, true)
append("</code>")
val exceptionDescription = markdownToHtml(this)
@@ -213,7 +244,7 @@ object KDocRenderer {
if (subjectName != null) {
append("<p><code>")
when (val link = it.getChildrenOfType<KDocLink>().firstOrNull()) {
null -> appendStyledSpan(titleAttributes, subjectName)
null -> appendStyledSpan(doHighlightLinks, titleAttributes, subjectName)
else -> appendHyperlink(link)
}
append("</code>")
@@ -306,8 +337,13 @@ object KDocRenderer {
val startDelimiter = node.child(MarkdownTokenTypes.BACKTICK)?.text
if (startDelimiter != null) {
val text = node.text.substring(startDelimiter.length).removeSuffix(startDelimiter)
sb.append("<code>")
sb.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(comment.project, KotlinLanguage.INSTANCE, text)
sb.append("<code style='font-size:96%;'>")
sb.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
doHighlightInlineCodeBlocks,
comment.project,
KotlinLanguage.INSTANCE,
text
)
sb.append("</code>")
}
}
@@ -329,17 +365,21 @@ object KDocRenderer {
?.dropLastWhile { it.type == MarkdownTokenTypes.RBRACKET }
if (linkLabelContent != null) {
val label = linkLabelContent.joinToString(separator = "") { it.text }
val resolvedLinkElement = comment.findDescendantOfType<KDocName> { it.text == label }
?.mainReference
?.resolve()
val linkText = node.child(MarkdownElementTypes.LINK_TEXT)?.toHtml() ?: label
DocumentationManagerUtil.createHyperlink(
sb,
label,
highlightQualifiedName(linkText, getTargetLinkElementAttributes(resolvedLinkElement)),
false,
true
)
if (DumbService.isDumb(comment.project)) {
sb.append(linkText)
} else {
val resolvedLinkElement = comment.findDescendantOfType<KDocName> { it.text == label }
?.mainReference
?.resolve()
DocumentationManagerUtil.createHyperlink(
sb,
label,
highlightQualifiedName(linkText, getTargetLinkElementAttributes(resolvedLinkElement)),
false,
true
)
}
} else {
sb.append(node.text)
}
@@ -369,6 +409,7 @@ object KDocRenderer {
MarkdownTokenTypes.CODE_LINE,
MarkdownTokenTypes.CODE_FENCE_CONTENT -> {
sb.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
doSyntaxHighlighting,
comment.project,
guessLanguage(currentCodeFenceLang) ?: KotlinLanguage.INSTANCE,
nodeText
@@ -474,14 +515,18 @@ object KDocRenderer {
}
}
private val doSyntaxHighlighting: Boolean get() = EditorSettingsExternalizable.getInstance().isDocSyntaxHighlightingEnabled
private fun StringBuilder.appendStyledSpan(doHighlighting: Boolean, attributesKey: TextAttributesKey, value: String?): StringBuilder {
if (doHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(this, attributesKey, value, highlightingSaturation)
} else {
append(value)
}
return this
}
private fun StringBuilder.appendStyledSpan(
attributesKey: TextAttributesKey,
value: String?
): StringBuilder {
if (doSyntaxHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(this, attributesKey, value)
private fun StringBuilder.appendStyledSpan(doHighlighting: Boolean, attributes: TextAttributes, value: String?): StringBuilder {
if (doHighlighting) {
HtmlSyntaxInfoUtil.appendStyledSpan(this, attributes, value, highlightingSaturation)
} else {
append(value)
}
@@ -489,18 +534,42 @@ object KDocRenderer {
}
private fun StringBuilder.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
doHighlighting: Boolean,
project: Project,
language: Language,
codeSnippet: String?
codeSnippet: String
): StringBuilder {
if (doSyntaxHighlighting) {
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(this, project, language, codeSnippet, false)
val codeSnippetBuilder = StringBuilder()
if (doHighlighting) { // highlight code by lexer
HtmlSyntaxInfoUtil.appendHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
codeSnippetBuilder, project, language, codeSnippet, false, highlightingSaturation
)
} else {
append(codeSnippet)
codeSnippetBuilder.append(StringUtil.escapeXmlEntities(codeSnippet))
}
// set code text color as editor default code color instead of doc component text color
val codeAttributes = EditorColorsManager.getInstance().globalScheme.getAttributes(HighlighterColors.TEXT).clone()
codeAttributes.backgroundColor = null
appendStyledSpan(doHighlighting, codeAttributes, codeSnippetBuilder.toString())
return this
}
/**
* If highlighted links has the same color as highlighted inline code blocks they will be indistinguishable.
* In this case we should change link color to standard hyperlink color which we believe is apriori different.
*/
private fun tuneAttributesForLink(attributes: TextAttributes): TextAttributes {
val globalScheme = EditorColorsManager.getInstance().globalScheme
if (attributes.foregroundColor == globalScheme.getAttributes(HighlighterColors.TEXT).foregroundColor
|| attributes.foregroundColor == globalScheme.getAttributes(DefaultLanguageHighlighterColors.IDENTIFIER).foregroundColor
) {
val tuned = attributes.clone()
tuned.foregroundColor = globalScheme.getAttributes(CodeInsightColors.HYPERLINK_ATTRIBUTES).foregroundColor
return tuned
}
return attributes
}
private fun guessLanguage(name: String): Language? {
val lower = StringUtil.toLowerCase(name)
return Language.findLanguageByID(lower)
@@ -31,8 +31,8 @@ class JavadocNavigationTest() : KotlinLightCodeInsightFixtureTestCase() {
val docInfo = JavaDocInfoGenerator(project, psiClass).generateDocInfo(emptyList())
Assert.assertEquals(
"""<div class='definition'><pre><span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">ExtMethod</span>
<span style="color:#000080;font-weight:bold;">extends</span> <a href="psi_element://Super"><code><span style="color:#000000;">Super</span></code></a></pre></div><div class='content'>
<a href="psi_element://Project#guessDir()"><code><span style="color:#000000;">directory</span></code></a>
<span style="color:#000080;font-weight:bold;">extends</span> <a href="psi_element://Super"><code><span style="color:#0000ff;">Super</span></code></a></pre></div><div class='content'>
<a href="psi_element://Project#guessDir()"><code><span style="color:#0000ff;">directory</span></code></a>
</div><table class='sections'><p></table>""", docInfo)
}
@@ -54,4 +54,4 @@ class klass<T, X>(val name: String, val name2: String) {
}
//RENDER: <div class='content'><p>This class has no useful logic; it's just a documentation example.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://T"><code style='font-size:96%;'><span style="color:#20999d;">T</span></code></a></code> - the type of a member in this class.<p><code><a href="psi_element://X"><code style='font-size:96%;'><span style="color:#20999d;">X</span></code></a></code> - the type of a member in this class.</td><tr><td valign='top' class='section'><p>Properties:</td><td valign='top'><p><code><a href="psi_element://name"><code style='font-size:96%;'><span style="color:#660e7a;font-weight:bold;">name</span></code></a></code> - is blablabla for name<p><code><a href="psi_element://name2"><code style='font-size:96%;'><span style="color:#660e7a;font-weight:bold;">name2</span></code></a></code> - is blublublu for name2</td><tr><td valign='top' class='section'><p>Constructor:</td><td valign='top'>primary ctor for it</td></table>
//RENDER: <div class='content'><p>This method has no useful logic; it's just a documentation example.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://M"><code style='font-size:96%;'><span style="color:#20999d;">M</span></code></a></code> - the type of a member in this method.<p><code><a href="psi_element://K"><code style='font-size:96%;'><span style="color:#20999d;">K</span></code></a></code> - the type of a member in this group.</td><tr><td valign='top' class='section'><p>Properties:</td><td valign='top'><p><code><a href="psi_element://name"><code style='font-size:96%;'><span style="">name</span></code></a></code> - is blablabla for name<p><code><a href="psi_element://name2"><code style='font-size:96%;'><span style="">name2</span></code></a></code> - blublublu for name2</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><a href="psi_element://returnMethod"><code style='font-size:96%;'><span style="color:#000000;">returnMethod</span></code></a> if Duck is Dark</td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><code><a href="psi_element://IndexOutOfBoundsException"><code style='font-size:96%;'><span style="color:#000000;">IndexOutOfBoundsException</span></code></a></code> - if something wrong<p><code><a href="psi_element://ArrayIndexOutOfBoundsException"><code style='font-size:96%;'><span style="color:#000000;">ArrayIndexOutOfBoundsException</span></code></a></code> - if else something wrong<p><code><a href="psi_element://java.io.IOException"><code style='font-size:96%;'><span style="color:#000000;">java</span><span style="">.</span><span style="color:#000000;">io</span><span style="">.</span><span style="color:#000000;">IOException</span></code></a></code> - if something else else wrong</td><tr><td valign='top' class='section'><p>Author:</td><td valign='top'>DarkWing Duck</td><tr><td valign='top' class='section'><p>Suppress:</td><td valign='top'>something to suppress</td><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><a href="psi_element://method2"><code style='font-size:96%;'><span style="color:#000000;">method2</span></code></a>,<br><a href="psi_element://method3"><code style='font-size:96%;'><span style="color:#000000;">method3</span></code></a></td><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://sample"><code style='font-size:96%;'><span style="color:#000000;">sample</span></code></a><pre><code><br><span style="color:#808080;font-style:italic;">//this&#32;is&#32;the&#32;sample<br></span></code></pre><p><a href="psi_element://sample2"><code style='font-size:96%;'><span style="color:#000000;">sample2</span></code></a><pre><code><br><span style="color:#808080;font-style:italic;">//this&#32;is&#32;the&#32;sample2<br></span></code></pre></td></table>
//RENDER: <div class='content'><p>This method has no useful logic; it's just a documentation example.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://M"><code style='font-size:96%;'><span style="color:#20999d;">M</span></code></a></code> - the type of a member in this method.<p><code><a href="psi_element://K"><code style='font-size:96%;'><span style="color:#20999d;">K</span></code></a></code> - the type of a member in this group.</td><tr><td valign='top' class='section'><p>Properties:</td><td valign='top'><p><code><a href="psi_element://name"><code style='font-size:96%;'><span style="color:#0000ff;">name</span></code></a></code> - is blablabla for name<p><code><a href="psi_element://name2"><code style='font-size:96%;'><span style="color:#0000ff;">name2</span></code></a></code> - blublublu for name2</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'><a href="psi_element://returnMethod"><code style='font-size:96%;'><span style="color:#0000ff;">returnMethod</span></code></a> if Duck is Dark</td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><code><a href="psi_element://IndexOutOfBoundsException"><code style='font-size:96%;'><span style="color:#0000ff;">IndexOutOfBoundsException</span></code></a></code> - if something wrong<p><code><a href="psi_element://ArrayIndexOutOfBoundsException"><code style='font-size:96%;'><span style="color:#0000ff;">ArrayIndexOutOfBoundsException</span></code></a></code> - if else something wrong<p><code><a href="psi_element://java.io.IOException"><code style='font-size:96%;'><span style="color:#000000;">java</span><span style="">.</span><span style="color:#000000;">io</span><span style="">.</span><span style="color:#0000ff;">IOException</span></code></a></code> - if something else else wrong</td><tr><td valign='top' class='section'><p>Author:</td><td valign='top'>DarkWing Duck</td><tr><td valign='top' class='section'><p>Suppress:</td><td valign='top'>something to suppress</td><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><a href="psi_element://method2"><code style='font-size:96%;'><span style="color:#0000ff;">method2</span></code></a>,<br><a href="psi_element://method3"><code style='font-size:96%;'><span style="color:#0000ff;">method3</span></code></a></td><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://sample"><code style='font-size:96%;'><span style="color:#0000ff;">sample</span></code></a><pre><code><span style=""><br><span style="color:#808080;font-style:italic;">//this&#32;is&#32;the&#32;sample<br></span></span></code></pre><p><a href="psi_element://sample2"><code style='font-size:96%;'><span style="color:#0000ff;">sample2</span></code></a><pre><code><span style=""><br><span style="color:#808080;font-style:italic;">//this&#32;is&#32;the&#32;sample2<br></span></span></code></pre></td></table>
@@ -10,5 +10,5 @@ class <caret>A<T>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">final</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">A</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span></pre></div><div class='content'><p>Code block:</p>
//INFO: <pre><code>
//INFO: <span style="">A&lt;T&gt;</span>
//INFO: </code></pre><p>Code span: <code><span style="">&lt;T&gt;</span></code> is type parameter</p></div><table class='sections'></table>
//INFO: <span style=""><span style="">A&lt;T&gt;</span></span>
//INFO: </code></pre><p>Code span: <code style='font-size:96%;'><span style=""><span style="">&lt;T&gt;</span></span></code> is type parameter</p></div><table class='sections'></table>
@@ -13,10 +13,10 @@
*/
class <caret>A
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">final</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">A</span></pre></div><div class='content'><pre><code>&#32;&#32;&#32;&#32;<span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">a&#32;=&#32;A()</span>
//INFO: &#32;&#32;&#32;&#32;<span style="">println(a)&#32;</span><span style="color:#808080;font-style:italic;">//&#32;comment</span></code></pre><pre><code>
//INFO: <span style="">&lt;fenced&gt;Code_block&lt;/fenced&gt;</span>
//INFO: </code></pre><pre><code>&#32;&#32;&#32;&#32;<span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">b&#32;=&#32;B()</span>
//INFO: &#32;&#32;&#32;&#32;<span style="">println(b)</span></code></pre><p>some text content</p>
//INFO: <pre><code>&#32;&#32;&#32;&#32;<span style="">Indented&#32;code&#32;block&#32;with&#32;tab</span>
//INFO: &#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;<span style="">Second&#32;line</span></code></pre></div><table class='sections'></table>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">final</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">A</span></pre></div><div class='content'><pre><code><span style="">&#32;&#32;&#32;&#32;<span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">a&#32;=&#32;A()</span></span>
//INFO: <span style="">&#32;&#32;&#32;&#32;<span style="">println(a)&#32;</span><span style="color:#808080;font-style:italic;">//&#32;comment</span></span></code></pre><pre><code>
//INFO: <span style=""><span style="">&lt;fenced&gt;Code_block&lt;/fenced&gt;</span></span>
//INFO: </code></pre><pre><code><span style="">&#32;&#32;&#32;&#32;<span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">b&#32;=&#32;B()</span></span>
//INFO: <span style="">&#32;&#32;&#32;&#32;<span style="">println(b)</span></span></code></pre><p>some text content</p>
//INFO: <pre><code><span style="">&#32;&#32;&#32;&#32;<span style="">Indented&#32;code&#32;block&#32;with&#32;tab</span></span>
//INFO: <span style="">&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;<span style="">Second&#32;line</span></span></code></pre></div><table class='sections'></table>
@@ -3,5 +3,5 @@ fun testing() {
}
//INFO: <div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
//INFO: <span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000000;">SomeClassWithParen</span><span style="">(</span><br> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">str</span><span style="">,</span>
//INFO: <span style="color:#000080;font-weight:bold;">public</span>&nbsp;<span style="color:#000000;">SomeClassWithParen</span><span style="">(</span><br> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="">str</span><span style="">,</span>
//INFO: <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">num</span><br><span style="">)</span></pre></div><table class='sections'><p><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i></td></table>
@@ -2,6 +2,6 @@ fun testing() {
<caret>SomeClass<List<String>>()
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">SomeClass</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.util.List"><code><span style="color:#000000;">List</span></code></a><span style="">&gt;</span></pre></div><div class='content'>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">class</span> <span style="color:#000000;">SomeClass</span><span style="">&lt;</span><span style="color:#20999d;">T</span><span style="color:#000080;font-weight:bold;"> extends </span><a href="psi_element://java.util.List"><code><span style="color:#0000ff;">List</span></code></a><span style="">&gt;</span></pre></div><div class='content'>
//INFO: Some Java Class
//INFO: </div><table class='sections'><p><tr><td valign='top' class='section'><p>Type parameters:</td><td valign='top'>&lt;<span style="color:#20999d;">T</span>&gt;</td></table>
@@ -4,6 +4,6 @@ fun ktTest() {
//INFO: <div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
//INFO: <i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.NotNull"><code><span style="color:#808000;">NotNull</span></code></a></i>&nbsp;
//INFO: <span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">param</span><br><span style="">)</span></pre></div><div class='content'>
//INFO: <span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="">param</span><br><span style="">)</span></pre></div><div class='content'>
//INFO: Java Method
//INFO: </div><table class='sections'><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i><br><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.NotNull"><span style="color:#808000;">org.jetbrains.annotations.NotNull</span></a></i></td></table>
@@ -4,7 +4,7 @@ fun ktTestWithParen() {
//INFO: <div class='definition'><pre><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><code><span style="color:#808000;">Contract</span></code></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_,&#32;_&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i>&nbsp;
//INFO: <i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.NotNull"><code><span style="color:#808000;">NotNull</span></code></a></i>&nbsp;
//INFO: <span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#000000;">Object</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <a href="psi_element://java.lang.String"><code><span style="color:#000000;">String</span></code></a>&nbsp;<span style="">str</span><span style="">,</span>
//INFO: <span style="color:#000080;font-weight:bold;">public static</span>&nbsp;<a href="psi_element://java.lang.Object"><code><span style="color:#0000ff;">Object</span></code></a><span style="">[]</span>&nbsp;<span style="color:#000000;">foo</span><span style="">(</span><br> <a href="psi_element://java.lang.String"><code><span style="color:#0000ff;">String</span></code></a>&nbsp;<span style="">str</span><span style="">,</span>
//INFO: <span style="color:#000080;font-weight:bold;">int</span>&nbsp;<span style="">num</span><br><span style="">)</span></pre></div><div class='content'>
//INFO: Java Method
//INFO: </div><table class='sections'><tr><td valign='top' class='section'><p><i>Inferred</i><br> annotations:</td><td valign='top'><p><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.Contract"><span style="color:#808000;">org.jetbrains.annotations.Contract</span></a><span style="">(</span><span style="">value</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"_,&#32;_&#32;-&gt;&#32;new"</span><span style="">,&nbsp;</span><span style="">pure</span><span style=""> = </span><span style="color:#000080;font-weight:bold;">true</span><span style="">)</span></i><br><i><span style="color:#808000;">@</span><a href="psi_element://org.jetbrains.annotations.NotNull"><span style="color:#808000;">org.jetbrains.annotations.NotNull</span></a></i></td></table>
@@ -4,4 +4,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">inline</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span> <span style="color:#000000;"><a href="psi_element://kotlin.collections.Iterable">Iterable</a></span><span style="">&lt;</span><span style="color:#20999d;"><a href="psi_element://kotlin.collections.filter.T">T</a></span><span style="">&gt;</span><span style="">.</span><span style="color:#000000;">filter</span>(
//INFO: <span style="color:#000000;">predicate</span><span style="">: </span><span style="">(</span><span style="color:#20999d;"><a href="psi_element://kotlin.collections.filter.T">T</a></span><span style="">) </span><span style="">-&gt;</span> <span style="color:#000000;">Boolean</span>
//INFO: )<span style="">: </span><span style="color:#000000;"><a href="psi_element://kotlin.collections.List">List</a></span><span style="">&lt;</span><span style="color:#20999d;"><a href="psi_element://kotlin.collections.filter.T">T</a></span><span style="">&gt;</span></pre></div><div class='content'><p>Returns a list containing only elements matching the given <a href="psi_element://predicate"><code style='font-size:96%;'><span style="">predicate</span></code></a>.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.collections.Collections.Filtering.filter"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">collections</span><span style="">.</span><span style="color:#000000;">Collections</span><span style="">.</span><span style="color:#000000;">Filtering</span><span style="">.</span><span style="color:#000000;">filter</span></code></a><pre><code><span style="color:#808080;font-style:italic;">//&#32;Unresolved</span></code></pre></td></table>
//INFO: )<span style="">: </span><span style="color:#000000;"><a href="psi_element://kotlin.collections.List">List</a></span><span style="">&lt;</span><span style="color:#20999d;"><a href="psi_element://kotlin.collections.filter.T">T</a></span><span style="">&gt;</span></pre></div><div class='content'><p>Returns a list containing only elements matching the given <a href="psi_element://predicate"><code style='font-size:96%;'><span style="color:#0000ff;">predicate</span></code></a>.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.collections.Collections.Filtering.filter"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">collections</span><span style="">.</span><span style="color:#000000;">Collections</span><span style="">.</span><span style="color:#000000;">Filtering</span><span style="">.</span><span style="color:#0000ff;text-decoration-line:underline;text-decoration-color:#0000ff;">filter</span></code></a><pre><code><span style=""><span style="color:#808080;font-style:italic;">//&#32;Unresolved</span></span></code></pre></td></table>
@@ -9,4 +9,4 @@ fun use() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">final</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">valueOf</span>(
//INFO: <span style="color:#000000;">value</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;"><a href="psi_element://E">E</a></span></pre></div><div class='content'><p>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.)</p></div><table class='sections'><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><code><a href="psi_element://IllegalArgumentException"><code style='font-size:96%;'><span style="color:#000000;">IllegalArgumentException</span></code></a></code> - if this enum type has no constant with the specified name</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;"><a href="psi_element://E">E</a></span></pre></div><div class='content'><p>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.)</p></div><table class='sections'><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><code><a href="psi_element://IllegalArgumentException"><code style='font-size:96%;'><span style="color:#0000ff;">IllegalArgumentException</span></code></a></code> - if this enum type has no constant with the specified name</td></table>
@@ -15,4 +15,4 @@ fun <caret>testFun(first: String, second: Int) = 12
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testFun</span>(
//INFO: <span style="color:#000000;">first</span><span style="">: </span><span style="color:#000000;">String</span>,
//INFO: <span style="color:#000000;">second</span><span style="">: </span><span style="color:#000000;">Int</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Int</span></pre></div><div class='content'><p>Test function</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://first"><code style='font-size:96%;'><span style="">first</span></code></a></code> - Some<p><code><a href="psi_element://second"><code style='font-size:96%;'><span style="">second</span></code></a></code> - Other</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Int</span></pre></div><div class='content'><p>Test function</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://first"><code style='font-size:96%;'><span style="color:#0000ff;">first</span></code></a></code> - Some<p><code><a href="psi_element://second"><code style='font-size:96%;'><span style="color:#0000ff;">second</span></code></a></code> - Other</td></table>
@@ -15,4 +15,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">a</span><span style="">: </span><span style="color:#000000;">Int</span>,
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span><span style=""> = </span><span style="color:#008000;font-weight:bold;">"default"</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td></table>
@@ -15,4 +15,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">a</span><span style="">: </span><span style="color:#000000;">Int</span>,
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td></table>
@@ -15,4 +15,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">a</span><span style="">: </span><span style="color:#000000;">Int</span>,
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td></table>
@@ -26,10 +26,10 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation.</p>
//INFO: <pre><code>
//INFO: <span style="">Code&#32;block</span>
//INFO: &#32;&#32;&#32;&#32;<span style="">Second&#32;line</span>
//INFO: <span style=""><span style="">Code&#32;block</span></span>
//INFO: <span style="">&#32;&#32;&#32;&#32;<span style="">Second&#32;line</span></span>
//INFO:
//INFO: <span style="">Third&#32;line</span>
//INFO: <span style=""><span style="">Third&#32;line</span></span>
//INFO: </code></pre><p>Text between code blocks.</p>
//INFO: <pre><code>
//INFO: </code></pre><p>Text after code block.</p></div><table class='sections'></table>
@@ -27,10 +27,10 @@ fun test() {
<caret>testMethod(1, "value")
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation. <strong>Bold</strong> <em>underline</em> <code><span style="">code</span></code> foo: bar (baz) <a href="psi_element://quux"><code style='font-size:96%;'><span style="color:#000000;">quux</span></code></a> 'apos'</p>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation. <strong>Bold</strong> <em>underline</em> <code style='font-size:96%;'><span style=""><span style="">code</span></span></code> foo: bar (baz) <a href="psi_element://quux"><code style='font-size:96%;'><span style="color:#0000ff;text-decoration-line:underline;text-decoration-color:#0000ff;">quux</span></code></a> 'apos'</p>
//INFO: <p><a href="https://www.kotlinlang.org">Kotlin</a> <a href="https://www.ibm.com">a<strong>b</strong><strong>d</strong> kas</a></p>
//INFO: <p><a href="psi_element://C"><code style='font-size:96%;'><span style="color:#000000;">C</span></code></a></p>
//INFO: <p><a href="psi_element://C"><code style='font-size:96%;'><span style="color:#000000;">See <strong>this</strong> class</span></code></a></p>
//INFO: <p><a href="psi_element://C"><code style='font-size:96%;'><span style="color:#0000ff;">C</span></code></a></p>
//INFO: <p><a href="psi_element://C"><code style='font-size:96%;'><span style="color:#0000ff;">See <strong>this</strong> class</span></code></a></p>
//INFO: <p>This is <em>emphasized text</em> but text_with_underscores has to preserve the underscores. Single stars embedded in a word like Embedded*Star have to be preserved as well.</p>
//INFO: <p>Exclamation marks are also important! Also in <code><span style="">code&#32;blocks!</span></code></p>
//INFO: <p>bt+ : <code><span style="">prefix&#32;`&#32;postfix</span></code> backslash: <code><span style="">\</span></code></p></div><table class='sections'></table>
//INFO: <p>Exclamation marks are also important! Also in <code style='font-size:96%;'><span style=""><span style="">code&#32;blocks!</span></span></code></p>
//INFO: <p>bt+ : <code style='font-size:96%;'><span style=""><span style="">prefix&#32;`&#32;postfix</span></span></code> backslash: <code style='font-size:96%;'><span style=""><span style="">\</span></span></code></p></div><table class='sections'></table>
@@ -14,4 +14,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">test</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation on two lines.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://test"><code style='font-size:96%;'><span style="">test</span></code></a></code> - String on two lines</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation on two lines.</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://test"><code style='font-size:96%;'><span style="color:#0000ff;">test</span></code></a></code> - String on two lines</td></table>
@@ -15,4 +15,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">Int</span><span style="">.</span><span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Receiver:</td><td valign='top'>Some int</td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'>Return <a href="psi_element://a"><code style='font-size:96%;'><span style="color:#000000;">a</span></code></a> and nothing else</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Receiver:</td><td valign='top'>Some int</td><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'>Return <a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;text-decoration-line:underline;text-decoration-color:#0000ff;">a</span></code></a> and nothing else</td></table>
@@ -16,4 +16,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">a</span><span style="">: </span><span style="color:#000000;">Int</span>,
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'>Return <a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a> and nothing else</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'>Return <a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a> and nothing else</td></table>
@@ -17,4 +17,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">a</span><span style="">: </span><span style="color:#000000;">Int</span>,
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'>Return value</td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><code><a href="psi_element://IllegalArgumentException"><code style='font-size:96%;'><span style="color:#000000;">IllegalArgumentException</span></code></a></code> - if the weather is bad</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td><tr><td valign='top' class='section'><p>Returns:</td><td valign='top'>Return value</td><tr><td valign='top' class='section'><p>Throws:</td><td valign='top'><p><code><a href="psi_element://IllegalArgumentException"><code style='font-size:96%;'><span style="color:#0000ff;">IllegalArgumentException</span></code></a></code> - if the weather is bad</td></table>
@@ -17,4 +17,4 @@ fun test() {
<caret>testMethod(1, "value")
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><a href="psi_element://C"><code style='font-size:96%;'><span style="color:#000000;">C</span></code></a>,<br><a href="psi_element://D"><code style='font-size:96%;'><span style="color:#000000;">D</span></code></a>,<br><a href="https://kotl.in">kotlin</a></td></table>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">testMethod</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>See Also:</td><td valign='top'><a href="psi_element://C"><code style='font-size:96%;'><span style="color:#0000ff;">C</span></code></a>,<br><a href="psi_element://D"><code style='font-size:96%;'><span style="color:#0000ff;">D</span></code></a>,<br><a href="https://kotl.in">kotlin</a></td></table>
@@ -16,4 +16,4 @@ fun test() {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="">&lt;</span><span style="color:#20999d;">T</span><span style="">&gt;</span> <span style="color:#000000;">testMethod</span>(
//INFO: <span style="color:#000000;">a</span><span style="">: </span><span style="color:#000000;">Int</span>,
//INFO: <span style="color:#000000;">b</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://T"><code style='font-size:96%;'><span style="color:#20999d;">T</span></code></a></code> - the type parameter<p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="">b</span></code></a></code> - String</td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'><p>Some documentation</p></div><table class='sections'><tr><td valign='top' class='section'><p>Params:</td><td valign='top'><p><code><a href="psi_element://T"><code style='font-size:96%;'><span style="color:#20999d;">T</span></code></a></code> - the type parameter<p><code><a href="psi_element://a"><code style='font-size:96%;'><span style="color:#0000ff;">a</span></code></a></code> - Some int<p><code><a href="psi_element://b"><code style='font-size:96%;'><span style="color:#0000ff;">b</span></code></a></code> - String</td></table>
@@ -21,4 +21,4 @@ fun <caret>castTextSpell(spell: String) {
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">castTextSpell</span>(
//INFO: <span style="color:#000000;">spell</span><span style="">: </span><span style="color:#000000;">String</span>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://Samples.sampleMagic"><code style='font-size:96%;'><span style="color:#000000;">Samples</span><span style="">.</span><span style="color:#000000;">sampleMagic</span></code></a><pre><code><br><span style="">castTextSpell(</span><span style="color:#008000;font-weight:bold;">"[asd]&#32;[dse]&#32;[asz]"</span><span style="">)<br></span></code></pre><p><a href="psi_element://sampleScroll"><code style='font-size:96%;'><span style="color:#000000;">sampleScroll</span></code></a><pre><code><br><span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">reader&#32;=&#32;Scroll(</span><span style="color:#008000;font-weight:bold;">"[asd]&#32;[dse]&#32;[asz]"</span><span style="">).reader()<br></span><span style="">castTextSpell(reader.readAll())<br></span></code></pre></td></table>
//INFO: )<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://Samples.sampleMagic"><code style='font-size:96%;'><span style="color:#000000;">Samples</span><span style="">.</span><span style="color:#0000ff;">sampleMagic</span></code></a><pre><code><span style=""><br><span style="">castTextSpell(</span><span style="color:#008000;font-weight:bold;">"[asd]&#32;[dse]&#32;[asz]"</span><span style="">)<br></span></span></code></pre><p><a href="psi_element://sampleScroll"><code style='font-size:96%;'><span style="color:#0000ff;">sampleScroll</span></code></a><pre><code><span style=""><br><span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">reader&#32;=&#32;Scroll(</span><span style="color:#008000;font-weight:bold;">"[asd]&#32;[dse]&#32;[asz]"</span><span style="">).reader()<br></span><span style="">castTextSpell(reader.readAll())<br></span></span></code></pre></td></table>
@@ -9,4 +9,4 @@ fun some<caret>() {
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.SampleGroup.mySample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">SampleGroup</span><span style="">.</span><span style="color:#000000;">mySample</span></code></a><pre><code><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"Hello,&#32;world"</span><span style="">)<br></span></code></pre><p><a href="psi_element://samples.megasamples.MegaSamplesGroup.megaSample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">megasamples</span><span style="">.</span><span style="color:#000000;">MegaSamplesGroup</span><span style="">.</span><span style="color:#000000;">megaSample</span></code></a><pre><code><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"...---..."</span><span style="">)<br></span></code></pre><p><a href="psi_element://samples.notindir.NotInDirSamples.sssample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">notindir</span><span style="">.</span><span style="color:#000000;">NotInDirSamples</span><span style="">.</span><span style="color:#000000;">sssample</span></code></a><pre><code><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"location&#32;is&#32;samplesTest/"</span><span style="">)<br></span></code></pre><p><a href="psi_element://smaplez.a.b.c.Samplez.sssample"><code style='font-size:96%;'><span style="color:#000000;">smaplez</span><span style="">.</span><span style="color:#000000;">a</span><span style="">.</span><span style="color:#000000;">b</span><span style="">.</span><span style="color:#000000;">c</span><span style="">.</span><span style="color:#000000;">Samplez</span><span style="">.</span><span style="color:#000000;">sssample</span></code></a><pre><code><span style="color:#808080;font-style:italic;">//&#32;Unresolved</span></code></pre></td></table>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.SampleGroup.mySample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">SampleGroup</span><span style="">.</span><span style="color:#0000ff;">mySample</span></code></a><pre><code><span style=""><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"Hello,&#32;world"</span><span style="">)<br></span></span></code></pre><p><a href="psi_element://samples.megasamples.MegaSamplesGroup.megaSample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">megasamples</span><span style="">.</span><span style="color:#000000;">MegaSamplesGroup</span><span style="">.</span><span style="color:#0000ff;">megaSample</span></code></a><pre><code><span style=""><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"...---..."</span><span style="">)<br></span></span></code></pre><p><a href="psi_element://samples.notindir.NotInDirSamples.sssample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">notindir</span><span style="">.</span><span style="color:#000000;">NotInDirSamples</span><span style="">.</span><span style="color:#0000ff;">sssample</span></code></a><pre><code><span style=""><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"location&#32;is&#32;samplesTest/"</span><span style="">)<br></span></span></code></pre><p><a href="psi_element://smaplez.a.b.c.Samplez.sssample"><code style='font-size:96%;'><span style="color:#000000;">smaplez</span><span style="">.</span><span style="color:#000000;">a</span><span style="">.</span><span style="color:#000000;">b</span><span style="">.</span><span style="color:#000000;">c</span><span style="">.</span><span style="color:#000000;">Samplez</span><span style="">.</span><span style="color:#0000ff;text-decoration-line:underline;text-decoration-color:#0000ff;">sssample</span></code></a><pre><code><span style=""><span style="color:#808080;font-style:italic;">//&#32;Unresolved</span></span></code></pre></td></table>
@@ -5,4 +5,4 @@ fun some<caret>() {
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.sample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">sample</span></code></a><pre><code><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"Hello,&#32;world"</span><span style="">)<br></span></code></pre></td></table>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.sample"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#0000ff;">sample</span></code></a><pre><code><span style=""><br><span style="">println(</span><span style="color:#008000;font-weight:bold;">"Hello,&#32;world"</span><span style="">)<br></span></span></code></pre></td></table>
@@ -5,4 +5,4 @@ fun some<caret>() {
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.nestedTypeParameter"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">nestedTypeParameter</span></code></a><pre><code><br><span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">m&#32;=&#32;mapOf&amp;lt;String,&#32;Pair&amp;lt;Int,&#32;Long&amp;gt;&amp;gt;()<br></span><span style="">println(m)<br></span></code></pre></td></table>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.nestedTypeParameter"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#0000ff;">nestedTypeParameter</span></code></a><pre><code><span style=""><br><span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">m&#32;=&#32;mapOf&amp;lt;String,&#32;Pair&amp;lt;Int,&#32;Long&amp;gt;&amp;gt;()<br></span><span style="">println(m)<br></span></span></code></pre></td></table>
@@ -5,4 +5,4 @@ fun some<caret>() {
}
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.singleTypeParameter"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#000000;">singleTypeParameter</span></code></a><pre><code><br><span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">l&#32;=&#32;listOf&amp;lt;String&amp;gt;()<br></span><span style="">println(l)<br></span></code></pre></td></table>
//INFO: <div class='definition'><pre><span style="color:#000080;font-weight:bold;">public</span> <span style="color:#000080;font-weight:bold;">fun</span> <span style="color:#000000;">some</span>()<span style="">: </span><span style="color:#000000;">Unit</span></pre></div><div class='content'></div><table class='sections'><tr><td valign='top' class='section'><p>Samples:</td><td valign='top'><p><a href="psi_element://samples.singleTypeParameter"><code style='font-size:96%;'><span style="color:#000000;">samples</span><span style="">.</span><span style="color:#0000ff;">singleTypeParameter</span></code></a><pre><code><span style=""><br><span style="color:#000080;font-weight:bold;">val&#32;</span><span style="">l&#32;=&#32;listOf&amp;lt;String&amp;gt;()<br></span><span style="">println(l)<br></span></span></code></pre></td></table>