diff --git a/python/src/com/jetbrains/python/documentation/docstrings/SphinxDocString.java b/python/src/com/jetbrains/python/documentation/docstrings/SphinxDocString.java index 37f2d2cbcfdf..e6e2c04518a9 100644 --- a/python/src/com/jetbrains/python/documentation/docstrings/SphinxDocString.java +++ b/python/src/com/jetbrains/python/documentation/docstrings/SphinxDocString.java @@ -74,7 +74,7 @@ public class SphinxDocString extends TagBasedDocString { @Nullable @Override public String getParamDescription(@Nullable String paramName) { - return paramName != null ? concatTrimmedLines(getTagValue("param", paramName)) : null; + return paramName != null ? concatTrimmedLines(getTagValue(PARAM_TAGS, paramName)) : null; } @Override diff --git a/python/src/com/jetbrains/python/documentation/docstrings/TagBasedDocString.java b/python/src/com/jetbrains/python/documentation/docstrings/TagBasedDocString.java index ce7cd4c0df99..ee38d1304c84 100644 --- a/python/src/com/jetbrains/python/documentation/docstrings/TagBasedDocString.java +++ b/python/src/com/jetbrains/python/documentation/docstrings/TagBasedDocString.java @@ -24,7 +24,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.Map; import java.util.regex.Matcher; @@ -187,22 +186,24 @@ public abstract class TagBasedDocString extends DocStringLineParser implements S @Nullable public Substring getTagValue(String[] tagNames, @NotNull String argName) { for (String tagName : tagNames) { - Map argValues = myArgTagValues.get(tagName); - if (argValues != null) { - return argValues.get(new Substring(argName)); + final Map argValues = myArgTagValues.get(tagName); + final Substring key = new Substring(argName); + if (argValues != null && argValues.containsKey(key)) { + return argValues.get(key); } } return null; } public List getTagArguments(String... tagNames) { + final List result = new ArrayList<>(); for (String tagName : tagNames) { final Map map = myArgTagValues.get(tagName); if (map != null) { - return new ArrayList<>(map.keySet()); + result.addAll(map.keySet()); } } - return Collections.emptyList(); + return result; } @NotNull diff --git a/python/testSrc/com/jetbrains/python/EpydocStringTest.java b/python/testSrc/com/jetbrains/python/EpydocStringTest.java index 799417988213..2959e2e50ce8 100644 --- a/python/testSrc/com/jetbrains/python/EpydocStringTest.java +++ b/python/testSrc/com/jetbrains/python/EpydocStringTest.java @@ -23,6 +23,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import static com.intellij.testFramework.UsefulTestCase.assertOrderedEquals; +import static com.intellij.testFramework.UsefulTestCase.assertSameElements; /** * @author yole @@ -122,4 +123,45 @@ public class EpydocStringTest extends TestCase { assertEquals("(ParsedDocstring, list of Field)", EpydocString.removeInlineMarkup("C{(L{ParsedDocstring}, list of L{Field})}")); } + + public void testDifferentExceptionTags() { + final EpydocString docstring = createEpydocDocString("@raises Exception1: foo\n" + + "@except Exception2: bar"); + assertSameElements(docstring.getRaisedExceptions(), "Exception1", "Exception2"); + assertEquals("foo", docstring.getRaisedExceptionDescription("Exception1")); + assertEquals("bar", docstring.getRaisedExceptionDescription("Exception2")); + } + + public void testFieldAliases() { + final EpydocString docstring = createEpydocDocString("@param p1: p1 description\n" + + "@parameter p2: p2 description\n" + + "@arg p3: p3 description\n" + + "@argument p4: p4 description\n" + + "\n" + + "@kwarg key1: key1 description\n" + + "@keyword key2: key2 description\n" + + "@kwparam key3: key3 description\n" + + "\n" + + "@raises Exc1: Exc1 description \n" + + "@raise Exc2: Exc2 description \n" + + "@except Exc3: Exc3 description \n" + + "@exception Exc4: Exc4 description "); + + assertSameElements(docstring.getParameters(), "p1", "p2", "p3", "p4"); + assertEquals("p1 description", docstring.getParamDescription("p1")); + assertEquals("p2 description", docstring.getParamDescription("p2")); + assertEquals("p3 description", docstring.getParamDescription("p3")); + assertEquals("p4 description", docstring.getParamDescription("p4")); + + assertSameElements(docstring.getKeywordArguments(), "key1", "key2", "key3"); + assertEquals("key1 description", docstring.getKeywordArgumentDescription("key1")); + assertEquals("key2 description", docstring.getKeywordArgumentDescription("key2")); + assertEquals("key3 description", docstring.getKeywordArgumentDescription("key3")); + + assertSameElements(docstring.getRaisedExceptions(), "Exc1", "Exc2", "Exc3", "Exc4"); + assertEquals("Exc1 description", docstring.getRaisedExceptionDescription("Exc1")); + assertEquals("Exc2 description", docstring.getRaisedExceptionDescription("Exc2")); + assertEquals("Exc3 description", docstring.getRaisedExceptionDescription("Exc3")); + assertEquals("Exc4 description", docstring.getRaisedExceptionDescription("Exc4")); + } } diff --git a/python/testSrc/com/jetbrains/python/SphinxDocstringTest.java b/python/testSrc/com/jetbrains/python/SphinxDocstringTest.java new file mode 100644 index 000000000000..b552a4be9080 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/SphinxDocstringTest.java @@ -0,0 +1,45 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.jetbrains.python; + +import com.jetbrains.python.documentation.docstrings.SphinxDocString; +import com.jetbrains.python.fixtures.PyTestCase; +import com.jetbrains.python.toolbox.Substring; +import org.intellij.lang.annotations.Language; +import org.jetbrains.annotations.NotNull; + +public class SphinxDocstringTest extends PyTestCase { + private static SphinxDocString createSphinxDocstring(@Language("TEXT") @NotNull String unescapedContentWithoutQuotes) { + return new SphinxDocString(new Substring(unescapedContentWithoutQuotes)); + } + + public void testFieldAliases() { + final SphinxDocString docstring = createSphinxDocstring(":param p1: p1 description\n" + + ":parameter p2: p2 description\n" + + ":arg p3: p3 description\n" + + ":argument p4: p4 description\n" + + "\n" + + ":key key1: key1 description\n" + + ":keyword key2: key2 description\n" + + "\n" + + ":raises Exc1: Exc1 description \n" + + ":raise Exc2: Exc2 description \n" + + ":except Exc3: Exc3 description \n" + + ":exception Exc4: Exc4 description "); + + assertSameElements(docstring.getParameters(), "p1", "p2", "p3", "p4"); + assertEquals("p1 description", docstring.getParamDescription("p1")); + assertEquals("p2 description", docstring.getParamDescription("p2")); + assertEquals("p3 description", docstring.getParamDescription("p3")); + assertEquals("p4 description", docstring.getParamDescription("p4")); + + assertSameElements(docstring.getKeywordArguments(), "key1", "key2"); + assertEquals("key1 description", docstring.getKeywordArgumentDescription("key1")); + assertEquals("key2 description", docstring.getKeywordArgumentDescription("key2")); + + assertSameElements(docstring.getRaisedExceptions(), "Exc1", "Exc2", "Exc3", "Exc4"); + assertEquals("Exc1 description", docstring.getRaisedExceptionDescription("Exc1")); + assertEquals("Exc2 description", docstring.getRaisedExceptionDescription("Exc2")); + assertEquals("Exc3 description", docstring.getRaisedExceptionDescription("Exc3")); + assertEquals("Exc4 description", docstring.getRaisedExceptionDescription("Exc4")); + } +}