From b997c753a5f4dd53ed9a0f892f3ca25d6c8e6e31 Mon Sep 17 00:00:00 2001 From: Ekaterina Tuzova Date: Fri, 11 May 2012 18:32:33 +0400 Subject: [PATCH] fixed PY-6548 @type in class docstrings does not recognize class variables --- .../documentation/DocStringParameterReference.java | 10 ++++++++++ .../documentation/DocStringReferenceProvider.java | 3 +++ .../python/documentation/EpydocString.java | 3 --- .../python/documentation/SphinxDocString.java | 8 ++++---- .../python/documentation/StructuredDocString.java | 4 ++++ .../PyUnresolvedReferencesInspection/docstring.py | 13 +++++++++++++ .../PyUnresolvedReferencesInspectionTest.java | 5 +++++ 7 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 python/testData/inspections/PyUnresolvedReferencesInspection/docstring.py diff --git a/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java b/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java index 0fae6c6b9925..450e55dc2d4b 100644 --- a/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java +++ b/python/src/com/jetbrains/python/documentation/DocStringParameterReference.java @@ -40,6 +40,16 @@ public class DocStringParameterReference extends PsiReferenceBase { if (init != null) { return resolveParameter(init); } + else { + final PyStatementList statementList = ((PyClass)owner).getStatementList(); + for (PsiElement element : statementList.getChildren()) { + if (element instanceof PyAssignmentStatement) { + final PyExpression[] targets = ((PyAssignmentStatement)element).getTargets(); + if (targets.length > 0 && targets[0].getText().equals(getCanonicalText())) + return targets[0]; + } + } + } } return null; } diff --git a/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java b/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java index 026fa4f45cbc..43be0b2c4730 100644 --- a/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java +++ b/python/src/com/jetbrains/python/documentation/DocStringReferenceProvider.java @@ -47,6 +47,9 @@ public class DocStringReferenceProvider extends PsiReferenceProvider { docString.getTagArguments(StructuredDocString.PARAM_TYPE_TAGS), "parameter_type")); result.addAll(referencesFromNames(element, offset, docString, docString.getKeywordArgumentSubstrings(), "keyword")); + + result.addAll(referencesFromNames(element, offset, docString, + docString.getTagArguments(StructuredDocString.VARIABLE_TAGS), "variable")); } return result.toArray(new PsiReference[result.size()]); } diff --git a/python/src/com/jetbrains/python/documentation/EpydocString.java b/python/src/com/jetbrains/python/documentation/EpydocString.java index 1cdcf52f175a..83eb84e55198 100644 --- a/python/src/com/jetbrains/python/documentation/EpydocString.java +++ b/python/src/com/jetbrains/python/documentation/EpydocString.java @@ -11,12 +11,9 @@ import java.util.*; * @author yole */ public class EpydocString extends StructuredDocString { - public static String[] RAISES_TAGS = new String[] { "raises", "raise", "except", "exception" }; - public static String[] RETURN_TAGS = new String[] { "return", "returns" }; public static String[] RTYPE_TAGS = new String[] { "rtype", "returntype" }; public static String[] KEYWORD_ARGUMENT_TAGS = new String[] { "keyword", "kwarg", "kwparam" }; - public static String[] VARIABLE_TAGS = new String[] { "ivar", "cvar", "var" }; public static String[] ALL_TAGS = new String[] { "@param", "@type", "@return", "@rtype", "@keyword", "@raise", "@ivar", "@cvar", "@var", "@group", "@sort", "@note", "@attention", diff --git a/python/src/com/jetbrains/python/documentation/SphinxDocString.java b/python/src/com/jetbrains/python/documentation/SphinxDocString.java index 935300639723..ac59d6b87a10 100644 --- a/python/src/com/jetbrains/python/documentation/SphinxDocString.java +++ b/python/src/com/jetbrains/python/documentation/SphinxDocString.java @@ -61,12 +61,12 @@ public class SphinxDocString extends StructuredDocString { @Override public String getReturnDescription() { - return concatTrimmedLines(getTagValue(EpydocString.RETURN_TAGS)); + return concatTrimmedLines(getTagValue(RETURN_TAGS)); } @Override public List getRaisedExceptions() { - return toUniqueStrings(getTagArguments(EpydocString.RAISES_TAGS)); + return toUniqueStrings(getTagArguments(RAISES_TAGS)); } @Nullable @@ -75,12 +75,12 @@ public class SphinxDocString extends StructuredDocString { if (exceptionName == null) { return null; } - return concatTrimmedLines(getTagValue(EpydocString.RAISES_TAGS, exceptionName)); + return concatTrimmedLines(getTagValue(RAISES_TAGS, exceptionName)); } @Override public String getAttributeDescription() { - return concatTrimmedLines(getTagValue(EpydocString.VARIABLE_TAGS)); + return concatTrimmedLines(getTagValue(VARIABLE_TAGS)); } @Override diff --git a/python/src/com/jetbrains/python/documentation/StructuredDocString.java b/python/src/com/jetbrains/python/documentation/StructuredDocString.java index 41e66f233cc3..f2b6e4641825 100644 --- a/python/src/com/jetbrains/python/documentation/StructuredDocString.java +++ b/python/src/com/jetbrains/python/documentation/StructuredDocString.java @@ -27,6 +27,10 @@ public abstract class StructuredDocString { public static String[] PARAM_TAGS = new String[] { "param", "parameter", "arg", "argument" }; public static String[] PARAM_TYPE_TAGS = new String[] { "type" }; + public static String[] VARIABLE_TAGS = new String[] { "ivar", "cvar", "var" }; + + public static String[] RAISES_TAGS = new String[] { "raises", "raise", "except", "exception" }; + public static String[] RETURN_TAGS = new String[] { "return", "returns" }; @Nullable public static StructuredDocString parse(String text) { diff --git a/python/testData/inspections/PyUnresolvedReferencesInspection/docstring.py b/python/testData/inspections/PyUnresolvedReferencesInspection/docstring.py new file mode 100644 index 000000000000..d7439be62056 --- /dev/null +++ b/python/testData/inspections/PyUnresolvedReferencesInspection/docstring.py @@ -0,0 +1,13 @@ +class Test(object): + """ + @cvar some: some variable + @type some: C{str} + """ + some = 'hello' + + def q(self, another): + """ + @param another: another variable + @type another: C{str} + """ + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java index 4d5fdd2228eb..f483114d1c9e 100644 --- a/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java +++ b/python/testSrc/com/jetbrains/python/inspections/PyUnresolvedReferencesInspectionTest.java @@ -116,6 +116,11 @@ public class PyUnresolvedReferencesInspectionTest extends PyTestCase { doMultiFileTest("a.py"); } + // PY-6548 + public void testDocstring() { + doTest(); + } + private void doTest() { myFixture.configureByFile(TEST_DIRECTORY + getTestName(true) + ".py"); myFixture.enableInspections(PyUnresolvedReferencesInspection.class);