From b3f3b3946eaedc1abe7a6ced722164f1ba07b971 Mon Sep 17 00:00:00 2001 From: Stanislav Erokhin Date: Tue, 18 Nov 2014 17:27:52 +0300 Subject: [PATCH] Add receiver to Visibility#isVisible --- .../lang/resolve/calls/CandidateResolver.java | 2 +- .../lang/resolve/java/JavaVisibilities.java | 11 ++++---- .../jet/lang/descriptors/Visibilities.java | 28 +++++++++++-------- .../jet/lang/descriptors/Visibility.java | 3 +- .../scopes/receivers/ReceiverValue.java | 18 ++++++++++++ 5 files changed, 44 insertions(+), 18 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 6cdb350abd1..a1daa17ce97 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -93,7 +93,7 @@ public class CandidateResolver { DeclarationDescriptorWithVisibility invisibleMember = - Visibilities.findInvisibleMember(candidate, context.scope.getContainingDeclaration()); + Visibilities.findInvisibleMember(ReceiverValue.IRRELEVANT_RECEIVER, candidate, context.scope.getContainingDeclaration()); if (invisibleMember != null) { candidateCall.addStatus(OTHER_ERROR); context.tracing.invisibleMember(context.trace, invisibleMember); diff --git a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java index 5334e95d8f3..401a3af2a74 100644 --- a/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java +++ b/core/descriptor.loader.java/src/org/jetbrains/jet/lang/resolve/java/JavaVisibilities.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.resolve.java; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; public class JavaVisibilities { private JavaVisibilities() { @@ -26,7 +27,7 @@ public class JavaVisibilities { public static final Visibility PACKAGE_VISIBILITY = new Visibility("package", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { return areInSamePackage(what, from); } @@ -51,7 +52,7 @@ public class JavaVisibilities { public static final Visibility PROTECTED_STATIC_VISIBILITY = new Visibility("protected_static", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { if (areInSamePackage(what, from)) { return true; } @@ -66,7 +67,7 @@ public class JavaVisibilities { if (DescriptorUtils.isSubclass(fromClass, whatClass)) { return true; } - return isVisible(what, fromClass.getContainingDeclaration()); + return isVisible(receiver, what, fromClass.getContainingDeclaration()); } @Override @@ -83,7 +84,7 @@ public class JavaVisibilities { public static final Visibility PROTECTED_AND_PACKAGE = new Visibility("protected_and_package", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { if (areInSamePackage(what, from)) { return true; } @@ -97,7 +98,7 @@ public class JavaVisibilities { if (DescriptorUtils.isSubclass(fromClass, whatClass)) { return true; } - return isVisible(what, fromClass.getContainingDeclaration()); + return isVisible(receiver, what, fromClass.getContainingDeclaration()); } @Override diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java index a9626a0406c..de24e27db7e 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibilities.java @@ -20,6 +20,7 @@ import kotlin.KotlinPackage; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.resolve.DescriptorUtils; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.utils.UtilsPackage; import java.util.Collections; @@ -29,7 +30,7 @@ import java.util.Set; public class Visibilities { public static final Visibility PRIVATE = new Visibility("private", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { DeclarationDescriptor parent = what; while (parent != null) { parent = parent.getContainingDeclaration(); @@ -61,7 +62,7 @@ public class Visibilities { public static final Visibility PROTECTED = new Visibility("protected", true) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { ClassDescriptor classDescriptor = DescriptorUtils.getParentOfType(what, ClassDescriptor.class); if (DescriptorUtils.isClassObject(classDescriptor)) { classDescriptor = DescriptorUtils.getParentOfType(classDescriptor, ClassDescriptor.class); @@ -73,35 +74,35 @@ public class Visibilities { if (DescriptorUtils.isSubclass(fromClass, classDescriptor)) { return true; } - return isVisible(what, fromClass.getContainingDeclaration()); + return isVisible(receiver, what, fromClass.getContainingDeclaration()); } }; public static final Visibility INTERNAL = new Visibility("internal", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { //NOTE: supposedly temporarily - return PUBLIC.isVisible(what, from); + return PUBLIC.isVisible(receiver, what, from); } }; public static final Visibility PUBLIC = new Visibility("public", true) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { return true; } }; public static final Visibility LOCAL = new Visibility("local", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { throw new IllegalStateException(); //This method shouldn't be invoked for LOCAL visibility } }; public static final Visibility INHERITED = new Visibility("inherited", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { throw new IllegalStateException("Visibility is unknown yet"); //This method shouldn't be invoked for INHERITED visibility } }; @@ -109,7 +110,7 @@ public class Visibilities { /* Visibility for fake override invisible members (they are created for better error reporting) */ public static final Visibility INVISIBLE_FAKE = new Visibility("invisible_fake", false) { @Override - protected boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + protected boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { return false; } }; @@ -121,7 +122,11 @@ public class Visibilities { } public static boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { - return findInvisibleMember(what, from) == null; + return isVisible(ReceiverValue.IRRELEVANT_RECEIVER, what, from); + } + + public static boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from) { + return findInvisibleMember(receiver, what, from) == null; } @SuppressWarnings("UnusedDeclaration") @@ -131,12 +136,13 @@ public class Visibilities { @Nullable public static DeclarationDescriptorWithVisibility findInvisibleMember( + @NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from ) { DeclarationDescriptorWithVisibility parent = what; while (parent != null && parent.getVisibility() != LOCAL) { - if (!parent.getVisibility().isVisible(parent, from)) { + if (!parent.getVisibility().isVisible(receiver, parent, from)) { return parent; } parent = DescriptorUtils.getParentOfType(parent, DeclarationDescriptorWithVisibility.class); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibility.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibility.java index d3f1ff25cda..cb49e3c17f6 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibility.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/Visibility.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; public abstract class Visibility { private final boolean isPublicAPI; @@ -48,5 +49,5 @@ public abstract class Visibility { return this; } - protected abstract boolean isVisible(@NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from); + protected abstract boolean isVisible(@NotNull ReceiverValue receiver, @NotNull DeclarationDescriptorWithVisibility what, @NotNull DeclarationDescriptor from); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverValue.java b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverValue.java index 5ebac9b6e26..40b94b1bcd0 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverValue.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/resolve/scopes/receivers/ReceiverValue.java @@ -38,6 +38,24 @@ public interface ReceiverValue { } }; + ReceiverValue IRRELEVANT_RECEIVER = new ReceiverValue() { + @NotNull + @Override + public JetType getType() { + throw new UnsupportedOperationException("IRRELEVANT_RECEIVER.getType()"); + } + + @Override + public boolean exists() { + return false; + } + + @Override + public String toString() { + return "IRRELEVANT_RECEIVER"; + } + }; + @NotNull JetType getType();