[FE 1.0] Resolve private constructors of sealed classes same as for regular classes
^KT-44866 ^KT-49729
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.descriptors
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities.*
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
|
||||
|
||||
object DescriptorVisibilityUtils {
|
||||
@JvmStatic
|
||||
fun findInvisibleMember(
|
||||
receiver: ReceiverValue?,
|
||||
what: DeclarationDescriptorWithVisibility,
|
||||
from: DeclarationDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): DeclarationDescriptorWithVisibility? {
|
||||
return findInvisibleMember(receiver, what, from, languageVersionSettings.useSpecialRulesForPrivateSealedConstructors)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun isVisible(
|
||||
receiver: ReceiverValue?,
|
||||
what: DeclarationDescriptorWithVisibility,
|
||||
from: DeclarationDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): Boolean {
|
||||
return isVisible(receiver, what, from, languageVersionSettings.useSpecialRulesForPrivateSealedConstructors)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun isVisibleIgnoringReceiver(
|
||||
what: DeclarationDescriptorWithVisibility,
|
||||
from: DeclarationDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): Boolean {
|
||||
return isVisibleIgnoringReceiver(what, from, languageVersionSettings.useSpecialRulesForPrivateSealedConstructors)
|
||||
}
|
||||
|
||||
@JvmStatic
|
||||
fun isVisibleWithAnyReceiver(
|
||||
what: DeclarationDescriptorWithVisibility,
|
||||
from: DeclarationDescriptor,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
): Boolean {
|
||||
return isVisibleWithAnyReceiver(what, from, languageVersionSettings.useSpecialRulesForPrivateSealedConstructors)
|
||||
}
|
||||
|
||||
val LanguageVersionSettings.useSpecialRulesForPrivateSealedConstructors: Boolean
|
||||
get() = !supportsFeature(LanguageFeature.AllowSealedInheritorsInDifferentFilesOfSamePackage) ||
|
||||
!supportsFeature(LanguageFeature.UseConsistentRulesForPrivateConstructorsOfSealedClasses)
|
||||
}
|
||||
+8
-3
@@ -11,8 +11,8 @@ import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
|
||||
import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
|
||||
import org.jetbrains.kotlin.resolve.calls.components.candidate.CallableReferenceResolutionCandidate
|
||||
import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemOperation
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.components.*
|
||||
@@ -43,11 +43,16 @@ internal object CheckVisibility : ResolutionPart() {
|
||||
|
||||
val receiverValue = dispatchReceiverArgument?.receiver?.receiverValue ?: DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER
|
||||
val invisibleMember =
|
||||
DescriptorVisibilities.findInvisibleMember(receiverValue, resolvedCall.candidateDescriptor, containingDescriptor) ?: return
|
||||
DescriptorVisibilityUtils.findInvisibleMember(
|
||||
receiverValue,
|
||||
resolvedCall.candidateDescriptor,
|
||||
containingDescriptor,
|
||||
callComponents.languageVersionSettings
|
||||
) ?: return
|
||||
|
||||
if (dispatchReceiverArgument is ExpressionKotlinCallArgument) {
|
||||
val smartCastReceiver = getReceiverValueWithSmartCast(receiverValue, dispatchReceiverArgument.receiver.stableType)
|
||||
if (DescriptorVisibilities.findInvisibleMember(smartCastReceiver, candidateDescriptor, containingDescriptor) == null) {
|
||||
if (DescriptorVisibilityUtils.findInvisibleMember(smartCastReceiver, candidateDescriptor, containingDescriptor, callComponents.languageVersionSettings) == null) {
|
||||
addDiagnostic(
|
||||
SmartCastDiagnostic(
|
||||
dispatchReceiverArgument,
|
||||
|
||||
+1
-1
@@ -340,7 +340,7 @@ class CallableReferencesCandidateFactory(
|
||||
val setter = descriptor.setter
|
||||
setter == null || DescriptorVisibilities.isVisible(
|
||||
dispatchReceiver?.asReceiverValueForVisibilityChecks, setter,
|
||||
scopeTower.lexicalScope.ownerDescriptor
|
||||
scopeTower.lexicalScope.ownerDescriptor, false
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve.calls.tower
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -48,6 +49,8 @@ interface ImplicitScopeTower {
|
||||
|
||||
val isNewInferenceEnabled: Boolean
|
||||
|
||||
val languageVersionSettings: LanguageVersionSettings
|
||||
|
||||
val typeApproximator: TypeApproximator
|
||||
|
||||
val implicitsResolutionFilter: ImplicitsExtensionsResolutionFilter
|
||||
|
||||
@@ -64,10 +64,11 @@ internal abstract class AbstractScopeTowerLevel(
|
||||
|
||||
val shouldSkipVisibilityCheck = scopeTower.isNewInferenceEnabled
|
||||
if (!shouldSkipVisibilityCheck) {
|
||||
DescriptorVisibilities.findInvisibleMember(
|
||||
DescriptorVisibilityUtils.findInvisibleMember(
|
||||
getReceiverValueWithSmartCast(dispatchReceiver?.receiverValue, dispatchReceiverSmartCastType),
|
||||
descriptor,
|
||||
scopeTower.lexicalScope.ownerDescriptor
|
||||
scopeTower.lexicalScope.ownerDescriptor,
|
||||
scopeTower.languageVersionSettings
|
||||
)?.let { diagnostics.add(VisibilityError(it)) }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user