New diagnostic error for ambiguous object expression type

This commit is contained in:
Mikhael Bogdanov
2013-02-18 18:31:40 +04:00
parent 1b2da6b558
commit 1662c5cb75
9 changed files with 395 additions and 19 deletions
@@ -0,0 +1,117 @@
trait MyTrait {
fun f1() {}
}
open class MyClass {
fun f2() {}
}
class Foo {
private val privateProperty = object : MyClass(), MyTrait {}
{
privateProperty.f1()
privateProperty.f2()
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected val protectedProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val internalProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val internal2Property<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val publicProperty<!> = object : MyClass(), MyTrait {}
private fun privateFunction() = object : MyClass(), MyTrait {}
{
privateFunction().f1()
privateFunction().f2()
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected fun protectedFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun internalFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun internal2Function()<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass(), MyTrait {}
class FooInner {
private val privatePropertyInner = object : MyClass(), MyTrait {}
{
privatePropertyInner.f1()
privatePropertyInner.f2()
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected val protectedProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val internalProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val internal2Property<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val publicProperty<!> = object : MyClass(), MyTrait {}
private fun privateFunctionInner() = object : MyClass(), MyTrait {}
{
privateFunctionInner().f1()
privateFunctionInner().f2()
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected fun protectedFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun internalFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun internal2Function()<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass(), MyTrait {}
}
fun foo() {
val localVar = object : MyClass(), MyTrait {}
localVar.f1()
localVar.f2()
fun foo2() = object : MyClass(), MyTrait {}
foo2().f1()
foo2().f2()
}
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>private val packagePrivateProperty<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> val packageProtectedProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val packageInternalProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val packageInternal2Property<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val packagePublicProperty<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> fun packageProtectedFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun packageInternalFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun packageInternal2Function()<!> = object : MyClass(), MyTrait {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun packagePublicFunction()<!> = object : MyClass(), MyTrait {}
fun fooPackage() {
val packageLocalVar = object : MyClass(), MyTrait {}
packageLocalVar.f1()
packageLocalVar.f2()
fun fooPackageLocal() = object : MyClass(), MyTrait {}
fooPackageLocal().f1()
fooPackageLocal().f2()
}
@@ -0,0 +1,200 @@
open class MyClass {
fun f1() {}
}
class Foo {
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected val protectedProperty<!> = object : MyClass() {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val publicProperty<!> = object : MyClass() {}
protected val protected2Property : MyClass = object : MyClass() {fun invisible() {}}
public val public2Property : MyClass = object : MyClass() {fun invisible() {}}
private val privateProperty = object : MyClass() {fun visible() {}}
val internalProperty = object : MyClass() { fun invisible() {}}
internal val internal2Property = object : MyClass() {fun invisible() {}}
fun testProperties() {
privateProperty.f1()
internalProperty.f1()
internal2Property.f1()
protected2Property.f1()
public2Property.f1()
privateProperty.visible()
protected2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
internalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
internal2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected fun protectedFunction()<!> = object : MyClass() {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass() {}
protected fun protected2Function(): MyClass = object : MyClass() {fun visible() {}}
public fun public2Function(): MyClass = object : MyClass() {fun visible() {}}
private fun privateFunction() = object : MyClass() {fun visible() {}}
fun internalFunction() = object : MyClass() {fun invisible() {}}
internal fun internal2Function() = object : MyClass() {fun invisible() {}}
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
internal2Function().f1()
public2Function().f1()
protected2Function().f1()
privateFunction().visible()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
internal2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
protected2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
}
class FooInner {
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val publicProperty<!> = object : MyClass() {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected val protectedProperty<!> = object : MyClass() {}
protected val protected2Property : MyClass = object : MyClass() {fun invisible() {}}
public val public2Property : MyClass = object : MyClass() {fun invisible() {}}
private val privateProperty = object : MyClass() {fun visible() {}}
val internalProperty = object : MyClass() { fun invisible() {}}
internal val internal2Property = object : MyClass() {fun invisible() {}}
fun testProperties() {
privateProperty.f1()
internalProperty.f1()
internal2Property.f1()
protected2Property.f1()
public2Property.f1()
privateProperty.visible()
protected2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
internalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
internal2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>protected fun protectedFunction()<!> = object : MyClass() {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass() {}
protected fun protected2Function(): MyClass = object : MyClass() {fun visible() {}}
public fun public2Function(): MyClass = object : MyClass() {fun visible() {}}
private fun privateFunction() = object : MyClass() {fun visible() {}}
fun internalFunction() = object : MyClass() {fun invisible() {}}
internal fun internal2Function() = object : MyClass() {fun invisible() {}}
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
internal2Function().f1()
public2Function().f1()
protected2Function().f1()
privateFunction().visible()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
internal2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
protected2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
}
}
fun foo() {
val localVar = object : MyClass() {}
localVar.f1()
fun foo2() = object : MyClass() {}
foo2().f1()
}
}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> val packageProtectedProperty<!> = object : MyClass() {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public val packagePublicProperty<!> = object : MyClass() {}
public val packagePublic2Property : MyClass = object : MyClass() {fun invisible() {}}
private val packagePrivateProperty = object : MyClass() {fun invisible() {}}
val packageInternalProperty = object : MyClass() {fun invisible() {}}
internal val packageInternal2Property = object : MyClass() {fun invisible() {}}
fun testProperties() {
packagePrivateProperty.f1()
packageInternalProperty.f1()
packageInternal2Property.f1()
packagePublic2Property.f1()
packagePrivateProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
packageInternalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
packageInternal2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
packagePublic2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
}
private fun privateFunction() = object : MyClass() {fun invisible() {}}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!><!PACKAGE_MEMBER_CANNOT_BE_PROTECTED!>protected<!> fun protectedFunction()<!> = object : MyClass() {}
<!PUBLIC_MEMBER_SHOULD_SPECIFY_TYPE!>public fun publicFunction()<!> = object : MyClass() {}
public fun public2Function() : MyClass = object : MyClass() {fun invisible() {}}
fun internalFunction() = object : MyClass() {fun invisible() {}}
internal fun internal2Function() = object : MyClass() {fun invisible() {}}
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
internal2Function().f1()
public2Function().f1()
privateFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
internal2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
}
fun fooPackage() {
val packageLocalVar = object : MyClass() {fun visible() {}}
packageLocalVar.f1()
packageLocalVar.visible()
fun fooPackageLocal() = object : MyClass() {fun visible() {}}
fooPackageLocal().f1()
fooPackageLocal().visible()
}