Added 'checkPublishedApi' to effective visibility checker
This commit is contained in:
+2
-4
@@ -257,10 +257,8 @@ class InlineChecker implements CallChecker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static boolean isEffectivelyPublicOrPublishedApi(@NotNull CallableDescriptor descriptor) {
|
private static boolean isEffectivelyPublicOrPublishedApi(@NotNull CallableDescriptor descriptor) {
|
||||||
EffectiveVisibility visibility = EffectiveVisibilityKt.effectiveVisibility(descriptor, descriptor.getVisibility());
|
EffectiveVisibility visibility = EffectiveVisibilityKt.effectiveVisibility(descriptor, descriptor.getVisibility(), true);
|
||||||
if (visibility.getPublicApi()) return true;
|
return visibility.getPublicApi();
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void checkPrivateClassMemberAccess(
|
private void checkPrivateClassMemberAccess(
|
||||||
|
|||||||
+1
-1
@@ -59,7 +59,7 @@ public class JavaVisibilities {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public EffectiveVisibility effectiveVisibility(@Nullable ClassDescriptor classDescriptor) {
|
public EffectiveVisibility effectiveVisibility(@Nullable ClassDescriptor classDescriptor, boolean checkPublishedApi) {
|
||||||
return EffectiveVisibility.PackagePrivate.INSTANCE;
|
return EffectiveVisibility.PackagePrivate.INSTANCE;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -232,17 +232,19 @@ private fun lowerBound(first: EffectiveVisibility, args: List<EffectiveVisibilit
|
|||||||
private fun lowerBound(args: List<EffectiveVisibility>) =
|
private fun lowerBound(args: List<EffectiveVisibility>) =
|
||||||
if (args.isEmpty()) Public else lowerBound(args.first(), args.subList(1, args.size))
|
if (args.isEmpty()) Public else lowerBound(args.first(), args.subList(1, args.size))
|
||||||
|
|
||||||
private fun Visibility.forVisibility(descriptor: ClassDescriptor? = null): EffectiveVisibility = when (this) {
|
private fun Visibility.forVisibility(descriptor: ClassDescriptor? = null, checkPublishedApi: Boolean = false): EffectiveVisibility =
|
||||||
Visibilities.PRIVATE, Visibilities.PRIVATE_TO_THIS, Visibilities.INVISIBLE_FAKE -> Private
|
when (this) {
|
||||||
Visibilities.PROTECTED -> Protected(descriptor)
|
Visibilities.PRIVATE, Visibilities.PRIVATE_TO_THIS, Visibilities.INVISIBLE_FAKE -> Private
|
||||||
Visibilities.INTERNAL -> Internal
|
Visibilities.PROTECTED -> Protected(descriptor)
|
||||||
Visibilities.PUBLIC -> Public
|
Visibilities.INTERNAL -> Internal
|
||||||
Visibilities.LOCAL -> Local
|
Visibilities.PUBLIC -> Public
|
||||||
// NB: visibility must be already normalized here, so e.g. no JavaVisibilities are possible at this point
|
Visibilities.LOCAL -> Local
|
||||||
else -> throw AssertionError("Visibility $name is not allowed in forVisibility")
|
// NB: visibility must be already normalized here, so e.g. no JavaVisibilities are possible at this point
|
||||||
}
|
else -> throw AssertionError("Visibility $name is not allowed in forVisibility")
|
||||||
|
}
|
||||||
|
|
||||||
fun effectiveVisibility(visibility: Visibility, descriptor: ClassDescriptor?) = visibility.forVisibility(descriptor)
|
fun effectiveVisibility(visibility: Visibility, descriptor: ClassDescriptor?, checkPublishedApi: Boolean = false) =
|
||||||
|
visibility.forVisibility(descriptor, checkPublishedApi)
|
||||||
|
|
||||||
enum class RelationToType(val description: String) {
|
enum class RelationToType(val description: String) {
|
||||||
CONSTRUCTOR(""),
|
CONSTRUCTOR(""),
|
||||||
@@ -260,7 +262,7 @@ enum class RelationToType(val description: String) {
|
|||||||
|
|
||||||
data class DescriptorWithRelation(val descriptor: ClassifierDescriptor, val relation: RelationToType) {
|
data class DescriptorWithRelation(val descriptor: ClassifierDescriptor, val relation: RelationToType) {
|
||||||
fun effectiveVisibility() =
|
fun effectiveVisibility() =
|
||||||
(descriptor as? ClassDescriptor)?.visibility?.effectiveVisibility(descriptor.containingDeclaration as? ClassDescriptor) ?: Public
|
(descriptor as? ClassDescriptor)?.visibility?.effectiveVisibility(descriptor.containingDeclaration as? ClassDescriptor, false) ?: Public
|
||||||
|
|
||||||
override fun toString() = "$relation ${descriptor.name}"
|
override fun toString() = "$relation ${descriptor.name}"
|
||||||
}
|
}
|
||||||
@@ -269,12 +271,12 @@ private fun ClassifierDescriptor.dependentDescriptors(ownRelation: RelationToTyp
|
|||||||
setOf(DescriptorWithRelation(this, ownRelation)) +
|
setOf(DescriptorWithRelation(this, ownRelation)) +
|
||||||
((this.containingDeclaration as? ClassifierDescriptor)?.dependentDescriptors(ownRelation.containerRelation()) ?: emptySet())
|
((this.containingDeclaration as? ClassifierDescriptor)?.dependentDescriptors(ownRelation.containerRelation()) ?: emptySet())
|
||||||
|
|
||||||
fun ClassDescriptor.effectiveVisibility() = effectiveVisibility(emptySet())
|
fun ClassDescriptor.effectiveVisibility(checkPublishedApi: Boolean = false) = effectiveVisibility(emptySet(), checkPublishedApi)
|
||||||
|
|
||||||
private fun ClassDescriptor.effectiveVisibility(classes: Set<ClassDescriptor>): EffectiveVisibility =
|
private fun ClassDescriptor.effectiveVisibility(classes: Set<ClassDescriptor>, checkPublishedApi: Boolean): EffectiveVisibility =
|
||||||
if (this in classes) Public
|
if (this in classes) Public
|
||||||
else with(this.containingDeclaration as? ClassDescriptor) {
|
else with(this.containingDeclaration as? ClassDescriptor) {
|
||||||
lowerBound(visibility.effectiveVisibility(this), this?.effectiveVisibility(classes + this@effectiveVisibility) ?: Public)
|
lowerBound(visibility.effectiveVisibility(this, checkPublishedApi), this?.effectiveVisibility(classes + this@effectiveVisibility, checkPublishedApi) ?: Public)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Should collect all dependent classifier descriptors, to get verbose diagnostic
|
// Should collect all dependent classifier descriptors, to get verbose diagnostic
|
||||||
@@ -302,7 +304,9 @@ private fun Set<DescriptorWithRelation>.leastPermissive(base: EffectiveVisibilit
|
|||||||
|
|
||||||
fun KotlinType.leastPermissiveDescriptor(base: EffectiveVisibility) = dependentDescriptors().leastPermissive(base)
|
fun KotlinType.leastPermissiveDescriptor(base: EffectiveVisibility) = dependentDescriptors().leastPermissive(base)
|
||||||
|
|
||||||
fun DeclarationDescriptorWithVisibility.effectiveVisibility(visibility: Visibility = this.visibility): EffectiveVisibility =
|
fun DeclarationDescriptorWithVisibility.effectiveVisibility(
|
||||||
lowerBound(visibility.effectiveVisibility(this.containingDeclaration as? ClassDescriptor),
|
visibility: Visibility = this.visibility, checkPublishedApi: Boolean = false
|
||||||
(this.containingDeclaration as? ClassDescriptor)?.effectiveVisibility() ?: Public)
|
): EffectiveVisibility =
|
||||||
|
lowerBound(visibility.effectiveVisibility(this.containingDeclaration as? ClassDescriptor, checkPublishedApi),
|
||||||
|
(this.containingDeclaration as? ClassDescriptor)?.effectiveVisibility(checkPublishedApi) ?: Public)
|
||||||
|
|
||||||
|
|||||||
@@ -64,5 +64,5 @@ abstract class Visibility protected constructor(
|
|||||||
open fun normalize(): Visibility = this
|
open fun normalize(): Visibility = this
|
||||||
|
|
||||||
// Should be overloaded in Java visibilities
|
// Should be overloaded in Java visibilities
|
||||||
open fun effectiveVisibility(descriptor: ClassDescriptor?) = effectiveVisibility(normalize(), descriptor)
|
open fun effectiveVisibility(descriptor: ClassDescriptor?, checkPublishedApi: Boolean) = effectiveVisibility(normalize(), descriptor, checkPublishedApi)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user