[FE 1.0] Resolve private constructors of sealed classes same as for regular classes
^KT-44866 ^KT-49729
This commit is contained in:
+7
-5
@@ -16,9 +16,10 @@
|
||||
|
||||
package org.jetbrains.kotlin.resolve.jvm.checkers
|
||||
|
||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
@@ -58,26 +59,27 @@ class JavaTypeAccessibilityChecker : AdditionalTypeChecker {
|
||||
private fun findInaccessibleJavaClasses(type: KotlinType, c: ResolutionContext<*>): Collection<ClassDescriptor> {
|
||||
val scopeOwner = c.scope.ownerDescriptor
|
||||
val inaccessibleJavaClasses = LinkedHashSet<ClassDescriptor>()
|
||||
findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses)
|
||||
findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses, c.languageVersionSettings)
|
||||
return inaccessibleJavaClasses
|
||||
}
|
||||
|
||||
private fun findInaccessibleJavaClassesRec(
|
||||
type: KotlinType,
|
||||
scopeOwner: DeclarationDescriptor,
|
||||
inaccessibleClasses: MutableCollection<ClassDescriptor>
|
||||
inaccessibleClasses: MutableCollection<ClassDescriptor>,
|
||||
languageVersionSettings: LanguageVersionSettings
|
||||
) {
|
||||
val declarationDescriptor = type.constructor.declarationDescriptor
|
||||
|
||||
if (declarationDescriptor is JavaClassDescriptor) {
|
||||
if (!DescriptorVisibilities.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner)) {
|
||||
if (!DescriptorVisibilityUtils.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner, languageVersionSettings)) {
|
||||
inaccessibleClasses.add(declarationDescriptor)
|
||||
}
|
||||
}
|
||||
|
||||
for (typeProjection in type.arguments) {
|
||||
if (typeProjection.isStarProjection) continue
|
||||
findInaccessibleJavaClassesRec(typeProjection.type, scopeOwner, inaccessibleClasses)
|
||||
findInaccessibleJavaClassesRec(typeProjection.type, scopeOwner, inaccessibleClasses, languageVersionSettings)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+6
-3
@@ -19,8 +19,9 @@ package org.jetbrains.kotlin.resolve.jvm.checkers
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.config.LanguageFeature
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisible
|
||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
|
||||
import org.jetbrains.kotlin.diagnostics.Errors
|
||||
@@ -62,7 +63,7 @@ object ProtectedSyntheticExtensionCallChecker : CallChecker {
|
||||
val from = context.scope.ownerDescriptor
|
||||
|
||||
// Already reported
|
||||
if (!DescriptorVisibilities.isVisibleIgnoringReceiver(descriptor, from)) return
|
||||
if (!DescriptorVisibilityUtils.isVisibleIgnoringReceiver(descriptor, from, context.languageVersionSettings)) return
|
||||
|
||||
if (resolvedCall.dispatchReceiver != null && resolvedCall.extensionReceiver !is ReceiverValue) return
|
||||
|
||||
@@ -74,7 +75,9 @@ object ProtectedSyntheticExtensionCallChecker : CallChecker {
|
||||
context.languageVersionSettings
|
||||
)
|
||||
|
||||
if (receiverTypes.none { DescriptorVisibilities.isVisible(getReceiverValueWithSmartCast(null, it), sourceFunction, from) }) {
|
||||
if (receiverTypes.none {
|
||||
isVisible(getReceiverValueWithSmartCast(null, it), sourceFunction, from, context.languageVersionSettings)
|
||||
}) {
|
||||
context.trace.report(error.on(reportOn, descriptor, descriptor.visibility, from))
|
||||
}
|
||||
}
|
||||
|
||||
+7
-3
@@ -20,9 +20,9 @@ import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaCallableMemberDescriptor
|
||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
|
||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
||||
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||
|
||||
fun FunctionDescriptor.hasJavaOriginInHierarchy(): Boolean {
|
||||
@@ -46,9 +46,13 @@ fun syntheticVisibility(originalDescriptor: DeclarationDescriptorWithVisibility,
|
||||
override fun isVisible(
|
||||
receiver: ReceiverValue?,
|
||||
what: DeclarationDescriptorWithVisibility,
|
||||
from: DeclarationDescriptor
|
||||
from: DeclarationDescriptor,
|
||||
useSpecialRulesForPrivateSealedConstructors: Boolean
|
||||
) = originalVisibility.isVisible(
|
||||
if (isUsedForExtension) DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER else receiver, originalDescriptor, from
|
||||
if (isUsedForExtension) DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER else receiver,
|
||||
originalDescriptor,
|
||||
from,
|
||||
useSpecialRulesForPrivateSealedConstructors
|
||||
)
|
||||
|
||||
override fun mustCheckInImports() = throw UnsupportedOperationException("Should never be called for this visibility")
|
||||
|
||||
Reference in New Issue
Block a user