mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-01-08 06:39:38 +07:00
PythonSpaceHandler uses PyDocStringGenerator. Finally get rid of PythonDocumentationProvider#generateDocumentationContentStub
This commit is contained in:
@@ -303,16 +303,11 @@ public class PyDocstringGenerator {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (builder.getLines().size() > 1) {
|
||||
if (!builder.getLines().isEmpty()) {
|
||||
return myQuotes + '\n' + builder.buildContent(indentation, true) + '\n' + indentation + myQuotes;
|
||||
}
|
||||
else {
|
||||
return myQuotes + builder.buildContent(indentation, false) + myQuotes;
|
||||
}
|
||||
}
|
||||
else {
|
||||
return myQuotes + '\n' + indentation + myQuotes;
|
||||
}
|
||||
return myQuotes + '\n' + indentation + myQuotes;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -23,8 +23,6 @@ import com.intellij.openapi.application.ApplicationManager;
|
||||
import com.intellij.openapi.application.ModalityState;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.projectRoots.Sdk;
|
||||
import com.intellij.openapi.roots.ProjectRootManager;
|
||||
@@ -36,12 +34,8 @@ import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.intellij.psi.util.QualifiedName;
|
||||
import com.intellij.util.Function;
|
||||
import com.jetbrains.python.PyNames;
|
||||
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
|
||||
import com.jetbrains.python.console.PydevConsoleRunner;
|
||||
import com.jetbrains.python.console.PydevDocumentationProvider;
|
||||
import com.jetbrains.python.debugger.PySignature;
|
||||
import com.jetbrains.python.debugger.PySignatureCacheManager;
|
||||
import com.jetbrains.python.debugger.PySignatureUtil;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import com.jetbrains.python.psi.impl.PyBuiltinCache;
|
||||
import com.jetbrains.python.psi.resolve.QualifiedNameFinder;
|
||||
@@ -76,9 +70,6 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i
|
||||
@NonNls static final String LINK_TYPE_PARAM = "#param#";
|
||||
@NonNls static final String LINK_TYPE_TYPENAME = "#typename#";
|
||||
|
||||
@NonNls private static final String RST_PREFIX = ":";
|
||||
@NonNls private static final String EPYDOC_PREFIX = "@";
|
||||
|
||||
// provides ctrl+hover info
|
||||
@Override
|
||||
@Nullable
|
||||
@@ -541,80 +532,4 @@ public class PythonDocumentationProvider extends AbstractDocumentationProvider i
|
||||
|
||||
public static final LinkWrapper LinkMyClass = new LinkWrapper(LINK_TYPE_CLASS);
|
||||
// link item to containing class
|
||||
|
||||
@NotNull
|
||||
private static String generateDocumentationContentStub(@NotNull PyFunction element, @NotNull String offset, boolean checkReturn) {
|
||||
final Module module = ModuleUtilCore.findModuleForPsiElement(element);
|
||||
if (module == null) return "";
|
||||
final PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(module);
|
||||
String result = "";
|
||||
if (documentationSettings.isEpydocFormat(element.getContainingFile())) {
|
||||
result += generateContent(element, offset, EPYDOC_PREFIX, checkReturn);
|
||||
}
|
||||
else if (documentationSettings.isReSTFormat(element.getContainingFile())) {
|
||||
result += generateContent(element, offset, RST_PREFIX, checkReturn);
|
||||
}
|
||||
else {
|
||||
result += offset;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@NotNull
|
||||
private static String getStatementListIndent(@NotNull PyStatementList statementList) {
|
||||
final PsiWhiteSpace whitespace = PsiTreeUtil.getPrevSiblingOfType(statementList, PsiWhiteSpace.class);
|
||||
if (whitespace != null) {
|
||||
final String text = whitespace.getText();
|
||||
final int index = text.lastIndexOf('\n');
|
||||
if (index >= 0) {
|
||||
return text.substring(index + 1);
|
||||
}
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
@NotNull
|
||||
public String generateDocumentationContentStub(@NotNull PyFunction function, boolean checkReturn) {
|
||||
final PyStatementList insertPlace = function.getStatementList();
|
||||
return generateDocumentationContentStub(function, "\n" + getStatementListIndent(insertPlace), checkReturn);
|
||||
}
|
||||
|
||||
private static String generateContent(@NotNull PyFunction function, @NotNull String offset, String prefix, boolean checkReturn) {
|
||||
//TODO: this code duplicates PyDocstringGenerator in some parts
|
||||
|
||||
final StringBuilder builder = new StringBuilder(offset);
|
||||
final TypeEvalContext context = TypeEvalContext.userInitiated(function.getProject(), function.getContainingFile());
|
||||
final PySignature signature = PySignatureCacheManager.getInstance(function.getProject()).findSignature(function);
|
||||
final PyDecoratorList decoratorList = function.getDecoratorList();
|
||||
final boolean classMethod = decoratorList != null && decoratorList.findDecorator(PyNames.CLASSMETHOD) != null;
|
||||
for (PyParameter p : PyUtil.getParameters(function, context)) {
|
||||
final String parameterName = p.getName();
|
||||
if (parameterName == null ||
|
||||
parameterName.equals(PyNames.CANONICAL_SELF) ||
|
||||
(classMethod && parameterName.equals(PyNames.CANONICAL_CLS))) {
|
||||
continue;
|
||||
}
|
||||
final String argType = signature == null ? null : signature.getArgTypeQualifiedName(parameterName);
|
||||
|
||||
if (argType == null) {
|
||||
builder.append(prefix);
|
||||
builder.append("param ");
|
||||
builder.append(parameterName);
|
||||
builder.append(": ");
|
||||
builder.append(offset);
|
||||
}
|
||||
if (PyCodeInsightSettings.getInstance().INSERT_TYPE_DOCSTUB || argType != null) {
|
||||
builder.append(prefix);
|
||||
builder.append("type ");
|
||||
builder.append(parameterName);
|
||||
builder.append(": ");
|
||||
if (signature != null && argType != null) {
|
||||
builder.append(PySignatureUtil.getShortestImportableName(function, argType));
|
||||
}
|
||||
builder.append(offset);
|
||||
}
|
||||
}
|
||||
builder.append(PyDocstringGenerator.generateRaiseOrReturn(function, offset, prefix, checkReturn));
|
||||
return builder.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,20 +17,17 @@ package com.jetbrains.python.editor;
|
||||
|
||||
import com.intellij.codeInsight.CodeInsightSettings;
|
||||
import com.intellij.codeInsight.editorActions.TypedHandlerDelegate;
|
||||
import com.intellij.openapi.editor.Document;
|
||||
import com.intellij.openapi.editor.Editor;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtilCore;
|
||||
import com.intellij.openapi.project.Project;
|
||||
import com.intellij.openapi.util.TextRange;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.util.PsiTreeUtil;
|
||||
import com.jetbrains.python.documentation.DocStringFormat;
|
||||
import com.jetbrains.python.documentation.PyDocumentationSettings;
|
||||
import com.jetbrains.python.documentation.PythonDocumentationProvider;
|
||||
import com.jetbrains.python.psi.PyClass;
|
||||
import com.jetbrains.python.psi.PyElement;
|
||||
import com.jetbrains.python.psi.PyFile;
|
||||
import com.jetbrains.python.psi.PyFunction;
|
||||
import com.jetbrains.python.documentation.DocStringUtil;
|
||||
import com.jetbrains.python.documentation.PyDocstringGenerator;
|
||||
import com.jetbrains.python.psi.PyDocStringOwner;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
@@ -43,32 +40,27 @@ public class PythonSpaceHandler extends TypedHandlerDelegate {
|
||||
if (c == ' ' && codeInsightSettings.JAVADOC_STUB_ON_ENTER) {
|
||||
int offset = editor.getCaretModel().getOffset();
|
||||
PsiElement element = file.findElementAt(offset);
|
||||
if (element == null && offset > 1)
|
||||
element = file.findElementAt(offset-2);
|
||||
if (element == null && offset > 1) {
|
||||
element = file.findElementAt(offset - 2);
|
||||
}
|
||||
if (element == null) return Result.CONTINUE;
|
||||
int expectedStringStart = editor.getCaretModel().getOffset()-4; // """ or ''' plus space char
|
||||
int expectedStringStart = offset - 4; // """ or ''' plus space char
|
||||
if (PythonDocCommentUtil.atDocCommentStart(element, expectedStringStart)) {
|
||||
PythonDocumentationProvider provider = new PythonDocumentationProvider();
|
||||
PyFunction fun = PsiTreeUtil.getParentOfType(element, PyFunction.class);
|
||||
final PsiElement parent = element.getParent();
|
||||
if (fun != null) {
|
||||
String docStub = provider.generateDocumentationContentStub(fun, false);
|
||||
docStub += parent.getText().substring(0,3);
|
||||
if (docStub.length() != 0) {
|
||||
editor.getDocument().insertString(editor.getCaretModel().getOffset(), docStub);
|
||||
Module module = ModuleUtilCore.findModuleForPsiElement(element);
|
||||
if (module == null) return Result.CONTINUE;
|
||||
PyDocumentationSettings documentationSettings = PyDocumentationSettings.getInstance(module);
|
||||
if (documentationSettings.getFormat() != DocStringFormat.PLAIN) {
|
||||
editor.getCaretModel().moveCaretRelatively(100, 1, false, false, false);
|
||||
}
|
||||
return Result.STOP;
|
||||
final PyDocStringOwner docOwner = PsiTreeUtil.getParentOfType(element, PyDocStringOwner.class);
|
||||
if (docOwner != null) {
|
||||
final Document document = editor.getDocument();
|
||||
final String quotes = document.getText(TextRange.from(expectedStringStart, 3));
|
||||
final String docString = new PyDocstringGenerator(docOwner)
|
||||
.forceNewMode()
|
||||
.addFirstEmptyLine()
|
||||
.withQuotes(quotes)
|
||||
.forceAddReturn()
|
||||
.buildDocString();
|
||||
document.insertString(offset, docString.substring(3));
|
||||
if (DocStringUtil.getDocStringFormat(parent) != DocStringFormat.PLAIN) {
|
||||
editor.getCaretModel().moveCaretRelatively(100, 1, false, false, false);
|
||||
}
|
||||
}
|
||||
PyElement klass = PsiTreeUtil.getParentOfType(element, PyClass.class, PyFile.class);
|
||||
if (klass != null) {
|
||||
editor.getDocument().insertString(editor.getCaretModel().getOffset(),
|
||||
PythonDocCommentUtil.generateDocForClass(klass, parent.getText().substring(0, 3)));
|
||||
return Result.STOP;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user