Fix return type of private members that return anonymous object

#KT-16813 Fixed

Anonymous objects returned from private-in-file members should behave as for private class members
This commit is contained in:
Mikhail Zarechenskiy
2017-04-11 16:25:18 +03:00
parent 44170f3357
commit e86d52b681
16 changed files with 202 additions and 108 deletions
@@ -907,8 +907,7 @@ public class DescriptorResolver {
return type;
}
boolean definedInClass = DescriptorUtils.getParentOfType(descriptor, ClassDescriptor.class) != null;
if (!definedInClass || !Visibilities.isPrivate(descriptor.getVisibility())) {
if (!Visibilities.isPrivate(descriptor.getVisibility())) {
if (type.getConstructor().getSupertypes().size() == 1) {
return type.getConstructor().getSupertypes().iterator().next();
}
@@ -0,0 +1,22 @@
interface IFoo {
fun foo(): String
}
interface IBar
private fun createAnonObject() =
object : IFoo, IBar {
override fun foo() = "foo"
fun qux(): String = "qux"
}
fun useAnonObject() {
createAnonObject().foo()
createAnonObject().qux()
}
fun box(): String {
if (createAnonObject().foo() != "foo") return "fail 1"
if (createAnonObject().qux() != "qux") return "fail 2"
return "OK"
}
@@ -1,9 +1,9 @@
interface MyTrait {
fun f1() {}
fun f1() {}
}
open class MyClass {
fun f2() {}
fun f2() {}
}
@@ -12,8 +12,8 @@ class Foo {
private val privateProperty = object : MyClass(), MyTrait {}
init {
privateProperty.f1()
privateProperty.f2()
privateProperty.f1()
privateProperty.f2()
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val <!EXPOSED_PROPERTY_TYPE!>protectedProperty<!><!> = object : MyClass(), MyTrait {}
@@ -25,14 +25,14 @@ class Foo {
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val <!EXPOSED_PROPERTY_TYPE!>publicProperty<!><!> = object : MyClass(), MyTrait {}
val <!EXPOSED_PROPERTY_TYPE!>propertyWithGetter<!>
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>get()<!> = object: MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>get()<!> = object: MyClass(), MyTrait {}
private fun privateFunction() = object : MyClass(), MyTrait {}
init {
privateFunction().f1()
privateFunction().f2()
privateFunction().f1()
privateFunction().f2()
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected fun <!EXPOSED_FUNCTION_RETURN_TYPE!>protectedFunction<!>()<!> = object : MyClass(), MyTrait {}
@@ -45,53 +45,53 @@ class Foo {
class FooInner {
private val privatePropertyInner = object : MyClass(), MyTrait {}
class FooInner {
private val privatePropertyInner = object : MyClass(), MyTrait {}
init {
privatePropertyInner.f1()
privatePropertyInner.f2()
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val <!EXPOSED_PROPERTY_TYPE!>protectedProperty<!><!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val <!EXPOSED_PROPERTY_TYPE!>internalProperty<!><!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val <!EXPOSED_PROPERTY_TYPE!>internal2Property<!><!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val <!EXPOSED_PROPERTY_TYPE!>publicProperty<!><!> = object : MyClass(), MyTrait {}
private fun privateFunctionInner() = object : MyClass(), MyTrait {}
init {
privateFunctionInner().f1()
privateFunctionInner().f2()
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected fun <!EXPOSED_FUNCTION_RETURN_TYPE!>protectedFunction<!>()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun <!EXPOSED_FUNCTION_RETURN_TYPE!>internalFunction<!>()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun <!EXPOSED_FUNCTION_RETURN_TYPE!>internal2Function<!>()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public fun <!EXPOSED_FUNCTION_RETURN_TYPE!>publicFunction<!>()<!> = object : MyClass(), MyTrait {}
init {
privatePropertyInner.f1()
privatePropertyInner.f2()
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val <!EXPOSED_PROPERTY_TYPE!>protectedProperty<!><!> = object : MyClass(), MyTrait {}
fun foo() {
val localVar = object : MyClass(), MyTrait {}
localVar.f1()
localVar.f2()
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val <!EXPOSED_PROPERTY_TYPE!>internalProperty<!><!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val <!EXPOSED_PROPERTY_TYPE!>internal2Property<!><!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val <!EXPOSED_PROPERTY_TYPE!>publicProperty<!><!> = object : MyClass(), MyTrait {}
private fun privateFunctionInner() = object : MyClass(), MyTrait {}
init {
privateFunctionInner().f1()
privateFunctionInner().f2()
fun foo2() = object : MyClass(), MyTrait {}
foo2().f1()
foo2().f2()
}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected fun <!EXPOSED_FUNCTION_RETURN_TYPE!>protectedFunction<!>()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun <!EXPOSED_FUNCTION_RETURN_TYPE!>internalFunction<!>()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun <!EXPOSED_FUNCTION_RETURN_TYPE!>internal2Function<!>()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public fun <!EXPOSED_FUNCTION_RETURN_TYPE!>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 {}
private val packagePrivateProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> val <!EXPOSED_PROPERTY_TYPE!>packageProtectedProperty<!><!> = object : MyClass(), MyTrait {}
@@ -1,5 +1,5 @@
open class MyClass {
fun f1() {}
fun f1() {}
}
@@ -19,15 +19,15 @@ class Foo {
fun testProperties() {
privateProperty.f1()
internalProperty.f1()
protected2Property.f1()
public2Property.f1()
privateProperty.f1()
internalProperty.f1()
protected2Property.f1()
public2Property.f1()
privateProperty.visible()
protected2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
internalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
privateProperty.visible()
protected2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
internalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
}
@@ -45,15 +45,15 @@ class Foo {
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
public2Function().f1()
protected2Function().f1()
privateFunction().f1()
internalFunction().f1()
public2Function().f1()
protected2Function().f1()
privateFunction().visible()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
protected2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
privateFunction().visible()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
protected2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
}
@@ -73,49 +73,49 @@ class Foo {
fun testProperties() {
privateProperty.f1()
internalProperty.f1()
protected2Property.f1()
public2Property.f1()
privateProperty.f1()
internalProperty.f1()
protected2Property.f1()
public2Property.f1()
privateProperty.visible()
protected2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
internalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
privateProperty.visible()
protected2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
internalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
}
protected fun protectedFunction() = object : MyClass() {}
protected fun protectedFunction() = object : MyClass() {}
public fun publicFunction() = object : MyClass() {}
public fun publicFunction() = object : MyClass() {}
protected fun protected2Function(): MyClass = object : MyClass() {fun visible() {}}
protected fun protected2Function(): MyClass = object : MyClass() {fun visible() {}}
public fun public2Function(): MyClass = object : MyClass() {fun visible() {}}
public fun public2Function(): MyClass = object : MyClass() {fun visible() {}}
private fun privateFunction() = object : MyClass() {fun visible() {}}
private fun privateFunction() = object : MyClass() {fun visible() {}}
internal fun internalFunction() = object : MyClass() {fun invisible() {}}
internal fun internalFunction() = object : MyClass() {fun invisible() {}}
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
public2Function().f1()
protected2Function().f1()
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
public2Function().f1()
protected2Function().f1()
privateFunction().visible()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
protected2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
}
privateFunction().visible()
internalFunction().<!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()
val localVar = object : MyClass() {}
localVar.f1()
fun foo2() = object : MyClass() {}
foo2().f1()
}
}
@@ -136,7 +136,7 @@ fun testProperties() {
packageInternalProperty.f1()
packagePublic2Property.f1()
packagePrivateProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
packagePrivateProperty.invisible()
packageInternalProperty.<!UNRESOLVED_REFERENCE!>invisible<!>()
packagePublic2Property.<!UNRESOLVED_REFERENCE!>invisible<!>()
}
@@ -155,13 +155,13 @@ internal fun internalFunction() = object : MyClass() {fun invisible() {}}
fun testFunctions() {
privateFunction().f1()
internalFunction().f1()
public2Function().f1()
privateFunction().f1()
internalFunction().f1()
public2Function().f1()
privateFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
privateFunction().invisible()
internalFunction().<!UNRESOLVED_REFERENCE!>invisible<!>()
public2Function().<!UNRESOLVED_REFERENCE!>invisible<!>()
}
fun fooPackage() {
@@ -1,13 +1,13 @@
package
internal val packageInternalProperty: MyClass
private val packagePrivateProperty: MyClass
private val packagePrivateProperty: packagePrivateProperty.<no name provided>
protected val packageProtectedProperty: MyClass
public val packagePublic2Property: MyClass
public val packagePublicProperty: MyClass
public fun fooPackage(): kotlin.Unit
internal fun internalFunction(): MyClass
private fun privateFunction(): MyClass
private fun privateFunction(): privateFunction.<no name provided>
protected fun protectedFunction(): MyClass
public fun public2Function(): MyClass
public fun publicFunction(): MyClass
@@ -0,0 +1,24 @@
interface IFoo {
fun foo()
}
interface IBar
private fun createAnonObject() =
object : IFoo, IBar {
override fun foo() {}
fun qux() {}
}
private val propOfAnonObject = object : IFoo, IBar {
override fun foo() {}
fun qux() {}
}
fun useAnonObject() {
createAnonObject().foo()
createAnonObject().qux()
propOfAnonObject.foo()
propOfAnonObject.qux()
}
@@ -0,0 +1,18 @@
package
private val propOfAnonObject: propOfAnonObject.<no name provided>
private fun createAnonObject(): createAnonObject.<no name provided>
public fun useAnonObject(): kotlin.Unit
public interface IBar {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public interface IFoo {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public abstract fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,6 +1,5 @@
private var x = object {}
fun test() {
// No error, because the type of x is normalized to Any
x = object {}
x = <!TYPE_MISMATCH!>object<!> {}
}
@@ -1,4 +1,4 @@
package
private var x: kotlin.Any
private var x: x.<no name provided>
public fun test(): kotlin.Unit
@@ -11198,6 +11198,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
doTest(fileName);
}
@TestMetadata("anonymousObjectReturnsFromTopLevelFun.kt")
public void testAnonymousObjectReturnsFromTopLevelFun() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/anonymousObjectReturnsFromTopLevelFun.kt");
doTest(fileName);
}
@TestMetadata("classCallsProtectedInheritedByCompanion.kt")
public void testClassCallsProtectedInheritedByCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/classCallsProtectedInheritedByCompanion.kt");
@@ -17098,6 +17098,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("anonymousObjectFromTopLevelMember.kt")
public void testAnonymousObjectFromTopLevelMember() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/resolve/anonymousObjectFromTopLevelMember.kt");
doTest(fileName);
}
@TestMetadata("capturedTypesInLambdaParameter.kt")
public void testCapturedTypesInLambdaParameter() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/resolve/capturedTypesInLambdaParameter.kt");
@@ -11198,6 +11198,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest(fileName);
}
@TestMetadata("anonymousObjectReturnsFromTopLevelFun.kt")
public void testAnonymousObjectReturnsFromTopLevelFun() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/anonymousObjectReturnsFromTopLevelFun.kt");
doTest(fileName);
}
@TestMetadata("classCallsProtectedInheritedByCompanion.kt")
public void testClassCallsProtectedInheritedByCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/classCallsProtectedInheritedByCompanion.kt");
@@ -11198,6 +11198,12 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
doTest(fileName);
}
@TestMetadata("anonymousObjectReturnsFromTopLevelFun.kt")
public void testAnonymousObjectReturnsFromTopLevelFun() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/anonymousObjectReturnsFromTopLevelFun.kt");
doTest(fileName);
}
@TestMetadata("classCallsProtectedInheritedByCompanion.kt")
public void testClassCallsProtectedInheritedByCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/classCallsProtectedInheritedByCompanion.kt");
@@ -3,7 +3,6 @@ Run Java
Connected to the target VM
ceAnonymousObject.kt:18
Compile bytecode for publicTopLevelObject
Compile bytecode for privateTopLevelObject
Compile bytecode for publicObject
Compile bytecode for protectedObject
Compile bytecode for localObject
@@ -22,8 +22,11 @@ class MyClass {
// EXPRESSION: publicTopLevelObject
// RESULT: instance of ceAnonymousObject.CeAnonymousObjectKt$publicTopLevelObject$1(id=ID): LceAnonymousObject/CeAnonymousObjectKt$publicTopLevelObject$1;
// EXPRESSION: privateTopLevelObject
// RESULT: instance of ceAnonymousObject.CeAnonymousObjectKt$privateTopLevelObject$1(id=ID): LceAnonymousObject/CeAnonymousObjectKt$privateTopLevelObject$1;
// -EXPRESSION: privateTopLevelObject
// -RESULT: 1
// -EXPRESSION: privateTopLevelObject.test()
// -RESULT: 1: I
// EXPRESSION: publicObject
// RESULT: instance of ceAnonymousObject.MyClass$publicObject$1(id=ID): LceAnonymousObject/MyClass$publicObject$1;
@@ -12616,6 +12616,12 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
doTest(fileName);
}
@TestMetadata("anonymousObjectReturnsFromTopLevelFun.kt")
public void testAnonymousObjectReturnsFromTopLevelFun() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/anonymousObjectReturnsFromTopLevelFun.kt");
doTest(fileName);
}
@TestMetadata("classCallsProtectedInheritedByCompanion.kt")
public void testClassCallsProtectedInheritedByCompanion() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/objects/classCallsProtectedInheritedByCompanion.kt");