Report EXPOSED_PROPERTY_TYPE on a property name only #KT-10760 Fixed
This commit is contained in:
@@ -75,7 +75,7 @@ public interface Errors {
|
|||||||
DiagnosticFactory3<PsiElement, DeclarationDescriptor, Visibility, DeclarationDescriptor> INVISIBLE_MEMBER = DiagnosticFactory3.create(ERROR, CALL_ELEMENT);
|
DiagnosticFactory3<PsiElement, DeclarationDescriptor, Visibility, DeclarationDescriptor> INVISIBLE_MEMBER = DiagnosticFactory3.create(ERROR, CALL_ELEMENT);
|
||||||
|
|
||||||
// Exposed visibility group
|
// Exposed visibility group
|
||||||
DiagnosticFactory2<KtProperty, EffectiveVisibility, EffectiveVisibility> EXPOSED_PROPERTY_TYPE = DiagnosticFactory2.create(ERROR);
|
DiagnosticFactory2<PsiElement, EffectiveVisibility, EffectiveVisibility> EXPOSED_PROPERTY_TYPE = DiagnosticFactory2.create(ERROR);
|
||||||
DiagnosticFactory2<PsiElement, EffectiveVisibility, EffectiveVisibility> EXPOSED_FUNCTION_RETURN_TYPE = DiagnosticFactory2.create(ERROR);
|
DiagnosticFactory2<PsiElement, EffectiveVisibility, EffectiveVisibility> EXPOSED_FUNCTION_RETURN_TYPE = DiagnosticFactory2.create(ERROR);
|
||||||
DiagnosticFactory2<KtParameter, EffectiveVisibility, EffectiveVisibility> EXPOSED_PARAMETER_TYPE = DiagnosticFactory2.create(ERROR);
|
DiagnosticFactory2<KtParameter, EffectiveVisibility, EffectiveVisibility> EXPOSED_PARAMETER_TYPE = DiagnosticFactory2.create(ERROR);
|
||||||
DiagnosticFactory2<KtTypeReference, EffectiveVisibility, EffectiveVisibility> EXPOSED_RECEIVER_TYPE = DiagnosticFactory2.create(ERROR);
|
DiagnosticFactory2<KtTypeReference, EffectiveVisibility, EffectiveVisibility> EXPOSED_RECEIVER_TYPE = DiagnosticFactory2.create(ERROR);
|
||||||
|
|||||||
@@ -639,7 +639,7 @@ class DeclarationsChecker(
|
|||||||
val propertyVisibility = propertyDescriptor.effectiveVisibility()
|
val propertyVisibility = propertyDescriptor.effectiveVisibility()
|
||||||
val typeVisibility = propertyDescriptor.type.effectiveVisibility()
|
val typeVisibility = propertyDescriptor.type.effectiveVisibility()
|
||||||
if (!typeVisibility.sameOrMorePermissive(propertyVisibility)) {
|
if (!typeVisibility.sameOrMorePermissive(propertyVisibility)) {
|
||||||
trace.report(EXPOSED_PROPERTY_TYPE.on(property, propertyVisibility, typeVisibility))
|
trace.report(EXPOSED_PROPERTY_TYPE.on(property.nameIdentifier ?: property, propertyVisibility, typeVisibility))
|
||||||
}
|
}
|
||||||
checkMemberReceiverExposedType(property.receiverTypeReference, propertyDescriptor)
|
checkMemberReceiverExposedType(property.receiverTypeReference, propertyDescriptor)
|
||||||
}
|
}
|
||||||
|
|||||||
+12
-12
@@ -16,13 +16,13 @@ class Foo {
|
|||||||
privateProperty.f2()
|
privateProperty.f2()
|
||||||
}
|
}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val protectedProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val <!EXPOSED_PROPERTY_TYPE!>protectedProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val internalProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val <!EXPOSED_PROPERTY_TYPE!>internalProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val internal2Property<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val <!EXPOSED_PROPERTY_TYPE!>internal2Property<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val publicProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val <!EXPOSED_PROPERTY_TYPE!>publicProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
|
|
||||||
private fun privateFunction() = object : MyClass(), MyTrait {}
|
private fun privateFunction() = object : MyClass(), MyTrait {}
|
||||||
@@ -50,13 +50,13 @@ class Foo {
|
|||||||
privatePropertyInner.f2()
|
privatePropertyInner.f2()
|
||||||
}
|
}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val protectedProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val <!EXPOSED_PROPERTY_TYPE!>protectedProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val internalProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val <!EXPOSED_PROPERTY_TYPE!>internalProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val internal2Property<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val <!EXPOSED_PROPERTY_TYPE!>internal2Property<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val publicProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val <!EXPOSED_PROPERTY_TYPE!>publicProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
|
|
||||||
private fun privateFunctionInner() = object : MyClass(), MyTrait {}
|
private fun privateFunctionInner() = object : MyClass(), MyTrait {}
|
||||||
@@ -90,13 +90,13 @@ class Foo {
|
|||||||
|
|
||||||
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>private val packagePrivateProperty<!> = object : MyClass(), MyTrait {}
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>private val packagePrivateProperty<!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> val packageProtectedProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> val <!EXPOSED_PROPERTY_TYPE!>packageProtectedProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val packageInternalProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val <!EXPOSED_PROPERTY_TYPE!>packageInternalProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val packageInternal2Property<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val <!EXPOSED_PROPERTY_TYPE!>packageInternal2Property<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!><!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val packagePublicProperty<!> = object : MyClass(), MyTrait {}<!>
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val <!EXPOSED_PROPERTY_TYPE!>packagePublicProperty<!><!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> fun <!EXPOSED_FUNCTION_RETURN_TYPE!>packageProtectedFunction<!>()<!> = object : MyClass(), MyTrait {}
|
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> fun <!EXPOSED_FUNCTION_RETURN_TYPE!>packageProtectedFunction<!>()<!> = object : MyClass(), MyTrait {}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ internal open class Your: My() {
|
|||||||
open class His: <!EXPOSED_SUPER_CLASS!>Your()<!> {
|
open class His: <!EXPOSED_SUPER_CLASS!>Your()<!> {
|
||||||
protected open class Nested
|
protected open class Nested
|
||||||
// error, public from internal
|
// error, public from internal
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val x = My()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>x<!> = My()
|
||||||
// valid, private from internal
|
// valid, private from internal
|
||||||
private fun bar() = My()
|
private fun bar() = My()
|
||||||
// valid, internal from internal
|
// valid, internal from internal
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ class Something {
|
|||||||
internal val internalVal1 = object { override fun toString() = "!" }
|
internal val internalVal1 = object { override fun toString() = "!" }
|
||||||
private val privateVal1 = object { override fun toString() = "!" }
|
private val privateVal1 = object { override fun toString() = "!" }
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>public val publicVal2 = run { class A; A() }<!>
|
public val <!EXPOSED_PROPERTY_TYPE!>publicVal2<!> = run { class A; A() }
|
||||||
<!EXPOSED_PROPERTY_TYPE!>protected val protectedVal2 = run { class A; A() }<!>
|
protected val <!EXPOSED_PROPERTY_TYPE!>protectedVal2<!> = run { class A; A() }
|
||||||
<!EXPOSED_PROPERTY_TYPE!>internal val internalVal2 = run { class A; A() }<!>
|
internal val <!EXPOSED_PROPERTY_TYPE!>internalVal2<!> = run { class A; A() }
|
||||||
private val privateVal2 = run { class A; A() }
|
private val privateVal2 = run { class A; A() }
|
||||||
|
|
||||||
public fun publicFun1() = object { override fun toString() = "!" }
|
public fun publicFun1() = object { override fun toString() = "!" }
|
||||||
|
|||||||
@@ -2,27 +2,27 @@ class My<T>(val value: T)
|
|||||||
|
|
||||||
open class Base
|
open class Base
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val invalid1 = run {
|
val <!EXPOSED_PROPERTY_TYPE!>invalid1<!> = run {
|
||||||
class Local
|
class Local
|
||||||
My(Local())
|
My(Local())
|
||||||
}<!>
|
}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val invalid2 = My(object {})<!>
|
val <!EXPOSED_PROPERTY_TYPE!>invalid2<!> = My(object {})
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val invalid3 = My(object : Base() {})<!>
|
val <!EXPOSED_PROPERTY_TYPE!>invalid3<!> = My(object : Base() {})
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val invalid4 = run {
|
val <!EXPOSED_PROPERTY_TYPE!>invalid4<!> = run {
|
||||||
class Local
|
class Local
|
||||||
My(My(Local()))
|
My(My(Local()))
|
||||||
}<!>
|
}
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val invalid5 = run {
|
val <!EXPOSED_PROPERTY_TYPE!>invalid5<!> = run {
|
||||||
fun invalid5a() = run {
|
fun invalid5a() = run {
|
||||||
class Local
|
class Local
|
||||||
Local()
|
Local()
|
||||||
}
|
}
|
||||||
My(invalid5a())
|
My(invalid5a())
|
||||||
}<!>
|
}
|
||||||
|
|
||||||
// Valid: effectively Any
|
// Valid: effectively Any
|
||||||
val valid1 = object {}
|
val valid1 = object {}
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
// From KT-10753
|
// From KT-10753
|
||||||
object My : <!EXPOSED_SUPER_CLASS!>Inter()<!> {
|
object My : <!EXPOSED_SUPER_CLASS!>Inter()<!> {
|
||||||
fun <!EXPOSED_FUNCTION_RETURN_TYPE!>foo<!>(<!EXPOSED_PARAMETER_TYPE!>arg: Inter<!>): Inter = arg
|
fun <!EXPOSED_FUNCTION_RETURN_TYPE!>foo<!>(<!EXPOSED_PARAMETER_TYPE!>arg: Inter<!>): Inter = arg
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val x: Inter? = null<!>
|
val <!EXPOSED_PROPERTY_TYPE!>x<!>: Inter? = null
|
||||||
}
|
}
|
||||||
|
|
||||||
internal open class Inter
|
internal open class Inter
|
||||||
|
|||||||
+1
-1
@@ -10,7 +10,7 @@ public class Derived<<!EXPOSED_TYPE_PARAMETER_BOUND!>T: My<!>>(<!EXPOSED_PARAMET
|
|||||||
|
|
||||||
constructor(<!EXPOSED_PARAMETER_TYPE!>xx: My?<!>, <!EXPOSED_PARAMETER_TYPE!>x: My<!>): this(xx ?: x)
|
constructor(<!EXPOSED_PARAMETER_TYPE!>xx: My?<!>, <!EXPOSED_PARAMETER_TYPE!>x: My<!>): this(xx ?: x)
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val y: Base? = null<!>
|
val <!EXPOSED_PROPERTY_TYPE!>y<!>: Base? = null
|
||||||
|
|
||||||
val <!EXPOSED_RECEIVER_TYPE!>My<!>.z: Int
|
val <!EXPOSED_RECEIVER_TYPE!>My<!>.z: Int
|
||||||
get() = 42
|
get() = 42
|
||||||
|
|||||||
@@ -15,4 +15,4 @@ package p1
|
|||||||
import p2.*
|
import p2.*
|
||||||
|
|
||||||
val x: X = X()
|
val x: X = X()
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val y: <!INVISIBLE_REFERENCE!>Y<!> = <!INVISIBLE_MEMBER!>Y<!>()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>y<!>: <!INVISIBLE_REFERENCE!>Y<!> = <!INVISIBLE_MEMBER!>Y<!>()
|
||||||
|
|||||||
@@ -16,29 +16,29 @@ class MyJavaClass {
|
|||||||
//FILE:a.kt
|
//FILE:a.kt
|
||||||
package a
|
package a
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val mc = MyJavaClass()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>mc<!> = MyJavaClass()
|
||||||
val x = MyJavaClass.staticMethod()
|
val x = MyJavaClass.staticMethod()
|
||||||
val y = MyJavaClass.NestedClass.staticMethodOfNested()
|
val y = MyJavaClass.NestedClass.staticMethodOfNested()
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val z = MyJavaClass.NestedClass()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>z<!> = MyJavaClass.NestedClass()
|
||||||
|
|
||||||
//FILE: b.kt
|
//FILE: b.kt
|
||||||
package b
|
package b
|
||||||
|
|
||||||
import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
|
import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val mc1 = <!INVISIBLE_MEMBER!>MyJavaClass<!>()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>mc1<!> = <!INVISIBLE_MEMBER!>MyJavaClass<!>()
|
||||||
|
|
||||||
val x = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>staticMethod<!>()
|
val x = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>staticMethod<!>()
|
||||||
val y = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_REFERENCE!>NestedClass<!>.<!INVISIBLE_MEMBER!>staticMethodOfNested<!>()
|
val y = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_REFERENCE!>NestedClass<!>.<!INVISIBLE_MEMBER!>staticMethodOfNested<!>()
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val z = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>NestedClass<!>()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>z<!> = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>NestedClass<!>()
|
||||||
|
|
||||||
//FILE: c.kt
|
//FILE: c.kt
|
||||||
package a.c
|
package a.c
|
||||||
|
|
||||||
import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
|
import a.<!INVISIBLE_REFERENCE!>MyJavaClass<!>
|
||||||
|
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val mc1 = <!INVISIBLE_MEMBER!>MyJavaClass<!>()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>mc1<!> = <!INVISIBLE_MEMBER!>MyJavaClass<!>()
|
||||||
|
|
||||||
val x = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>staticMethod<!>()
|
val x = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>staticMethod<!>()
|
||||||
val y = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_REFERENCE!>NestedClass<!>.<!INVISIBLE_MEMBER!>staticMethodOfNested<!>()
|
val y = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_REFERENCE!>NestedClass<!>.<!INVISIBLE_MEMBER!>staticMethodOfNested<!>()
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val z = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>NestedClass<!>()<!>
|
val <!EXPOSED_PROPERTY_TYPE!>z<!> = <!INVISIBLE_REFERENCE!>MyJavaClass<!>.<!INVISIBLE_MEMBER!>NestedClass<!>()
|
||||||
@@ -17,7 +17,7 @@ class E private constructor() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val a = <!NO_COMPANION_OBJECT!>A<!>
|
val a = <!NO_COMPANION_OBJECT!>A<!>
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val b = <!INVISIBLE_MEMBER!>B<!><!>
|
val <!EXPOSED_PROPERTY_TYPE!>b<!> = <!INVISIBLE_MEMBER!>B<!>
|
||||||
val c = <!NO_COMPANION_OBJECT!>C<!>
|
val c = <!NO_COMPANION_OBJECT!>C<!>
|
||||||
val d = D
|
val d = D
|
||||||
val e = E(42)
|
val e = E(42)
|
||||||
@@ -11,5 +11,5 @@ import p.*
|
|||||||
|
|
||||||
interface I {
|
interface I {
|
||||||
val v1: FilteringSequence
|
val v1: FilteringSequence
|
||||||
<!EXPOSED_PROPERTY_TYPE!>val v2: <!INVISIBLE_REFERENCE!>IndexingSequence<!><String><!>
|
val <!EXPOSED_PROPERTY_TYPE!>v2<!>: <!INVISIBLE_REFERENCE!>IndexingSequence<!><String>
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user