Minor. Removed ReceiverValue.IRRELEVANT_RECEIVER.

This commit is contained in:
Stanislav Erokhin
2015-12-14 18:41:33 +03:00
parent 56cd29dff2
commit 3692318c38
12 changed files with 35 additions and 40 deletions
@@ -33,7 +33,6 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.jvm.diagnostics.* 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.resolve.scopes.receivers.ReceiverValue
import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addIfNotNull
import java.util.* import java.util.*
@@ -175,7 +174,7 @@ class BuilderFactoryForDuplicateSignatureDiagnostics(
descriptor.getParentJavaStaticClassScope()?.run { descriptor.getParentJavaStaticClassScope()?.run {
getContributedDescriptors(DescriptorKindFilter.FUNCTIONS) getContributedDescriptors(DescriptorKindFilter.FUNCTIONS)
.filter { .filter {
it is FunctionDescriptor && Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, it, descriptor) it is FunctionDescriptor && Visibilities.isVisibleWithIrrelevantReceiver(it, descriptor)
} }
.forEach(::processMember) .forEach(::processMember)
} }
@@ -419,11 +419,11 @@ public class ControlFlowInformationProvider {
PropertySetterDescriptor setterDescriptor = ((PropertyDescriptor) variableDescriptor).getSetter(); PropertySetterDescriptor setterDescriptor = ((PropertyDescriptor) variableDescriptor).getSetter();
ResolvedCall<? extends CallableDescriptor> resolvedCall = CallUtilKt.getResolvedCall(expression, trace.getBindingContext()); ResolvedCall<? extends CallableDescriptor> resolvedCall = CallUtilKt.getResolvedCall(expression, trace.getBindingContext());
ReceiverValue receiverValue = ReceiverValue.IRRELEVANT_RECEIVER; ReceiverValue receiverValue = ReceiverValue.NO_RECEIVER;
if (resolvedCall != null) { if (resolvedCall != null) {
receiverValue = resolvedCall.getDispatchReceiver(); receiverValue = resolvedCall.getDispatchReceiver();
} }
if (Visibilities.isVisible(receiverValue, variableDescriptor, descriptor) && setterDescriptor != null if (Visibilities.isVisible(receiverValue, variableDescriptor, descriptor) && setterDescriptor != null
&& !Visibilities.isVisible(receiverValue, setterDescriptor, descriptor)) { && !Visibilities.isVisible(receiverValue, setterDescriptor, descriptor)) {
report(Errors.INVISIBLE_SETTER.on(expression, variableDescriptor, setterDescriptor.getVisibility(), report(Errors.INVISIBLE_SETTER.on(expression, variableDescriptor, setterDescriptor.getVisibility(),
@@ -41,7 +41,6 @@ import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilKt; import org.jetbrains.kotlin.resolve.calls.callResolverUtil.CallResolverUtilKt;
import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsKt; 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.*;
import org.jetbrains.kotlin.types.checker.KotlinTypeChecker; import org.jetbrains.kotlin.types.checker.KotlinTypeChecker;
import org.jetbrains.kotlin.utils.HashSetUtil; 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)); all.addAll((Collection) supertype.getMemberScope().getContributedVariables(declared.getName(), NoLookupLocation.WHEN_CHECK_OVERRIDES));
for (CallableMemberDescriptor fromSuper : all) { for (CallableMemberDescriptor fromSuper : all) {
if (OverridingUtil.DEFAULT.isOverridableBy(fromSuper, declared, null).getResult() == OVERRIDABLE) { 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 + throw new IllegalStateException("Descriptor " + fromSuper + " is overridable by " + declared +
" and visible but does not appear in its getOverriddenDescriptors()"); " and visible but does not appear in its getOverriddenDescriptors()");
} }
@@ -600,7 +600,7 @@ public class QualifiedExpressionResolver(val symbolUsageValidator: SymbolUsageVa
if (Visibilities.isPrivate(visibility)) return false if (Visibilities.isPrivate(visibility)) return false
if (!visibility.mustCheckInImports()) return true if (!visibility.mustCheckInImports()) return true
} }
return Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, shouldBeVisibleFrom) return Visibilities.isVisibleWithIrrelevantReceiver(descriptor, shouldBeVisibleFrom)
} }
} }
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.resolve.PlatformTypesMappedToKotlinChecker
import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver import org.jetbrains.kotlin.resolve.QualifiedExpressionResolver
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.ImportingScope 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.storage.StorageManager
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.util.collectionUtils.concat import org.jetbrains.kotlin.util.collectionUtils.concat
@@ -180,7 +179,7 @@ class LazyImportScope(
val visibility = descriptor.getVisibility() val visibility = descriptor.getVisibility()
val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES val includeVisible = filteringKind == FilteringKind.VISIBLE_CLASSES
if (!visibility.mustCheckInImports()) return includeVisible 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? { override fun getContributedClassifier(name: Name, location: LookupLocation): ClassifierDescriptor? {
@@ -70,6 +70,20 @@ public class Visibilities {
} }
}; };
/**
* This visibility is needed for the next case:
* class A<in T>(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<String>) {
* 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) { public static final Visibility PRIVATE_TO_THIS = new Visibility("private_to_this", false) {
@Override @Override
public boolean isVisible(@NotNull ReceiverValue thisObject, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { 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; 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 @Nullable
public static DeclarationDescriptorWithVisibility findInvisibleMember( public static DeclarationDescriptorWithVisibility findInvisibleMember(
@NotNull ReceiverValue receiver, @NotNull ReceiverValue receiver,
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.descriptors.impl.FunctionDescriptorImpl;
import org.jetbrains.kotlin.descriptors.impl.PropertyAccessorDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.PropertyAccessorDescriptorImpl;
import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl; import org.jetbrains.kotlin.descriptors.impl.PropertyDescriptorImpl;
import org.jetbrains.kotlin.name.Name; 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.FlexibleTypesKt;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.types.TypeConstructor; import org.jetbrains.kotlin.types.TypeConstructor;
@@ -297,7 +296,7 @@ public class OverridingUtil {
for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) { for (CallableMemberDescriptor fromSupertype : descriptorsFromSuper) {
OverrideCompatibilityInfo.Result result = DEFAULT.isOverridableBy(fromSupertype, fromCurrent, current).getResult(); 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) { switch (result) {
case OVERRIDABLE: case OVERRIDABLE:
if (isVisible) { if (isVisible) {
@@ -485,7 +484,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 !Visibilities.isPrivate(descriptor.getVisibility()) && return !Visibilities.isPrivate(descriptor.getVisibility()) &&
Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, current); Visibilities.isVisibleWithIrrelevantReceiver(descriptor, current);
} }
}); });
} }
@@ -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 @NotNull
KotlinType getType(); KotlinType getType();
} }
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors import org.jetbrains.kotlin.resolve.findOriginalTopMostOverriddenDescriptors
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver 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.resolve.scopes.utils.getImplicitReceiversHierarchy
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
@@ -55,7 +54,7 @@ private fun DeclarationDescriptorWithVisibility.isVisible(
bindingContext: BindingContext? = null, bindingContext: BindingContext? = null,
resolutionScope: LexicalScope? = null resolutionScope: LexicalScope? = null
): Boolean { ): 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 if (bindingContext == null || resolutionScope == null) return false
@@ -34,7 +34,6 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.allChildren import org.jetbrains.kotlin.psi.psiUtil.allChildren
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy 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.resolve.source.getPsi
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -150,7 +149,7 @@ private fun KotlinPullUpData.checkVisibility(
fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) { fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) {
val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return
if (targetDescriptor is DeclarationDescriptorWithVisibility if (targetDescriptor is DeclarationDescriptorWithVisibility
&& !Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, targetDescriptor, targetClassDescriptor)) { && !Visibilities.isVisibleWithIrrelevantReceiver(targetDescriptor, targetClassDescriptor)) {
val message = RefactoringBundle.message( val message = RefactoringBundle.message(
"0.uses.1.which.is.not.accessible.from.the.superclass", "0.uses.1.which.is.not.accessible.from.the.superclass",
memberDescriptor.renderForConflicts(), memberDescriptor.renderForConflicts(),
@@ -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.getCalleeExpressionIfAny
import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall
import org.jetbrains.kotlin.resolve.scopes.receivers.Qualifier 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.resolve.source.getPsi
import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeSubstitutor
import org.jetbrains.kotlin.types.substitutions.getTypeSubstitutor import org.jetbrains.kotlin.types.substitutions.getTypeSubstitutor
import org.jetbrains.kotlin.util.findCallableMemberBySignature import org.jetbrains.kotlin.util.findCallableMemberBySignature
import java.util.ArrayList import java.util.*
fun analyzePushDownConflicts(context: KotlinPushDownContext, fun analyzePushDownConflicts(context: KotlinPushDownContext,
usages: Array<out UsageInfo>): MultiMap<PsiElement, String> { usages: Array<out UsageInfo>): MultiMap<PsiElement, String> {
@@ -198,7 +196,7 @@ private fun checkVisibility(
fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) { fun reportConflictIfAny(targetDescriptor: DeclarationDescriptor) {
val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return val target = (targetDescriptor as? DeclarationDescriptorWithSource)?.source?.getPsi() ?: return
if (targetDescriptor is DeclarationDescriptorWithVisibility if (targetDescriptor is DeclarationDescriptorWithVisibility
&& !Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, targetDescriptor, targetClassDescriptor)) { && !Visibilities.isVisibleWithIrrelevantReceiver(targetDescriptor, targetClassDescriptor)) {
val message = "${context.memberDescriptors[member]!!.renderForConflicts()} " + val message = "${context.memberDescriptors[member]!!.renderForConflicts()} " +
"uses ${targetDescriptor.renderForConflicts()}, " + "uses ${targetDescriptor.renderForConflicts()}, " +
"which is not accessible from the ${targetClassDescriptor.renderForConflicts()}" "which is not accessible from the ${targetClassDescriptor.renderForConflicts()}"
@@ -42,7 +42,6 @@ import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.LexicalScope import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.resolve.scopes.MemberScope import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.getDescriptorsFiltered 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.findClassifier
import org.jetbrains.kotlin.resolve.scopes.utils.findFunction import org.jetbrains.kotlin.resolve.scopes.utils.findFunction
import org.jetbrains.kotlin.resolve.scopes.utils.findPackage 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 { fun isVisible(descriptor: DeclarationDescriptor): Boolean {
if (descriptor !is DeclarationDescriptorWithVisibility) return true if (descriptor !is DeclarationDescriptorWithVisibility) return true
val visibility = descriptor.getVisibility() val visibility = descriptor.getVisibility()
return !visibility.mustCheckInImports() || Visibilities.isVisible(ReceiverValue.IRRELEVANT_RECEIVER, descriptor, filePackage) return !visibility.mustCheckInImports() || Visibilities.isVisibleWithIrrelevantReceiver(descriptor, filePackage)
} }
val classNamesToImport = scopeToImport val classNamesToImport = scopeToImport