From a460641e25e4166f5b06eb79d741baa9c0cbc3a8 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Fri, 2 Aug 2013 15:59:40 +0400 Subject: [PATCH] fixed identifiers completion for plain docstring --- .../PyDocstringCompletionContributor.java | 61 ++++++++++--------- .../identifiersInPlainDocstring.after.py | 2 + .../completion/identifiersInPlainDocstring.py | 2 + .../inspections/StatementEffectPrint.py | 1 + .../inspections/StatementEffectPrint_after.py | 1 + .../python/PythonCompletionTest.java | 8 +++ 6 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 python/testData/completion/identifiersInPlainDocstring.after.py create mode 100644 python/testData/completion/identifiersInPlainDocstring.py diff --git a/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java b/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java index ebc64e168d16..7cd6f7fbd2d9 100644 --- a/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java +++ b/python/src/com/jetbrains/python/codeInsight/completion/PyDocstringCompletionContributor.java @@ -1,49 +1,54 @@ package com.jetbrains.python.codeInsight.completion; -import com.intellij.codeInsight.completion.*; +import com.intellij.codeInsight.completion.CompletionContributor; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.codeInsight.lookup.LookupElementBuilder; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleUtilCore; +import com.intellij.psi.PsiFile; import com.intellij.psi.util.PsiTreeUtil; -import com.intellij.util.ProcessingContext; -import com.jetbrains.python.PyTokenTypes; +import com.jetbrains.python.documentation.PyDocumentationSettings; import com.jetbrains.python.psi.PyDocStringOwner; -import com.jetbrains.python.psi.PyStringLiteralExpression; import com.jetbrains.python.refactoring.PyRefactoringUtil; -import org.jetbrains.annotations.NotNull; import java.util.Collection; -import static com.intellij.patterns.PlatformPatterns.psiElement; - /** * User : ktisha */ public class PyDocstringCompletionContributor extends CompletionContributor { - public PyDocstringCompletionContributor() { - extend(CompletionType.BASIC, - psiElement().inside(PyStringLiteralExpression.class).withElementType(PyTokenTypes.DOCSTRING), - new IdentifierCompletionProvider()); - } - private static class IdentifierCompletionProvider extends CompletionProvider { - - private IdentifierCompletionProvider() { - } - - @Override - protected void addCompletions(@NotNull CompletionParameters parameters, - ProcessingContext context, - @NotNull CompletionResultSet result) { - final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(parameters.getOriginalPosition(), PyDocStringOwner.class); - if (docStringOwner != null) { + public void fillCompletionVariants(final CompletionParameters parameters, CompletionResultSet result) { + final PyDocStringOwner docStringOwner = PsiTreeUtil.getParentOfType(parameters.getOriginalPosition(), PyDocStringOwner.class); + if (docStringOwner != null) { + final Module module = ModuleUtilCore.findModuleForPsiElement(docStringOwner); + if (module != null) { + final PsiFile file = docStringOwner.getContainingFile(); + result = result.withPrefixMatcher(getPrefix(parameters.getOffset(), file)); + final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(module); + if (!settings.isPlain(file)) return; final Collection identifiers = PyRefactoringUtil.collectUsedNames(docStringOwner); for (String identifier : identifiers) result.addElement(LookupElementBuilder.create(identifier)); + + final Collection fileIdentifiers = PyRefactoringUtil.collectUsedNames(parameters.getOriginalFile()); + for (String identifier : fileIdentifiers) + result.addElement(LookupElementBuilder.create(identifier)); } - - - final Collection fileIdentifiers = PyRefactoringUtil.collectUsedNames(parameters.getOriginalFile()); - for (String identifier : fileIdentifiers) - result.addElement(LookupElementBuilder.create(identifier)); } } + + private static String getPrefix(int offset, PsiFile file) { + if (offset > 0) { + offset--; + } + final String text = file.getText(); + StringBuilder prefixBuilder = new StringBuilder(); + while(offset > 0 && Character.isLetterOrDigit(text.charAt(offset))) { + prefixBuilder.insert(0, text.charAt(offset)); + offset--; + } + return prefixBuilder.toString(); + } } diff --git a/python/testData/completion/identifiersInPlainDocstring.after.py b/python/testData/completion/identifiersInPlainDocstring.after.py new file mode 100644 index 000000000000..440570bceefc --- /dev/null +++ b/python/testData/completion/identifiersInPlainDocstring.after.py @@ -0,0 +1,2 @@ +def foo(bar): + """ Variable bar """ \ No newline at end of file diff --git a/python/testData/completion/identifiersInPlainDocstring.py b/python/testData/completion/identifiersInPlainDocstring.py new file mode 100644 index 000000000000..acaddd7b4fe7 --- /dev/null +++ b/python/testData/completion/identifiersInPlainDocstring.py @@ -0,0 +1,2 @@ +def foo(bar): + """ Variable b """ \ No newline at end of file diff --git a/python/testData/inspections/StatementEffectPrint.py b/python/testData/inspections/StatementEffectPrint.py index 6d4ef60eb1b1..03aa1156e1fc 100644 --- a/python/testData/inspections/StatementEffectPrint.py +++ b/python/testData/inspections/StatementEffectPrint.py @@ -1,2 +1,3 @@ print \ "foo" +a = 1 \ No newline at end of file diff --git a/python/testData/inspections/StatementEffectPrint_after.py b/python/testData/inspections/StatementEffectPrint_after.py index 3d3d53a16273..a06f4711f292 100644 --- a/python/testData/inspections/StatementEffectPrint_after.py +++ b/python/testData/inspections/StatementEffectPrint_after.py @@ -1 +1,2 @@ print("foo") +a = 1 \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java index fe8a74f6d610..5a593c9ff789 100644 --- a/python/testSrc/com/jetbrains/python/PythonCompletionTest.java +++ b/python/testSrc/com/jetbrains/python/PythonCompletionTest.java @@ -437,6 +437,14 @@ public class PythonCompletionTest extends PyTestCase { } } + public void testIdentifiersInPlainDocstring() { + final PyDocumentationSettings settings = PyDocumentationSettings.getInstance(myFixture.getModule()); + settings.setFormat(DocStringFormat.PLAIN); + myFixture.configureByFile("completion/identifiersInPlainDocstring.py"); + myFixture.completeBasic(); + myFixture.checkResultByFile("completion/identifiersInPlainDocstring.after.py"); + } + public void testNoneInArgList() { // PY-3464 doTest3K(); }