Skip to content

Commit 93378b1

Browse files
committed
[FE 1.0] Resolve private constructors of sealed classes same as for regular classes
^KT-44866 ^KT-49729
1 parent e2d68fd commit 93378b1

File tree

31 files changed

+294
-113
lines changed

31 files changed

+294
-113
lines changed

analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.intellij.openapi.vfs.VirtualFile
1111
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
1212
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
1313
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
14+
import org.jetbrains.kotlin.config.LanguageVersionSettings
1415
import org.jetbrains.kotlin.psi.KtElement
1516
import org.jetbrains.kotlin.resolve.BindingContext
1617
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
@@ -47,4 +48,7 @@ class Fe10AnalysisContext(
4748

4849
val builtIns: KotlinBuiltIns
4950
get() = resolveSession.moduleDescriptor.builtIns
50-
}
51+
52+
val languageVersionSettings: LanguageVersionSettings
53+
get() = resolveSession.languageVersionSettings
54+
}

analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10OverrideInfoProvider.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion
1818
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
1919
import org.jetbrains.kotlin.descriptors.ClassDescriptor
2020
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
21-
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
21+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisibleWithAnyReceiver
2222
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
2323
import org.jetbrains.kotlin.util.ImplementationStatus
2424

@@ -31,7 +31,7 @@ internal class KtFe10OverrideInfoProvider(
3131
override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean = withValidityAssertion {
3232
val memberDescriptor = getSymbolDescriptor(memberSymbol) as? DeclarationDescriptorWithVisibility ?: return false
3333
val classDescriptor = getSymbolDescriptor(classSymbol) ?: return false
34-
return DescriptorVisibilities.isVisibleWithAnyReceiver(memberDescriptor, classDescriptor)
34+
return isVisibleWithAnyReceiver(memberDescriptor, classDescriptor, analysisSession.analysisContext.languageVersionSettings)
3535
}
3636

3737
override fun getImplementationStatus(
@@ -53,4 +53,4 @@ internal class KtFe10OverrideInfoProvider(
5353
val containingClassDescriptor = originalCallableDescriptor.containingDeclaration as? ClassDescriptor ?: return null
5454
return containingClassDescriptor.toKtClassifierSymbol(analysisContext) as? KtClassOrObjectSymbol
5555
}
56-
}
56+
}

analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10VisibilityChecker.kt

+15-7
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.descriptors.components
77

88
import com.intellij.psi.PsiElement
99
import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker
10-
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
1110
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
11+
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
1212
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
1313
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
1414
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
@@ -17,9 +17,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
1717
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
1818
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
1919
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
20-
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
20+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisible
2121
import org.jetbrains.kotlin.descriptors.Visibilities
22-
import org.jetbrains.kotlin.psi.*
22+
import org.jetbrains.kotlin.psi.KtCallableDeclaration
23+
import org.jetbrains.kotlin.psi.KtExpression
24+
import org.jetbrains.kotlin.psi.KtPsiUtil
2325
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
2426
import org.jetbrains.kotlin.resolve.BindingContext
2527
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
@@ -52,14 +54,20 @@ internal class KtFe10VisibilityChecker(
5254
val bindingContext = analysisContext.analyze(receiverExpression, AnalysisMode.PARTIAL)
5355
val receiverType = bindingContext.getType(receiverExpression) ?: return false
5456
val explicitReceiver = ExpressionReceiver.create(receiverExpression, receiverType, bindingContext)
55-
return DescriptorVisibilities.isVisible(explicitReceiver, targetDescriptor, useSiteDescriptor)
57+
return isVisible(
58+
explicitReceiver,
59+
targetDescriptor,
60+
useSiteDescriptor,
61+
analysisContext.languageVersionSettings
62+
)
5663
} else {
5764
val bindingContext = analysisContext.analyze(useSiteDeclaration, AnalysisMode.FULL)
5865

5966
val lexicalScope = position.getResolutionScope(bindingContext)
6067
if (lexicalScope != null) {
61-
return lexicalScope.getImplicitReceiversHierarchy()
62-
.any { DescriptorVisibilities.isVisible(it.value, targetDescriptor, useSiteDescriptor) }
68+
return lexicalScope.getImplicitReceiversHierarchy().any {
69+
isVisible(it.value, targetDescriptor, useSiteDescriptor, analysisContext.languageVersionSettings)
70+
}
6371
}
6472
}
6573

