From c48f15defbfc80c50dce4d8371b05553c29f724c Mon Sep 17 00:00:00 2001 From: Semyon Proshev Date: Fri, 12 Oct 2018 19:36:13 +0300 Subject: [PATCH] Return null if found similar element is the same as the original one --- .../src/com/jetbrains/python/pyi/PyiUtil.java | 6 +- .../AnotherTypeSimilarForFunctionStub/b.py | 1 + .../AnotherTypeSimilarForFunctionStub/b.pyi | 2 + .../AnotherTypeSimilarForMethodStub/b.py | 2 + .../AnotherTypeSimilarForMethodStub/b.pyi | 3 + .../AnotherTypeSimilarForRuntimeFunction/a.py | 2 + .../a.pyi | 1 + .../AnotherTypeSimilarForRuntimeMethod/a.py | 3 + .../AnotherTypeSimilarForRuntimeMethod/a.pyi | 2 + .../NoSimilarClassForMethodStub/b.py | 0 .../NoSimilarClassForMethodStub/b.pyi | 3 + .../NoSimilarClassForRuntimeMethod/a.py | 3 + .../NoSimilarClassForRuntimeMethod/a.pyi | 0 .../lineMarkers/NoSimilarForFunctionStub/b.py | 0 .../NoSimilarForFunctionStub/b.pyi | 2 + .../lineMarkers/NoSimilarForMethodStub/b.py | 2 + .../lineMarkers/NoSimilarForMethodStub/b.pyi | 3 + .../NoSimilarForRuntimeFunction/a.py | 2 + .../NoSimilarForRuntimeFunction/a.pyi | 0 .../NoSimilarForRuntimeMethod/a.py | 3 + .../NoSimilarForRuntimeMethod/a.pyi | 2 + .../NoSimilarModuleForFunctionStub/b.pyi | 2 + .../NoSimilarModuleForRuntimeFunction/a.py | 2 + .../OverloadsAndImplementationInPyFile/a.py | 14 +++ .../lineMarkers/SimilarForFunctionStub/b.py | 2 + .../lineMarkers/SimilarForFunctionStub/b.pyi | 2 + .../pyi/lineMarkers/SimilarForMethodStub/b.py | 3 + .../lineMarkers/SimilarForMethodStub/b.pyi | 3 + .../SimilarForRuntimeFunction/a.py | 2 + .../SimilarForRuntimeFunction/a.pyi | 2 + .../lineMarkers/SimilarForRuntimeMethod/a.py | 3 + .../lineMarkers/SimilarForRuntimeMethod/a.pyi | 3 + .../pyi/PyiRelatedItemLineMarkerTest.kt | 113 ++++++++++++++++++ 33 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.py create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.py create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.py create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.pyi create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.py create mode 100644 python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.py create mode 100644 python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.py create mode 100644 python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.py create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.py create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.py create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.py create mode 100644 python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarModuleForFunctionStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/NoSimilarModuleForRuntimeFunction/a.py create mode 100644 python/testData/pyi/lineMarkers/OverloadsAndImplementationInPyFile/a.py create mode 100644 python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.py create mode 100644 python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/SimilarForMethodStub/b.py create mode 100644 python/testData/pyi/lineMarkers/SimilarForMethodStub/b.pyi create mode 100644 python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.py create mode 100644 python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.pyi create mode 100644 python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.py create mode 100644 python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.pyi create mode 100644 python/testSrc/com/jetbrains/python/pyi/PyiRelatedItemLineMarkerTest.kt diff --git a/python/src/com/jetbrains/python/pyi/PyiUtil.java b/python/src/com/jetbrains/python/pyi/PyiUtil.java index 0cd0ce85679b..84466ab9be00 100644 --- a/python/src/com/jetbrains/python/pyi/PyiUtil.java +++ b/python/src/com/jetbrains/python/pyi/PyiUtil.java @@ -184,11 +184,13 @@ public class PyiUtil { final PyClassLikeType instanceType = classType.toInstance(); final List resolveResults = instanceType.resolveMember(name, null, AccessDirection.READ, PyResolveContext.noImplicits(), false); - return takeTopPriorityElement(resolveResults); + final PsiElement result = takeTopPriorityElement(resolveResults); + return result == element ? null : result; } } else if (originalOwner instanceof PyFile) { - return takeTopPriorityElement(((PyFile)originalOwner).multiResolveName(name)); + final PsiElement result = takeTopPriorityElement(((PyFile)originalOwner).multiResolveName(name)); + return result == element ? null : result; } } return null; diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.py b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.py new file mode 100644 index 000000000000..750da5445f46 --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.py @@ -0,0 +1 @@ +foo = None \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.pyi b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.pyi new file mode 100644 index 000000000000..6584985db844 --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForFunctionStub/b.pyi @@ -0,0 +1,2 @@ +def foo(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.py b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.py new file mode 100644 index 000000000000..1f56e5e71d86 --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.py @@ -0,0 +1,2 @@ +class B: + bar = None \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.pyi b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.pyi new file mode 100644 index 000000000000..4b58fb916d11 --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForMethodStub/b.pyi @@ -0,0 +1,3 @@ +class B: + def bar(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.py b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.py new file mode 100644 index 000000000000..e371b819e300 --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.py @@ -0,0 +1,2 @@ +def function(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.pyi b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.pyi new file mode 100644 index 000000000000..4e0e03296b14 --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeFunction/a.pyi @@ -0,0 +1 @@ +function = None \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.py b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.py new file mode 100644 index 000000000000..a4320f3ee64b --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.py @@ -0,0 +1,3 @@ +class A: + def method(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.pyi b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.pyi new file mode 100644 index 000000000000..4c94c826a66f --- /dev/null +++ b/python/testData/pyi/lineMarkers/AnotherTypeSimilarForRuntimeMethod/a.pyi @@ -0,0 +1,2 @@ +class A: + method = None \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.py b/python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.pyi b/python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.pyi new file mode 100644 index 000000000000..4b58fb916d11 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarClassForMethodStub/b.pyi @@ -0,0 +1,3 @@ +class B: + def bar(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.py b/python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.py new file mode 100644 index 000000000000..a4320f3ee64b --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.py @@ -0,0 +1,3 @@ +class A: + def method(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.pyi b/python/testData/pyi/lineMarkers/NoSimilarClassForRuntimeMethod/a.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.py b/python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.pyi b/python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.pyi new file mode 100644 index 000000000000..6584985db844 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarForFunctionStub/b.pyi @@ -0,0 +1,2 @@ +def foo(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.py b/python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.py new file mode 100644 index 000000000000..1a70fa2aecc0 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.py @@ -0,0 +1,2 @@ +class B: + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.pyi b/python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.pyi new file mode 100644 index 000000000000..4b58fb916d11 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarForMethodStub/b.pyi @@ -0,0 +1,3 @@ +class B: + def bar(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.py b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.py new file mode 100644 index 000000000000..e371b819e300 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.py @@ -0,0 +1,2 @@ +def function(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.pyi b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeFunction/a.pyi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.py b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.py new file mode 100644 index 000000000000..a4320f3ee64b --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.py @@ -0,0 +1,3 @@ +class A: + def method(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.pyi b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.pyi new file mode 100644 index 000000000000..7b3f59d68f68 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarForRuntimeMethod/a.pyi @@ -0,0 +1,2 @@ +class A: + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarModuleForFunctionStub/b.pyi b/python/testData/pyi/lineMarkers/NoSimilarModuleForFunctionStub/b.pyi new file mode 100644 index 000000000000..6584985db844 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarModuleForFunctionStub/b.pyi @@ -0,0 +1,2 @@ +def foo(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/NoSimilarModuleForRuntimeFunction/a.py b/python/testData/pyi/lineMarkers/NoSimilarModuleForRuntimeFunction/a.py new file mode 100644 index 000000000000..e371b819e300 --- /dev/null +++ b/python/testData/pyi/lineMarkers/NoSimilarModuleForRuntimeFunction/a.py @@ -0,0 +1,2 @@ +def function(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/OverloadsAndImplementationInPyFile/a.py b/python/testData/pyi/lineMarkers/OverloadsAndImplementationInPyFile/a.py new file mode 100644 index 000000000000..bda6d0368389 --- /dev/null +++ b/python/testData/pyi/lineMarkers/OverloadsAndImplementationInPyFile/a.py @@ -0,0 +1,14 @@ +from typing import overload + + +class B: + @overload + def baz(self, v: str): + pass + + @overload + def baz(self, v: int): + pass + + def baz(self, v): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.py b/python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.py new file mode 100644 index 000000000000..6584985db844 --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.py @@ -0,0 +1,2 @@ +def foo(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.pyi b/python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.pyi new file mode 100644 index 000000000000..6584985db844 --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForFunctionStub/b.pyi @@ -0,0 +1,2 @@ +def foo(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForMethodStub/b.py b/python/testData/pyi/lineMarkers/SimilarForMethodStub/b.py new file mode 100644 index 000000000000..4b58fb916d11 --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForMethodStub/b.py @@ -0,0 +1,3 @@ +class B: + def bar(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForMethodStub/b.pyi b/python/testData/pyi/lineMarkers/SimilarForMethodStub/b.pyi new file mode 100644 index 000000000000..4b58fb916d11 --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForMethodStub/b.pyi @@ -0,0 +1,3 @@ +class B: + def bar(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.py b/python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.py new file mode 100644 index 000000000000..e371b819e300 --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.py @@ -0,0 +1,2 @@ +def function(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.pyi b/python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.pyi new file mode 100644 index 000000000000..e371b819e300 --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForRuntimeFunction/a.pyi @@ -0,0 +1,2 @@ +def function(): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.py b/python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.py new file mode 100644 index 000000000000..a4320f3ee64b --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.py @@ -0,0 +1,3 @@ +class A: + def method(self): + pass \ No newline at end of file diff --git a/python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.pyi b/python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.pyi new file mode 100644 index 000000000000..a4320f3ee64b --- /dev/null +++ b/python/testData/pyi/lineMarkers/SimilarForRuntimeMethod/a.pyi @@ -0,0 +1,3 @@ +class A: + def method(self): + pass \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/pyi/PyiRelatedItemLineMarkerTest.kt b/python/testSrc/com/jetbrains/python/pyi/PyiRelatedItemLineMarkerTest.kt new file mode 100644 index 000000000000..fdd85fe65187 --- /dev/null +++ b/python/testSrc/com/jetbrains/python/pyi/PyiRelatedItemLineMarkerTest.kt @@ -0,0 +1,113 @@ +// 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.pyi + +import com.intellij.codeInsight.daemon.LineMarkerInfo +import com.intellij.codeInsight.daemon.impl.DaemonCodeAnalyzerImpl +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiNameIdentifierOwner +import com.intellij.psi.util.PsiTreeUtil +import com.jetbrains.python.fixtures.PyTestCase +import com.jetbrains.python.psi.PyFunction + +class PyiRelatedItemLineMarkerTest : PyTestCase() { + + fun testOverloadsAndImplementationInPyFile() { + assertNoMarker("baz", false) + } + + // runtime -> stub + + fun testNoSimilarClassForRuntimeMethod() { + assertNoMarker("method", false) + } + + fun testNoSimilarForRuntimeMethod() { + assertNoMarker("method", false) + } + + fun testSimilarForRuntimeMethod() { + assertMarker("method", false) + } + + fun testAnotherTypeSimilarForRuntimeMethod() { + assertMarker("method", false) + } + + fun testNoSimilarModuleForRuntimeFunction() { + assertNoMarker("function", false) + } + + fun testNoSimilarForRuntimeFunction() { + assertNoMarker("function", false) + } + + fun testSimilarForRuntimeFunction() { + assertMarker("function", false) + } + + fun testAnotherTypeSimilarForRuntimeFunction() { + assertMarker("function", false) + } + + // stub -> runtime + + fun testNoSimilarClassForMethodStub() { + assertNoMarker("bar", true) + } + + fun testNoSimilarForMethodStub() { + assertNoMarker("bar", true) + } + + fun testSimilarForMethodStub() { + assertMarker("bar", true) + } + + fun testAnotherTypeSimilarForMethodStub() { + assertMarker("bar", true) + } + + fun testNoSimilarModuleForFunctionStub() { + assertNoMarker("foo", true) + } + + fun testNoSimilarForFunctionStub() { + assertNoMarker("foo", true) + } + + fun testSimilarForFunctionStub() { + assertMarker("foo", true) + } + + fun testAnotherTypeSimilarForFunctionStub() { + assertMarker("foo", true) + } + + override fun getTestDataPath(): String { + return super.getTestDataPath() + "/pyi/lineMarkers" + } + + private fun assertMarker(elementName: String, pyi: Boolean) { + val expectedTooltip = if (pyi) "Stub for item in b.py" else "Has stub item in a.pyi" + assertEquals(expectedTooltip, getMarkers(elementName, pyi).singleOrNull()?.lineMarkerTooltip) + } + + private fun assertNoMarker(elementName: String, pyi: Boolean) { + assertEmpty(getMarkers(elementName, pyi)) + } + + private fun getMarkers(elementName: String, pyi: Boolean): List> { + myFixture.copyDirectoryToProject(getTestName(false), "") + myFixture.configureByFile(if (pyi) "b.pyi" else "a.py") + + val functions = PsiTreeUtil.findChildrenOfType(myFixture.file, PyFunction::class.java) + functions.forEach { assertEquals(elementName, it.name) } + assertNotEmpty(functions) + + myFixture.doHighlighting() + + return DaemonCodeAnalyzerImpl + .getLineMarkers(myFixture.editor.document, myFixture.project) + .filter { PsiTreeUtil.getParentOfType(it.element, PsiNameIdentifierOwner::class.java)?.name == elementName } + } +} \ No newline at end of file