diff --git a/python/src/com/jetbrains/python/PyFilterLexer.java b/python/src/com/jetbrains/python/PyFilterLexer.java index 7c3b01026c87..78cf7ef397aa 100644 --- a/python/src/com/jetbrains/python/PyFilterLexer.java +++ b/python/src/com/jetbrains/python/PyFilterLexer.java @@ -58,6 +58,9 @@ public class PyFilterLexer extends BaseFilterLexer { } else if (PyTokenTypes.STRING_NODES.contains(tokenType)) { scanWordsInToken(UsageSearchContext.IN_STRINGS | UsageSearchContext.IN_FOREIGN_LANGUAGES, false, true); + if (tokenType == PyTokenTypes.DOCSTRING) { + advanceTodoItemCountsInToken(); + } } else if (PyIndexPatternBuilder.COMMENTS.contains(tokenType)) { scanWordsInToken(UsageSearchContext.IN_COMMENTS, false, false); diff --git a/python/testSrc/com/jetbrains/python/PyTodoTest.java b/python/testSrc/com/jetbrains/python/PyTodoTest.java index 99bcb099acd6..aee0f41158ae 100644 --- a/python/testSrc/com/jetbrains/python/PyTodoTest.java +++ b/python/testSrc/com/jetbrains/python/PyTodoTest.java @@ -44,4 +44,23 @@ public class PyTodoTest extends LightPlatformCodeInsightFixtureTestCase { todo.setTodoPatterns(oldPatterns); } } + + public void testTodoInDocstrings() { + myFixture.configureByText(PythonFileType.INSTANCE, "''' TODO: return dead parrot '''"); + TodoItem[] items = PsiTodoSearchHelper.SERVICE.getInstance(getProject()).findTodoItems(myFixture.getFile()); + assertEquals(1, items.length); + } + + public void testTodoInDocstrings2() { + myFixture.configureByText(PythonFileType.INSTANCE, "def foo():\n''' TODO: return dead parrot '''"); + TodoItem[] items = PsiTodoSearchHelper.SERVICE.getInstance(getProject()).findTodoItems(myFixture.getFile()); + assertEquals(1, items.length); + } + + public void testTodoInTripleQuotedString() { + myFixture.configureByText(PythonFileType.INSTANCE, "s = ''' TODO: return dead parrot '''"); + TodoItem[] items = PsiTodoSearchHelper.SERVICE.getInstance(getProject()).findTodoItems(myFixture.getFile()); + assertEquals(0, items.length); // no todo in normal triple quoted strings + } + }