@@ -75,4 +83,4 @@ private fun findContainingNonLocalDeclaration(element: PsiElement): KtCallableDe
7583
}
7684

7785
return null
78-
}
86+
}

compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.*
2424
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
2525
import org.jetbrains.kotlin.utils.addIfNotNull
2626
import org.jetbrains.org.objectweb.asm.commons.Method
27-
import java.util.*
2827

2928
private val EXTERNAL_SOURCES_KINDS = arrayOf(
3029
JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL,
@@ -49,7 +48,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
4948
bindingContext: BindingContext,
5049
private val diagnostics: DiagnosticSink,
5150
moduleName: String,
52-
languageVersionSettings: LanguageVersionSettings,
51+
val languageVersionSettings: LanguageVersionSettings,
5352
useOldInlineClassesManglingScheme: Boolean,
5453
shouldGenerate: (JvmDeclarationOrigin) -> Boolean,
5554
) : SignatureCollectingClassBuilderFactory(builderFactory, shouldGenerate) {
@@ -231,7 +230,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
231230
descriptor.getParentJavaStaticClassScope()?.run {
232231
getContributedDescriptors(DescriptorKindFilter.FUNCTIONS)
233232
.filter {
234-
it is FunctionDescriptor && DescriptorVisibilities.isVisibleIgnoringReceiver(it, descriptor)
233+
it is FunctionDescriptor && DescriptorVisibilityUtils.isVisibleIgnoringReceiver(it, descriptor, languageVersionSettings)
235234
}
236235
.forEach(::processMember)
237236
}

compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/JavaTypeAccessibilityChecker.kt

+7-5
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,10 @@
1616

1717
package org.jetbrains.kotlin.resolve.jvm.checkers
1818

19+
import org.jetbrains.kotlin.config.LanguageVersionSettings
1920
import org.jetbrains.kotlin.descriptors.ClassDescriptor
2021
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
21-
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
22+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils
2223
import org.jetbrains.kotlin.diagnostics.Errors
2324
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
2425
import org.jetbrains.kotlin.psi.KtExpression
@@ -58,26 +59,27 @@ class JavaTypeAccessibilityChecker : AdditionalTypeChecker {
5859
private fun findInaccessibleJavaClasses(type: KotlinType, c: ResolutionContext<*>): Collection<ClassDescriptor> {
5960
val scopeOwner = c.scope.ownerDescriptor
6061
val inaccessibleJavaClasses = LinkedHashSet<ClassDescriptor>()
61-
findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses)
62+
findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses, c.languageVersionSettings)
6263
return inaccessibleJavaClasses
6364
}
6465

6566
private fun findInaccessibleJavaClassesRec(
6667
type: KotlinType,
6768
scopeOwner: DeclarationDescriptor,
68-
inaccessibleClasses: MutableCollection<ClassDescriptor>
69+
inaccessibleClasses: MutableCollection<ClassDescriptor>,
70+
languageVersionSettings: LanguageVersionSettings
6971
) {
7072
val declarationDescriptor = type.constructor.declarationDescriptor
7173

7274
if (declarationDescriptor is JavaClassDescriptor) {
73-
if (!DescriptorVisibilities.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner)) {
75+
if (!DescriptorVisibilityUtils.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner, languageVersionSettings)) {
7476
inaccessibleClasses.add(declarationDescriptor)
7577
}
7678
}
7779

7880
for (typeProjection in type.arguments) {
7981
if (typeProjection.isStarProjection) continue
80-
findInaccessibleJavaClassesRec(typeProjection.type, scopeOwner, inaccessibleClasses)
82+
findInaccessibleJavaClassesRec(typeProjection.type, scopeOwner, inaccessibleClasses, languageVersionSettings)
8183
}
8284
}
8385

compiler/frontend.java/src/org/jetbrains/kotlin/resolve/jvm/checkers/ProtectedSyntheticExtensionCallChecker.kt

