diff --git a/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java b/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java index 42e138e69181..06190a099d7c 100644 --- a/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java +++ b/python/src/com/jetbrains/python/documentation/PyDocstringGenerator.java @@ -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 diff --git a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java index 1d558fb8d9da..2ab161cd9823 100644 --- a/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java +++ b/python/src/com/jetbrains/python/documentation/PythonDocumentationProvider.java @@ -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(); - } } diff --git a/python/src/com/jetbrains/python/editor/PythonSpaceHandler.java b/python/src/com/jetbrains/python/editor/PythonSpaceHandler.java index 9dedcbe9288c..c11654fe819e 100644 --- a/python/src/com/jetbrains/python/editor/PythonSpaceHandler.java +++ b/python/src/com/jetbrains/python/editor/PythonSpaceHandler.java @@ -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; } }