diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt index 0ae2478ecff..c172301280c 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/util/ShadowedDeclarationsFilter.kt @@ -246,6 +246,15 @@ class ShadowedDeclarationsFilter( if (p1.varargElementType != p2.varargElementType) return false // both should be vararg or or both not if (p1.type != p2.type) return false } + + val typeParameters1 = function.typeParameters + val typeParameters2 = other.function.typeParameters + if (typeParameters1.size != typeParameters2.size) return false + for (i in typeParameters1.indices) { + val t1 = typeParameters1[i] + val t2 = typeParameters2[i] + if (t1.upperBounds != t2.upperBounds) return false + } return true } diff --git a/idea/idea-completion/testData/basic/common/shadowing/ExtensionShadows.kt b/idea/idea-completion/testData/basic/common/shadowing/ExtensionShadows.kt new file mode 100644 index 00000000000..bb5c4dcff7e --- /dev/null +++ b/idea/idea-completion/testData/basic/common/shadowing/ExtensionShadows.kt @@ -0,0 +1,13 @@ +class Shadow { + fun shade() {} +} + +fun Shadow.shade() {} + +fun context() { + Shadow().sha +} + +// EXIST: { lookupString: "shade", itemText: "shade", tailText: "()", typeText: "Unit" } +// EXIST: { lookupString: "shade", itemText: "shade", tailText: "() for Shadow in ", typeText: "Unit" } +// NOTHING_ELSE \ No newline at end of file diff --git a/idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithMultipleParam.kt b/idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithMultipleParam.kt new file mode 100644 index 00000000000..f3e6cc5b4f0 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithMultipleParam.kt @@ -0,0 +1,9 @@ +fun List.xxx(t: T){} +fun Iterable.xxx(t: T){} + +fun foo() { + listOf(1).xx +} + +// EXIST: { lookupString: "xxx", itemText: "xxx", tailText: "(t: Int) for List in ", typeText: "Unit" } +// NOTHING_ELSE diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java index 1c8d519c480..85a2042d7a8 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JSBasicCompletionTestGenerated.java @@ -2110,6 +2110,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/basic/common/shadowing"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("ExtensionShadows.kt") + public void testExtensionShadows() throws Exception { + runTest("idea/idea-completion/testData/basic/common/shadowing/ExtensionShadows.kt"); + } + @TestMetadata("InInitializer1.kt") public void testInInitializer1() throws Exception { runTest("idea/idea-completion/testData/basic/common/shadowing/InInitializer1.kt"); @@ -2200,6 +2205,11 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes runTest("idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGeneric.kt"); } + @TestMetadata("PreferMoreSpecificExtensionGenericWithMultipleParam.kt") + public void testPreferMoreSpecificExtensionGenericWithMultipleParam() throws Exception { + runTest("idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithMultipleParam.kt"); + } + @TestMetadata("PreferMoreSpecificExtensionGenericWithParam.kt") public void testPreferMoreSpecificExtensionGenericWithParam() throws Exception { runTest("idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithParam.kt"); diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java index 48ee073b548..f6c9e82361a 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmBasicCompletionTestGenerated.java @@ -2110,6 +2110,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/idea-completion/testData/basic/common/shadowing"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.ANY, true); } + @TestMetadata("ExtensionShadows.kt") + public void testExtensionShadows() throws Exception { + runTest("idea/idea-completion/testData/basic/common/shadowing/ExtensionShadows.kt"); + } + @TestMetadata("InInitializer1.kt") public void testInInitializer1() throws Exception { runTest("idea/idea-completion/testData/basic/common/shadowing/InInitializer1.kt"); @@ -2200,6 +2205,11 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT runTest("idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGeneric.kt"); } + @TestMetadata("PreferMoreSpecificExtensionGenericWithMultipleParam.kt") + public void testPreferMoreSpecificExtensionGenericWithMultipleParam() throws Exception { + runTest("idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithMultipleParam.kt"); + } + @TestMetadata("PreferMoreSpecificExtensionGenericWithParam.kt") public void testPreferMoreSpecificExtensionGenericWithParam() throws Exception { runTest("idea/idea-completion/testData/basic/common/shadowing/PreferMoreSpecificExtensionGenericWithParam.kt");