+6-3
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ package org.jetbrains.kotlin.resolve.jvm.checkers
1919
import com.intellij.psi.PsiElement
2020
import org.jetbrains.kotlin.config.LanguageFeature
2121
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
22-
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
2322
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
23+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils
24+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisible
2425
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
2526
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
2627
import org.jetbrains.kotlin.diagnostics.Errors
@@ -62,7 +63,7 @@ object ProtectedSyntheticExtensionCallChecker : CallChecker {
6263
val from = context.scope.ownerDescriptor
6364

6465
// Already reported
65-
if (!DescriptorVisibilities.isVisibleIgnoringReceiver(descriptor, from)) return
66+
if (!DescriptorVisibilityUtils.isVisibleIgnoringReceiver(descriptor, from, context.languageVersionSettings)) return
6667

6768
if (resolvedCall.dispatchReceiver != null && resolvedCall.extensionReceiver !is ReceiverValue) return
6869

@@ -74,7 +75,9 @@ object ProtectedSyntheticExtensionCallChecker : CallChecker {
7475
context.languageVersionSettings
7576
)
7677

77-
if (receiverTypes.none { DescriptorVisibilities.isVisible(getReceiverValueWithSmartCast(null, it), sourceFunction, from) }) {
78+
if (receiverTypes.none {
79+
isVisible(getReceiverValueWithSmartCast(null, it), sourceFunction, from, context.languageVersionSettings)
80+
}) {
7881
context.trace.report(error.on(reportOn, descriptor, descriptor.visibility, from))
7982
}
8083
}

compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/syntheticExtensionsUtils.kt

+7-3
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,9 @@ import org.jetbrains.kotlin.descriptors.*
2020
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
2121
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
2222
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
23-
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
2423
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
2524
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
25+
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
2626
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
2727

2828
fun FunctionDescriptor.hasJavaOriginInHierarchy(): Boolean {
@@ -46,9 +46,13 @@ fun syntheticVisibility(originalDescriptor: DeclarationDescriptorWithVisibility,
4646
override fun isVisible(
4747
receiver: ReceiverValue?,
4848
what: DeclarationDescriptorWithVisibility,
49-
from: DeclarationDescriptor
49+
from: DeclarationDescriptor,
50+
useSpecialRulesForPrivateSealedConstructors: Boolean
5051
) = originalVisibility.isVisible(
51-
if (isUsedForExtension) DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER else receiver, originalDescriptor, from
52+
if (isUsedForExtension) DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER else receiver,
53+
originalDescriptor,
54+
from,
55+
useSpecialRulesForPrivateSealedConstructors
5256
)
5357

5458
override fun mustCheckInImports() = throw UnsupportedOperationException("Should never be called for this visibility")

compiler/frontend/cfg/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProviderImpl.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -490,9 +490,9 @@ class ControlFlowInformationProviderImpl private constructor(
490490

491491
val receiverValue = expression.getResolvedCall(trace.bindingContext)?.getDispatchReceiverWithSmartCast()
492492

493-
if (DescriptorVisibilities.isVisible(receiverValue, variableDescriptor, descriptor)
493+
if (DescriptorVisibilityUtils.isVisible(receiverValue, variableDescriptor, descriptor, languageVersionSettings)
494494
&& setterDescriptor != null
495-
&& !DescriptorVisibilities.isVisible(receiverValue, setterDescriptor, descriptor)
495+
&& !DescriptorVisibilityUtils.isVisible(receiverValue, setterDescriptor, descriptor, languageVersionSettings)
496496
) {
497497
report(
498498
Errors.INVISIBLE_SETTER.on(

compiler/frontend/src/org/jetbrains/kotlin/resolve/LazyExplicitImportScope.kt

+6-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.jetbrains.kotlin.resolve
1818

1919
import com.intellij.util.SmartList
20+
import org.jetbrains.kotlin.config.LanguageVersionSettings
2021
import org.jetbrains.kotlin.descriptors.*
2122
import org.jetbrains.kotlin.incremental.components.LookupLocation
2223
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.utils.Printer
2930
import org.jetbrains.kotlin.utils.addIfNotNull
3031

3132
class LazyExplicitImportScope(
33+
private val languageVersionSettings: LanguageVersionSettings,
3234
private val packageOrClassDescriptor: DeclarationDescriptor,
3335
private val packageFragmentForVisibilityCheck: PackageFragmentDescriptor?,
3436
private val declaredName: Name,
@@ -148,6 +150,8 @@ class LazyExplicitImportScope(
148150
else -> null
149151
}
150152

151-
private fun <D : CallableMemberDescriptor> Collection<D>.choseOnlyVisibleOrAll() =
152-
filter { isVisible(it, packageFragmentForVisibilityCheck, position = QualifierPosition.IMPORT) }.takeIf { it.isNotEmpty() } ?: this
153+
private fun <D : CallableMemberDescriptor> Collection<D>.choseOnlyVisibleOrAll(): Collection<D> =
154+
filter { isVisible(it, packageFragmentForVisibilityCheck, position = QualifierPosition.IMPORT, languageVersionSettings) }
155+
.takeIf { it.isNotEmpty() }
156+
?: this
153157
}

compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.kt

+8-6
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
2727
import org.jetbrains.kotlin.descriptors.*
2828
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
2929
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE
30+
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.useSpecialRulesForPrivateSealedConstructors
3031
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2
3132
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
3233
import org.jetbrains.kotlin.diagnostics.Errors.*
@@ -41,7 +42,6 @@ import org.jetbrains.kotlin.resolve.calls.util.isOrOverridesSynthesized
4142
import org.jetbrains.kotlin.types.*
4243
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
4344
import org.jetbrains.kotlin.types.checker.NewKotlinTypeCheckerImpl
44-
import org.jetbrains.kotlin.types.TypeRefinement
4545
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
4646
import java.util.*
4747

@@ -366,7 +366,7 @@ class OverrideResolver(
366366
override fun nothingToOverride(overriding: CallableMemberDescriptor) {
367367
trace.report(NOTHING_TO_OVERRIDE.on(member, declared))
368368
}
369-
}
369+
}, languageVersionSettings
370370
)
371371
} else if (!overriddenDescriptors.isEmpty() && !overridesBackwardCompatibilityHelper.overrideCanBeOmitted(declared)) {
372372
val overridden = overriddenDescriptors.first()
@@ -854,7 +854,8 @@ class OverrideResolver(
854854
private fun checkOverridesForMemberMarkedOverride(
855855
declared: CallableMemberDescriptor,
856856
kotlinTypeRefiner: KotlinTypeRefiner,
857-
reportError: CheckOverrideReportForDeclaredMemberStrategy
857+
reportError: CheckOverrideReportForDeclaredMemberStrategy,
858+
languageVersionSettings: LanguageVersionSettings
858859
) {
859860
val overriddenDescriptors = declared.overriddenDescriptors
860861

@@ -868,7 +869,7 @@ class OverrideResolver(
868869

869870
val invisibleOverriddenDescriptor =
870871
findInvisibleOverriddenDescriptor(
871-
declared, declaringClass, kotlinTypeRefiner
872+
declared, declaringClass, kotlinTypeRefiner, languageVersionSettings
872873
)
873874
if (invisibleOverriddenDescriptor != null) {
874875
reportError.cannotOverrideInvisibleMember(declared, invisibleOverriddenDescriptor)
@@ -953,7 +954,8 @@ class OverrideResolver(
953954
private fun findInvisibleOverriddenDescriptor(
954955
declared: CallableMemberDescriptor,
955956
declaringClass: ClassDescriptor,
956-
kotlinTypeRefiner: KotlinTypeRefiner
957+
kotlinTypeRefiner: KotlinTypeRefiner,
958+
languageVersionSettings: LanguageVersionSettings
957959
): CallableMemberDescriptor? {
958960
@OptIn(TypeRefinement::class)
959961
for (supertype in kotlinTypeRefiner.refineSupertypes(declaringClass)) {
@@ -962,7 +964,7 @@ class OverrideResolver(
962964
all.addAll(supertype.memberScope.getContributedVariables(declared.name, NoLookupLocation.WHEN_CHECK_OVERRIDES))
963965
for (fromSuper in all) {
964966
if (OverridingUtil.DEFAULT.isOverridableBy(fromSuper, declared, null).result == OVERRIDABLE) {
965-
if (OverridingUtil.isVisibleForOverride(declared, fromSuper)) {
967+
if (OverridingUtil.isVisibleForOverride(declared, fromSuper, languageVersionSettings.useSpecialRulesForPrivateSealedConstructors)) {
966968
throw IllegalStateException(
967969
"Descriptor " + fromSuper + " is overridable by " + declared +
968970
" and visible but does not appear in its getOverriddenDescriptors()"

0 commit comments

Comments
 (0)