diff --git a/idea/idea-completion/testData/basic/common/ProtectedExtensionMethod.kt b/idea/idea-completion/testData/basic/common/ProtectedExtensionMethod.kt new file mode 100644 index 00000000000..e448d839226 --- /dev/null +++ b/idea/idea-completion/testData/basic/common/ProtectedExtensionMethod.kt @@ -0,0 +1,9 @@ +abstract class ProtectedTest { + fun foo() { + "". + } + + abstract protected fun String.bar() +} + +// EXIST: bar \ No newline at end of file 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 8cb7aa54d48..c8a118d1b56 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 @@ -649,6 +649,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("ProtectedExtensionMethod.kt") + public void testProtectedExtensionMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ProtectedExtensionMethod.kt"); + doTest(fileName); + } + @TestMetadata("QualifiedSuperMembers.kt") public void testQualifiedSuperMembers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/QualifiedSuperMembers.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 a2f07dfb79d..4bf88c6d769 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 @@ -649,6 +649,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("ProtectedExtensionMethod.kt") + public void testProtectedExtensionMethod() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/ProtectedExtensionMethod.kt"); + doTest(fileName); + } + @TestMetadata("QualifiedSuperMembers.kt") public void testQualifiedSuperMembers() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/QualifiedSuperMembers.kt"); diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt index 6832071a666..8e23556adb4 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtExpression import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.OverridingUtil import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors @@ -62,7 +63,8 @@ private fun DeclarationDescriptorWithVisibility.isVisible( if (bindingContext == null || resolutionScope == null) return false - if (receiverExpression != null) { + // for extension it makes no sense to check explicit receiver because we need dispatch receiver which is implicit in this case + if (receiverExpression != null && !isExtension) { val receiverType = bindingContext.getType(receiverExpression) ?: return false val explicitReceiver = ExpressionReceiver.create(receiverExpression, receiverType, bindingContext) return Visibilities.isVisible(explicitReceiver, this, from)