PythonSpaceHandler uses PyDocStringGenerator. Finally get rid of PythonDocumentationProvider#generateDocumentationContentStub

This commit is contained in:
Mikhail Golubev
2015-08-24 01:04:21 +03:00
parent 50fb7947fe
commit f651eb3b14
3 changed files with 24 additions and 122 deletions

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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;
}
}