[FE 1.0] Resolve private constructors of sealed classes same as for regular classes
^KT-44866 ^KT-49729
This commit is contained in:
+4
@@ -11,6 +11,7 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||||
@@ -47,4 +48,7 @@ class Fe10AnalysisContext(
|
|||||||
|
|
||||||
val builtIns: KotlinBuiltIns
|
val builtIns: KotlinBuiltIns
|
||||||
get() = resolveSession.moduleDescriptor.builtIns
|
get() = resolveSession.moduleDescriptor.builtIns
|
||||||
|
|
||||||
|
val languageVersionSettings: LanguageVersionSettings
|
||||||
|
get() = resolveSession.languageVersionSettings
|
||||||
}
|
}
|
||||||
+2
-2
@@ -18,7 +18,7 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
|||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisibleWithAnyReceiver
|
||||||
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
|
||||||
import org.jetbrains.kotlin.util.ImplementationStatus
|
import org.jetbrains.kotlin.util.ImplementationStatus
|
||||||
|
|
||||||
@@ -31,7 +31,7 @@ internal class KtFe10OverrideInfoProvider(
|
|||||||
override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean = withValidityAssertion {
|
override fun isVisible(memberSymbol: KtCallableSymbol, classSymbol: KtClassOrObjectSymbol): Boolean = withValidityAssertion {
|
||||||
val memberDescriptor = getSymbolDescriptor(memberSymbol) as? DeclarationDescriptorWithVisibility ?: return false
|
val memberDescriptor = getSymbolDescriptor(memberSymbol) as? DeclarationDescriptorWithVisibility ?: return false
|
||||||
val classDescriptor = getSymbolDescriptor(classSymbol) ?: return false
|
val classDescriptor = getSymbolDescriptor(classSymbol) ?: return false
|
||||||
return DescriptorVisibilities.isVisibleWithAnyReceiver(memberDescriptor, classDescriptor)
|
return isVisibleWithAnyReceiver(memberDescriptor, classDescriptor, analysisSession.analysisContext.languageVersionSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getImplementationStatus(
|
override fun getImplementationStatus(
|
||||||
|
|||||||
+14
-6
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.descriptors.components
|
|||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker
|
import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
|
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
|
||||||
|
import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
|
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getSymbolDescriptor
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.getResolutionScope
|
||||||
@@ -17,9 +17,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
|||||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptorWithVisibility
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisible
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||||
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
|
import org.jetbrains.kotlin.psi.KtPsiUtil
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||||
@@ -52,14 +54,20 @@ internal class KtFe10VisibilityChecker(
|
|||||||
val bindingContext = analysisContext.analyze(receiverExpression, AnalysisMode.PARTIAL)
|
val bindingContext = analysisContext.analyze(receiverExpression, AnalysisMode.PARTIAL)
|
||||||
val receiverType = bindingContext.getType(receiverExpression) ?: return false
|
val receiverType = bindingContext.getType(receiverExpression) ?: return false
|
||||||
val explicitReceiver = ExpressionReceiver.create(receiverExpression, receiverType, bindingContext)
|
val explicitReceiver = ExpressionReceiver.create(receiverExpression, receiverType, bindingContext)
|
||||||
return DescriptorVisibilities.isVisible(explicitReceiver, targetDescriptor, useSiteDescriptor)
|
return isVisible(
|
||||||
|
explicitReceiver,
|
||||||
|
targetDescriptor,
|
||||||
|
useSiteDescriptor,
|
||||||
|
analysisContext.languageVersionSettings
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
val bindingContext = analysisContext.analyze(useSiteDeclaration, AnalysisMode.FULL)
|
val bindingContext = analysisContext.analyze(useSiteDeclaration, AnalysisMode.FULL)
|
||||||
|
|
||||||
val lexicalScope = position.getResolutionScope(bindingContext)
|
val lexicalScope = position.getResolutionScope(bindingContext)
|
||||||
if (lexicalScope != null) {
|
if (lexicalScope != null) {
|
||||||
return lexicalScope.getImplicitReceiversHierarchy()
|
return lexicalScope.getImplicitReceiversHierarchy().any {
|
||||||
.any { DescriptorVisibilities.isVisible(it.value, targetDescriptor, useSiteDescriptor) }
|
isVisible(it.value, targetDescriptor, useSiteDescriptor, analysisContext.languageVersionSettings)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-3
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.resolve.jvm.diagnostics.*
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import org.jetbrains.org.objectweb.asm.commons.Method
|
import org.jetbrains.org.objectweb.asm.commons.Method
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
private val EXTERNAL_SOURCES_KINDS = arrayOf(
|
private val EXTERNAL_SOURCES_KINDS = arrayOf(
|
||||||
JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL,
|
JvmDeclarationOriginKind.CLASS_MEMBER_DELEGATION_TO_DEFAULT_IMPL,
|
||||||
@@ -49,7 +48,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
|
|||||||
bindingContext: BindingContext,
|
bindingContext: BindingContext,
|
||||||
private val diagnostics: DiagnosticSink,
|
private val diagnostics: DiagnosticSink,
|
||||||
moduleName: String,
|
moduleName: String,
|
||||||
languageVersionSettings: LanguageVersionSettings,
|
val languageVersionSettings: LanguageVersionSettings,
|
||||||
useOldInlineClassesManglingScheme: Boolean,
|
useOldInlineClassesManglingScheme: Boolean,
|
||||||
shouldGenerate: (JvmDeclarationOrigin) -> Boolean,
|
shouldGenerate: (JvmDeclarationOrigin) -> Boolean,
|
||||||
) : SignatureCollectingClassBuilderFactory(builderFactory, shouldGenerate) {
|
) : SignatureCollectingClassBuilderFactory(builderFactory, shouldGenerate) {
|
||||||
@@ -231,7 +230,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
|
|||||||
descriptor.getParentJavaStaticClassScope()?.run {
|
descriptor.getParentJavaStaticClassScope()?.run {
|
||||||
getContributedDescriptors(DescriptorKindFilter.FUNCTIONS)
|
getContributedDescriptors(DescriptorKindFilter.FUNCTIONS)
|
||||||
.filter {
|
.filter {
|
||||||
it is FunctionDescriptor && DescriptorVisibilities.isVisibleIgnoringReceiver(it, descriptor)
|
it is FunctionDescriptor && DescriptorVisibilityUtils.isVisibleIgnoringReceiver(it, descriptor, languageVersionSettings)
|
||||||
}
|
}
|
||||||
.forEach(::processMember)
|
.forEach(::processMember)
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -16,9 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.jvm.checkers
|
package org.jetbrains.kotlin.resolve.jvm.checkers
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
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.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
@@ -58,26 +59,27 @@ class JavaTypeAccessibilityChecker : AdditionalTypeChecker {
|
|||||||
private fun findInaccessibleJavaClasses(type: KotlinType, c: ResolutionContext<*>): Collection<ClassDescriptor> {
|
private fun findInaccessibleJavaClasses(type: KotlinType, c: ResolutionContext<*>): Collection<ClassDescriptor> {
|
||||||
val scopeOwner = c.scope.ownerDescriptor
|
val scopeOwner = c.scope.ownerDescriptor
|
||||||
val inaccessibleJavaClasses = LinkedHashSet<ClassDescriptor>()
|
val inaccessibleJavaClasses = LinkedHashSet<ClassDescriptor>()
|
||||||
findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses)
|
findInaccessibleJavaClassesRec(type, scopeOwner, inaccessibleJavaClasses, c.languageVersionSettings)
|
||||||
return inaccessibleJavaClasses
|
return inaccessibleJavaClasses
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun findInaccessibleJavaClassesRec(
|
private fun findInaccessibleJavaClassesRec(
|
||||||
type: KotlinType,
|
type: KotlinType,
|
||||||
scopeOwner: DeclarationDescriptor,
|
scopeOwner: DeclarationDescriptor,
|
||||||
inaccessibleClasses: MutableCollection<ClassDescriptor>
|
inaccessibleClasses: MutableCollection<ClassDescriptor>,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
) {
|
) {
|
||||||
val declarationDescriptor = type.constructor.declarationDescriptor
|
val declarationDescriptor = type.constructor.declarationDescriptor
|
||||||
|
|
||||||
if (declarationDescriptor is JavaClassDescriptor) {
|
if (declarationDescriptor is JavaClassDescriptor) {
|
||||||
if (!DescriptorVisibilities.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner)) {
|
if (!DescriptorVisibilityUtils.isVisibleIgnoringReceiver(declarationDescriptor, scopeOwner, languageVersionSettings)) {
|
||||||
inaccessibleClasses.add(declarationDescriptor)
|
inaccessibleClasses.add(declarationDescriptor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (typeProjection in type.arguments) {
|
for (typeProjection in type.arguments) {
|
||||||
if (typeProjection.isStarProjection) continue
|
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 com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.config.LanguageFeature
|
import org.jetbrains.kotlin.config.LanguageFeature
|
||||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibility
|
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.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory3
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
@@ -62,7 +63,7 @@ object ProtectedSyntheticExtensionCallChecker : CallChecker {
|
|||||||
val from = context.scope.ownerDescriptor
|
val from = context.scope.ownerDescriptor
|
||||||
|
|
||||||
// Already reported
|
// 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
|
if (resolvedCall.dispatchReceiver != null && resolvedCall.extensionReceiver !is ReceiverValue) return
|
||||||
|
|
||||||
@@ -74,7 +75,9 @@ object ProtectedSyntheticExtensionCallChecker : CallChecker {
|
|||||||
context.languageVersionSettings
|
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))
|
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.JavaCallableMemberDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
import org.jetbrains.kotlin.load.java.descriptors.JavaClassDescriptor
|
||||||
import org.jetbrains.kotlin.load.java.sam.SamAdapterDescriptor
|
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.model.ResolvedCall
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
import org.jetbrains.kotlin.resolve.calls.tower.NewResolvedCallImpl
|
||||||
|
import org.jetbrains.kotlin.resolve.sam.SamConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
|
|
||||||
fun FunctionDescriptor.hasJavaOriginInHierarchy(): Boolean {
|
fun FunctionDescriptor.hasJavaOriginInHierarchy(): Boolean {
|
||||||
@@ -46,9 +46,13 @@ fun syntheticVisibility(originalDescriptor: DeclarationDescriptorWithVisibility,
|
|||||||
override fun isVisible(
|
override fun isVisible(
|
||||||
receiver: ReceiverValue?,
|
receiver: ReceiverValue?,
|
||||||
what: DeclarationDescriptorWithVisibility,
|
what: DeclarationDescriptorWithVisibility,
|
||||||
from: DeclarationDescriptor
|
from: DeclarationDescriptor,
|
||||||
|
useSpecialRulesForPrivateSealedConstructors: Boolean
|
||||||
) = originalVisibility.isVisible(
|
) = 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")
|
override fun mustCheckInImports() = throw UnsupportedOperationException("Should never be called for this visibility")
|
||||||
|
|||||||
+2
-2
@@ -490,9 +490,9 @@ class ControlFlowInformationProviderImpl private constructor(
|
|||||||
|
|
||||||
val receiverValue = expression.getResolvedCall(trace.bindingContext)?.getDispatchReceiverWithSmartCast()
|
val receiverValue = expression.getResolvedCall(trace.bindingContext)?.getDispatchReceiverWithSmartCast()
|
||||||
|
|
||||||
if (DescriptorVisibilities.isVisible(receiverValue, variableDescriptor, descriptor)
|
if (DescriptorVisibilityUtils.isVisible(receiverValue, variableDescriptor, descriptor, languageVersionSettings)
|
||||||
&& setterDescriptor != null
|
&& setterDescriptor != null
|
||||||
&& !DescriptorVisibilities.isVisible(receiverValue, setterDescriptor, descriptor)
|
&& !DescriptorVisibilityUtils.isVisible(receiverValue, setterDescriptor, descriptor, languageVersionSettings)
|
||||||
) {
|
) {
|
||||||
report(
|
report(
|
||||||
Errors.INVISIBLE_SETTER.on(
|
Errors.INVISIBLE_SETTER.on(
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
package org.jetbrains.kotlin.resolve
|
package org.jetbrains.kotlin.resolve
|
||||||
|
|
||||||
import com.intellij.util.SmartList
|
import com.intellij.util.SmartList
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
@@ -29,6 +30,7 @@ import org.jetbrains.kotlin.utils.Printer
|
|||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
|
|
||||||
class LazyExplicitImportScope(
|
class LazyExplicitImportScope(
|
||||||
|
private val languageVersionSettings: LanguageVersionSettings,
|
||||||
private val packageOrClassDescriptor: DeclarationDescriptor,
|
private val packageOrClassDescriptor: DeclarationDescriptor,
|
||||||
private val packageFragmentForVisibilityCheck: PackageFragmentDescriptor?,
|
private val packageFragmentForVisibilityCheck: PackageFragmentDescriptor?,
|
||||||
private val declaredName: Name,
|
private val declaredName: Name,
|
||||||
@@ -148,6 +150,8 @@ class LazyExplicitImportScope(
|
|||||||
else -> null
|
else -> null
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun <D : CallableMemberDescriptor> Collection<D>.choseOnlyVisibleOrAll() =
|
private fun <D : CallableMemberDescriptor> Collection<D>.choseOnlyVisibleOrAll(): Collection<D> =
|
||||||
filter { isVisible(it, packageFragmentForVisibilityCheck, position = QualifierPosition.IMPORT) }.takeIf { it.isNotEmpty() } ?: this
|
filter { isVisible(it, packageFragmentForVisibilityCheck, position = QualifierPosition.IMPORT, languageVersionSettings) }
|
||||||
|
.takeIf { it.isNotEmpty() }
|
||||||
|
?: this
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.config.LanguageVersionSettings
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.DELEGATION
|
||||||
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE
|
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor.Kind.FAKE_OVERRIDE
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.useSpecialRulesForPrivateSealedConstructors
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory2
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
|
import org.jetbrains.kotlin.diagnostics.DiagnosticFactoryWithPsiElement
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.*
|
import org.jetbrains.kotlin.diagnostics.Errors.*
|
||||||
@@ -41,7 +42,6 @@ import org.jetbrains.kotlin.resolve.calls.util.isOrOverridesSynthesized
|
|||||||
import org.jetbrains.kotlin.types.*
|
import org.jetbrains.kotlin.types.*
|
||||||
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
||||||
import org.jetbrains.kotlin.types.checker.NewKotlinTypeCheckerImpl
|
import org.jetbrains.kotlin.types.checker.NewKotlinTypeCheckerImpl
|
||||||
import org.jetbrains.kotlin.types.TypeRefinement
|
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
|
import org.jetbrains.kotlin.utils.addToStdlib.assertedCast
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -366,7 +366,7 @@ class OverrideResolver(
|
|||||||
override fun nothingToOverride(overriding: CallableMemberDescriptor) {
|
override fun nothingToOverride(overriding: CallableMemberDescriptor) {
|
||||||
trace.report(NOTHING_TO_OVERRIDE.on(member, declared))
|
trace.report(NOTHING_TO_OVERRIDE.on(member, declared))
|
||||||
}
|
}
|
||||||
}
|
}, languageVersionSettings
|
||||||
)
|
)
|
||||||
} else if (!overriddenDescriptors.isEmpty() && !overridesBackwardCompatibilityHelper.overrideCanBeOmitted(declared)) {
|
} else if (!overriddenDescriptors.isEmpty() && !overridesBackwardCompatibilityHelper.overrideCanBeOmitted(declared)) {
|
||||||
val overridden = overriddenDescriptors.first()
|
val overridden = overriddenDescriptors.first()
|
||||||
@@ -854,7 +854,8 @@ class OverrideResolver(
|
|||||||
private fun checkOverridesForMemberMarkedOverride(
|
private fun checkOverridesForMemberMarkedOverride(
|
||||||
declared: CallableMemberDescriptor,
|
declared: CallableMemberDescriptor,
|
||||||
kotlinTypeRefiner: KotlinTypeRefiner,
|
kotlinTypeRefiner: KotlinTypeRefiner,
|
||||||
reportError: CheckOverrideReportForDeclaredMemberStrategy
|
reportError: CheckOverrideReportForDeclaredMemberStrategy,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
) {
|
) {
|
||||||
val overriddenDescriptors = declared.overriddenDescriptors
|
val overriddenDescriptors = declared.overriddenDescriptors
|
||||||
|
|
||||||
@@ -868,7 +869,7 @@ class OverrideResolver(
|
|||||||
|
|
||||||
val invisibleOverriddenDescriptor =
|
val invisibleOverriddenDescriptor =
|
||||||
findInvisibleOverriddenDescriptor(
|
findInvisibleOverriddenDescriptor(
|
||||||
declared, declaringClass, kotlinTypeRefiner
|
declared, declaringClass, kotlinTypeRefiner, languageVersionSettings
|
||||||
)
|
)
|
||||||
if (invisibleOverriddenDescriptor != null) {
|
if (invisibleOverriddenDescriptor != null) {
|
||||||
reportError.cannotOverrideInvisibleMember(declared, invisibleOverriddenDescriptor)
|
reportError.cannotOverrideInvisibleMember(declared, invisibleOverriddenDescriptor)
|
||||||
@@ -953,7 +954,8 @@ class OverrideResolver(
|
|||||||
private fun findInvisibleOverriddenDescriptor(
|
private fun findInvisibleOverriddenDescriptor(
|
||||||
declared: CallableMemberDescriptor,
|
declared: CallableMemberDescriptor,
|
||||||
declaringClass: ClassDescriptor,
|
declaringClass: ClassDescriptor,
|
||||||
kotlinTypeRefiner: KotlinTypeRefiner
|
kotlinTypeRefiner: KotlinTypeRefiner,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
): CallableMemberDescriptor? {
|
): CallableMemberDescriptor? {
|
||||||
@OptIn(TypeRefinement::class)
|
@OptIn(TypeRefinement::class)
|
||||||
for (supertype in kotlinTypeRefiner.refineSupertypes(declaringClass)) {
|
for (supertype in kotlinTypeRefiner.refineSupertypes(declaringClass)) {
|
||||||
@@ -962,7 +964,7 @@ class OverrideResolver(
|
|||||||
all.addAll(supertype.memberScope.getContributedVariables(declared.name, NoLookupLocation.WHEN_CHECK_OVERRIDES))
|
all.addAll(supertype.memberScope.getContributedVariables(declared.name, NoLookupLocation.WHEN_CHECK_OVERRIDES))
|
||||||
for (fromSuper in all) {
|
for (fromSuper in all) {
|
||||||
if (OverridingUtil.DEFAULT.isOverridableBy(fromSuper, declared, null).result == OVERRIDABLE) {
|
if (OverridingUtil.DEFAULT.isOverridableBy(fromSuper, declared, null).result == OVERRIDABLE) {
|
||||||
if (OverridingUtil.isVisibleForOverride(declared, fromSuper)) {
|
if (OverridingUtil.isVisibleForOverride(declared, fromSuper, languageVersionSettings.useSpecialRulesForPrivateSealedConstructors)) {
|
||||||
throw IllegalStateException(
|
throw IllegalStateException(
|
||||||
"Descriptor " + fromSuper + " is overridable by " + declared +
|
"Descriptor " + fromSuper + " is overridable by " + declared +
|
||||||
" and visible but does not appear in its getOverriddenDescriptors()"
|
" and visible but does not appear in its getOverriddenDescriptors()"
|
||||||
|
|||||||
@@ -336,6 +336,7 @@ class QualifiedExpressionResolver(val languageVersionSettings: LanguageVersionSe
|
|||||||
(resolvedDescriptor as? TypeAliasDescriptor)?.let { it.classDescriptor ?: return null } ?: resolvedDescriptor
|
(resolvedDescriptor as? TypeAliasDescriptor)?.let { it.classDescriptor ?: return null } ?: resolvedDescriptor
|
||||||
|
|
||||||
return LazyExplicitImportScope(
|
return LazyExplicitImportScope(
|
||||||
|
languageVersionSettings,
|
||||||
packageOrClassDescriptor,
|
packageOrClassDescriptor,
|
||||||
packageFragmentForVisibilityCheck,
|
packageFragmentForVisibilityCheck,
|
||||||
lastPart.name,
|
lastPart.name,
|
||||||
@@ -739,7 +740,7 @@ class QualifiedExpressionResolver(val languageVersionSettings: LanguageVersionSe
|
|||||||
) {
|
) {
|
||||||
referenceExpression ?: return
|
referenceExpression ?: return
|
||||||
if (descriptors.size > 1) {
|
if (descriptors.size > 1) {
|
||||||
val visibleDescriptors = descriptors.filter { isVisible(it, shouldBeVisibleFrom, position) }
|
val visibleDescriptors = descriptors.filter { isVisible(it, shouldBeVisibleFrom, position, languageVersionSettings) }
|
||||||
when {
|
when {
|
||||||
visibleDescriptors.isEmpty() -> {
|
visibleDescriptors.isEmpty() -> {
|
||||||
val descriptor = descriptors.first() as DeclarationDescriptorWithVisibility
|
val descriptor = descriptors.first() as DeclarationDescriptorWithVisibility
|
||||||
@@ -782,7 +783,7 @@ class QualifiedExpressionResolver(val languageVersionSettings: LanguageVersionSe
|
|||||||
} else {
|
} else {
|
||||||
shouldBeVisibleFrom
|
shouldBeVisibleFrom
|
||||||
}
|
}
|
||||||
if (!isVisible(descriptor, fromToCheck, position)) {
|
if (!isVisible(descriptor, fromToCheck, position, languageVersionSettings)) {
|
||||||
trace.report(Errors.INVISIBLE_REFERENCE.on(referenceExpression, descriptor, descriptor.visibility, descriptor))
|
trace.report(Errors.INVISIBLE_REFERENCE.on(referenceExpression, descriptor, descriptor.visibility, descriptor))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -836,7 +837,8 @@ class QualifiedExpressionResolver(val languageVersionSettings: LanguageVersionSe
|
|||||||
internal fun isVisible(
|
internal fun isVisible(
|
||||||
descriptor: DeclarationDescriptor,
|
descriptor: DeclarationDescriptor,
|
||||||
shouldBeVisibleFrom: DeclarationDescriptor?,
|
shouldBeVisibleFrom: DeclarationDescriptor?,
|
||||||
position: QualifierPosition
|
position: QualifierPosition,
|
||||||
|
languageVersionSettings: LanguageVersionSettings
|
||||||
): Boolean {
|
): Boolean {
|
||||||
if (descriptor !is DeclarationDescriptorWithVisibility || shouldBeVisibleFrom == null) return true
|
if (descriptor !is DeclarationDescriptorWithVisibility || shouldBeVisibleFrom == null) return true
|
||||||
|
|
||||||
@@ -845,7 +847,7 @@ internal fun isVisible(
|
|||||||
if (DescriptorVisibilities.isPrivate(visibility)) return DescriptorVisibilities.inSameFile(descriptor, shouldBeVisibleFrom)
|
if (DescriptorVisibilities.isPrivate(visibility)) return DescriptorVisibilities.inSameFile(descriptor, shouldBeVisibleFrom)
|
||||||
if (!visibility.mustCheckInImports()) return true
|
if (!visibility.mustCheckInImports()) return true
|
||||||
}
|
}
|
||||||
return DescriptorVisibilities.isVisibleIgnoringReceiver(descriptor, shouldBeVisibleFrom)
|
return DescriptorVisibilityUtils.isVisibleIgnoringReceiver(descriptor, shouldBeVisibleFrom, languageVersionSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
internal enum class QualifierPosition {
|
internal enum class QualifierPosition {
|
||||||
|
|||||||
@@ -12,17 +12,12 @@ import org.jetbrains.kotlin.descriptors.*
|
|||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors.*
|
import org.jetbrains.kotlin.diagnostics.Errors.EXPANDED_TYPE_CANNOT_BE_CONSTRUCTED
|
||||||
|
import org.jetbrains.kotlin.diagnostics.Errors.SUPER_CANT_BE_EXTENSION_RECEIVER
|
||||||
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
import org.jetbrains.kotlin.progress.ProgressIndicatorAndCompilationCanceledStatus
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.*
|
import org.jetbrains.kotlin.resolve.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallTransformer.CallForImplicitInvoke
|
import org.jetbrains.kotlin.resolve.calls.CallTransformer.CallForImplicitInvoke
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.ResolveArgumentsMode
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.getEffectiveExpectedType
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.getErasedReceiverType
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.isInvokeCallOnExpressionWithBothReceivers
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.isSafeCall
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker
|
import org.jetbrains.kotlin.resolve.calls.checkers.AdditionalTypeChecker
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.*
|
import org.jetbrains.kotlin.resolve.calls.context.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.SubstitutionFilteringInternalResolveAnnotations
|
import org.jetbrains.kotlin.resolve.calls.inference.SubstitutionFilteringInternalResolveAnnotations
|
||||||
@@ -33,7 +28,8 @@ import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus.*
|
|||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.SmartCastManager
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.getReceiverValueWithSmartCast
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.getReceiverValueWithSmartCast
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
import org.jetbrains.kotlin.resolve.calls.util.*
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.util.ResolveArgumentsMode.SHAPE_FUNCTION_ARGUMENTS
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.Receiver
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
@@ -44,7 +40,6 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
|
|||||||
import org.jetbrains.kotlin.types.expressions.DoubleColonExpressionResolver
|
import org.jetbrains.kotlin.types.expressions.DoubleColonExpressionResolver
|
||||||
import org.jetbrains.kotlin.types.typeUtil.containsTypeProjectionsInTopLevelArguments
|
import org.jetbrains.kotlin.types.typeUtil.containsTypeProjectionsInTopLevelArguments
|
||||||
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
|
||||||
import java.util.*
|
|
||||||
import kotlin.math.min
|
import kotlin.math.min
|
||||||
|
|
||||||
class CandidateResolver(
|
class CandidateResolver(
|
||||||
@@ -185,8 +180,11 @@ class CandidateResolver(
|
|||||||
receiverArgument: ReceiverValue?,
|
receiverArgument: ReceiverValue?,
|
||||||
smartCastType: KotlinType?
|
smartCastType: KotlinType?
|
||||||
): ResolutionStatus {
|
): ResolutionStatus {
|
||||||
val invisibleMember = DescriptorVisibilities.findInvisibleMember(
|
val invisibleMember = DescriptorVisibilityUtils.findInvisibleMember(
|
||||||
getReceiverValueWithSmartCast(receiverArgument, smartCastType), candidateDescriptor, scope.ownerDescriptor
|
getReceiverValueWithSmartCast(receiverArgument, smartCastType),
|
||||||
|
candidateDescriptor,
|
||||||
|
scope.ownerDescriptor,
|
||||||
|
languageVersionSettings
|
||||||
)
|
)
|
||||||
return if (invisibleMember != null) {
|
return if (invisibleMember != null) {
|
||||||
tracing.invisibleMember(trace, invisibleMember)
|
tracing.invisibleMember(trace, invisibleMember)
|
||||||
@@ -205,9 +203,10 @@ class CandidateResolver(
|
|||||||
private fun CallCandidateResolutionContext<*>.isCandidateVisible(
|
private fun CallCandidateResolutionContext<*>.isCandidateVisible(
|
||||||
receiverArgument: ReceiverValue?,
|
receiverArgument: ReceiverValue?,
|
||||||
smartCastType: KotlinType?
|
smartCastType: KotlinType?
|
||||||
) = DescriptorVisibilities.findInvisibleMember(
|
) = DescriptorVisibilityUtils.findInvisibleMember(
|
||||||
getReceiverValueWithSmartCast(receiverArgument, smartCastType),
|
getReceiverValueWithSmartCast(receiverArgument, smartCastType),
|
||||||
candidateDescriptor, scope.ownerDescriptor
|
candidateDescriptor, scope.ownerDescriptor,
|
||||||
|
languageVersionSettings
|
||||||
) == null
|
) == null
|
||||||
|
|
||||||
private fun CallCandidateResolutionContext<*>.checkExtensionReceiver() = checkAndReport {
|
private fun CallCandidateResolutionContext<*>.checkExtensionReceiver() = checkAndReport {
|
||||||
|
|||||||
+9
-2
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve.calls.checkers
|
|||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.psi.KtConstructorCalleeExpression
|
import org.jetbrains.kotlin.psi.KtConstructorCalleeExpression
|
||||||
@@ -37,7 +38,7 @@ object ProtectedConstructorCallChecker : CallChecker {
|
|||||||
|
|
||||||
if (actualConstructor.visibility.normalize() != DescriptorVisibilities.PROTECTED) return
|
if (actualConstructor.visibility.normalize() != DescriptorVisibilities.PROTECTED) return
|
||||||
// Error already reported
|
// Error already reported
|
||||||
if (!DescriptorVisibilities.isVisibleWithAnyReceiver(descriptor, scopeOwner)) return
|
if (!DescriptorVisibilityUtils.isVisibleWithAnyReceiver(descriptor, scopeOwner, context.languageVersionSettings)) return
|
||||||
|
|
||||||
val calleeExpression = resolvedCall.call.calleeExpression
|
val calleeExpression = resolvedCall.call.calleeExpression
|
||||||
|
|
||||||
@@ -55,7 +56,13 @@ object ProtectedConstructorCallChecker : CallChecker {
|
|||||||
// And without ProtectedConstructorCallChecker such calls would be allowed only because they are performed within subclass
|
// And without ProtectedConstructorCallChecker such calls would be allowed only because they are performed within subclass
|
||||||
// of constructor owner
|
// of constructor owner
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
if (DescriptorVisibilities.findInvisibleMember(DescriptorVisibilities.FALSE_IF_PROTECTED, descriptor, scopeOwner) == actualConstructor.original) {
|
if (DescriptorVisibilityUtils.findInvisibleMember(
|
||||||
|
DescriptorVisibilities.FALSE_IF_PROTECTED,
|
||||||
|
descriptor,
|
||||||
|
scopeOwner,
|
||||||
|
context.languageVersionSettings
|
||||||
|
) == actualConstructor.original
|
||||||
|
) {
|
||||||
context.trace.report(Errors.PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL.on(reportOn, descriptor))
|
context.trace.report(Errors.PROTECTED_CONSTRUCTOR_NOT_IN_SUPER_CALL.on(reportOn, descriptor))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-5
@@ -32,10 +32,6 @@ import org.jetbrains.kotlin.resolve.TemporaryBindingTrace
|
|||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
||||||
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
|
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.isBinaryRemOperator
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.isConventionCall
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.isInfixCall
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.createLookupLocation
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.*
|
import org.jetbrains.kotlin.resolve.calls.context.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.BuilderInferenceSupport
|
import org.jetbrains.kotlin.resolve.calls.inference.BuilderInferenceSupport
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic
|
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic
|
||||||
@@ -48,7 +44,7 @@ import org.jetbrains.kotlin.resolve.calls.results.ResolutionStatus
|
|||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.*
|
import org.jetbrains.kotlin.resolve.calls.tasks.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
import org.jetbrains.kotlin.resolve.calls.util.*
|
||||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDynamicExtensionAnnotation
|
import org.jetbrains.kotlin.resolve.descriptorUtil.hasDynamicExtensionAnnotation
|
||||||
import org.jetbrains.kotlin.resolve.scopes.*
|
import org.jetbrains.kotlin.resolve.scopes.*
|
||||||
@@ -381,6 +377,8 @@ class NewResolutionOldInference(
|
|||||||
override val isNewInferenceEnabled: Boolean
|
override val isNewInferenceEnabled: Boolean
|
||||||
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
get() = resolutionContext.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
||||||
|
|
||||||
|
override val languageVersionSettings: LanguageVersionSettings
|
||||||
|
get() = resolutionContext.languageVersionSettings
|
||||||
|
|
||||||
override fun interceptFunctionCandidates(
|
override fun interceptFunctionCandidates(
|
||||||
resolutionScope: ResolutionScope,
|
resolutionScope: ResolutionScope,
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ import org.jetbrains.kotlin.types.model.TypeSystemInferenceExtensionContext
|
|||||||
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
|
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
|
import org.jetbrains.kotlin.utils.addToStdlib.compactIfPossible
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
|
||||||
import java.util.*
|
|
||||||
|
|
||||||
class PSICallResolver(
|
class PSICallResolver(
|
||||||
private val typeResolver: TypeResolver,
|
private val typeResolver: TypeResolver,
|
||||||
@@ -395,6 +394,7 @@ class PSICallResolver(
|
|||||||
override val syntheticScopes: SyntheticScopes get() = this@PSICallResolver.syntheticScopes
|
override val syntheticScopes: SyntheticScopes get() = this@PSICallResolver.syntheticScopes
|
||||||
override val isDebuggerContext: Boolean get() = context.isDebuggerContext
|
override val isDebuggerContext: Boolean get() = context.isDebuggerContext
|
||||||
override val isNewInferenceEnabled: Boolean get() = context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
override val isNewInferenceEnabled: Boolean get() = context.languageVersionSettings.supportsFeature(LanguageFeature.NewInference)
|
||||||
|
override val languageVersionSettings: LanguageVersionSettings get() = context.languageVersionSettings
|
||||||
override val lexicalScope: LexicalScope get() = context.scope
|
override val lexicalScope: LexicalScope get() = context.scope
|
||||||
override val typeApproximator: TypeApproximator get() = this@PSICallResolver.typeApproximator
|
override val typeApproximator: TypeApproximator get() = this@PSICallResolver.typeApproximator
|
||||||
override val implicitsResolutionFilter: ImplicitsExtensionsResolutionFilter get() = this@PSICallResolver.implicitsResolutionFilter
|
override val implicitsResolutionFilter: ImplicitsExtensionsResolutionFilter get() = this@PSICallResolver.implicitsResolutionFilter
|
||||||
|
|||||||
@@ -269,7 +269,11 @@ class FileScopeFactory(
|
|||||||
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
|
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
|
||||||
if (name in excludedNames) return null
|
if (name in excludedNames) return null
|
||||||
val classifier = scope.getContributedClassifier(name, location) ?: return null
|
val classifier = scope.getContributedClassifier(name, location) ?: return null
|
||||||
val visible = DescriptorVisibilities.isVisibleIgnoringReceiver(classifier as DeclarationDescriptorWithVisibility, fromDescriptor)
|
val visible = DescriptorVisibilityUtils.isVisibleIgnoringReceiver(
|
||||||
|
classifier as DeclarationDescriptorWithVisibility,
|
||||||
|
fromDescriptor,
|
||||||
|
components.languageVersionSettings
|
||||||
|
)
|
||||||
return classifier.takeIf { filteringKind == if (visible) FilteringKind.VISIBLE_CLASSES else FilteringKind.INVISIBLE_CLASSES }
|
return classifier.takeIf { filteringKind == if (visible) FilteringKind.VISIBLE_CLASSES else FilteringKind.INVISIBLE_CLASSES }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import gnu.trove.THashSet
|
|||||||
import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMapper
|
import org.jetbrains.kotlin.builtins.PlatformToKotlinClassMapper
|
||||||
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
|
import org.jetbrains.kotlin.descriptors.DescriptorVisibilityUtils.isVisibleIgnoringReceiver
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
import org.jetbrains.kotlin.incremental.KotlinLookupLocation
|
import org.jetbrains.kotlin.incremental.KotlinLookupLocation
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
@@ -240,7 +241,7 @@ class LazyImportScope(
|
|||||||
val visibility = (descriptor as DeclarationDescriptorWithVisibility).visibility
|
val visibility = (descriptor as DeclarationDescriptorWithVisibility).visibility
|
||||||
val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES
|
val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES
|
||||||
if (!visibility.mustCheckInImports()) return includeVisible
|
if (!visibility.mustCheckInImports()) return includeVisible
|
||||||
return DescriptorVisibilities.isVisibleIgnoringReceiver(descriptor, components.moduleDescriptor) == includeVisible
|
return isVisibleIgnoringReceiver(descriptor, components.moduleDescriptor, components.languageVersionSettings) == includeVisible
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
|
override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
|
||||||
|
|||||||
+2
-8
@@ -25,9 +25,6 @@ import org.jetbrains.kotlin.psi.psiUtil.checkReservedYield
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
|
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedElementSelector
|
||||||
import org.jetbrains.kotlin.resolve.*
|
import org.jetbrains.kotlin.resolve.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.ResolveArgumentsMode
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.getCalleeExpressionIfAny
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.getResolvedCall
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.checkers.isBuiltInCoroutineContext
|
import org.jetbrains.kotlin.resolve.calls.checkers.isBuiltInCoroutineContext
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.*
|
import org.jetbrains.kotlin.resolve.calls.context.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.BuilderInferenceSession
|
import org.jetbrains.kotlin.resolve.calls.inference.BuilderInferenceSession
|
||||||
@@ -35,9 +32,7 @@ import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults
|
|||||||
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil
|
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResultsUtil
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowInfo
|
||||||
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.CallMaker
|
import org.jetbrains.kotlin.resolve.calls.util.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject
|
|
||||||
import org.jetbrains.kotlin.resolve.calls.util.createValueParametersForInvokeInFunctionType
|
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ClassQualifier
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ClassQualifier
|
||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver
|
||||||
@@ -50,7 +45,6 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
|
|||||||
import org.jetbrains.kotlin.types.expressions.FunctionWithBigAritySupport.LanguageVersionDependent
|
import org.jetbrains.kotlin.types.expressions.FunctionWithBigAritySupport.LanguageVersionDependent
|
||||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.createTypeInfo
|
||||||
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo
|
import org.jetbrains.kotlin.types.expressions.typeInfoFactory.noTypeInfo
|
||||||
import org.jetbrains.kotlin.types.TypeRefinement
|
|
||||||
import org.jetbrains.kotlin.types.typeUtil.*
|
import org.jetbrains.kotlin.types.typeUtil.*
|
||||||
import org.jetbrains.kotlin.utils.yieldIfNotNull
|
import org.jetbrains.kotlin.utils.yieldIfNotNull
|
||||||
import java.util.*
|
import java.util.*
|
||||||
@@ -846,7 +840,7 @@ class DoubleColonExpressionResolver(
|
|||||||
): Boolean {
|
): Boolean {
|
||||||
val receiver = receiverTypeFor(descriptor, lhs)?.let(::TransientReceiver)
|
val receiver = receiverTypeFor(descriptor, lhs)?.let(::TransientReceiver)
|
||||||
val setter = descriptor.setter
|
val setter = descriptor.setter
|
||||||
return descriptor.isVar && (setter == null || DescriptorVisibilities.isVisible(receiver, setter, scopeOwnerDescriptor))
|
return descriptor.isVar && (setter == null || DescriptorVisibilities.isVisible(receiver, setter, scopeOwnerDescriptor, false))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createKCallableTypeForReference(
|
fun createKCallableTypeForReference(
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ class ClassGenerator(
|
|||||||
context.extensions.getParentClassStaticScope(classDescriptor)?.run {
|
context.extensions.getParentClassStaticScope(classDescriptor)?.run {
|
||||||
for (parentStaticMember in getContributedDescriptors()) {
|
for (parentStaticMember in getContributedDescriptors()) {
|
||||||
if (parentStaticMember is FunctionDescriptor &&
|
if (parentStaticMember is FunctionDescriptor &&
|
||||||
DescriptorVisibilities.isVisibleIgnoringReceiver(parentStaticMember, classDescriptor)
|
DescriptorVisibilityUtils.isVisibleIgnoringReceiver(parentStaticMember, classDescriptor, context.languageVersionSettings)
|
||||||
) {
|
) {
|
||||||
val fakeOverride = createFakeOverrideDescriptorForParentStaticMember(classDescriptor, parentStaticMember)
|
val fakeOverride = createFakeOverrideDescriptorForParentStaticMember(classDescriptor, parentStaticMember)
|
||||||
declarationGenerator.generateFakeOverrideDeclaration(fakeOverride, ktClassOrObject)?.let {
|
declarationGenerator.generateFakeOverrideDeclaration(fakeOverride, ktClassOrObject)?.let {
|
||||||
|
|||||||
@@ -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.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.TypeAliasConstructorDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.calls.components.TypeArgumentsToParametersMapper.TypeArgumentsMapping.NoExplicitArguments
|
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.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.ConstraintSystemOperation
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
import org.jetbrains.kotlin.resolve.calls.inference.NewConstraintSystem
|
||||||
import org.jetbrains.kotlin.resolve.calls.inference.components.*
|
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 receiverValue = dispatchReceiverArgument?.receiver?.receiverValue ?: DescriptorVisibilities.ALWAYS_SUITABLE_RECEIVER
|
||||||
val invisibleMember =
|
val invisibleMember =
|
||||||
DescriptorVisibilities.findInvisibleMember(receiverValue, resolvedCall.candidateDescriptor, containingDescriptor) ?: return
|
DescriptorVisibilityUtils.findInvisibleMember(
|
||||||
|
receiverValue,
|
||||||
|
resolvedCall.candidateDescriptor,
|
||||||
|
containingDescriptor,
|
||||||
|
callComponents.languageVersionSettings
|
||||||
|
) ?: return
|
||||||
|
|
||||||
if (dispatchReceiverArgument is ExpressionKotlinCallArgument) {
|
if (dispatchReceiverArgument is ExpressionKotlinCallArgument) {
|
||||||
val smartCastReceiver = getReceiverValueWithSmartCast(receiverValue, dispatchReceiverArgument.receiver.stableType)
|
val smartCastReceiver = getReceiverValueWithSmartCast(receiverValue, dispatchReceiverArgument.receiver.stableType)
|
||||||
if (DescriptorVisibilities.findInvisibleMember(smartCastReceiver, candidateDescriptor, containingDescriptor) == null) {
|
if (DescriptorVisibilityUtils.findInvisibleMember(smartCastReceiver, candidateDescriptor, containingDescriptor, callComponents.languageVersionSettings) == null) {
|
||||||
addDiagnostic(
|
addDiagnostic(
|
||||||
SmartCastDiagnostic(
|
SmartCastDiagnostic(
|
||||||
dispatchReceiverArgument,
|
dispatchReceiverArgument,
|
||||||
|
|||||||
+1
-1
@@ -340,7 +340,7 @@ class CallableReferencesCandidateFactory(
|
|||||||
val setter = descriptor.setter
|
val setter = descriptor.setter
|
||||||
setter == null || DescriptorVisibilities.isVisible(
|
setter == null || DescriptorVisibilities.isVisible(
|
||||||
dispatchReceiver?.asReceiverValueForVisibilityChecks, setter,
|
dispatchReceiver?.asReceiverValueForVisibilityChecks, setter,
|
||||||
scopeTower.lexicalScope.ownerDescriptor
|
scopeTower.lexicalScope.ownerDescriptor, false
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve.calls.tower
|
package org.jetbrains.kotlin.resolve.calls.tower
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.config.LanguageVersionSettings
|
||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -48,6 +49,8 @@ interface ImplicitScopeTower {
|
|||||||
|
|
||||||
val isNewInferenceEnabled: Boolean
|
val isNewInferenceEnabled: Boolean
|
||||||
|
|
||||||
|
val languageVersionSettings: LanguageVersionSettings
|
||||||
|
|
||||||
val typeApproximator: TypeApproximator
|
val typeApproximator: TypeApproximator
|
||||||
|
|
||||||
val implicitsResolutionFilter: ImplicitsExtensionsResolutionFilter
|
val implicitsResolutionFilter: ImplicitsExtensionsResolutionFilter
|
||||||
|
|||||||
@@ -64,10 +64,11 @@ internal abstract class AbstractScopeTowerLevel(
|
|||||||
|
|
||||||
val shouldSkipVisibilityCheck = scopeTower.isNewInferenceEnabled
|
val shouldSkipVisibilityCheck = scopeTower.isNewInferenceEnabled
|
||||||
if (!shouldSkipVisibilityCheck) {
|
if (!shouldSkipVisibilityCheck) {
|
||||||
DescriptorVisibilities.findInvisibleMember(
|
DescriptorVisibilityUtils.findInvisibleMember(
|
||||||
getReceiverValueWithSmartCast(dispatchReceiver?.receiverValue, dispatchReceiverSmartCastType),
|
getReceiverValueWithSmartCast(dispatchReceiver?.receiverValue, dispatchReceiverSmartCastType),
|
||||||
descriptor,
|
descriptor,
|
||||||
scopeTower.lexicalScope.ownerDescriptor
|
scopeTower.lexicalScope.ownerDescriptor,
|
||||||
|
scopeTower.languageVersionSettings
|
||||||
)?.let { diagnostics.add(VisibilityError(it)) }
|
)?.let { diagnostics.add(VisibilityError(it)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -243,6 +243,7 @@ enum class LanguageFeature(
|
|||||||
// 1.8
|
// 1.8
|
||||||
|
|
||||||
ProhibitConfusingSyntaxInWhenBranches(KOTLIN_1_8, kind = BUG_FIX), // KT-48385
|
ProhibitConfusingSyntaxInWhenBranches(KOTLIN_1_8, kind = BUG_FIX), // KT-48385
|
||||||
|
UseConsistentRulesForPrivateConstructorsOfSealedClasses(sinceVersion = KOTLIN_1_8, kind = BUG_FIX), // KT-44866
|
||||||
|
|
||||||
// Temporarily disabled, see KT-27084/KT-22379
|
// Temporarily disabled, see KT-27084/KT-22379
|
||||||
SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),
|
SoundSmartcastFromLoopConditionForLoopAssignedVariables(sinceVersion = null, kind = BUG_FIX),
|
||||||
|
|||||||
+19
-4
@@ -33,7 +33,12 @@ public class JavaDescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility PACKAGE_VISIBILITY = new DelegatedDescriptorVisibility(JavaVisibilities.PackageVisibility.INSTANCE) {
|
public static final DescriptorVisibility PACKAGE_VISIBILITY = new DelegatedDescriptorVisibility(JavaVisibilities.PackageVisibility.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
return areInSamePackage(what, from);
|
return areInSamePackage(what, from);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -41,7 +46,12 @@ public class JavaDescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility PROTECTED_STATIC_VISIBILITY = new DelegatedDescriptorVisibility(JavaVisibilities.ProtectedStaticVisibility.INSTANCE) {
|
public static final DescriptorVisibility PROTECTED_STATIC_VISIBILITY = new DelegatedDescriptorVisibility(JavaVisibilities.ProtectedStaticVisibility.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
return isVisibleForProtectedAndPackage(receiver, what, from);
|
return isVisibleForProtectedAndPackage(receiver, what, from);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -49,7 +59,12 @@ public class JavaDescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility PROTECTED_AND_PACKAGE = new DelegatedDescriptorVisibility(JavaVisibilities.ProtectedAndPackage.INSTANCE) {
|
public static final DescriptorVisibility PROTECTED_AND_PACKAGE = new DelegatedDescriptorVisibility(JavaVisibilities.ProtectedAndPackage.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
return isVisibleForProtectedAndPackage(receiver, what, from);
|
return isVisibleForProtectedAndPackage(receiver, what, from);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -63,7 +78,7 @@ public class JavaDescriptorVisibilities {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return DescriptorVisibilities.PROTECTED.isVisible(receiver, what, from);
|
return DescriptorVisibilities.PROTECTED.isVisible(receiver, what, from, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean areInSamePackage(@NotNull DeclarationDescriptor first, @NotNull DeclarationDescriptor second) {
|
private static boolean areInSamePackage(@NotNull DeclarationDescriptor first, @NotNull DeclarationDescriptor second) {
|
||||||
|
|||||||
@@ -39,14 +39,20 @@ public class DescriptorVisibilities {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
if (DescriptorUtils.isTopLevelDeclaration(what) && hasContainingSourceFile(from)) {
|
if (DescriptorUtils.isTopLevelDeclaration(what) && hasContainingSourceFile(from)) {
|
||||||
return inSameFile(what, from);
|
return inSameFile(what, from);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (what instanceof ConstructorDescriptor) {
|
if (what instanceof ConstructorDescriptor) {
|
||||||
ClassifierDescriptorWithTypeParameters classDescriptor = ((ConstructorDescriptor) what).getContainingDeclaration();
|
ClassifierDescriptorWithTypeParameters classDescriptor = ((ConstructorDescriptor) what).getContainingDeclaration();
|
||||||
if (DescriptorUtils.isSealedClass(classDescriptor)
|
if (useSpecialRulesForPrivateSealedConstructors
|
||||||
|
&& DescriptorUtils.isSealedClass(classDescriptor)
|
||||||
&& DescriptorUtils.isTopLevelDeclaration(classDescriptor)
|
&& DescriptorUtils.isTopLevelDeclaration(classDescriptor)
|
||||||
&& from instanceof ConstructorDescriptor
|
&& from instanceof ConstructorDescriptor
|
||||||
&& DescriptorUtils.isTopLevelDeclaration(from.getContainingDeclaration())
|
&& DescriptorUtils.isTopLevelDeclaration(from.getContainingDeclaration())
|
||||||
@@ -99,8 +105,13 @@ public class DescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility PRIVATE_TO_THIS = new DelegatedDescriptorVisibility(Visibilities.PrivateToThis.INSTANCE) {
|
public static final DescriptorVisibility PRIVATE_TO_THIS = new DelegatedDescriptorVisibility(Visibilities.PrivateToThis.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue thisObject, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
if (PRIVATE.isVisible(thisObject, what, from)) {
|
@Nullable ReceiverValue thisObject,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
|
if (PRIVATE.isVisible(thisObject, what, from, useSpecialRulesForPrivateSealedConstructors)) {
|
||||||
// See Visibility.isVisible contract
|
// See Visibility.isVisible contract
|
||||||
if (thisObject == ALWAYS_SUITABLE_RECEIVER) return true;
|
if (thisObject == ALWAYS_SUITABLE_RECEIVER) return true;
|
||||||
if (thisObject == IRRELEVANT_RECEIVER) return false;
|
if (thisObject == IRRELEVANT_RECEIVER) return false;
|
||||||
@@ -121,7 +132,8 @@ public class DescriptorVisibilities {
|
|||||||
public boolean isVisible(
|
public boolean isVisible(
|
||||||
@Nullable ReceiverValue receiver,
|
@Nullable ReceiverValue receiver,
|
||||||
@NotNull DeclarationDescriptorWithVisibility what,
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
@NotNull DeclarationDescriptor from
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
) {
|
) {
|
||||||
ClassDescriptor givenDescriptorContainingClass = DescriptorUtils.getParentOfType(what, ClassDescriptor.class);
|
ClassDescriptor givenDescriptorContainingClass = DescriptorUtils.getParentOfType(what, ClassDescriptor.class);
|
||||||
ClassDescriptor fromClass = DescriptorUtils.getParentOfType(from, ClassDescriptor.class, false);
|
ClassDescriptor fromClass = DescriptorUtils.getParentOfType(from, ClassDescriptor.class, false);
|
||||||
@@ -148,7 +160,7 @@ public class DescriptorVisibilities {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return isVisible(receiver, what, fromClass.getContainingDeclaration());
|
return isVisible(receiver, what, fromClass.getContainingDeclaration(), useSpecialRulesForPrivateSealedConstructors);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean doesReceiverFitForProtectedVisibility(
|
private boolean doesReceiverFitForProtectedVisibility(
|
||||||
@@ -179,7 +191,12 @@ public class DescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility INTERNAL = new DelegatedDescriptorVisibility(Visibilities.Internal.INSTANCE) {
|
public static final DescriptorVisibility INTERNAL = new DelegatedDescriptorVisibility(Visibilities.Internal.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
ModuleDescriptor whatModule = DescriptorUtils.getContainingModule(what);
|
ModuleDescriptor whatModule = DescriptorUtils.getContainingModule(what);
|
||||||
ModuleDescriptor fromModule = DescriptorUtils.getContainingModule(from);
|
ModuleDescriptor fromModule = DescriptorUtils.getContainingModule(from);
|
||||||
|
|
||||||
@@ -196,7 +213,12 @@ public class DescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility PUBLIC = new DelegatedDescriptorVisibility(Visibilities.Public.INSTANCE) {
|
public static final DescriptorVisibility PUBLIC = new DelegatedDescriptorVisibility(Visibilities.Public.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -204,7 +226,12 @@ public class DescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility LOCAL = new DelegatedDescriptorVisibility(Visibilities.Local.INSTANCE) {
|
public static final DescriptorVisibility LOCAL = new DelegatedDescriptorVisibility(Visibilities.Local.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
throw new IllegalStateException("This method shouldn't be invoked for LOCAL visibility");
|
throw new IllegalStateException("This method shouldn't be invoked for LOCAL visibility");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -212,7 +239,12 @@ public class DescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility INHERITED = new DelegatedDescriptorVisibility(Visibilities.Inherited.INSTANCE) {
|
public static final DescriptorVisibility INHERITED = new DelegatedDescriptorVisibility(Visibilities.Inherited.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
throw new IllegalStateException("Visibility is unknown yet"); //This method shouldn't be invoked for INHERITED visibility
|
throw new IllegalStateException("Visibility is unknown yet"); //This method shouldn't be invoked for INHERITED visibility
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -221,7 +253,12 @@ public class DescriptorVisibilities {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static final DescriptorVisibility INVISIBLE_FAKE = new DelegatedDescriptorVisibility(Visibilities.InvisibleFake.INSTANCE) {
|
public static final DescriptorVisibility INVISIBLE_FAKE = new DelegatedDescriptorVisibility(Visibilities.InvisibleFake.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public boolean isVisible(
|
||||||
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -232,7 +269,8 @@ public class DescriptorVisibilities {
|
|||||||
public static final DescriptorVisibility UNKNOWN = new DelegatedDescriptorVisibility(Visibilities.Unknown.INSTANCE) {
|
public static final DescriptorVisibility UNKNOWN = new DelegatedDescriptorVisibility(Visibilities.Unknown.INSTANCE) {
|
||||||
@Override
|
@Override
|
||||||
public boolean isVisible(
|
public boolean isVisible(
|
||||||
@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from
|
@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
) {
|
) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -244,23 +282,36 @@ public class DescriptorVisibilities {
|
|||||||
private DescriptorVisibilities() {
|
private DescriptorVisibilities() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isVisible(@Nullable ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public static boolean isVisible(
|
||||||
return findInvisibleMember(receiver, what, from) == null;
|
@Nullable ReceiverValue receiver,
|
||||||
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
|
return findInvisibleMember(receiver, what, from, useSpecialRulesForPrivateSealedConstructors) == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see DescriptorVisibility.isVisible contract
|
* @see DescriptorVisibility.isVisible contract
|
||||||
*/
|
*/
|
||||||
public static boolean isVisibleIgnoringReceiver(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public static boolean isVisibleIgnoringReceiver(
|
||||||
return findInvisibleMember(ALWAYS_SUITABLE_RECEIVER, what, from) == null;
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
|
return findInvisibleMember(ALWAYS_SUITABLE_RECEIVER, what, from, useSpecialRulesForPrivateSealedConstructors) == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see DescriptorVisibility.isVisible contract
|
* @see DescriptorVisibility.isVisible contract
|
||||||
* @see DescriptorVisibilities.RECEIVER_DOES_NOT_EXIST
|
* @see DescriptorVisibilities.RECEIVER_DOES_NOT_EXIST
|
||||||
*/
|
*/
|
||||||
public static boolean isVisibleWithAnyReceiver(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) {
|
public static boolean isVisibleWithAnyReceiver(
|
||||||
return findInvisibleMember(IRRELEVANT_RECEIVER, what, from) == null;
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
|
return findInvisibleMember(IRRELEVANT_RECEIVER, what, from, useSpecialRulesForPrivateSealedConstructors) == null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note that this method returns false if `from` declaration is `init` initializer
|
// Note that this method returns false if `from` declaration is `init` initializer
|
||||||
@@ -277,11 +328,12 @@ public class DescriptorVisibilities {
|
|||||||
public static DeclarationDescriptorWithVisibility findInvisibleMember(
|
public static DeclarationDescriptorWithVisibility findInvisibleMember(
|
||||||
@Nullable ReceiverValue receiver,
|
@Nullable ReceiverValue receiver,
|
||||||
@NotNull DeclarationDescriptorWithVisibility what,
|
@NotNull DeclarationDescriptorWithVisibility what,
|
||||||
@NotNull DeclarationDescriptor from
|
@NotNull DeclarationDescriptor from,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
) {
|
) {
|
||||||
DeclarationDescriptorWithVisibility parent = (DeclarationDescriptorWithVisibility) what.getOriginal();
|
DeclarationDescriptorWithVisibility parent = (DeclarationDescriptorWithVisibility) what.getOriginal();
|
||||||
while (parent != null && parent.getVisibility() != LOCAL) {
|
while (parent != null && parent.getVisibility() != LOCAL) {
|
||||||
if (!parent.getVisibility().isVisible(receiver, parent, from)) {
|
if (!parent.getVisibility().isVisible(receiver, parent, from, useSpecialRulesForPrivateSealedConstructors)) {
|
||||||
return parent;
|
return parent;
|
||||||
}
|
}
|
||||||
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
|
parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class);
|
||||||
@@ -289,7 +341,12 @@ public class DescriptorVisibilities {
|
|||||||
|
|
||||||
if (what instanceof TypeAliasConstructorDescriptor) {
|
if (what instanceof TypeAliasConstructorDescriptor) {
|
||||||
DeclarationDescriptorWithVisibility invisibleUnderlying =
|
DeclarationDescriptorWithVisibility invisibleUnderlying =
|
||||||
findInvisibleMember(receiver, ((TypeAliasConstructorDescriptor) what).getUnderlyingConstructorDescriptor(), from);
|
findInvisibleMember(
|
||||||
|
receiver,
|
||||||
|
((TypeAliasConstructorDescriptor) what).getUnderlyingConstructorDescriptor(),
|
||||||
|
from,
|
||||||
|
useSpecialRulesForPrivateSealedConstructors
|
||||||
|
);
|
||||||
if (invisibleUnderlying != null) return invisibleUnderlying;
|
if (invisibleUnderlying != null) return invisibleUnderlying;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,7 +40,12 @@ abstract class DescriptorVisibility protected constructor() {
|
|||||||
*
|
*
|
||||||
* Also it's important that implementation that take receiver into account do aware about these special values.
|
* Also it's important that implementation that take receiver into account do aware about these special values.
|
||||||
*/
|
*/
|
||||||
abstract fun isVisible(receiver: ReceiverValue?, what: DeclarationDescriptorWithVisibility, from: DeclarationDescriptor): Boolean
|
abstract fun isVisible(
|
||||||
|
receiver: ReceiverValue?,
|
||||||
|
what: DeclarationDescriptorWithVisibility,
|
||||||
|
from: DeclarationDescriptor,
|
||||||
|
useSpecialRulesForPrivateSealedConstructors: Boolean
|
||||||
|
): Boolean
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* True, if it makes sense to check this visibility in imports and not import inaccessible declarations with such visibility.
|
* True, if it makes sense to check this visibility in imports and not import inaccessible declarations with such visibility.
|
||||||
|
|||||||
@@ -504,9 +504,13 @@ public class OverridingUtil {
|
|||||||
createAndBindFakeOverrides(current, notOverridden, strategy);
|
createAndBindFakeOverrides(current, notOverridden, strategy);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isVisibleForOverride(@NotNull MemberDescriptor overriding, @NotNull MemberDescriptor fromSuper) {
|
public static boolean isVisibleForOverride(
|
||||||
|
@NotNull MemberDescriptor overriding,
|
||||||
|
@NotNull MemberDescriptor fromSuper,
|
||||||
|
boolean useSpecialRulesForPrivateSealedConstructors
|
||||||
|
) {
|
||||||
return !DescriptorVisibilities.isPrivate(fromSuper.getVisibility()) &&
|
return !DescriptorVisibilities.isPrivate(fromSuper.getVisibility()) &&
|
||||||
DescriptorVisibilities.isVisibleIgnoringReceiver(fromSuper, overriding);
|
DescriptorVisibilities.isVisibleIgnoringReceiver(fromSuper, overriding, useSpecialRulesForPrivateSealedConstructors);
|
||||||
}
|
}
|
||||||
|
|
||||||
private Collection<CallableMemberDescriptor> extractAndBindOverridesForMember(
|
private Collection<CallableMemberDescriptor> extractAndBindOverridesForMember(
|
||||||
@@ -520,7 +524,7 @@ public class OverridingUtil {
|
|||||||
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
|
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
|
||||||
OverrideCompatibilityInfo.Result result = isOverridableBy(fromSupertype, fromCurrent, current).getResult();
|
OverrideCompatibilityInfo.Result result = isOverridableBy(fromSupertype, fromCurrent, current).getResult();
|
||||||
|
|
||||||
boolean isVisibleForOverride = isVisibleForOverride(fromCurrent, fromSupertype);
|
boolean isVisibleForOverride = isVisibleForOverride(fromCurrent, fromSupertype, false);
|
||||||
|
|
||||||
switch (result) {
|
switch (result) {
|
||||||
case OVERRIDABLE:
|
case OVERRIDABLE:
|
||||||
@@ -810,7 +814,7 @@ public class OverridingUtil {
|
|||||||
public Boolean invoke(CallableMemberDescriptor descriptor) {
|
public Boolean invoke(CallableMemberDescriptor descriptor) {
|
||||||
//nested class could capture private member, so check for private visibility added
|
//nested class could capture private member, so check for private visibility added
|
||||||
return !DescriptorVisibilities.isPrivate(descriptor.getVisibility()) &&
|
return !DescriptorVisibilities.isPrivate(descriptor.getVisibility()) &&
|
||||||
DescriptorVisibilities.isVisibleIgnoringReceiver(descriptor, current);
|
DescriptorVisibilities.isVisibleIgnoringReceiver(descriptor, current, false);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -956,7 +956,9 @@ class ClassFileToSourceStubConverter(val kaptContext: KaptContextForStubGenerati
|
|||||||
// We already checked it in convertClass()
|
// We already checked it in convertClass()
|
||||||
val declaration = kaptContext.origins[containingClass]?.descriptor as ClassDescriptor
|
val declaration = kaptContext.origins[containingClass]?.descriptor as ClassDescriptor
|
||||||
val superClass = declaration.getSuperClassOrAny()
|
val superClass = declaration.getSuperClassOrAny()
|
||||||
val superClassConstructor = superClass.constructors.firstOrNull { it.visibility.isVisible(null, it, declaration) }
|
val superClassConstructor = superClass.constructors.firstOrNull {
|
||||||
|
it.visibility.isVisible(null, it, declaration, useSpecialRulesForPrivateSealedConstructors = true)
|
||||||
|
}
|
||||||
|
|
||||||
val superClassConstructorCall = if (superClassConstructor != null) {
|
val superClassConstructorCall = if (superClassConstructor != null) {
|
||||||
val args = mapJList(superClassConstructor.valueParameters) { param ->
|
val args = mapJList(superClassConstructor.valueParameters) { param ->
|
||||||
|
|||||||
+6
-5
@@ -11,10 +11,6 @@ import org.jetbrains.kotlin.builtins.isFunctionType
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl
|
import org.jetbrains.kotlin.descriptors.impl.TypeParameterDescriptorImpl
|
||||||
import org.jetbrains.kotlin.scripting.ide_common.idea.codeInsight.ReferenceVariantsHelper
|
|
||||||
import org.jetbrains.kotlin.scripting.ide_common.idea.util.CallTypeAndReceiver
|
|
||||||
import org.jetbrains.kotlin.scripting.ide_common.idea.util.IdeDescriptorRenderersScripting
|
|
||||||
import org.jetbrains.kotlin.scripting.ide_common.idea.util.getResolutionScope
|
|
||||||
import org.jetbrains.kotlin.lexer.KtKeywordToken
|
import org.jetbrains.kotlin.lexer.KtKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -32,8 +28,13 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|||||||
import org.jetbrains.kotlin.resolve.annotations.argumentValue
|
import org.jetbrains.kotlin.resolve.annotations.argumentValue
|
||||||
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
|
||||||
import org.jetbrains.kotlin.resolve.scopes.MemberScope.Companion.ALL_NAME_FILTER
|
import org.jetbrains.kotlin.resolve.scopes.MemberScope.Companion.ALL_NAME_FILTER
|
||||||
|
import org.jetbrains.kotlin.scripting.ide_common.idea.codeInsight.ReferenceVariantsHelper
|
||||||
|
import org.jetbrains.kotlin.scripting.ide_common.idea.util.CallTypeAndReceiver
|
||||||
|
import org.jetbrains.kotlin.scripting.ide_common.idea.util.IdeDescriptorRenderersScripting
|
||||||
|
import org.jetbrains.kotlin.scripting.ide_common.idea.util.getResolutionScope
|
||||||
import org.jetbrains.kotlin.scripting.ide_services.compiler.completion
|
import org.jetbrains.kotlin.scripting.ide_services.compiler.completion
|
||||||
import org.jetbrains.kotlin.scripting.ide_services.compiler.filterOutShadowedDescriptors
|
import org.jetbrains.kotlin.scripting.ide_services.compiler.filterOutShadowedDescriptors
|
||||||
|
import org.jetbrains.kotlin.scripting.ide_services.compiler.impl.KJvmReplCompleter.ResultGetter
|
||||||
import org.jetbrains.kotlin.scripting.ide_services.compiler.nameFilter
|
import org.jetbrains.kotlin.scripting.ide_services.compiler.nameFilter
|
||||||
import org.jetbrains.kotlin.scripting.resolve.classId
|
import org.jetbrains.kotlin.scripting.resolve.classId
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
@@ -373,7 +374,7 @@ private class KJvmReplCompleter(
|
|||||||
|
|
||||||
if (descriptor is DeclarationDescriptorWithVisibility) {
|
if (descriptor is DeclarationDescriptorWithVisibility) {
|
||||||
return try {
|
return try {
|
||||||
descriptor.visibility.isVisible(null, descriptor, inDescriptor)
|
descriptor.visibility.isVisible(null, descriptor, inDescriptor, useSpecialRulesForPrivateSealedConstructors = true)
|
||||||
} catch (e: IllegalStateException) {
|
} catch (e: IllegalStateException) {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user