diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt index aa335626f04..54073a20721 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/BuilderFactoryForDuplicateSignatureDiagnostics.kt @@ -33,7 +33,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.* import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.utils.addIfNotNull import java.util.* @@ -175,7 +174,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics( descriptor.getParentJavaStaticClassScope()?.run { getContributedDescriptors(DescriptorKindFilter.FUNCTIONS) .filter { - it is FunctionDescriptor && Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, it, descriptor) + it is FunctionDescriptor && Visibilities.isVisibleWithIrrelevantReceiver(it, descriptor) } .forEach(::processMember) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.java index 877fc5a061f..034611e7c19 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowInformationProvider.java @@ -419,11 +419,11 @@ public class ControlFlowInformationProvider { PropertySetterDescriptor setterDescriptor = ((PropertyDescriptor) variableDescriptor).getSetter(); ResolvedCall resolvedCall = CallUtilKt.getResolvedCall(expression, trace.getBindingContext()); - ReceiverValue receiverValue = ReceiverValue.IRRELEVANT_RECEIVER; + ReceiverValue receiverValue = ReceiverValue.NO_RECEIVER; if (resolvedCall != null) { receiverValue = resolvedCall.getDispatchReceiver(); - } + if (Visibilities.isVisible(receiverValue, variableDescriptor, descriptor) && setterDescriptor != null && !Visibilities.isVisible(receiverValue, setterDescriptor, descriptor)) { report(Errors.INVISIBLE_SETTER.on(expression, variableDescriptor, setterDescriptor.getVisibility(), diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java index d26c0368ed8..9fde9560b4e 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverrideResolver.java @@ -41,7 +41,6 @@ import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilKt; import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsKt; -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.types.*; import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; import org.jetbrains.kotlin.utils.HashSetUtil; @@ -1028,7 +1027,7 @@ public class OverrideResolver { all.addAll((Collection) supertype.getMemberScope().getContributedVariables(declared.getName(), NoLookupLocation.WHEN_CHECK_OVERRIDES)); for (CallableMemberDescriptor fromSuper : all) { if (OverridingUtil.DEFAULT.isOverridableBy(fromSuper, declared, null).getResult() == OVERRIDABLE) { - if (Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, fromSuper, declared)) { + if (Visibilities.isVisibleWithIrrelevantReceiver(fromSuper, declared)) { throw new IllegalStateException("Descriptor " + fromSuper + " is overridable by " + declared + " and visible but does not appear in its getOverriddenDescriptors()"); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt index 11eb1606b49..3034c61d552 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/QualifiedExpressionResolver.kt @@ -600,7 +600,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa if (Visibilities.isPrivate(visibility)) return false if (!visibility.mustCheckInImports()) return true } - return Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, shouldBeVisibleFrom) + return Visibilities.isVisibleWithIrrelevantReceiver(descriptor, shouldBeVisibleFrom) } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt index 53a6375fe0c..891c9830e8f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/LazyImportScope.kt @@ -31,7 +31,6 @@ import org.jetbrains.kotlin.resolve.PlatformTypesMappedToKotlinChecker import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.ImportingScope -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.util.collectionUtils.concat @@ -180,7 +179,7 @@ class LazyImportScope( val visibility = descriptor.getVisibility() val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES if (!visibility.mustCheckInImports()) return includeVisible - return Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, importResolver.moduleDescriptor) == includeVisible + return Visibilities.isVisibleWithIrrelevantReceiver(descriptor, importResolver.moduleDescriptor) == includeVisible } override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? { diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java index cfb3451af38..bb97cba3f5e 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/Visibilities.java @@ -70,6 +70,20 @@ public class Visibilities { } }; + /** + * This visibility is needed for the next case: + * class A(t: T) { + * private val t: T = t // visibility for t is PRIVATE_TO_THIS + * + * fun test() { + * val x: T = t // correct + * val y: T = this.t // also correct + * } + * fun foo(a: A) { + * val x: String = a.t // incorrect, because a.t can be Any + * } + * } + */ public static final Visibility PRIVATE_TO_THIS = new Visibility("private_to_this", false) { @Override public boolean isVisible(@NotNull ReceiverValue thisObject, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { @@ -208,6 +222,14 @@ public class Visibilities { return findInvisibleMember(receiver, what, from) == null; } + /** + * Receiver used only for visibility PRIVATE_TO_THIS. + * For all other visibilities this method give correct result. + */ + public static boolean isVisibleWithIrrelevantReceiver(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + return findInvisibleMember(ReceiverValue.NO_RECEIVER /* temporary */, what, from) == null; + } + @Nullable public static DeclarationDescriptorWithVisibility findInvisibleMember( @NotNull ReceiverValue receiver, diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java index c0a1caf5480..768d47276eb 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/OverridingUtil.java @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.PropertyAccessorDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.kotlin.name.Name; -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.kotlin.types.FlexibleTypesKt; import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.TypeConstructor; @@ -297,7 +296,7 @@ public class OverridingUtil { for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) { OverrideCompatibilityInfo.Result result = DEFAULT.isOverridableBy(fromSupertype, fromCurrent, current).getResult(); - boolean isVisible = Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, fromSupertype, current); + boolean isVisible = Visibilities.isVisibleWithIrrelevantReceiver(fromSupertype, current); switch (result) { case OVERRIDABLE: if (isVisible) { @@ -485,7 +484,7 @@ public class OverridingUtil { public Boolean invoke(CallableMemberDescriptor descriptor) { //nested class could capture private member, so check for private visibility added return !Visibilities.isPrivate(descriptor.getVisibility()) && - Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, current); + Visibilities.isVisibleWithIrrelevantReceiver(descriptor, current); } }); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java index db11b295658..00acf7ac418 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/scopes/receivers/ReceiverValue.java @@ -38,24 +38,6 @@ public interface ReceiverValue extends Receiver { } }; - ReceiverValue IRRELEVANT_RECEIVER = new ReceiverValue() { - @NotNull - @Override - public KotlinType getType() { - throw new UnsupportedOperationException("IRRELEVANT_RECEIVER.getType()"); - } - - @Override - public boolean exists() { - return false; - } - - @Override - public String toString() { - return "IRRELEVANT_RECEIVER"; - } - }; - @NotNull KotlinType getType(); } diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt index d186fee251d..8583b912483 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/descriptorUtils.kt @@ -30,7 +30,6 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.utils.getImplicitReceiversHierarchy import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor @@ -55,7 +54,7 @@ private fun DeclarationDescriptorWithVisibility.isVisible( bindingContext: BindingContext? = null, resolutionScope: LexicalScope? = null ): Boolean { - if (Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, this, from)) return true + if (Visibilities.isVisibleWithIrrelevantReceiver(this, from)) return true if (bindingContext == null || resolutionScope == null) return false diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpConflictsUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpConflictsUtils.kt index 00570d622e5..522a36e22b3 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpConflictsUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/pullUp/pullUpConflictsUtils.kt @@ -34,7 +34,6 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.Variance @@ -150,7 +149,7 @@ private fun KotlinPullUpData.checkVisibility( fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) { val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return if (targetDescriptor is DeclarationDescriptorWithVisibility - && !Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, targetDescriptor, targetClassDescriptor)) { + && !Visibilities.isVisibleWithIrrelevantReceiver(targetDescriptor, targetClassDescriptor)) { val message = RefactoringBundle.message( "0.uses.1.which.is.not.accessible.from.the.superclass", memberDescriptor.renderForConflicts(), diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/pushDownConflictsUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/pushDownConflictsUtils.kt index 14d9109785f..6d12a6ff157 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/pushDownConflictsUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/pushDown/pushDownConflictsUtils.kt @@ -34,13 +34,11 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.scopes.receivers.Qualifier -import org.jetbrains.kotlin.resolve.scopes.receivers.QualifierReceiver -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.source.getPsi import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.substitutions.getTypeSubstitutor import org.jetbrains.kotlin.util.findCallableMemberBySignature -import java.util.ArrayList +import java.util.* fun analyzePushDownConflicts(context: KotlinPushDownContext, usages: Array): MultiMap { @@ -198,7 +196,7 @@ private fun checkVisibility( fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) { val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return if (targetDescriptor is DeclarationDescriptorWithVisibility - && !Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, targetDescriptor, targetClassDescriptor)) { + && !Visibilities.isVisibleWithIrrelevantReceiver(targetDescriptor, targetClassDescriptor)) { val message = "${context.memberDescriptors[member]!!.renderForConflicts()} " + "uses ${targetDescriptor.renderForConflicts()}, " + "which is not accessible from the ${targetClassDescriptor.renderForConflicts()}" diff --git a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt index ceb7eee15a1..ccb28598b95 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/ImportInsertHelperImpl.kt @@ -42,7 +42,6 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.scopes.utils.findFunction import org.jetbrains.kotlin.resolve.scopes.utils.findPackage @@ -254,7 +253,7 @@ public class ImportInsertHelperImpl(private val project: Project) : ImportInsert fun isVisible(descriptor: DeclarationDescriptor): Boolean { if (descriptor !is DeclarationDescriptorWithVisibility) return true val visibility = descriptor.getVisibility() - return !visibility.mustCheckInImports() || Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, filePackage) + return !visibility.mustCheckInImports() || Visibilities.isVisibleWithIrrelevantReceiver(descriptor, filePackage) } val classNamesToImport = scopeToImport