PY-55118: Syntax highlighting for definition signatures in Quick Documentation

GitOrigin-RevId: b8a27a048772a0af7fcc36a9cba0d308e0ace8cc
This commit is contained in:
Irina Fediaeva
2023-01-24 00:32:49 +02:00
committed by intellij-monorepo-bot
parent 2e6c91c3ea
commit bb882b63f5
152 changed files with 666 additions and 588 deletions

View File

@@ -76,7 +76,7 @@ public final class PyNames {
public static final String GET = "__get__";
public static final String __CLASS__ = "__class__";
public static final String DUNDER_METACLASS = "__metaclass__";
public static final String METACLASS = "metaclass";
public static final @NlsSafe String METACLASS = "metaclass";
public static final String TYPE = "type";
public static final String SUPER = "super";
@@ -220,7 +220,7 @@ public final class PyNames {
public static final String NOT_IMPLEMENTED_ERROR = "NotImplementedError";
public static final String UNKNOWN_TYPE = "Any";
public static final @NlsSafe String UNKNOWN_TYPE = "Any";
public static final @NlsSafe String UNNAMED_ELEMENT = "<unnamed>";

View File

@@ -4,6 +4,7 @@ package com.jetbrains.python.psi.types;
import com.intellij.psi.PsiElement;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.PyParameter;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -16,7 +17,7 @@ public interface PyCallableParameter {
* Returns null if the parameter is tuple or star, or name is unknown.
*/
@Nullable
String getName();
@Nls String getName();
/**
* @param context type evaluation context

View File

@@ -34,5 +34,6 @@
<orderEntry type="module" module-name="intellij.platform.ide.core.impl" />
<orderEntry type="module" module-name="intellij.platform.util.jdom" />
<orderEntry type="library" name="gson" level="project" />
<orderEntry type="module" module-name="intellij.platform.lang.impl" />
</component>
</module>

View File

@@ -248,7 +248,7 @@ QDOC.keyword.args=Keyword args:
QDOC.returns=Returns:
QDOC.params=Params:
QDOC.attributes=Attributes:
QDOC.class.name=class {0}
QDOC.class=class
QDOC.parameter.name.of.link=Parameter {0} of {1}
QDOC.property.name.of.link=Property {0} of {1}
QDOC.property.getter=property getter
@@ -256,8 +256,13 @@ QDOC.not.defined.in.parentheses=(not defined)
QDOC.instance.attribute=Instance attribute {0} of {1}
QDOC.class.attribute=Class attribute {0} of {1}
QDOC.built.in.description=built-in description
QDOC.package=Package {0}
QDOC.module=Module {0}
QDOC.package.name=Package {0}
QDOC.module.name=Module {0}
QDOC.inferred.type.name=Inferred type: {0}
QDOC.variable.name=Variable "{0}"
QDOC.parameter.of.function.name=Parameter "{0}" of function "{1}"
QDOC.parameter.of.method.name=Parameter "{0}" of method "{1}"
QDOC.parameter.name=Parameter "{0}"
### Formatter
formatter.panel.dict.alignment.do.not.align=Do not align

View File

@@ -1,35 +0,0 @@
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.documentation;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.xml.CommonXmlStrings;
import com.intellij.xml.util.XmlStringUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
final class DocumentationBuilderKit {
public final static @NonNls String BR = "<br>";
@NotNull
static final Function<String, String> ESCAPE_ONLY = StringUtil::escapeXmlEntities;
@NotNull
static final Function<@NotNull String, @NotNull String> TO_ONE_LINE_AND_ESCAPE = s -> ESCAPE_ONLY.apply(s.replace('\n', ' '));
@NotNull
static final Function<String, String> ESCAPE_AND_SAVE_NEW_LINES_AND_SPACES =
s -> ESCAPE_ONLY.apply(s).replace("\n", BR).replace(" ", CommonXmlStrings.NBSP);
@NotNull
static final Function<String, String> WRAP_IN_ITALIC = s -> "<i>" + s + "</i>";
@NotNull
static final Function<String, String> WRAP_IN_BOLD = s -> "<b>" + s + "</b>";
@NonNls
static String combUp(@NonNls String what) {
return XmlStringUtil.escapeString(what).replace("\n", BR).replace(" ", "&nbsp;");
}
}

View File

@@ -0,0 +1,63 @@
package com.jetbrains.python.documentation
import com.intellij.lang.documentation.DocumentationSettings
import com.intellij.openapi.editor.colors.TextAttributesKey
import com.intellij.openapi.editor.richcopy.HtmlSyntaxInfoUtil
import com.intellij.openapi.util.NlsSafe
import com.intellij.openapi.util.text.HtmlChunk
import com.intellij.psi.PsiElement
import com.jetbrains.python.PyNames
import com.jetbrains.python.PythonLanguage
import com.jetbrains.python.highlighting.PyHighlighter
import com.jetbrains.python.psi.LanguageLevel
import com.jetbrains.python.psi.PyExpression
import com.jetbrains.python.psi.PyFunction
import com.jetbrains.python.psi.PyStringLiteralExpression
import com.jetbrains.python.psi.impl.PyBuiltinCache
import org.jetbrains.annotations.Nls
internal fun styledSpan(text: @Nls String, textAttributeKey: TextAttributesKey): HtmlChunk {
return HtmlChunk.raw(styledSpanWithRawText(HtmlChunk.text(text).toString(), textAttributeKey))
}
internal fun styledSpan(text: HtmlChunk, textAttributeKey: TextAttributesKey): HtmlChunk {
return HtmlChunk.raw(styledSpanWithRawText(text.toString(), textAttributeKey))
}
@Suppress("HardCodedStringLiteral")
internal fun highlightExpressionText(expressionText: @NlsSafe String, expression: PyExpression?): HtmlChunk =
when (expression) {
null -> HtmlChunk.text(expressionText)
// Special case for PyStringLiteralExpression there because HtmlSyntaxInfoUtil will consider expressionText as docstring.
// (The only string literal in a file is considered its docstring).
is PyStringLiteralExpression -> styledSpan(expressionText, PyHighlighter.PY_UNICODE_STRING)
else -> HtmlChunk.raw(HtmlSyntaxInfoUtil.getHighlightedByLexerAndEncodedAsHtmlCodeSnippet(
expression.project, PythonLanguage.INSTANCE, expressionText, highlightingSaturation()
))
}
@NlsSafe
private fun styledSpanWithRawText(text: String, textAttributeKey: TextAttributesKey): String {
return HtmlSyntaxInfoUtil.getStyledSpan(textAttributeKey, text, highlightingSaturation())
}
private fun highlightingSaturation() = DocumentationSettings.getHighlightingSaturation(false)
internal fun paramNameTextAttribute(isSelf: Boolean): TextAttributesKey =
if (isSelf) PyHighlighter.PY_SELF_PARAMETER else PyHighlighter.PY_PARAMETER
internal fun functionNameTextAttribute(function: PyFunction, funcName: String?): TextAttributesKey {
val languageLevel = LanguageLevel.forElement(function)
if ((funcName in PyNames.UNDERSCORED_ATTRIBUTES || PyNames.getBuiltinMethods(languageLevel).containsKey(funcName))
&& function.containingClass != null) {
return PyHighlighter.PY_PREDEFINED_USAGE
}
return PyHighlighter.PY_FUNC_DEFINITION
}
internal fun styledReference(refText: HtmlChunk, refTarget: PsiElement): HtmlChunk {
if (PyBuiltinCache.getInstance(refTarget).isBuiltin(refTarget)) {
return styledSpan(refText, PyHighlighter.PY_BUILTIN_NAME)
}
return refText
}

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.documentation;
import com.intellij.icons.AllIcons;
import com.intellij.lang.ASTNode;
import com.intellij.lang.documentation.DocumentationMarkup;
import com.intellij.openapi.util.NlsSafe;
@@ -41,15 +42,14 @@ import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.regex.Pattern;
import static com.jetbrains.python.documentation.DocumentationBuilderKit.*;
import static com.jetbrains.python.psi.PyUtil.as;
public class PyDocumentationBuilder {
private final PsiElement myElement;
private final PsiElement myOriginalElement;
private final HtmlBuilder myProlog; // definition header
private final HtmlBuilder myBody; // definition main part
private final HtmlBuilder myContent; // sequence for doc string
private final HtmlBuilder myProlog; // definition header (link to class or module)
private final HtmlBuilder myBody; // definition main part (signature / element description)
private final HtmlBuilder myContent; // main part of docstring
private final HtmlBuilder mySections;
private final List<FormatterDocFragment> myFormatterFragments;
private final Map<String, HtmlBuilder> mySectionsMap = FactoryMap.createMap(item -> new HtmlBuilder(), LinkedHashMap::new);
@@ -123,15 +123,15 @@ public class PyDocumentationBuilder {
}
else {
final HtmlBuilder result = new HtmlBuilder();
if (!myProlog.isEmpty() || !myBody.isEmpty()) {
final HtmlBuilder definitionBuilder = new HtmlBuilder();
final HtmlBuilder definitionBuilder = new HtmlBuilder();
if (!myProlog.isEmpty()) {
definitionBuilder.append(myProlog);
if (!myBody.isEmpty() && !myProlog.isEmpty()) {
definitionBuilder.br();
}
definitionBuilder.append(myBody);
result.append(definitionBuilder.wrapWith("pre").wrapWith(DocumentationMarkup.DEFINITION_ELEMENT));
}
if (!myBody.isEmpty()) {
definitionBuilder.append(myBody.wrapWith("pre").wrapWith(DocumentationMarkup.DEFINITION_ELEMENT));
}
result.append(definitionBuilder);
if (!myContent.isEmpty()) {
result.append(myContent.wrapWith(DocumentationMarkup.CONTENT_ELEMENT));
}
@@ -202,7 +202,7 @@ public class PyDocumentationBuilder {
final HtmlChunk link = func != null ? getLinkToFunction(func, true) : HtmlChunk.text(PyNames.UNNAMED_ELEMENT);
final String parameterName = parameter.getName();
if (link != null && parameterName != null) {
myProlog.appendRaw(PyPsiBundle.message("QDOC.parameter.name.of.link", HtmlChunk.text(parameterName).bold(), link));
myBody.appendRaw(PyPsiBundle.message("QDOC.parameter.name.of.link", HtmlChunk.text(parameterName).bold(), link)).br();
}
if (func != null) {
@@ -221,7 +221,7 @@ public class PyDocumentationBuilder {
myBody.append(PythonDocumentationProvider.describeParameter(parameter, myContext));
}
private @NotNull HtmlChunk runFormatterService(@NotNull @NlsSafe String description) {
private @NotNull HtmlChunk runFormatterService(@NotNull @Nls String description) {
final DocstringFormatterRequest output =
PyStructuredDocstringFormatter.formatDocstring(myElement, new DocstringFormatterRequest(description, Collections.emptyList()),
List.of(PyStructuredDocstringFormatter.FORMATTER_FRAGMENTS_FLAG));
@@ -258,7 +258,7 @@ public class PyDocumentationBuilder {
final Maybe<PyCallable> accessor = property.getByDirection(direction);
final HtmlChunk link = getLinkToClass(cls, true);
if (link != null) {
myProlog.appendRaw(PyPsiBundle.message("QDOC.property.name.of.link", HtmlChunk.text(propertyName).bold(), link));
myBody.appendRaw(PyPsiBundle.message("QDOC.property.name.of.link", HtmlChunk.text(propertyName).bold(), link)).br();
}
// Choose appropriate docstring
@@ -291,7 +291,7 @@ public class PyDocumentationBuilder {
myContent.append(safeRunFormatterService(elementDefinition, docstring));
}
mySectionsMap.get(PyPsiBundle.message("QDOC.accessor.kind")).append(getAccessorKind(direction))
.append(accessor.valueOrNull() == null ? " " + PyPsiBundle.message("QDOC.not.defined.in.parentheses") : "");
.append(accessor.valueOrNull() == null ? " " + PyPsiBundle.message("QDOC.not.defined.in.parentheses") : "");
// Choose appropriate definition to display
if (accessor.valueOrNull() != null) {
@@ -327,17 +327,22 @@ public class PyDocumentationBuilder {
if (PyUtil.isTopLevel(elementDefinition)) {
final PsiFile containing = elementDefinition.getContainingFile();
if (containing instanceof PyFile) {
final String link = getLinkToModule((PyFile)containing);
if (link != null) {
myProlog.appendRaw(link);
final HtmlChunk linkToModule = getLinkToModule((PyFile)containing);
if (linkToModule != null) {
myProlog.append(HtmlChunk.div()
.setClass("bottom")
.children(
HtmlChunk.icon("AllIcons.Nodes.Package", AllIcons.Nodes.Package),
HtmlChunk.nbsp(),
linkToModule.code()
));
}
}
}
if (elementDefinition instanceof PyClass pyClass) {
myBody.append(PythonDocumentationProvider.describeDecorators(pyClass, WRAP_IN_ITALIC, ESCAPE_AND_SAVE_NEW_LINES_AND_SPACES, BR, BR));
myBody.append(
PythonDocumentationProvider.describeClass(pyClass, WRAP_IN_BOLD, ESCAPE_AND_SAVE_NEW_LINES_AND_SPACES, true, myContext));
myBody.append(PythonDocumentationProvider.describeDecorators(pyClass, HtmlChunk.br()));
myBody.append(PythonDocumentationProvider.describeClass(pyClass, myContext));
if (effectiveDocstring != null) {
// add class attributes described either in the init doc or class doc
addAttributesSection(effectiveDocstring);
@@ -352,15 +357,20 @@ public class PyDocumentationBuilder {
}
}
else if (elementDefinition instanceof PyFunction pyFunction) {
myBody.append(
PythonDocumentationProvider.describeDecorators(pyFunction, WRAP_IN_ITALIC, ESCAPE_AND_SAVE_NEW_LINES_AND_SPACES, BR, BR));
myBody.append(PythonDocumentationProvider.describeDecorators(pyFunction, HtmlChunk.br()));
myBody.append(PythonDocumentationProvider.describeFunction(pyFunction, myContext, false));
final PyClass pyClass = pyFunction.getContainingClass();
if (!isProperty && pyClass != null) {
final HtmlChunk link = getLinkToClass(pyClass, true);
if (link != null) {
myProlog.append(link);
myProlog.append(HtmlChunk.div()
.setClass("bottom")
.children(
HtmlChunk.icon("AllIcons.Nodes.Class", AllIcons.Nodes.Class),
HtmlChunk.nbsp(),
link.code()
));
}
}
if (effectiveDocstring != null) {
@@ -442,11 +452,12 @@ public class PyDocumentationBuilder {
String targetName = target.getName();
if (link != null && targetName != null) {
if (PyUtil.isInstanceAttribute(target)) {
myProlog.appendRaw(PyPsiBundle.message("QDOC.instance.attribute", HtmlChunk.text(targetName).bold(), link));
myBody.appendRaw(PyPsiBundle.message("QDOC.instance.attribute", HtmlChunk.text(targetName).bold(), link));
}
else {
myProlog.appendRaw(PyPsiBundle.message("QDOC.class.attribute", HtmlChunk.text(targetName).bold(), link));
myBody.appendRaw(PyPsiBundle.message("QDOC.class.attribute", HtmlChunk.text(targetName).bold(), link));
}
myBody.br();
}
// if there is no separate doc for attribute we will try to take it from class doc
if (getEffectiveDocStringExpression(target) == null) {
@@ -624,7 +635,7 @@ public class PyDocumentationBuilder {
// reconstruct back, dropping first empty fragment as needed
boolean isFirstLine = true;
final int tabSize = PythonCodeStyleService.getInstance().getTabSize(element.getContainingFile());
for (String line : updatedLines) {
for (@NlsSafe String line : updatedLines) {
if (isFirstLine && ourSpacesPattern.matcher(line).matches()) continue; // ignore all initial whitespace
if (isFirstLine) {
isFirstLine = false;
@@ -639,8 +650,7 @@ public class PyDocumentationBuilder {
if (leadingTabs > 0) {
line = StringUtil.repeatSymbol(' ', tabSize * leadingTabs) + line.substring(leadingTabs);
}
final @NonNls String html = combUp(line);
result.appendRaw(html);
result.append(HtmlChunk.text(line));
}
return result.toFragment();
}
@@ -649,7 +659,7 @@ public class PyDocumentationBuilder {
// what to prepend to a module description?
final VirtualFile file = followed.getVirtualFile();
if (file == null) {
myProlog.append(HtmlChunk.text(PyPsiBundle.message("QDOC.module.path.unknown")).wrapWith(HtmlChunk.tag("small")));
myBody.append(HtmlChunk.text(PyPsiBundle.message("QDOC.module.path.unknown")).wrapWith(HtmlChunk.tag("small")));
}
else {
final QualifiedName name = QualifiedNameFinder.findShortestImportableQName(followed);
@@ -657,31 +667,35 @@ public class PyDocumentationBuilder {
@NonNls String qualifiedName =
ObjectUtils.chooseNotNull(QualifiedNameFinder.canonizeQualifiedName(followed, name, null), name).toString();
if (PyUtil.isPackage(followed)) {
myProlog.appendRaw(PyPsiBundle.message("QDOC.package", HtmlChunk.text(qualifiedName).bold()));
myBody.appendRaw(PyPsiBundle.message("QDOC.package.name", HtmlChunk.text(qualifiedName).bold()));
}
else {
myProlog.appendRaw(PyPsiBundle.message("QDOC.module", HtmlChunk.text(qualifiedName).bold()));
myBody.appendRaw(PyPsiBundle.message("QDOC.module.name", HtmlChunk.text(qualifiedName).bold()));
}
}
else {
@NonNls final String path = file.getPath();
myProlog.append(HtmlChunk.raw(path).wrapWith(HtmlChunk.tag("span").attr("path", path)));
myBody.append(HtmlChunk.raw(path).wrapWith(HtmlChunk.tag("span").attr("path", path)));
}
}
}
@NlsSafe
@Nullable
private static String getLinkToModule(@NotNull PyFile module) {
private static HtmlChunk getLinkToModule(@NotNull PyFile module) {
final QualifiedName name = QualifiedNameFinder.findCanonicalImportPath(module, null);
if (name != null) {
return PyDocumentationLink.toModule(name.toString(), name.toString());
}
final VirtualFile vFile = module.getVirtualFile();
return vFile != null ? vFile.getPath() : null;
if (vFile != null) {
@NlsSafe String vFilePath = vFile.getPath();
return HtmlChunk.raw(vFilePath);
}
else {
return null;
}
}
@NlsSafe
@Nullable
private HtmlChunk getLinkToClass(@NotNull PyClass pyClass, boolean preferQualifiedName) {
final String qualifiedName = pyClass.getQualifiedName();
@@ -693,17 +707,14 @@ public class PyDocumentationBuilder {
}
if (qualifiedName != null) {
final @NlsSafe String linkToPossibleClass = PyDocumentationLink.toPossibleClass(linkText, qualifiedName, pyClass, myContext);
return HtmlChunk.raw(linkToPossibleClass);
return PyDocumentationLink.toClass(pyClass, linkText);
}
else if (PsiTreeUtil.getParentOfType(myElement, PyClass.class, false) == pyClass) {
final @NlsSafe String linkToContainingClass = PyDocumentationLink.toContainingClass(linkText);
return HtmlChunk.raw(linkToContainingClass);
return PyDocumentationLink.toContainingClass(linkText);
}
return HtmlChunk.raw(linkText);
}
@NlsSafe
@Nullable
private static HtmlChunk getLinkToFunction(@NotNull PyFunction function, boolean preferQualifiedName) {
final String qualifiedName = function.getQualifiedName();
@@ -717,8 +728,7 @@ public class PyDocumentationBuilder {
}
if (qualifiedName != null) {
final @NlsSafe String link = PyDocumentationLink.toFunction(linkText, function);
return HtmlChunk.raw(link);
return PyDocumentationLink.toFunction(linkText, function);
}
return HtmlChunk.raw(linkText);
}
@@ -739,7 +749,7 @@ public class PyDocumentationBuilder {
}
static final class DocstringFormatterRequest {
@NotNull private final String body;
@NotNull private final @NlsSafe String body;
@NotNull private final List<FormatterDocFragment> fragments;
DocstringFormatterRequest() {
@@ -769,19 +779,19 @@ public class PyDocumentationBuilder {
return Objects.hash(body, fragments);
}
@NlsSafe @NotNull String getBody() {
@NotNull @NlsSafe String getBody() {
return body;
}
@NlsSafe @NotNull List<FormatterDocFragment> getFragments() {
@NotNull List<FormatterDocFragment> getFragments() {
return fragments;
}
}
private static final class FormatterDocFragment {
@NlsSafe private static final String NDASH = " &ndash; ";
@NlsSafe private final String myName;
@NlsSafe private final String myDescription;
private static final @NlsSafe String NDASH = " &ndash; ";
private final @NlsSafe String myName;
private final @NlsSafe String myDescription;
private final FormatterDocFragmentType myFragmentType;
private FormatterDocFragment(@NotNull String name, @NotNull String description, @NotNull FormatterDocFragmentType type) {

View File

@@ -16,14 +16,19 @@
package com.jetbrains.python.documentation
import com.intellij.codeInsight.documentation.DocumentationManagerProtocol
import com.intellij.openapi.util.NlsSafe
import com.intellij.openapi.util.text.HtmlChunk
import com.intellij.psi.PsiElement
import com.intellij.psi.PsiFileSystemItem
import com.intellij.psi.util.PsiTreeUtil
import com.intellij.psi.util.QualifiedName
import com.jetbrains.python.highlighting.PyHighlighter
import com.jetbrains.python.psi.*
import com.jetbrains.python.psi.types.PyClassType
import com.jetbrains.python.psi.types.PyNoneType
import com.jetbrains.python.psi.types.PyTypeParser
import com.jetbrains.python.psi.types.TypeEvalContext
import org.jetbrains.annotations.Nls
object PyDocumentationLink {
@@ -34,44 +39,44 @@ object PyDocumentationLink {
private const val LINK_TYPE_MODULE = "#module#"
@JvmStatic
fun toContainingClass(content: String?): String {
return "<a href=\"${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_CLASS\">$content</a>"
fun toContainingClass(@NlsSafe content: String): HtmlChunk {
return HtmlChunk.link("${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_CLASS", content)
}
@JvmStatic
fun toParameterPossibleClass(type: String, anchor: PsiElement, context: TypeEvalContext): String {
fun toParameterPossibleClass(@NlsSafe type: String, anchor: PsiElement, context: TypeEvalContext): HtmlChunk {
return when (PyTypeParser.getTypeByName(anchor, type, context)) {
is PyClassType -> "<a href=\"${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_PARAM\">$type</a>"
else -> type
is PyClassType -> HtmlChunk.link("${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_PARAM", type)
else -> HtmlChunk.text(type)
}
}
@JvmStatic
fun toPossibleClass(type: String, anchor: PsiElement, context: TypeEvalContext): String = toPossibleClass(type, type, anchor, context)
fun toPossibleClass(typeName: @Nls String, anchor: PsiElement, context: TypeEvalContext): HtmlChunk =
when (val type = PyTypeParser.getTypeByName(anchor, typeName, context)) {
is PyClassType -> styledReference(toClass(type.pyClass, typeName), type.pyClass)
is PyNoneType -> styledSpan(typeName, PyHighlighter.PY_KEYWORD)
else -> HtmlChunk.text(typeName)
}
@JvmStatic
fun toPossibleClass(content: String, qualifiedName: String, anchor: PsiElement, context: TypeEvalContext): String {
return when (PyTypeParser.getTypeByName(anchor, qualifiedName, context)) {
is PyClassType -> "<a href=\"${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_TYPENAME$qualifiedName\">$content</a>"
else -> content
}
fun toClass(pyClass: PyClass, linkText: @Nls String): HtmlChunk {
val qualifiedName = pyClass.qualifiedName
return HtmlChunk.link("${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_TYPENAME$qualifiedName", linkText)
}
@JvmStatic
fun toFunction(func: PyFunction): String = toFunction(func.qualifiedName ?: func.name.orEmpty(), func)
@JvmStatic
fun toFunction(content: String, func: PyFunction): String {
fun toFunction(@NlsSafe content: String, func: PyFunction): HtmlChunk {
val qualifiedName = func.qualifiedName
return when {
qualifiedName != null -> "<a href=\"${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_FUNC$qualifiedName\">$content</a>"
else -> content
qualifiedName != null -> HtmlChunk.link("${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_FUNC$qualifiedName", content)
else -> HtmlChunk.text(content)
}
}
@JvmStatic
fun toModule(content: String, qualifiedName: String): String {
return "<a href=\"${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_MODULE$qualifiedName\">$content</a>"
fun toModule(@NlsSafe content: String, qualifiedName: String): HtmlChunk {
return HtmlChunk.link("${DocumentationManagerProtocol.PSI_ELEMENT_PROTOCOL}$LINK_TYPE_MODULE$qualifiedName", content)
}
@JvmStatic

View File

@@ -3,26 +3,31 @@ package com.jetbrains.python.documentation;
import com.google.common.collect.Collections2;
import com.google.common.collect.Maps;
import com.intellij.openapi.editor.colors.TextAttributesKey;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.Ref;
import com.intellij.openapi.util.text.HtmlBuilder;
import com.intellij.openapi.util.text.HtmlChunk;
import com.intellij.psi.PsiElement;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.PyNames;
import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider;
import com.jetbrains.python.highlighting.PyHighlighter;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyExpression;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
import com.jetbrains.python.psi.types.*;
import com.jetbrains.python.pyi.PyiUtil;
import com.jetbrains.python.toolbox.ChainIterable;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import static com.jetbrains.python.documentation.DocumentationBuilderKit.combUp;
import static com.jetbrains.python.documentation.PyDocSignaturesHighlighterKt.highlightExpressionText;
import static com.jetbrains.python.documentation.PyDocSignaturesHighlighterKt.styledSpan;
public class PyTypeModelBuilder {
private final Map<PyType, TypeModel> myVisited = Maps.newHashMap();
@@ -100,7 +105,7 @@ public class PyTypeModelBuilder {
private static final NamedType ANY = new NamedType(PyNames.UNKNOWN_TYPE);
@Nullable
private final String name;
private final @NlsSafe String name;
private NamedType(@Nullable String name) {
this.name = name;
@@ -180,7 +185,7 @@ public class PyTypeModelBuilder {
}
static final class ParamType extends TypeModel {
@Nullable private final String name;
@Nullable private final @NlsSafe String name;
@Nullable private final TypeModel type;
private ParamType(@Nullable String name, @Nullable TypeModel type) {
@@ -208,7 +213,7 @@ public class PyTypeModelBuilder {
}
static class GenericType extends TypeModel {
private final String name;
private final @NlsSafe String name;
GenericType(@Nullable String name) {
this.name = name;
@@ -237,8 +242,8 @@ public class PyTypeModelBuilder {
/**
* Builds tree-like type model for PyType
*
*/
@SuppressWarnings("rawtypes")
public TypeModel build(@Nullable PyType type,
boolean allowUnions) {
final TypeModel evaluated = myVisited.get(type);
@@ -415,20 +420,28 @@ public class PyTypeModelBuilder {
}
private static class TypeToStringVisitor extends TypeNameVisitor {
private final StringBuilder myStringBuilder = new StringBuilder();
@Override
protected void add(String s) {
myStringBuilder.append(s);
protected @NotNull HtmlChunk styled(@Nls String text, @NotNull TextAttributesKey style) {
return HtmlChunk.raw(text);
}
@Override
protected void addType(String name) {
add(name);
protected @NotNull HtmlChunk escaped(@Nls String text) {
return HtmlChunk.raw(text);
}
@Override
protected @NotNull HtmlChunk className(@Nls String name) {
return escaped(name);
}
@Override
protected @NotNull HtmlChunk styledExpression(@Nls String expressionText, @NotNull PyExpression expression) {
return HtmlChunk.raw(expressionText);
}
public String getString() {
return myStringBuilder.toString();
return myBody.toString();
}
@Override
@@ -437,14 +450,12 @@ public class PyTypeModelBuilder {
if (nested != null) {
if (type.bitwiseOrUnionAllowed) {
nested.accept(this);
add(" | ");
add(PyNames.UNKNOWN_TYPE);
add(HtmlChunk.raw(" | " + PyNames.UNKNOWN_TYPE));
}
else {
add("Union[");
add(HtmlChunk.raw("Union[")); // NON-NLS
nested.accept(this);
add(", " + PyNames.UNKNOWN_TYPE);
add("]");
add(HtmlChunk.raw(", " + PyNames.UNKNOWN_TYPE + "]"));
}
}
}
@@ -458,19 +469,19 @@ public class PyTypeModelBuilder {
@Override
public void function(FunctionType function) {
add("Callable[");
add(HtmlChunk.raw("Callable[")); //NON-NLS
final Collection<TypeModel> parameters = function.parameters;
if (parameters != null) {
add("[");
add(HtmlChunk.raw("["));
processList(parameters);
add("]");
add(HtmlChunk.raw("]"));
}
else {
add("...");
add(HtmlChunk.raw("..."));
}
add(", ");
add(HtmlChunk.raw(", "));
function.returnType.accept(this);
add("]");
add(HtmlChunk.raw("]"));
}
@Override
@@ -479,7 +490,7 @@ public class PyTypeModelBuilder {
param.type.accept(this);
}
else {
add("Any");
add(HtmlChunk.raw(PyNames.UNKNOWN_TYPE));
}
}
@@ -490,7 +501,6 @@ public class PyTypeModelBuilder {
}
private static class TypeToBodyWithLinksVisitor extends TypeNameVisitor {
private final HtmlBuilder myBody;
private final PsiElement myAnchor;
TypeToBodyWithLinksVisitor(HtmlBuilder body, PsiElement anchor) {
@@ -499,35 +509,51 @@ public class PyTypeModelBuilder {
}
@Override
protected void add(String s) {
myBody.appendRaw(combUp(s));
protected @NotNull HtmlChunk styled(@Nls String text, @NotNull TextAttributesKey style) {
return styledSpan(text, style);
}
@Override
protected void addType(String name) {
protected @NotNull HtmlChunk escaped(@Nls String text) {
return HtmlChunk.text(text);
}
@Override
protected @NotNull HtmlChunk className(@Nls String name) {
final TypeEvalContext context = TypeEvalContext.userInitiated(myAnchor.getProject(), myAnchor.getContainingFile());
myBody.appendRaw(PyDocumentationLink.toPossibleClass(name, myAnchor, context));
return PyDocumentationLink.toPossibleClass(name, myAnchor, context);
}
@Override
protected @NotNull HtmlChunk styledExpression(@Nls String expressionText, @NotNull PyExpression expression) {
return highlightExpressionText(expressionText, expression);
}
}
private static class TypeToDescriptionVisitor extends TypeNameVisitor {
@NotNull
private final StringBuilder myResult = new StringBuilder();
@Override
protected void add(String s) {
myResult.append(s);
protected @NotNull HtmlChunk styled(@Nls String text, @NotNull TextAttributesKey style) {
return HtmlChunk.raw(text);
}
@Override
protected void addType(String name) {
add(name);
protected @NotNull HtmlChunk escaped(@Nls String text) {
return HtmlChunk.raw(text);
}
@Override
protected @NotNull HtmlChunk className(@Nls String name) {
return escaped(name);
}
@Override
protected @NotNull HtmlChunk styledExpression(@Nls String expressionText, @NotNull PyExpression expression) {
return HtmlChunk.raw(expressionText);
}
@NotNull
public String getDescription() {
return myResult.toString();
return myBody.toString();
}
}
@@ -535,21 +561,23 @@ public class PyTypeModelBuilder {
private int myDepth = 0;
private final static int MAX_DEPTH = 6;
private boolean switchBuiltinToTyping = false;
protected HtmlBuilder myBody = new HtmlBuilder();
@Override
public void oneOf(OneOf oneOf) {
myDepth++;
if (maxDepthExceeded()) {
add("...");
add(styled("...", PyHighlighter.PY_DOT));
return;
}
if (oneOf.bitwiseOrUnionAllowed) {
processList(oneOf.oneOfTypes, " | ");
}
else {
add("Union[");
add(escaped("Union")); //NON-NLS
add(styled("[", PyHighlighter.PY_BRACKETS));
processList(oneOf.oneOfTypes);
add("]");
add(styled("]", PyHighlighter.PY_BRACKETS));
}
myDepth--;
}
@@ -558,11 +586,19 @@ public class PyTypeModelBuilder {
processList(list, ", ");
}
protected void processList(@NotNull Collection<TypeModel> list, @NotNull String separator) {
protected void processList(@NotNull Collection<TypeModel> list, @NotNull @Nls String separator) {
boolean first = true;
for (TypeModel t : list) {
if (!first) {
add(separator);
if (separator.equals(", ")) {
add(styled(separator, PyHighlighter.PY_COMMA));
}
else if (separator.equals(" | ")) {
add(styled(separator, PyHighlighter.PY_OPERATION_SIGN));
}
else {
add(escaped(separator));
}
}
else {
first = false;
@@ -572,13 +608,23 @@ public class PyTypeModelBuilder {
}
}
protected abstract void add(String s);
protected void add(@NotNull HtmlChunk chunk) {
myBody.append(chunk);
}
protected abstract @NotNull HtmlChunk styled(@Nls String text, @NotNull TextAttributesKey style);
protected abstract @NotNull HtmlChunk escaped(@Nls String text);
protected abstract @NotNull HtmlChunk className(@Nls String name);
protected abstract @NotNull HtmlChunk styledExpression(@Nls String expressionText, @NotNull PyExpression expression);
@Override
public void collectionOf(CollectionOf collectionOf) {
myDepth++;
if (maxDepthExceeded()) {
add("...");
add(styled("...", PyHighlighter.PY_DOT));
return;
}
final boolean allTypeParamsAreAny = ContainerUtil.and(collectionOf.elementTypes, t -> t == NamedType.ANY);
@@ -598,35 +644,34 @@ public class PyTypeModelBuilder {
switchBuiltinToTyping = prevSwitchBuiltinToTyping;
if (!collectionOf.elementTypes.isEmpty()) {
add("[");
add(styled("[", PyHighlighter.PY_BRACKETS));
processList(collectionOf.elementTypes);
add("]");
add(styled("]", PyHighlighter.PY_BRACKETS));
}
}
protected abstract void addType(String name);
@Override
public void name(String name) {
addType(switchBuiltinToTyping ? PyTypingTypeProvider.TYPING_COLLECTION_CLASSES.getOrDefault(name, name) : name);
public void name(@NlsSafe String name) {
add(className(switchBuiltinToTyping ? PyTypingTypeProvider.TYPING_COLLECTION_CLASSES.getOrDefault(name, name) : name));
}
@Override
public void function(FunctionType function) {
myDepth++;
if (maxDepthExceeded()) {
add("...");
add(styled("...", PyHighlighter.PY_DOT));
return;
}
add("(");
add(styled("(", PyHighlighter.PY_PARENTHS));
final Collection<TypeModel> parameters = function.parameters;
if (parameters != null) {
processList(parameters);
}
else {
add("...");
add(styled("...", PyHighlighter.PY_DOT));
}
add(") -> ");
add(styled(")", PyHighlighter.PY_PARENTHS));
add(escaped(" -> "));
function.returnType.accept(this);
myDepth--;
}
@@ -639,15 +684,15 @@ public class PyTypeModelBuilder {
public void param(ParamType param) {
myDepth++;
if (maxDepthExceeded()) {
add("...");
add(styled("...", PyHighlighter.PY_DOT));
return;
}
if (param.name != null) {
add(param.name);
add(styled(param.name, PyHighlighter.PY_PARAMETER));
}
if (param.type != null) {
if (param.name != null) {
add(": ");
add(styled(": ", PyHighlighter.PY_OPERATION_SIGN));
}
param.type.accept(this);
}
@@ -663,49 +708,64 @@ public class PyTypeModelBuilder {
public void optional(OptionalType type) {
if (type.bitwiseOrUnionAllowed) {
type.type.accept(this);
add(" | None");
add(styled(" | ", PyHighlighter.PY_OPERATION_SIGN));
add(styled("None", PyHighlighter.PY_KEYWORD)); //NON-NLS
}
else {
add("Optional[");
add(escaped("Optional")); //NON-NLS
add(styled("[", PyHighlighter.PY_BRACKETS));
type.type.accept(this);
add("]");
add(styled("]", PyHighlighter.PY_BRACKETS));
}
}
@Override
public void tuple(TupleType type) {
add(type.useTypingAlias ? "Tuple" : "tuple");
if (type.useTypingAlias) {
add(escaped("Tuple")); //NON-NLS
}
else {
add(styled("tuple", PyHighlighter.PY_BUILTIN_NAME)); //NON-NLS
}
if (!type.members.isEmpty()) {
add("[");
add(styled("[", PyHighlighter.PY_BRACKETS));
processList(type.members);
if (type.homogeneous) {
add(", ...");
add(styled(", ", PyHighlighter.PY_COMMA));
add(styled("...", PyHighlighter.PY_DOT));
}
add("]");
add(styled("]", PyHighlighter.PY_BRACKETS));
}
}
@Override
public void classObject(ClassObjectType type) {
add("Type[");
add(escaped("Type")); //NON-NLS
add(styled("[", PyHighlighter.PY_BRACKETS));
type.classType.accept(this);
add("]");
add(styled("]", PyHighlighter.PY_BRACKETS));
}
@Override
public void genericType(GenericType type) {
add(type.name);
if (type.name != null) {
add(escaped(type.name));
}
}
@Override
public void oneOfLiterals(OneOfLiterals literals) {
add(
StreamEx
.of(literals.literals)
.map(PyLiteralType::getExpression)
.map(PyExpression::getText)
.joining(", ", "Literal[", "]")
);
new HtmlBuilder()
.append(escaped("Literal")) //NON-NLS
.append(styled("[", PyHighlighter.PY_BRACKETS))
.append(StreamEx
.of(literals.literals)
.map(PyLiteralType::getExpression)
.map(expr -> styledExpression(expr.getText(), expr))
.collect(HtmlChunk.toFragment(styled(", ", PyHighlighter.PY_COMMA))))
.append(styled("]", PyHighlighter.PY_BRACKETS))
.toFragment());
}
}
}

View File

@@ -2,6 +2,7 @@
package com.jetbrains.python.documentation;
import com.intellij.lang.documentation.DocumentationProvider;
import com.intellij.openapi.editor.DefaultLanguageHighlighterColors;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.NlsSafe;
@@ -13,12 +14,12 @@ import com.intellij.psi.*;
import com.intellij.psi.tree.IElementType;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.ObjectUtils;
import com.jetbrains.python.*;
import com.jetbrains.python.codeInsight.controlflow.ScopeOwner;
import com.jetbrains.python.codeInsight.dataflow.scope.ScopeUtil;
import com.jetbrains.python.codeInsight.typing.PyTypingTypeProvider;
import com.jetbrains.python.documentation.docstrings.DocStringUtil;
import com.jetbrains.python.highlighting.PyHighlighter;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.impl.ParamHelper;
import com.jetbrains.python.psi.impl.PyBuiltinCache;
@@ -33,10 +34,8 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;
import static com.jetbrains.python.documentation.DocumentationBuilderKit.TO_ONE_LINE_AND_ESCAPE;
import static com.jetbrains.python.documentation.PyDocSignaturesHighlighterKt.*;
import static com.jetbrains.python.psi.PyUtil.as;
/**
@@ -52,14 +51,15 @@ public class PythonDocumentationProvider implements DocumentationProvider {
@Override
@Nullable
public @Nls String getQuickNavigateInfo(PsiElement element, @NotNull PsiElement originalElement) {
final PsiElement referenceElement = originalElement.getParent(); // identifier -> expression
for (PythonDocumentationQuickInfoProvider point : PythonDocumentationQuickInfoProvider.EP_NAME.getExtensions()) {
final String info = point.getQuickInfo(originalElement);
final String info = point.getQuickInfo(referenceElement);
if (info != null) {
return info;
}
}
final TypeEvalContext context = TypeEvalContext.userInitiated(originalElement.getProject(), originalElement.getContainingFile());
final TypeEvalContext context = TypeEvalContext.userInitiated(referenceElement.getProject(), referenceElement.getContainingFile());
if (element instanceof PyFunction function) {
final HtmlBuilder result = new HtmlBuilder();
@@ -68,56 +68,29 @@ public class PythonDocumentationProvider implements DocumentationProvider {
if (cls != null) {
final String clsName = cls.getName();
if (clsName != null) {
result.appendRaw(PyPsiBundle.message("QDOC.class.name", clsName)).appendRaw("\n");
result.append(styledSpan(PyPsiBundle.message("QDOC.class"), PyHighlighter.PY_KEYWORD));
result.nbsp();
result.append(styledSpan(clsName, PyHighlighter.PY_CLASS_DEFINITION));
result.br();
// It would be nice to have class import info here, but we don't know the ctrl+hovered reference and context
}
}
result
.append(describeDecorators(function, Function.identity(), TO_ONE_LINE_AND_ESCAPE, ", ", "\n"))
.append(describeFunction(function, context, true));
final String docStringSummary = getDocStringSummary(function);
if (docStringSummary != null) {
result.appendRaw("\n").append(docStringSummary);
}
return result.toString();
return result
.append(describeDecorators(function, HtmlChunk.text(", ")))
.append(describeFunction(function, context, true))
.toString();
}
else if (element instanceof PyClass) {
final PyClass cls = (PyClass)element;
final HtmlBuilder result = new HtmlBuilder();
result
.append(describeDecorators(cls, Function.identity(), TO_ONE_LINE_AND_ESCAPE, ", ", "\n"))
.append(describeClass(cls, Function.identity(), TO_ONE_LINE_AND_ESCAPE, false, context));
final String docStringSummary = getDocStringSummary(cls);
if (docStringSummary != null) {
result.appendRaw("\n").append(docStringSummary);
}
else {
Optional
.ofNullable(cls.findInitOrNew(false, context))
.map(PythonDocumentationProvider::getDocStringSummary)
.ifPresent((@NlsSafe var summary) -> result.appendRaw("\n").append(summary));
}
return result.toString();
return result
.append(describeDecorators(cls, HtmlChunk.text(", ")))
.append(describeClass(cls, context))
.toString();
}
else if (element instanceof PyExpression) {
return describeExpression((PyExpression)element, originalElement, context);
}
return null;
}
@NlsSafe
@Nullable
private static String getDocStringSummary(@NotNull PyDocStringOwner owner) {
final PyStringLiteralExpression docStringExpression = PyDocumentationBuilder.getEffectiveDocStringExpression(owner);
if (docStringExpression != null) {
final StructuredDocString docString = DocStringUtil.parse(docStringExpression.getStringValue(), docStringExpression);
return docString.getSummary();
return describeExpression((PyExpression)element, referenceElement, context);
}
return null;
}
@@ -132,20 +105,22 @@ public class PythonDocumentationProvider implements DocumentationProvider {
@NotNull
static HtmlChunk describeTarget(@NotNull PyTargetExpression target, @NotNull TypeEvalContext context) {
final HtmlBuilder result = new HtmlBuilder();
result.append(StringUtil.notNullize(target.getName()));
result.appendRaw(": ");
describeTypeWithLinks(context.getType(target), target, context, target, result);
result.append(styledSpan(StringUtil.notNullize(target.getName()), DefaultLanguageHighlighterColors.IDENTIFIER));
result.append(styledSpan(": ", PyHighlighter.PY_OPERATION_SIGN));
result.append(styledSpan(formatTypeWithLinks(context.getType(target), target, target, context), PyHighlighter.PY_ANNOTATION));
// Can return not physical elements such as foo()[0] for assignments like x, _ = foo()
final PyExpression value = target.findAssignedValue();
if (value != null) {
result.appendRaw(" = ");
result.append(styledSpan(" = ", PyHighlighter.PY_OPERATION_SIGN));
final String initializerText = value.getText();
final int index = initializerText.indexOf("\n");
final int index = value.getText().indexOf("\n");
if (index < 0) {
result.append(initializerText);
result.append(highlightExpressionText(initializerText, value));
}
else {
result.append(initializerText.substring(0, index)).appendRaw("...");
result.append(highlightExpressionText(initializerText.substring(0, index), value));
result.append(styledSpan("...", PyHighlighter.PY_DOT));
}
}
return result.toFragment();
@@ -154,10 +129,9 @@ public class PythonDocumentationProvider implements DocumentationProvider {
@NotNull
static HtmlChunk describeParameter(@NotNull PyNamedParameter parameter, @NotNull TypeEvalContext context) {
final HtmlBuilder result = new HtmlBuilder();
result
.append(StringUtil.notNullize(parameter.getName()))
.appendRaw(": ");
describeTypeWithLinks(context.getType(parameter), parameter, context, parameter, result);
result.append(styledSpan(StringUtil.notNullize(parameter.getName()), paramNameTextAttribute(parameter.isSelf())));
result.append(styledSpan(": ", PyHighlighter.PY_OPERATION_SIGN));
result.append(styledSpan(formatTypeWithLinks(context.getType(parameter), parameter, parameter, context), PyHighlighter.PY_ANNOTATION));
return result.toFragment();
}
@@ -167,30 +141,32 @@ public class PythonDocumentationProvider implements DocumentationProvider {
@NotNull TypeEvalContext context,
boolean forTooltip) {
final StringBuilder result = new StringBuilder();
int firstParamOffset = 0;
// TODO wrapping of long signatures
if (function.isAsync()) {
result.append("async ");
}
result.append("def ");
final String funcName = StringUtil.notNullize(function.getName(), PyNames.UNNAMED_ELEMENT);
int firstParamOffset = result.length() + funcName.length();
int lastLineOffset = 0;
if (forTooltip) {
result.append(escaped(funcName));
}
else {
appendWithTags(result, escaped(funcName), "b");
}
result.append("(");
if (function.isAsync()) {
result.append(styledSpan("async ", PyHighlighter.PY_KEYWORD)); //NON-NLS
firstParamOffset += "async ".length();
}
result.append(styledSpan("def ", PyHighlighter.PY_KEYWORD)); //NON-NLS
firstParamOffset += "def ".length();
final String funcName = StringUtil.notNullize(function.getName(), PyNames.UNNAMED_ELEMENT);
firstParamOffset += funcName.length();
result.append(styledSpan(funcName, functionNameTextAttribute(function, funcName)));
result.append(styledSpan("(", PyHighlighter.PY_PARENTHS));
firstParamOffset++;
int lastLineOffset = 0;
boolean first = true;
boolean firstIsSelf = false;
final List<PyCallableParameter> parameters = function.getParameters(context);
for (PyCallableParameter parameter : parameters) {
boolean isSelf = parameter.isSelf();
if (!first) {
result.append(",");
result.append(styledSpan(",", PyHighlighter.PY_COMMA));
if (forTooltip || firstIsSelf && parameters.size() == 2) {
result.append(" ");
}
@@ -202,7 +178,7 @@ public class PythonDocumentationProvider implements DocumentationProvider {
}
}
else {
firstIsSelf = parameter.isSelf();
firstIsSelf = isSelf;
}
String paramName = parameter.getName();
@@ -210,14 +186,14 @@ public class PythonDocumentationProvider implements DocumentationProvider {
final PyNamedParameter named = as(parameter.getParameter(), PyNamedParameter.class);
boolean showType = true;
if (parameter.isPositionalContainer()) {
paramName = "*" + StringUtil.notNullize(paramName, "args");
paramName = "*" + StringUtil.notNullize(paramName, "args"); //NON-NLS
final PyTupleType tupleType = as(paramType, PyTupleType.class);
if (tupleType != null) {
paramType = tupleType.getIteratedItemType();
}
}
else if (parameter.isKeywordContainer()) {
paramName = "**" + StringUtil.notNullize(paramName, "kwargs");
paramName = "**" + StringUtil.notNullize(paramName, "kwargs"); //NON-NLS
final PyCollectionType genericType = as(paramType, PyCollectionType.class);
if (genericType != null && genericType.getPyClass() == PyBuiltinCache.getInstance(function).getClass("dict")) {
final List<PyType> typeParams = genericType.getElementTypes();
@@ -235,56 +211,71 @@ public class PythonDocumentationProvider implements DocumentationProvider {
else {
paramName = StringUtil.notNullize(paramName, PyNames.UNNAMED_ELEMENT);
// Don't show type for "self" unless it's explicitly annotated
showType = !parameter.isSelf() || (named != null && new PyTypingTypeProvider().getParameterType(named, function, context) != null);
showType = !isSelf || (named != null && new PyTypingTypeProvider().getParameterType(named, function, context) != null);
}
result.append(escaped(paramName));
result.append(styledSpan(paramName, paramNameTextAttribute(isSelf)));
if (showType) {
result.append(": ");
result.append(formatTypeWithLinks(paramType, named, function, context));
result
.append(styledSpan(": ", PyHighlighter.PY_OPERATION_SIGN))
.append(styledSpan(formatTypeWithLinks(paramType, named, function, context), PyHighlighter.PY_ANNOTATION));
}
final String signature = ParamHelper.getDefaultValuePartInSignature(parameter.getDefaultValueText(), showType);
if (signature != null) {
@SuppressWarnings("RegExpRepeatedSpace") final String delimiter = showType ? " = " : "=";
final String[] parts = signature.split(delimiter);
if (parts.length == 2) {
result.append(styledSpan(delimiter, PyHighlighter.PY_OPERATION_SIGN));
result.append(highlightExpressionText(parts[1], parameter.getDefaultValue()));
}
}
final String defaultValue = parameter.getDefaultValueText();
result.append(escaped(ObjectUtils.notNull(ParamHelper.getDefaultValuePartInSignature(defaultValue, showType), "")));
first = false;
}
result.append(")");
result.append(styledSpan(")", PyHighlighter.PY_PARENTHS));
if (!forTooltip && StringUtil.stripHtml(result.substring(lastLineOffset), false).length() > RETURN_TYPE_WRAPPING_THRESHOLD) {
result.append("\n ");
}
result.append(escaped(" -> "))
.append(formatTypeWithLinks(context.getReturnType(function), function, function, context));
final PyType returnType = context.getReturnType(function);
result.append(HtmlChunk.text(" -> "));
result.append(styledSpan(formatTypeWithLinks(returnType, function, function, context), PyHighlighter.PY_ANNOTATION));
return result.toString();
}
@NlsSafe
@Nullable
private static String describeExpression(@NotNull PyExpression expression,
@NotNull PsiElement originalElement,
@NotNull TypeEvalContext context) {
private static @Nls String describeExpression(@NotNull PyExpression expression,
@NotNull PsiElement originalElement,
@NotNull TypeEvalContext context) {
final String name = expression.getName();
if (name != null) {
final StringBuilder result = new StringBuilder(expression instanceof PyNamedParameter ? "parameter" : "variable");
result.append(String.format(" \"%s\"", name));
final HtmlBuilder result = new HtmlBuilder();
if (expression instanceof PyNamedParameter) {
final PyFunction function = PsiTreeUtil.getParentOfType(expression, PyFunction.class);
if (function != null) {
result
.append(" of ")
.append(function.getContainingClass() == null ? "function" : "method")
.append(String.format(" \"%s\"", function.getName()));
final String functionName = function.getName();
if (function.getContainingClass() == null) {
result.append(PyPsiBundle.message("QDOC.parameter.of.function.name", name, functionName));
}
else {
result.append(PyPsiBundle.message("QDOC.parameter.of.method.name", name, functionName));
}
}
else {
result.append(PyPsiBundle.message("QDOC.parameter.name", name));
}
}
if (originalElement instanceof PyTypedElement) {
final String typeName = getTypeName(context.getType(((PyTypedElement)originalElement)), context);
result
.append("\n")
.append(String.format("Inferred type: %s", typeName));
else {
result.append(PyPsiBundle.message("QDOC.variable.name", name));
}
return DocumentationBuilderKit.ESCAPE_ONLY.apply(result.toString());
if (originalElement instanceof PyTypedElement typedElement) {
final PyType type = context.getType(typedElement);
final HtmlChunk formattedType = formatTypeWithLinks(type, typedElement, typedElement, context);
result.br().appendRaw(PyPsiBundle.message("QDOC.inferred.type.name", formattedType));
}
return result.toString();
}
return null;
}
@@ -326,7 +317,7 @@ public class PythonDocumentationProvider implements DocumentationProvider {
if (typeOwner instanceof PyTargetExpression && type == null) {
PyAssignmentStatement assignment = as(typeOwner.getParent(), PyAssignmentStatement.class);
if (assignment != null && PyTypingTypeProvider.isExplicitTypeAlias(assignment, context)) {
body.append("TypeAlias");
body.append(styledSpan("TypeAlias", PyHighlighter.PY_ANNOTATION));
return;
}
}
@@ -351,136 +342,143 @@ public class PythonDocumentationProvider implements DocumentationProvider {
@NotNull
static HtmlChunk describeDecorators(@NotNull PyDecoratable decoratable,
@NotNull Function<String, String> escapedCalleeMapper,
@NotNull Function<@NotNull String, @NotNull String> escaper,
@NotNull @NlsSafe String separator,
@NotNull @NlsSafe String suffix) {
@NotNull HtmlChunk separator) {
final HtmlBuilder result = new HtmlBuilder();
final PyDecoratorList decoratorList = decoratable.getDecoratorList();
if (decoratorList != null) {
boolean first = true;
for (PyDecorator decorator : decoratorList.getDecorators()) {
if (!first) {
result.appendRaw(separator);
result.append(separator);
}
result.append(describeDecorator(decorator, escapedCalleeMapper, escaper));
result.appendRaw(describeDecorator(decorator).toString());
first = false;
}
}
if (!result.isEmpty()) {
result.appendRaw(suffix);
result.br();
}
return result.toFragment();
}
@NotNull
static HtmlChunk describeClass(@NotNull PyClass cls,
@NotNull Function<? super String, String> escapedNameMapper,
@NotNull Function<? super @NotNull String, @NlsSafe @NotNull String> escaper,
boolean linkAncestors,
@NotNull TypeEvalContext context) {
@NotNull TypeEvalContext context) {
final HtmlBuilder result = new HtmlBuilder();
@NlsSafe final String name = escapedNameMapper.apply(escaper.apply(StringUtil.notNullize(cls.getName(), PyNames.UNNAMED_ELEMENT)));
result.appendRaw(escaper.apply("class "));
result.appendRaw(name);
final @NlsSafe String name = StringUtil.notNullize(cls.getName(), PyNames.UNNAMED_ELEMENT);
result.append(styledSpan("class ", PyHighlighter.PY_KEYWORD)); //NON-NLS
result.append(styledSpan(name, PyHighlighter.PY_CLASS_DEFINITION));
final PyExpression[] superClasses = cls.getSuperClassExpressions();
if (superClasses.length > 0) {
result.appendRaw(escaper.apply("("));
result.append(styledSpan("(", PyHighlighter.PY_PARENTHS));
boolean isNotFirst = false;
for (PyExpression superClass : superClasses) {
if (isNotFirst) {
result.appendRaw(escaper.apply(", "));
result.append(styledSpan(", ", PyHighlighter.PY_COMMA));
}
else {
isNotFirst = true;
}
result.appendRaw(describeSuperClass(superClass, escaper, linkAncestors, context));
result.append(describeSuperClass(superClass, context));
}
result.appendRaw(escaper.apply(")"));
result.append(styledSpan(")", PyHighlighter.PY_PARENTHS));
}
return result.toFragment();
}
@NlsSafe
@NotNull
private static String describeSuperClass(@NotNull PyExpression expression,
@NotNull Function<? super String, String> escaper,
boolean link,
@NotNull TypeEvalContext context) {
if (link) {
if (expression instanceof PyReferenceExpression referenceExpression) {
if (!referenceExpression.isQualified()) {
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
for (ResolveResult result : referenceExpression.getReference(resolveContext).multiResolve(false)) {
final PsiElement element = result.getElement();
if (element instanceof PyClass) {
final String qualifiedName = ((PyClass)element).getQualifiedName();
if (qualifiedName != null) {
return PyDocumentationLink.toPossibleClass(escaper.apply(expression.getText()), qualifiedName, element, context);
}
}
private static HtmlChunk describeSuperClass(@NotNull PyExpression expression, @NotNull TypeEvalContext context) {
final @NlsSafe String expressionText = expression.getText();
if (expression instanceof PyReferenceExpression referenceExpression) {
if (!referenceExpression.isQualified()) {
final PyResolveContext resolveContext = PyResolveContext.defaultContext(context);
for (ResolveResult result : referenceExpression.getReference(resolveContext).multiResolve(false)) {
if (result.getElement() instanceof PyClass pyClass && pyClass.getQualifiedName() != null) {
return styledReference(PyDocumentationLink.toClass(pyClass, expressionText), pyClass);
}
}
}
else if (expression instanceof PySubscriptionExpression) {
final PyExpression operand = ((PySubscriptionExpression)expression).getOperand();
final PyExpression indexExpression = ((PySubscriptionExpression)expression).getIndexExpression();
}
else if (expression instanceof PySubscriptionExpression) {
final PyExpression operand = ((PySubscriptionExpression)expression).getOperand();
final PyExpression indexExpression = ((PySubscriptionExpression)expression).getIndexExpression();
if (indexExpression != null) {
return describeSuperClass(operand, escaper, true, context) +
escaper.apply("[") +
describeSuperClass(indexExpression, escaper, true, context) +
escaper.apply("]");
}
}
else if (expression instanceof PyKeywordArgument) {
final String keyword = ((PyKeywordArgument)expression).getKeyword();
final PyExpression valueExpression = ((PyKeywordArgument)expression).getValueExpression();
if (PyNames.METACLASS.equals(keyword) && valueExpression != null) {
return escaper.apply(PyNames.METACLASS + "=") + describeSuperClass(valueExpression, escaper, true, context);
}
}
else if (PyClassImpl.isSixWithMetaclassCall(expression)) {
final PyCallExpression callExpression = (PyCallExpression)expression;
final PyExpression callee = callExpression.getCallee();
if (callee != null) {
return StreamEx
.of(callExpression.getArguments())
.map(argument -> describeSuperClass(argument, escaper, true, context))
.joining(escaper.apply(", "), escaper.apply(callee.getText() + "("), escaper.apply(")"));
}
if (indexExpression != null) {
return new HtmlBuilder()
.append(describeSuperClass(operand, context))
.append(styledSpan("[", PyHighlighter.PY_BRACKETS))
.append(describeSuperClass(indexExpression, context))
.append(styledSpan("]", PyHighlighter.PY_BRACKETS))
.toFragment();
}
}
else if (expression instanceof PyKeywordArgument) {
final String keyword = ((PyKeywordArgument)expression).getKeyword();
final PyExpression valueExpression = ((PyKeywordArgument)expression).getValueExpression();
return escaper.apply(expression.getText());
if (PyNames.METACLASS.equals(keyword) && valueExpression != null) {
return new HtmlBuilder()
.append(styledSpan(PyNames.METACLASS, PyHighlighter.PY_KEYWORD_ARGUMENT))
.append(styledSpan("=", PyHighlighter.PY_OPERATION_SIGN))
.append(describeSuperClass(valueExpression, context))
.toFragment();
}
}
else if (PyClassImpl.isSixWithMetaclassCall(expression)) {
final PyCallExpression callExpression = (PyCallExpression)expression;
final PyExpression callee = callExpression.getCallee();
if (callee != null) {
return new HtmlBuilder()
.append(styledSpan(callee.getText(), DefaultLanguageHighlighterColors.IDENTIFIER))
.append(styledSpan("(", PyHighlighter.PY_PARENTHS))
.append(StreamEx
.of(callExpression.getArguments())
.map(argument -> describeSuperClass(argument, context))
.collect(HtmlChunk.toFragment(styledSpan(", ", PyHighlighter.PY_COMMA))))
.append(styledSpan(")", PyHighlighter.PY_PARENTHS))
.toFragment();
}
}
return HtmlChunk.text(expressionText);
}
@NotNull
private static HtmlChunk describeDecorator(@NotNull PyDecorator decorator,
@NotNull Function<String, @NlsSafe String> escapedCalleeMapper,
@NotNull Function<@NotNull String, @NotNull @NlsSafe String> escaper) {
private static HtmlChunk describeDecorator(@NotNull PyDecorator decorator) {
final HtmlBuilder result = new HtmlBuilder();
result.appendRaw(escaper.apply("@"))
.appendRaw(escapedCalleeMapper.apply(escaper.apply(PyUtil.getReadableRepr(decorator.getCallee(), false))));
result.append(styledSpan("@" + PyUtil.getReadableRepr(decorator.getCallee(), false), PyHighlighter.PY_DECORATOR));
final PyArgumentList argumentList = decorator.getArgumentList();
if (argumentList != null) {
result.appendRaw(escaper.apply(PyUtil.getReadableRepr(argumentList, false)));
}
result.append(styledSpan("(", PyHighlighter.PY_PARENTHS));
final PyExpression[] argumentsExpressions = argumentList.getArguments();
final HtmlChunk styledArgumentsList =
StreamEx
.of(argumentsExpressions)
.map(argExpression -> {
if (!(argExpression instanceof PyKeywordArgument keywordArg)) {
return highlightExpressionText(argExpression.getText(), argExpression);
}
final String argName = argExpression.getName();
if (argName == null) return null;
final PyExpression argValueExpression = keywordArg.getValueExpression();
if (argValueExpression == null) return null;
return new HtmlBuilder().append(styledSpan(argName, PyHighlighter.PY_KEYWORD_ARGUMENT))
.append(styledSpan("=", PyHighlighter.PY_OPERATION_SIGN))
.append(highlightExpressionText(argValueExpression.getText(), argValueExpression))
.toFragment();
})
.nonNull()
.collect(HtmlChunk.toFragment(styledSpan(", ", PyHighlighter.PY_COMMA)));
result.append(styledArgumentsList);
result.append(styledSpan(")", PyHighlighter.PY_PARENTHS));
}
return result.toFragment();
}
@@ -540,29 +538,13 @@ public class PythonDocumentationProvider implements DocumentationProvider {
return null;
}
private static void appendWithTags(@NotNull StringBuilder result, @NotNull String escapedContent, String @NotNull ... tags) {
for (String tag : tags) {
result.append("<").append(tag).append(">");
}
result.append(escapedContent);
for (int i = tags.length - 1; i >= 0; i--) {
result.append("</").append(tags[i]).append(">");
}
}
@NotNull
private static String escaped(@NotNull String unescaped) {
return StringUtil.escapeXmlEntities(unescaped);
}
@NotNull
private static String formatTypeWithLinks(@Nullable PyType type,
@Nullable PyTypedElement typeOwner,
@NotNull PsiElement anchor,
@NotNull TypeEvalContext context) {
private static @NotNull HtmlChunk formatTypeWithLinks(@Nullable PyType type,
@Nullable PyTypedElement typeOwner,
@NotNull PsiElement anchor,
@NotNull TypeEvalContext context) {
final HtmlBuilder builder = new HtmlBuilder();
describeTypeWithLinks(type, typeOwner, context, anchor, builder);
return builder.toString();
return builder.toFragment();
}
@Nullable
@@ -575,7 +557,7 @@ public class PythonDocumentationProvider implements DocumentationProvider {
if (owner instanceof PyClass) {
final QualifiedName importQName = QualifiedNameFinder.findCanonicalImportPath(element, element);
if (importQName != null) {
return QualifiedName.fromDottedString(importQName.toString() + "." + owner.getName() + "." + name);
return QualifiedName.fromDottedString(importQName + "." + owner.getName() + "." + name);
}
}
else if (PyUtil.isInitOrNewMethod(owner)) {

View File

@@ -70,17 +70,17 @@ public class PyHighlighter extends SyntaxHighlighterBase {
public static final TextAttributesKey PY_UNICODE_STRING = TextAttributesKey.createTextAttributesKey("PY.STRING.U", STRING);
public static final TextAttributesKey PY_NUMBER = TextAttributesKey.createTextAttributesKey("PY.NUMBER", NUMBER);
static final TextAttributesKey PY_OPERATION_SIGN = TextAttributesKey.createTextAttributesKey("PY.OPERATION_SIGN", OPERATION_SIGN);
public static final TextAttributesKey PY_OPERATION_SIGN = TextAttributesKey.createTextAttributesKey("PY.OPERATION_SIGN", OPERATION_SIGN);
static final TextAttributesKey PY_PARENTHS = TextAttributesKey.createTextAttributesKey("PY.PARENTHS", PARENTHESES);
public static final TextAttributesKey PY_PARENTHS = TextAttributesKey.createTextAttributesKey("PY.PARENTHS", PARENTHESES);
static final TextAttributesKey PY_BRACKETS = TextAttributesKey.createTextAttributesKey("PY.BRACKETS", BRACKETS);
public static final TextAttributesKey PY_BRACKETS = TextAttributesKey.createTextAttributesKey("PY.BRACKETS", BRACKETS);
static final TextAttributesKey PY_BRACES = TextAttributesKey.createTextAttributesKey("PY.BRACES", BRACES);
public static final TextAttributesKey PY_BRACES = TextAttributesKey.createTextAttributesKey("PY.BRACES", BRACES);
static final TextAttributesKey PY_COMMA = TextAttributesKey.createTextAttributesKey("PY.COMMA", COMMA);
public static final TextAttributesKey PY_COMMA = TextAttributesKey.createTextAttributesKey("PY.COMMA", COMMA);
static final TextAttributesKey PY_DOT = TextAttributesKey.createTextAttributesKey("PY.DOT", DOT);
public static final TextAttributesKey PY_DOT = TextAttributesKey.createTextAttributesKey("PY.DOT", DOT);
public static final TextAttributesKey PY_LINE_COMMENT = TextAttributesKey.createTextAttributesKey("PY.LINE_COMMENT", LINE_COMMENT);

View File

@@ -19,6 +19,7 @@ import com.intellij.openapi.progress.Task;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.util.io.FileUtilRt;
@@ -134,7 +135,7 @@ public final class PyUtil {
* @return the representation.
*/
@NotNull
@NonNls
@NlsSafe
public static String getReadableRepr(PsiElement elt, final boolean cutAtEOL) {
if (elt == null) return "null!";
ASTNode node = elt.getNode();

View File

@@ -15,6 +15,7 @@
*/
package com.jetbrains.python.psi.types;
import com.intellij.openapi.util.NlsSafe;
import com.intellij.openapi.util.Ref;
import com.intellij.psi.PsiElement;
import com.intellij.util.ObjectUtils;
@@ -25,6 +26,7 @@ import com.jetbrains.python.psi.PyNamedParameter;
import com.jetbrains.python.psi.PyParameter;
import com.jetbrains.python.psi.PyUtil;
import com.jetbrains.python.psi.impl.ParamHelper;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -32,7 +34,7 @@ import java.util.Objects;
import java.util.function.Predicate;
public final class PyCallableParameterImpl implements PyCallableParameter {
@Nullable private final String myName;
@Nullable private final @NlsSafe String myName;
@Nullable private final Ref<PyType> myType;
@Nullable private final PyExpression myDefaultValue;
@Nullable private final PyParameter myElement;
@@ -99,7 +101,7 @@ public final class PyCallableParameterImpl implements PyCallableParameter {
@Nullable
@Override
public String getName() {
public @Nls String getName() {
if (myName != null) {
return myName;
}

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#AncestorClassDocstringForConstructor.Sub">AncestorClassDocstringForConstructor.Sub</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Class&nbsp;docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#AncestorClassDocstringForConstructor.Base">Base</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#AncestorClassDocstringForConstructor.Sub">AncestorClassDocstringForConstructor.Sub</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Class docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#AncestorClassDocstringForConstructor.Base">Base</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#class#">Sub</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Class&nbsp;docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code>Base</code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#class#">Sub</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Class docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code>Base</code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ArgsDescriptionFromClassAndInitNotMixedGoogle">ArgsDescriptionFromClassAndInitNotMixedGoogle</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Params:</td><td valign="top"><p><code>param1</code> &ndash; param1 description</p><p><code>param2</code> &ndash; param2 description</p></td></tr><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>kw</code> &ndash; kw description</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ArgsDescriptionFromClassAndInitNotMixedGoogle">ArgsDescriptionFromClassAndInitNotMixedGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Params:</td><td valign="top"><p><code>param1</code> &ndash; param1 description</p><p><code>param2</code> &ndash; param2 description</p></td></tr><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>kw</code> &ndash; kw description</p></td></tr></table></body></html>

View File

@@ -1,4 +1,4 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#ArgsDescriptionFromClassDocstringGoogle.Parent">ArgsDescriptionFromClassDocstringGoogle.Parent</a><br/>def <b>__init__</b>(self,
p1: Any,
p2: Any,
**kwargs: Any) -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Params:</td><td valign="top"><p><code>p1</code> &ndash; p1 doc from class</p><p><code>p2</code> &ndash; p2 doc from class</p></td></tr><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>k</code> &ndash; k doc from class</p></td></tr><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#ArgsDescriptionFromClassDocstringGoogle.Parent">Parent</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ArgsDescriptionFromClassDocstringGoogle.Parent">ArgsDescriptionFromClassDocstringGoogle.Parent</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">,</span>
<span style="">p1</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">,</span>
<span style="">p2</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">,</span>
<span style="">**kwargs</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Params:</td><td valign="top"><p><code>p1</code> &ndash; p1 doc from class</p><p><code>p2</code> &ndash; p2 doc from class</p></td></tr><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>k</code> &ndash; k doc from class</p></td></tr><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#ArgsDescriptionFromClassDocstringGoogle.Parent">Parent</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ArgsFromInitNotTakenInClassDocstringGoogle">ArgsFromInitNotTakenInClassDocstringGoogle</a><br/>class&nbsp;<b>Parent</b></pre></div><div class="content">Unittest placeholder</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ArgsFromInitNotTakenInClassDocstringGoogle">ArgsFromInitNotTakenInClassDocstringGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">Parent</span></pre></div><div class="content">Unittest placeholder</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ArgsInClassDocGoogle">ArgsInClassDocGoogle</a><br/>class&nbsp;<b>Parent</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Params:</td><td valign="top"><p><code>p1</code> &ndash; p1 doc from class</p><p><code>p2</code> &ndash; p2 doc from class</p></td></tr><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>k</code> &ndash; k doc from class</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ArgsInClassDocGoogle">ArgsInClassDocGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">Parent</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Params:</td><td valign="top"><p><code>p1</code> &ndash; p1 doc from class</p><p><code>p2</code> &ndash; p2 doc from class</p></td></tr><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>k</code> &ndash; k doc from class</p></td></tr></table></body></html>

View File

@@ -1,2 +1,2 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ArgsKwargsTypes">ArgsKwargsTypes</a><br/>def <b>func</b>(*args: <a href="psi_element://#typename#str">str</a>,
**kwargs: <a href="psi_element://#typename#str">str</a>) -&gt; None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ArgsKwargsTypes">ArgsKwargsTypes</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">*args</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span><span style="">,</span>
<span style="">**kwargs</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ArgumentList">ArgumentList</a><br/>def <b>foo</b>() -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;foo.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ArgumentList">ArgumentList</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#AsyncFunctionQuickDoc">AsyncFunctionQuickDoc</a><br/>async def <b>func</b>() -&gt; Coroutine[Any,&nbsp;Any,&nbsp;None]</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#AsyncFunctionQuickDoc">AsyncFunctionQuickDoc</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">async </span><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;">Coroutine<span style="">[</span>Any<span style="">, </span>Any<span style="">, </span><span style="color:#000080;font-weight:bold;">None</span><span style="">]</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
async def func() -&gt; Coroutine[Any,&nbsp;Any,&nbsp;None]
<span style="color:#000080;font-weight:bold;">async </span><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;">Coroutine<span style="">[</span>Any<span style="">, </span>Any<span style="">, </span><span style="color:#000080;font-weight:bold;">None</span><span style="">]</span></span>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#AttributeDescriptionEmptyGoogle">AttributeDescriptionEmptyGoogle</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>attr</code></p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#AttributeDescriptionEmptyGoogle">AttributeDescriptionEmptyGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>attr</code></p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Class attribute <b>attr</b> of <a href="psi_element://#typename#AttributeDocsNotMixed.MyClass">AttributeDocsNotMixed.MyClass</a><br/>attr: <a href="psi_element://#typename#int">int</a> = 1</pre></div><div class="content">Docstring&nbsp;from&nbsp;attr</div></body></html>
<html><body><div class="definition"><pre>Class attribute <b>attr</b> of <a href="psi_element://#typename#AttributeDocsNotMixed.MyClass">AttributeDocsNotMixed.MyClass</a><br/><span style="color:#000000;">attr</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style=""> = </span><span style="color:#0000ff;">1</span></pre></div><div class="content">Docstring from attr</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#AttributesDescriptionFromClassDocstringGoogle.Parent">AttributesDescriptionFromClassDocstringGoogle.Parent</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; a1 doc from parent</p><p><code>a2</code> &ndash; a2 doc from parent</p></td></tr><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#AttributesDescriptionFromClassDocstringGoogle.Parent">Parent</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#AttributesDescriptionFromClassDocstringGoogle.Parent">AttributesDescriptionFromClassDocstringGoogle.Parent</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; a1 doc from parent</p><p><code>a2</code> &ndash; a2 doc from parent</p></td></tr><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#AttributesDescriptionFromClassDocstringGoogle.Parent">Parent</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#AttributesOrderGoogle">AttributesOrderGoogle</a><br/>class&nbsp;<b>Parent</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; a1 doc</p><p><code>a2</code> &ndash; a2 doc</p><p><code>a3</code> &ndash; a3 doc</p><p><code>a4</code> &ndash; a4 doc</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#AttributesOrderGoogle">AttributesOrderGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">Parent</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; a1 doc</p><p><code>a2</code> &ndash; a2 doc</p><p><code>a3</code> &ndash; a3 doc</p><p><code>a4</code> &ndash; a4 doc</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#builtins">builtins</a><br/>def <b>len</b>(__obj: Sized) -&gt; <a href="psi_element://#typename#int">int</a></pre></div><div class="content">len(object)&nbsp;-&gt;&nbsp;integer<br/><br/>Return&nbsp;the&nbsp;number&nbsp;of&nbsp;items&nbsp;of&nbsp;a&nbsp;sequence&nbsp;or&nbsp;collection.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#builtins">builtins</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">len</span><span style="">(</span><span style="">__obj</span><span style="">: </span><span style="color:#000000;">Sized</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span></pre></div><div class="content">len(object) -&gt; integer<br/><br/>Return the number of items of a sequence or collection.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#CallFunc">CallFunc</a><br/>def <b>foo</b>() -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;foo.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#CallFunc">CallFunc</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionEpydoc">ClassAndInstanceAttributesInOneSectionEpydoc</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p><p><code>state</code> &ndash; State</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionEpydoc">ClassAndInstanceAttributesInOneSectionEpydoc</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p><p><code>state</code> &ndash; State</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionGoogle">ClassAndInstanceAttributesInOneSectionGoogle</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionGoogle">ClassAndInstanceAttributesInOneSectionGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionNumpy">ClassAndInstanceAttributesInOneSectionNumpy</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionNumpy">ClassAndInstanceAttributesInOneSectionNumpy</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionRest">ClassAndInstanceAttributesInOneSectionRest</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p><p><code>state</code> &ndash; State</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassAndInstanceAttributesInOneSectionRest">ClassAndInstanceAttributesInOneSectionRest</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>msg</code> &ndash; Message</p><p><code>code</code> &ndash; Code</p><p><code>state</code> &ndash; State</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassAndInstanceAttributesWithSameNameNotDuplicatedGoogle">ClassAndInstanceAttributesWithSameNameNotDuplicatedGoogle</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; attr1 doc</p><p><code>a2</code> &ndash; attr2 doc</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassAndInstanceAttributesWithSameNameNotDuplicatedGoogle">ClassAndInstanceAttributesWithSameNameNotDuplicatedGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; attr1 doc</p><p><code>a2</code> &ndash; attr2 doc</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Class attribute <b>the_attr</b> of <a href="psi_element://#typename#ClassAttr.C">ClassAttr.C</a><br/>the_attr: <a href="psi_element://#typename#str">str</a> = &quot;&quot;</pre></div><div class="content">The&nbsp;documentation&nbsp;for&nbsp;the&nbsp;attribute.</div></body></html>
<html><body><div class="definition"><pre>Class attribute <b>the_attr</b> of <a href="psi_element://#typename#ClassAttr.C">ClassAttr.C</a><br/><span style="color:#000000;">the_attr</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span><span style=""> = </span><span style="color:#008000;font-weight:bold;">&quot;&quot;</span></pre></div><div class="content">The documentation for the attribute.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Class attribute <b>a1</b> of <a href="psi_element://#typename#ClassAttributeDescriptionFromClassDocstringGoogle.Parent">ClassAttributeDescriptionFromClassDocstringGoogle.Parent</a><br/>a1: <a href="psi_element://#typename#int">int</a> = 0</pre></div><div class="content">a1 doc</div></body></html>
<html><body><div class="definition"><pre>Class attribute <b>a1</b> of <a href="psi_element://#typename#ClassAttributeDescriptionFromClassDocstringGoogle.Parent">ClassAttributeDescriptionFromClassDocstringGoogle.Parent</a><br/><span style="color:#000000;">a1</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style=""> = </span><span style="color:#0000ff;">0</span></pre></div><div class="content">a1 doc</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Class attribute <b>attr</b> of <a href="psi_element://#typename#ClassAttributeDescriptionFromClassDocstringRest.MyClass">ClassAttributeDescriptionFromClassDocstringRest.MyClass</a><br/>attr: <a href="psi_element://#typename#int">int</a> = 0</pre></div><div class="content">attr description</div></body></html>
<html><body><div class="definition"><pre>Class attribute <b>attr</b> of <a href="psi_element://#typename#ClassAttributeDescriptionFromClassDocstringRest.MyClass">ClassAttributeDescriptionFromClassDocstringRest.MyClass</a><br/><span style="color:#000000;">attr</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style=""> = </span><span style="color:#0000ff;">0</span></pre></div><div class="content">attr description</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassConstructor">ClassConstructor</a><br/>class&nbsp;<b>Foo</b>(<a href="psi_element://#typename#object">object</a>)</pre></div><div class="content">Doc&nbsp;of&nbsp;Foo.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassConstructor">ClassConstructor</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">Foo</span><span style="">(</span><span style="color:#000080;"><a href="psi_element://#typename#object">object</a></span><span style="">)</span></pre></div><div class="content">Doc of Foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#ClassDocstringForConstructor.MyClass">ClassDocstringForConstructor.MyClass</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Class&nbsp;docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#ClassDocstringForConstructor.MyClass">MyClass</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ClassDocstringForConstructor.MyClass">ClassDocstringForConstructor.MyClass</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Class docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#ClassDocstringForConstructor.MyClass">MyClass</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassDocumentationTakenFromConstructor">ClassDocumentationTakenFromConstructor</a><br/>class&nbsp;<b>MyClass</b></pre></div><div class="content">Constructor&nbsp;docstring</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassDocumentationTakenFromConstructor">ClassDocumentationTakenFromConstructor</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span></pre></div><div class="content">Constructor docstring</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#ClassUndocumentedConstructor.Foo">ClassUndocumentedConstructor.Foo</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;Foo.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#ClassUndocumentedConstructor.Foo">Foo</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ClassUndocumentedConstructor.Foo">ClassUndocumentedConstructor.Foo</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of Foo.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#typename#ClassUndocumentedConstructor.Foo">Foo</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#ClassUndocumentedEmptyConstructor.Foo">ClassUndocumentedEmptyConstructor.Foo</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;Moo()</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#func#ClassUndocumentedEmptyConstructor.Moo.__init__">Moo.__init__</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ClassUndocumentedEmptyConstructor.Foo">ClassUndocumentedEmptyConstructor.Foo</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of Moo()</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#func#ClassUndocumentedEmptyConstructor.Moo.__init__">Moo.__init__</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ClassWithAllKindSuperClassExpressions">ClassWithAllKindSuperClassExpressions</a><br/>class&nbsp;<b>A</b>(metaclass=<a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Meta1">Meta1</a>,&nbsp;six.with_metaclass(<a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Meta2">Meta2</a>,&nbsp;<a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Base1">Base1</a>),&nbsp;<a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Base2">Base2</a>[<a href="psi_element://#typename#int">int</a>],&nbsp;<a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Base3">Base3</a>,&nbsp;Base4)</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ClassWithAllKindSuperClassExpressions">ClassWithAllKindSuperClassExpressions</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span><span style="">(</span><span style="color:#660099;">metaclass</span><span style="">=</span><a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Meta1">Meta1</a><span style="">, </span><span style="color:#000000;">six.with_metaclass</span><span style="">(</span><a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Meta2">Meta2</a><span style="">, </span><a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Base1">Base1</a><span style="">)</span><span style="">, </span><a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Base2">Base2</a><span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">]</span><span style="">, </span><a href="psi_element://#typename#ClassWithAllKindSuperClassExpressions.Base3">Base3</a><span style="">, </span>Base4<span style="">)</span></pre></div></body></html>

View File

@@ -1,3 +1,3 @@
<html><body><div class="definition"><pre>ConcatenateInGeneric.Y<br/>def <b>__init__</b>(self,
f: (Concatenate(int, ParamSpec("P")))&nbsp;-&gt;&nbsp;U,
attr: U) -&gt; None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ConcatenateInGeneric.Y">ConcatenateInGeneric.Y</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">,</span>
<span style="">f</span><span style="">: </span><span style="color:#000000;"><span style="">(</span>Concatenate(int, ParamSpec(&quot;P&quot;))<span style="">)</span> -&gt; U</span><span style="">,</span>
<span style="">attr</span><span style="">: </span><span style="color:#000000;">U</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ConcatenateInParam">ConcatenateInParam</a><br/>def <b>remove</b>(x: (Concatenate(int, ParamSpec("P")))&nbsp;-&gt;&nbsp;<a href="psi_element://#typename#int">int</a>) -&gt; (ParamSpec("P"))&nbsp;-&gt;&nbsp;<a href="psi_element://#typename#bool">bool</a></pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ConcatenateInParam">ConcatenateInParam</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">remove</span><span style="">(</span><span style="">x</span><span style="">: </span><span style="color:#000000;"><span style="">(</span>Concatenate(int, ParamSpec(&quot;P&quot;))<span style="">)</span> -&gt; <span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="">(</span>ParamSpec(&quot;P&quot;)<span style="">)</span> -&gt; <span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ConcatenateInReturn">ConcatenateInReturn</a><br/>def <b>add</b>(x: (ParamSpec("P"))&nbsp;-&gt;&nbsp;<a href="psi_element://#typename#int">int</a>) -&gt; (Concatenate(str, ParamSpec("P")))&nbsp;-&gt;&nbsp;<a href="psi_element://#typename#bool">bool</a></pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ConcatenateInReturn">ConcatenateInReturn</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">add</span><span style="">(</span><span style="">x</span><span style="">: </span><span style="color:#000000;"><span style="">(</span>ParamSpec(&quot;P&quot;)<span style="">)</span> -&gt; <span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="">(</span>Concatenate(str, ParamSpec(&quot;P&quot;))<span style="">)</span> -&gt; <span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span></pre></div></body></html>

View File

@@ -1,2 +1,2 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ConcatenateSeveralFirstParamInParam">ConcatenateSeveralFirstParamInParam</a><br/>def <b>remove</b>(x: (Concatenate(int, bool, list, ParamSpec("P")))&nbsp;-&gt;&nbsp;<a href="psi_element://#typename#int">int</a>)
-&gt; (ParamSpec("P"))&nbsp;-&gt;&nbsp;<a href="psi_element://#typename#bool">bool</a></pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ConcatenateSeveralFirstParamInParam">ConcatenateSeveralFirstParamInParam</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">remove</span><span style="">(</span><span style="">x</span><span style="">: </span><span style="color:#000000;"><span style="">(</span>Concatenate(int, bool, list, ParamSpec(&quot;P&quot;))<span style="">)</span> -&gt; <span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style="">)</span>
-&gt; <span style="color:#000000;"><span style="">(</span>ParamSpec(&quot;P&quot;)<span style="">)</span> -&gt; <span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span></pre></div></body></html>

View File

@@ -1,4 +1,3 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#DefaultValues.C">DefaultValues.C</a><br/>def <b>method</b>(self=42,
foo: <a href="psi_element://#typename#list">list</a>[<a href="psi_element://#typename#int">int</a>] = [1,
2],
bar: <a href="psi_element://#typename#str">str</a> = &quot;&lt;br/&gt;&quot;) -&gt; None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#DefaultValues.C">DefaultValues.C</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">method</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">=</span><span style="color:#0000ff;">42</span><span style="">,</span>
<span style="">foo</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#list">list</a></span><span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">]</span></span><span style=""> = </span><span style="">[</span><span style="color:#0000ff;">1</span><span style="">,<br></span><span style="">&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;</span><span style="color:#0000ff;">2</span><span style="">]</span><span style="">,</span>
<span style="">bar</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span><span style=""> = </span><span style="color:#008000;font-weight:bold;">&quot;&lt;br/&gt;&quot;</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#DirectClass">DirectClass</a><br/>class&nbsp;<b>Foo</b>(<a href="psi_element://#typename#object">object</a>)</pre></div><div class="content">Doc&nbsp;of&nbsp;Foo.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#DirectClass">DirectClass</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">Foo</span><span style="">(</span><span style="color:#000080;"><a href="psi_element://#typename#object">object</a></span><span style="">)</span></pre></div><div class="content">Doc of Foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#DirectFunc">DirectFunc</a><br/>def <b>foo</b>() -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;foo.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#DirectFunc">DirectFunc</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#DocOnImplementationWithOverloads">DocOnImplementationWithOverloads</a><br/>def <b>foo</b>(param: <a href="psi_element://#typename#bool">bool</a>) -&gt; <a href="psi_element://#typename#bool">bool</a></pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#DocOnImplementationWithOverloads">DocOnImplementationWithOverloads</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">param</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#DocOnOverloadDefinition">DocOnOverloadDefinition</a><br/>@<i>overload</i><br>def <b>foo</b>(param: <a href="psi_element://#typename#int">int</a>) -&gt; <a href="psi_element://#typename#int">int</a></pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#DocOnOverloadDefinition">DocOnOverloadDefinition</a></code></div><div class="definition"><pre><span style="color:#808000;">@overload</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">param</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#Docstring">Docstring</a><br/>def <b>foo</b>() -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;foo.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#Docstring">Docstring</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#EmptyTupleType">EmptyTupleType</a><br/>def <b>func</b>() -&gt; tuple</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#EmptyTupleType">EmptyTupleType</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;">tuple</span></span></pre></div></body></html>

View File

@@ -1,2 +1 @@
class MyClass
&lt;tag/&gt;
<span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span>

View File

@@ -1,2 +1 @@
class MyClass
&lt;tag/&gt;
<span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">MyClass</span>

View File

@@ -1,2 +1 @@
def func() -&gt; None
&lt;tag/&gt;
<span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ExceptionDescriptionGoogle">ExceptionDescriptionGoogle</a><br/>def <b>func</b>() -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Raises:</td><td valign="top"><p><code>Exception1</code></p><p><code>Exception2</code> &ndash; foo</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ExceptionDescriptionGoogle">ExceptionDescriptionGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Raises:</td><td valign="top"><p><code>Exception1</code></p><p><code>Exception2</code> &ndash; foo</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ExceptionDescriptionRest">ExceptionDescriptionRest</a><br/>def <b>func</b>() -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Raises:</td><td valign="top"><p><code>Exception1</code></p><p><code>Exception2</code> &ndash; bar</p><p><code>Exception3</code></p><p><code>Exception4</code> &ndash; foo</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ExceptionDescriptionRest">ExceptionDescriptionRest</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Raises:</td><td valign="top"><p><code>Exception1</code></p><p><code>Exception2</code> &ndash; bar</p><p><code>Exception3</code></p><p><code>Exception4</code> &ndash; foo</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#ExplicitlyAnnotatedClsParamType.MyClass">ExplicitlyAnnotatedClsParamType.MyClass</a><br/>@<i>classmethod</i><br>def <b>factory</b>(cls: Type[T]) -&gt; T</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ExplicitlyAnnotatedClsParamType.MyClass">ExplicitlyAnnotatedClsParamType.MyClass</a></code></div><div class="definition"><pre><span style="color:#808000;">@classmethod</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">factory</span><span style="">(</span><span style="color:#94558d;">cls</span><span style="">: </span><span style="color:#000000;">Type<span style="">[</span>T<span style="">]</span></span><span style="">)</span> -&gt; <span style="color:#000000;">T</span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#ExplicitlyAnnotatedSelfParamType.MyClass">ExplicitlyAnnotatedSelfParamType.MyClass</a><br/>def <b>method</b>(self: T) -&gt; None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#ExplicitlyAnnotatedSelfParamType.MyClass">ExplicitlyAnnotatedSelfParamType.MyClass</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">method</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">: </span><span style="color:#000000;">T</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1,4 +1,4 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#FunctionWrapping">FunctionWrapping</a><br/>def <b>maybe_add_numbers</b>(a: <a href="psi_element://#typename#int">int</a>&nbsp;|&nbsp;None,
b: <a href="psi_element://#typename#int">int</a>&nbsp;|&nbsp;None,
c: <a href="psi_element://#typename#int">int</a>&nbsp;|&nbsp;None,
d: <a href="psi_element://#typename#int">int</a>&nbsp;|&nbsp;None) -&gt; <a href="psi_element://#typename#int">int</a>&nbsp;|&nbsp;None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#FunctionWrapping">FunctionWrapping</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">maybe_add_numbers</span><span style="">(</span><span style="">a</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span><span style="">,</span>
<span style="">b</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span><span style="">,</span>
<span style="">c</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span><span style="">,</span>
<span style="">d</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#GoogleDocstringWithReturnValueDescriptionWithoutType">GoogleDocstringWithReturnValueDescriptionWithoutType</a><br/>def <b>func</b>() -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Returns:</td><td valign="top">Nothing</td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#GoogleDocstringWithReturnValueDescriptionWithoutType">GoogleDocstringWithReturnValueDescriptionWithoutType</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Returns:</td><td valign="top">Nothing</td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#HeterogeneousTuple">HeterogeneousTuple</a><br/>def <b>get_tuple</b>() -&gt; tuple[<a href="psi_element://#typename#int">int</a>,&nbsp;<a href="psi_element://#typename#int">int</a>,&nbsp;<a href="psi_element://#typename#str">str</a>]</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#HeterogeneousTuple">HeterogeneousTuple</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">get_tuple</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;">tuple</span><span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">, </span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">, </span><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span><span style="">]</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#HomogeneousTuple">HomogeneousTuple</a><br/>def <b>get_tuple</b>() -&gt; tuple[<a href="psi_element://#typename#str">str</a>,&nbsp;...]</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#HomogeneousTuple">HomogeneousTuple</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">get_tuple</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;">tuple</span><span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span><span style="">, </span><span style="">...</span><span style="">]</span></span></pre></div></body></html>

View File

@@ -1,2 +1 @@
class A(object)
Doc of A
<span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span><span style="">(</span><span style="color:#000080;"><a href="psi_element://#typename#object">object</a></span><span style="">)</span>

View File

@@ -1 +1 @@
class A(metaclass=Meta1, six.with_metaclass(Meta2, Base1), Base2[int], Base3, Base4)
<span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span><span style="">(</span><span style="color:#660099;">metaclass</span><span style="">=</span><a href="psi_element://#typename#HoverOverClassWithAllKindSuperClassExpressions.Meta1">Meta1</a><span style="">, </span><span style="color:#000000;">six.with_metaclass</span><span style="">(</span><a href="psi_element://#typename#HoverOverClassWithAllKindSuperClassExpressions.Meta2">Meta2</a><span style="">, </span><a href="psi_element://#typename#HoverOverClassWithAllKindSuperClassExpressions.Base1">Base1</a><span style="">)</span><span style="">, </span><a href="psi_element://#typename#HoverOverClassWithAllKindSuperClassExpressions.Base2">Base2</a><span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">]</span><span style="">, </span><a href="psi_element://#typename#HoverOverClassWithAllKindSuperClassExpressions.Base3">Base3</a><span style="">, </span>Base4<span style="">)</span>

View File

@@ -1,2 +1 @@
variable &quot;x&quot;
Inferred type: str | int
Variable &quot;x&quot;<br/>Inferred type: <span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span><span style=""> | </span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span>

View File

@@ -1 +1 @@
def foo(arg: Any) -&gt; <a href="psi_element://#typename#int">int</a>
<span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">arg</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span>

View File

@@ -1,3 +1 @@
@decorator1, @decorator2
class A
Doc of A
<span style="color:#808000;">@decorator1</span>, <span style="color:#808000;">@decorator2</span><br/><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span>

View File

@@ -1,2 +1 @@
@decorator1, @decorator2
def foo(param: Any) -&gt; Any&nbsp;|&nbsp;None
<span style="color:#808000;">@decorator1</span>, <span style="color:#808000;">@decorator2</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">param</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;">Any<span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span>

View File

@@ -1,2 +1 @@
class A
def f(self) -&gt; <a href="psi_element://#typename#int">int</a>
<span style="color:#000080;font-weight:bold;">class</span>&nbsp;<span style="color:#000000;">A</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">f</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span>

View File

@@ -1,3 +1 @@
@decorator
class A
Doc of A
<span style="color:#808000;">@decorator</span><br/><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span>

View File

@@ -1,2 +1 @@
@decorator
def foo(param: Any) -&gt; Any&nbsp;|&nbsp;None
<span style="color:#808000;">@decorator</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">param</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;">Any<span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span>

View File

@@ -1,2 +1 @@
@typing.overload
def foo(p: <a href="psi_element://#typename#str">str</a>) -&gt; <a href="psi_element://#typename#str">str</a>
<span style="color:#808000;">@typing.overload</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">p</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span>

View File

@@ -1 +1 @@
def foo(param: <a href="psi_element://#typename#bool">bool</a>) -&gt; <a href="psi_element://#typename#bool">bool</a>
<span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">param</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span>

View File

@@ -1,2 +1 @@
parameter &quot;self&quot; of method &quot;foo&quot;
Inferred type: A
Parameter &quot;self&quot; of method &quot;foo&quot;<br/>Inferred type: <a href="psi_element://#typename#HoverOverParameter.A">A</a>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#Indented">Indented</a><br/>def <b>foo</b>() -&gt; None</pre></div><div class="content">Doc&nbsp;of&nbsp;foo.<br/>It&nbsp;has&nbsp;two&nbsp;lines.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#Indented">Indented</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of foo.<br/>It has two lines.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#InheritedAttributesGoogle">InheritedAttributesGoogle</a><br/>class&nbsp;<b>Child</b>(<a href="psi_element://#typename#InheritedAttributesGoogle.Parent">Parent</a>)</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; a1 doc from child</p><p><code>a2</code> &ndash; a2 doc from child</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#InheritedAttributesGoogle">InheritedAttributesGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">Child</span><span style="">(</span><a href="psi_element://#typename#InheritedAttributesGoogle.Parent">Parent</a><span style="">)</span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Attributes:</td><td valign="top"><p><code>a1</code> &ndash; a1 doc from child</p><p><code>a2</code> &ndash; a2 doc from child</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#InheritedMethod.B">InheritedMethod.B</a><br/>def <b>foo</b>(self) -&gt; None</pre></div><div class="content">Doc&nbsp;from&nbsp;A.foo.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#func#InheritedMethod.A.foo">A.foo</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#InheritedMethod.B">InheritedMethod.B</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc from A.foo.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#func#InheritedMethod.A.foo">A.foo</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#class#">Sub</a><br/>def <b>method</b>(self) -&gt; None</pre></div><div class="content">Base&nbsp;class&nbsp;docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code>Base.method</code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#class#">Sub</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">method</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Base class docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code>Base.method</code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#InitEmptyDocstringOverClassDocstringGoogle.MyClass">InitEmptyDocstringOverClassDocstringGoogle.MyClass</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#InitEmptyDocstringOverClassDocstringGoogle.MyClass">InitEmptyDocstringOverClassDocstringGoogle.MyClass</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#class#">MyClass</a><br/>def <b>__init__</b>(self) -&gt; None</pre></div><div class="content">Class&nbsp;docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#class#">MyClass</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#class#">MyClass</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#b200b2;">__init__</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Class docstring.</div><table class="sections"><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#class#">MyClass</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Instance attribute <b>foo</b> of <a href="psi_element://#typename#InstanceAttr.C">InstanceAttr.C</a><br/>foo: <a href="psi_element://#typename#str">str</a> = &quot;Foo&quot;</pre></div><div class="content">The&nbsp;docstring&nbsp;for&nbsp;the&nbsp;attribute&nbsp;foo.</div></body></html>
<html><body><div class="definition"><pre>Instance attribute <b>foo</b> of <a href="psi_element://#typename#InstanceAttr.C">InstanceAttr.C</a><br/><span style="color:#000000;">foo</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span></span><span style=""> = </span><span style="color:#008000;font-weight:bold;">&quot;Foo&quot;</span></pre></div><div class="content">The docstring for the attribute foo.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Instance attribute <b>a1</b> of <a href="psi_element://#typename#InstanceAttributeDescriptionFromClassDocstringGoogle.Parent">InstanceAttributeDescriptionFromClassDocstringGoogle.Parent</a><br/>a1: <a href="psi_element://#typename#int">int</a> = 0</pre></div><div class="content">a1 doc</div></body></html>
<html><body><div class="definition"><pre>Instance attribute <b>a1</b> of <a href="psi_element://#typename#InstanceAttributeDescriptionFromClassDocstringGoogle.Parent">InstanceAttributeDescriptionFromClassDocstringGoogle.Parent</a><br/><span style="color:#000000;">a1</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style=""> = </span><span style="color:#0000ff;">0</span></pre></div><div class="content">a1 doc</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Instance attribute <b>attr</b> of <a href="psi_element://#typename#InstanceAttributeDescriptionFromClassDocstringRest.MyClass">InstanceAttributeDescriptionFromClassDocstringRest.MyClass</a><br/>attr: <a href="psi_element://#typename#int">int</a> = 0</pre></div><div class="content">attr description</div></body></html>
<html><body><div class="definition"><pre>Instance attribute <b>attr</b> of <a href="psi_element://#typename#InstanceAttributeDescriptionFromClassDocstringRest.MyClass">InstanceAttributeDescriptionFromClassDocstringRest.MyClass</a><br/><span style="color:#000000;">attr</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span></span><span style=""> = </span><span style="color:#0000ff;">0</span></pre></div><div class="content">attr description</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#KeywordArgsDescriptionEpydoc">KeywordArgsDescriptionEpydoc</a><br/>def <b>func</b>(**args: Any) -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>baz</code></p><p><code>foo</code> &ndash; bar</p><p><code>quux</code></p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#KeywordArgsDescriptionEpydoc">KeywordArgsDescriptionEpydoc</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">**args</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>baz</code></p><p><code>foo</code> &ndash; bar</p><p><code>quux</code></p></td></tr></table></body></html>

View File

@@ -1,4 +1,4 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#KeywordArgsDescriptionForMissingParameter.Sub">KeywordArgsDescriptionForMissingParameter.Sub</a><br/>def <b>method</b>(self,
*,
foo: Any,
bar: Any) -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>foo</code> &ndash; foo</p><p><code>bar</code> &ndash; bar</p></td></tr><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#func#KeywordArgsDescriptionForMissingParameter.Base.method">Base.method</a></code></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#KeywordArgsDescriptionForMissingParameter.Sub">KeywordArgsDescriptionForMissingParameter.Sub</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">method</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">,</span>
<span style="">*</span><span style="">,</span>
<span style="">foo</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">,</span>
<span style="">bar</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>foo</code> &ndash; foo</p><p><code>bar</code> &ndash; bar</p></td></tr><tr><td class="section" valign="top">Copied from:</td><td valign="top"><code><a href="psi_element://#func#KeywordArgsDescriptionForMissingParameter.Base.method">Base.method</a></code></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#KeywordArgsDescriptionGoogle">KeywordArgsDescriptionGoogle</a><br/>def <b>func</b>(**args: Any) -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>foo</code> &ndash; bar</p><p><code>baz</code></p><p><code>quux</code></p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#KeywordArgsDescriptionGoogle">KeywordArgsDescriptionGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">**args</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>foo</code> &ndash; bar</p><p><code>baz</code></p><p><code>quux</code></p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#KeywordArgsDescriptionRest">KeywordArgsDescriptionRest</a><br/>def <b>func</b>(**args: Any) -&gt; None</pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>baz</code></p><p><code>foo</code> &ndash; bar</p></td></tr></table></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#KeywordArgsDescriptionRest">KeywordArgsDescriptionRest</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">func</span><span style="">(</span><span style="">**args</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Keyword args:</td><td valign="top"><p><code>baz</code></p><p><code>foo</code> &ndash; bar</p></td></tr></table></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ManyDecoratorsClass">ManyDecoratorsClass</a><br/>@<i>decorator1</i><br>@<i>decorator2</i><br>class&nbsp;<b>A</b></pre></div><div class="content">Doc&nbsp;of&nbsp;A</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ManyDecoratorsClass">ManyDecoratorsClass</a></code></div><div class="definition"><pre><span style="color:#808000;">@decorator1</span><br/><span style="color:#808000;">@decorator2</span><br/><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span></pre></div><div class="content">Doc of A</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#ManyDecoratorsFunction">ManyDecoratorsFunction</a><br/>@<i>decorator1</i><br>@<i>decorator2</i><br>def <b>foo</b>(param: Any) -&gt; Any&nbsp;|&nbsp;None</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#ManyDecoratorsFunction">ManyDecoratorsFunction</a></code></div><div class="definition"><pre><span style="color:#808000;">@decorator1</span><br/><span style="color:#808000;">@decorator2</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">param</span><span style="">: </span><span style="color:#000000;">Any</span><span style="">)</span> -&gt; <span style="color:#000000;">Any<span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span></pre></div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#typename#Method.Foo">Method.Foo</a><br/>@<i>deco</i><br>def <b>meth</b>(self) -&gt; Any&nbsp;|&nbsp;None</pre></div><div class="content">Doc&nbsp;of&nbsp;meth.</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Class"/>&nbsp;<code><a href="psi_element://#typename#Method.Foo">Method.Foo</a></code></div><div class="definition"><pre><span style="color:#808000;">@deco</span><br/><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">meth</span><span style="">(</span><span style="color:#94558d;">self</span><span style="">)</span> -&gt; <span style="color:#000000;">Any<span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span></pre></div><div class="content">Doc of meth.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre>Module <b>Module</b></pre></div><div class="content">Module's&nbsp;doc.</div></body></html>
<html><body><div class="definition"><pre>Module <b>Module</b></pre></div><div class="content">Module&#39;s doc.</div></body></html>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#MultilineAssignedValueForTarget">MultilineAssignedValueForTarget</a><br/>var: <a href="psi_element://#typename#list">list</a>[<a href="psi_element://#typename#int">int</a>] = [1,...</pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#MultilineAssignedValueForTarget">MultilineAssignedValueForTarget</a></code></div><div class="definition"><pre><span style="color:#000000;">var</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#list">list</a></span><span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">]</span></span><span style=""> = </span><span style="">[</span><span style="color:#0000ff;">1</span><span style="">,</span><span style="">...</span></pre></div></body></html>

View File

@@ -1,4 +1,4 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#MultilineReturnSectionGoogle">MultilineReturnSectionGoogle</a><br/>def <b>foo</b>() -&gt; <a href="psi_element://#typename#bool">bool</a></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Returns:</td><td valign="top">True if successful, False otherwise.
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#MultilineReturnSectionGoogle">MultilineReturnSectionGoogle</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Returns:</td><td valign="top">True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the Returns section followed by a colon.

View File

@@ -1,4 +1,4 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#MultilineReturnSectionNumpy">MultilineReturnSectionNumpy</a><br/>def <b>foo</b>() -&gt; <a href="psi_element://#typename#bool">bool</a></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Returns:</td><td valign="top">True if successful, False otherwise.
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#MultilineReturnSectionNumpy">MultilineReturnSectionNumpy</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">foo</span><span style="">(</span><span style="">)</span> -&gt; <span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#bool">bool</a></span></span></pre></div><div class="content">Unittest placeholder</div><table class="sections"><tr><td class="section" valign="top">Returns:</td><td valign="top">True if successful, False otherwise.
The return type is optional and may be specified at the beginning of
the Returns section followed by a colon.

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#numpy">numpy</a><br/>class&nbsp;<b>ndarray</b></pre></div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#numpy">numpy</a></code></div><div class="definition"><pre><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">ndarray</span></pre></div></body></html>

View File

@@ -1,2 +1 @@
def ones(shape: <a href="psi_element://#typename#int">int</a>&nbsp;|&nbsp;Iterable[<a href="psi_element://#typename#int">int</a>], dtype: <a href="psi_element://#typename#object">object</a>&nbsp;|&nbsp;None = None, order: <a href="psi_element://#typename#str">str</a>&nbsp;|&nbsp;None = &#39;C&#39;) -&gt; <a href="psi_element://#typename#ndarray">ndarray</a>
**Test docstring**<br/>Return a new array of given shape and type, filled with ones.
<span style="color:#000080;font-weight:bold;">def </span><span style="color:#000000;">ones</span><span style="">(</span><span style="">shape</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style=""> | </span>Iterable<span style="">[</span><span style="color:#000080;"><a href="psi_element://#typename#int">int</a></span><span style="">]</span></span><span style="">,</span> <span style="">dtype</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#object">object</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span><span style=""> = </span><span style="color:#000080;font-weight:bold;">None</span><span style="">,</span> <span style="">order</span><span style="">: </span><span style="color:#000000;"><span style="color:#000080;"><a href="psi_element://#typename#str">str</a></span><span style=""> | </span><span style="color:#000080;font-weight:bold;">None</span></span><span style=""> = </span><span style="color:#008000;font-weight:bold;">&#39;C&#39;</span><span style="">)</span> -&gt; <span style="color:#000000;"><a href="psi_element://#typename#numpy.core.multiarray.ndarray">ndarray</a></span>

View File

@@ -1 +1 @@
<html><body><div class="definition"><pre><a href="psi_element://#module#OneDecoratorClass">OneDecoratorClass</a><br/>@<i>decorator</i><br>class&nbsp;<b>A</b></pre></div><div class="content">Doc&nbsp;of&nbsp;A</div></body></html>
<html><body><div class="bottom"><icon src="AllIcons.Nodes.Package"/>&nbsp;<code><a href="psi_element://#module#OneDecoratorClass">OneDecoratorClass</a></code></div><div class="definition"><pre><span style="color:#808000;">@decorator</span><br/><span style="color:#000080;font-weight:bold;">class </span><span style="color:#000000;">A</span></pre></div><div class="content">Doc of A</div></body></html>

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