diff --git a/python/src/com/jetbrains/python/documentation/DocStringUtil.java b/python/src/com/jetbrains/python/documentation/DocStringUtil.java
index 320392860333..c7879624b5d9 100644
--- a/python/src/com/jetbrains/python/documentation/DocStringUtil.java
+++ b/python/src/com/jetbrains/python/documentation/DocStringUtil.java
@@ -38,7 +38,6 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
-import java.util.regex.Matcher;
/**
* User: catherine
@@ -124,12 +123,12 @@ public class DocStringUtil {
}
public static boolean isGoogleDocString(@NotNull String text) {
- final Matcher matcher = GoogleCodeStyleDocString.SECTION_HEADER_RE.matcher(text);
- if (!matcher.find()) {
- return false;
+ for (@NonNls String title : StringUtil.findMatches(text, GoogleCodeStyleDocString.SECTION_HEADER, 1)) {
+ if (SectionBasedDocString.SECTION_NAMES.contains(title.toLowerCase())) {
+ return true;
+ }
}
- @NonNls final String foundName = matcher.group(1).trim();
- return SectionBasedDocString.SECTION_NAMES.contains(foundName.toLowerCase());
+ return false;
}
public static boolean isNumpyDocstring(@NotNull String text) {
diff --git a/python/src/com/jetbrains/python/documentation/GoogleCodeStyleDocString.java b/python/src/com/jetbrains/python/documentation/GoogleCodeStyleDocString.java
index 830fccd6eaf6..61f3a1a0184a 100644
--- a/python/src/com/jetbrains/python/documentation/GoogleCodeStyleDocString.java
+++ b/python/src/com/jetbrains/python/documentation/GoogleCodeStyleDocString.java
@@ -31,8 +31,8 @@ import java.util.regex.Pattern;
* @see Google Python Style: Docstrings
*/
public class GoogleCodeStyleDocString extends SectionBasedDocString {
- public static final Pattern SECTION_HEADER_RE = Pattern.compile("\\s*([\\w\\s]+):\\s*", Pattern.MULTILINE);
- private static final Pattern FIELD_NAME_AND_TYPE_RE = Pattern.compile("\\s*(.+?)\\s*\\(\\s*(.*?)\\s*\\)\\s*");
+ public static final Pattern SECTION_HEADER = Pattern.compile("^[ \t]*([\\w \t]+):[ \t]*$", Pattern.MULTILINE);
+ private static final Pattern FIELD_NAME_AND_TYPE = Pattern.compile("^[ \t]*(.+?)[ \t]*\\([ \t]*(.*?)[ \t]*\\)[ \t]*$", Pattern.MULTILINE);
public GoogleCodeStyleDocString(@NotNull Substring text) {
super(text);
@@ -87,7 +87,7 @@ public class GoogleCodeStyleDocString extends SectionBasedDocString {
final Substring textBeforeColon = colonSeparatedParts.get(0);
name = textBeforeColon.trim();
if (mayHaveType) {
- final Matcher matcher = FIELD_NAME_AND_TYPE_RE.matcher(textBeforeColon);
+ final Matcher matcher = FIELD_NAME_AND_TYPE.matcher(textBeforeColon);
if (matcher.matches()) {
name = textBeforeColon.getMatcherGroup(matcher, 1).trim();
type = textBeforeColon.getMatcherGroup(matcher, 2).trim();
@@ -115,7 +115,7 @@ public class GoogleCodeStyleDocString extends SectionBasedDocString {
@Override
protected Pair parseSectionHeader(int lineNum) {
final Substring line = getLine(lineNum);
- final Matcher matcher = SECTION_HEADER_RE.matcher(line);
+ final Matcher matcher = SECTION_HEADER.matcher(line);
if (matcher.matches()) {
@NonNls final Substring title = line.getMatcherGroup(matcher, 1).trim();
if (SECTION_NAMES.contains(title.toString().toLowerCase())) {
diff --git a/python/src/com/jetbrains/python/documentation/NumpyDocString.java b/python/src/com/jetbrains/python/documentation/NumpyDocString.java
index 2ce118237ea2..31767b4f0d88 100644
--- a/python/src/com/jetbrains/python/documentation/NumpyDocString.java
+++ b/python/src/com/jetbrains/python/documentation/NumpyDocString.java
@@ -29,8 +29,8 @@ import java.util.regex.Pattern;
* @see Napoleon: Example NumPy Style Python Docstrings
*/
public class NumpyDocString extends SectionBasedDocString {
- private static final Pattern SIGNATURE = Pattern.compile("^\\s*([\\w., ]+=)?\\s*[\\w\\.]+\\(.*\\)\\s*$", Pattern.MULTILINE);
- public static final Pattern SECTION_HEADER = Pattern.compile("^\\s*[-=]{2,}\\s*$", Pattern.MULTILINE);
+ private static final Pattern SIGNATURE = Pattern.compile("^[ \t]*([\\w., ]+=)?[ \t]*[\\w\\.]+\\(.*\\)[ \t]*$", Pattern.MULTILINE);
+ public static final Pattern SECTION_HEADER = Pattern.compile("^[ \t]*[-=]{2,}[ \t]*$", Pattern.MULTILINE);
private Substring mySignature;
public NumpyDocString(@NotNull Substring text) {
diff --git a/python/testSrc/com/jetbrains/python/PySectionBasedDocStringTest.java b/python/testSrc/com/jetbrains/python/PySectionBasedDocStringTest.java
index 5555ba69c7ed..0f1c61ada95b 100644
--- a/python/testSrc/com/jetbrains/python/PySectionBasedDocStringTest.java
+++ b/python/testSrc/com/jetbrains/python/PySectionBasedDocStringTest.java
@@ -18,6 +18,7 @@ package com.jetbrains.python;
import com.intellij.psi.PsiElement;
import com.intellij.psi.search.PsiElementProcessor;
import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.documentation.DocStringUtil;
import com.jetbrains.python.documentation.GoogleCodeStyleDocString;
import com.jetbrains.python.documentation.NumpyDocString;
import com.jetbrains.python.documentation.SectionBasedDocString;
@@ -290,6 +291,19 @@ public class PySectionBasedDocStringTest extends PyTestCase {
assertEquals("keyword arguments", docString.getSections().get(0).getNormalizedTitle());
}
+ // PY-16766
+ public void testGoogleDocStringContentDetection() {
+ assertTrue(DocStringUtil.isGoogleDocString(
+ "\n" +
+ " My Section:\n" +
+ " some user defined section\n" +
+ " \n" +
+ " Parameters:\n" +
+ " param1: \n" +
+ "\n" +
+ " Returns:\n"));
+ }
+
@Override
protected String getTestDataPath() {
return super.getTestDataPath() + "/docstrings";