Transform anonymous types even for public symbols

This became necessary when we removed the requirement to specify types for
public members, because otherwise everything fails not being able to locate the
anonymous class from another module

 #KT-9072 Fixed
 EA-72801
This commit is contained in:
Alexander Udalov
2015-09-11 16:43:31 +03:00
parent 6cecc66d10
commit 085fc3bf87
30 changed files with 85 additions and 65 deletions
@@ -26,6 +26,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget;
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
import org.jetbrains.kotlin.descriptors.annotations.CompositeAnnotations;
@@ -42,12 +43,14 @@ import org.jetbrains.kotlin.resolve.constants.ConstantValue;
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator;
import org.jetbrains.kotlin.resolve.dataClassUtils.DataClassUtilsPackage;
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil;
import org.jetbrains.kotlin.resolve.scopes.*;
import org.jetbrains.kotlin.resolve.scopes.JetScopeUtils;
import org.jetbrains.kotlin.resolve.scopes.LexicalScope;
import org.jetbrains.kotlin.resolve.scopes.LexicalWritableScope;
import org.jetbrains.kotlin.resolve.scopes.WritableScope;
import org.jetbrains.kotlin.storage.StorageManager;
import org.jetbrains.kotlin.types.*;
import org.jetbrains.kotlin.types.checker.JetTypeChecker;
import org.jetbrains.kotlin.types.expressions.ExpressionTypingServices;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationSplitter;
import java.util.*;
@@ -930,25 +933,21 @@ public class DescriptorResolver {
@NotNull JetType type,
@NotNull BindingTrace trace
) {
ClassifierDescriptor classifierDescriptor = type.getConstructor().getDeclarationDescriptor();
if (classifierDescriptor == null || !DescriptorUtils.isAnonymousObject(classifierDescriptor)) {
ClassifierDescriptor classifier = type.getConstructor().getDeclarationDescriptor();
if (classifier == null || !DescriptorUtils.isAnonymousObject(classifier) || DescriptorUtils.isLocal(descriptor)) {
return type;
}
boolean definedInClass = DescriptorUtils.getParentOfType(descriptor, ClassDescriptor.class) != null;
boolean isLocal = DescriptorUtils.isLocal(descriptor);
Visibility visibility = descriptor.getVisibility();
boolean transformNeeded = !isLocal && !visibility.getIsPublicAPI()
&& !(definedInClass && Visibilities.isPrivate(visibility));
if (transformNeeded) {
if (!definedInClass || !Visibilities.isPrivate(descriptor.getVisibility())) {
if (type.getConstructor().getSupertypes().size() == 1) {
assert type.getArguments().isEmpty() : "Object expression couldn't have any type parameters!";
return type.getConstructor().getSupertypes().iterator().next();
}
else {
trace.report(AMBIGUOUS_ANONYMOUS_TYPE_INFERRED.on(declaration, type.getConstructor().getSupertypes()));
}
}
return type;
}
@@ -0,0 +1,9 @@
package pkg
interface ClassA {
companion object {
val DEFAULT = object : ClassA {
override fun toString() = "OK"
}
}
}
@@ -0,0 +1,6 @@
import pkg.ClassA
fun main(args: Array<String>) {
val obj = ClassA.DEFAULT
obj.toString()
}
@@ -1,6 +1,6 @@
package
public val x: x.<no name provided>
public val x: kotlin.Any
public object A1 {
private constructor A1()
@@ -1,6 +1,6 @@
package
public val a: a.<no name provided>
public val a: T
kotlin.annotation.annotation() public final class Ann : C {
public constructor Ann()
@@ -5,7 +5,7 @@ package kt462 {
public final class T {
public constructor T()
public final val a: kt462.T.a.<no name provided>
public final val a: kotlin.Any
public final var r: kotlin.Int
public final var x: kotlin.Int
public final val z: kotlin.Int
@@ -1,6 +1,6 @@
package
public val m: m.<no name provided>
public val m: X
public interface X {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -1,7 +1,7 @@
package
package kt1191 {
public fun foo(/*0*/ unused: kotlin.Int): kt1191.foo.<no name provided>
public fun foo(/*0*/ unused: kotlin.Int): kotlin.Any
public fun </*0*/ T> kt1191.FunctionalList<T>.plus(/*0*/ element: T): kt1191.FunctionalList<T>
public interface FunctionalList</*0*/ T> {
@@ -3,7 +3,7 @@ package
package b {
public var f: () -> kotlin.Unit
public val g: () -> kotlin.Int
public val o: b.o.<no name provided>
public val o: kotlin.Any
public val p: b.P
public fun doSmth(/*0*/ i: kotlin.Int): kotlin.Int
@@ -1,6 +1,6 @@
package
public val m: m.<no name provided>
public val m: X
public fun box(): kotlin.Unit
public interface X {
@@ -16,13 +16,13 @@ class Foo {
privateProperty.f2()
}
protected val protectedProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val protectedProperty<!> = object : MyClass(), MyTrait {}
val internalProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val internalProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val internal2Property<!> = object : MyClass(), MyTrait {}
public val publicProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val publicProperty<!> = object : MyClass(), MyTrait {}
private fun privateFunction() = object : MyClass(), MyTrait {}
@@ -32,13 +32,13 @@ class Foo {
privateFunction().f2()
}
protected fun protectedFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected fun protectedFunction()<!> = object : MyClass(), MyTrait {}
fun internalFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun internalFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun internal2Function()<!> = object : MyClass(), MyTrait {}
public fun publicFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public fun publicFunction()<!> = object : MyClass(), MyTrait {}
@@ -50,13 +50,13 @@ class Foo {
privatePropertyInner.f2()
}
protected val protectedProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected val protectedProperty<!> = object : MyClass(), MyTrait {}
val internalProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val internalProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val internal2Property<!> = object : MyClass(), MyTrait {}
public val publicProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val publicProperty<!> = object : MyClass(), MyTrait {}
private fun privateFunctionInner() = object : MyClass(), MyTrait {}
@@ -66,13 +66,13 @@ class Foo {
privateFunctionInner().f2()
}
protected fun protectedFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>protected fun protectedFunction()<!> = object : MyClass(), MyTrait {}
fun internalFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun internalFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun internal2Function()<!> = object : MyClass(), MyTrait {}
public fun publicFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public fun publicFunction()<!> = object : MyClass(), MyTrait {}
}
@@ -90,21 +90,21 @@ class Foo {
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>private val packagePrivateProperty<!> = object : MyClass(), MyTrait {}
<!WRONG_MODIFIER_TARGET!>protected<!> val packageProtectedProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> val packageProtectedProperty<!> = object : MyClass(), MyTrait {}
val packageInternalProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>val packageInternalProperty<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal val packageInternal2Property<!> = object : MyClass(), MyTrait {}
public val packagePublicProperty = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public val packagePublicProperty<!> = object : MyClass(), MyTrait {}
<!WRONG_MODIFIER_TARGET!>protected<!> fun packageProtectedFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!><!WRONG_MODIFIER_TARGET!>protected<!> fun packageProtectedFunction()<!> = object : MyClass(), MyTrait {}
fun packageInternalFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>fun packageInternalFunction()<!> = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>internal fun packageInternal2Function()<!> = object : MyClass(), MyTrait {}
public fun packagePublicFunction() = object : MyClass(), MyTrait {}
<!AMBIGUOUS_ANONYMOUS_TYPE_INFERRED!>public fun packagePublicFunction()<!> = object : MyClass(), MyTrait {}
fun fooPackage() {
val packageLocalVar = object : MyClass(), MyTrait {}
@@ -2,15 +2,15 @@ package
internal val packageInternalProperty: MyClass
private val packagePrivateProperty: MyClass
protected val packageProtectedProperty: packageProtectedProperty.<no name provided>
protected val packageProtectedProperty: MyClass
public val packagePublic2Property: MyClass
public val packagePublicProperty: packagePublicProperty.<no name provided>
public val packagePublicProperty: MyClass
public fun fooPackage(): kotlin.Unit
internal fun internalFunction(): MyClass
private fun privateFunction(): MyClass
protected fun protectedFunction(): protectedFunction.<no name provided>
protected fun protectedFunction(): MyClass
public fun public2Function(): MyClass
public fun publicFunction(): publicFunction.<no name provided>
public fun publicFunction(): MyClass
public fun testFunctions(): kotlin.Unit
public fun testProperties(): kotlin.Unit
@@ -19,18 +19,18 @@ public final class Foo {
internal final val internalProperty: MyClass
private final val privateProperty: Foo.privateProperty.<no name provided>
protected final val protected2Property: MyClass
protected final val protectedProperty: Foo.protectedProperty.<no name provided>
protected final val protectedProperty: MyClass
public final val public2Property: MyClass
public final val publicProperty: Foo.publicProperty.<no name provided>
public final val publicProperty: MyClass
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun internalFunction(): MyClass
private final fun privateFunction(): Foo.privateFunction.<no name provided>
protected final fun protected2Function(): MyClass
protected final fun protectedFunction(): Foo.protectedFunction.<no name provided>
protected final fun protectedFunction(): MyClass
public final fun public2Function(): MyClass
public final fun publicFunction(): Foo.publicFunction.<no name provided>
public final fun publicFunction(): MyClass
public final fun testFunctions(): kotlin.Unit
public final fun testProperties(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -40,17 +40,17 @@ public final class Foo {
internal final val internalProperty: MyClass
private final val privateProperty: Foo.FooInner.privateProperty.<no name provided>
protected final val protected2Property: MyClass
protected final val protectedProperty: Foo.FooInner.protectedProperty.<no name provided>
protected final val protectedProperty: MyClass
public final val public2Property: MyClass
public final val publicProperty: Foo.FooInner.publicProperty.<no name provided>
public final val publicProperty: MyClass
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
internal final fun internalFunction(): MyClass
private final fun privateFunction(): Foo.FooInner.privateFunction.<no name provided>
protected final fun protected2Function(): MyClass
protected final fun protectedFunction(): Foo.FooInner.protectedFunction.<no name provided>
protected final fun protectedFunction(): MyClass
public final fun public2Function(): MyClass
public final fun publicFunction(): Foo.FooInner.publicFunction.<no name provided>
public final fun publicFunction(): MyClass
public final fun testFunctions(): kotlin.Unit
public final fun testProperties(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
@@ -1,3 +1,3 @@
package
public fun foo(): foo.<no name provided>
public fun foo(): kotlin.Any
@@ -2,7 +2,7 @@ package
public final class Outer {
public constructor Outer()
public final val x: Outer.x.<no name provided>
public final val x: kotlin.Any
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
@@ -1,8 +1,8 @@
package
public fun main(/*0*/ args: kotlin.Array<kotlin.String>): kotlin.Unit
public fun </*0*/ T : kotlin.Any> T?.iterator(): iterator.<no name provided>
public fun </*0*/ T> java.util.Enumeration<T>.iterator(): iterator.<no name provided>
public fun </*0*/ T : kotlin.Any> T?.iterator(): MyIterator<T>
public fun </*0*/ T> java.util.Enumeration<T>.iterator(): kotlin.Iterator<T>
public interface MyIterator</*0*/ T> {
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -1,4 +1,4 @@
package
public fun a(/*0*/ e: java.util.Enumeration<kotlin.Int>): kotlin.Unit
public fun </*0*/ T> java.util.Enumeration<T>.iterator(): iterator.<no name provided>
public fun </*0*/ T> java.util.Enumeration<T>.iterator(): kotlin.Iterator<T>
@@ -1,6 +1,6 @@
package
public val R: R.<no name provided>
public val R: kotlin.Any
public val prop: kotlin.Int = 42
public fun foo(): kotlin.Unit
@@ -17,7 +17,7 @@ public final class Test {
public companion object Companion : Test.InnerClass {
private constructor Companion()
public final val a: Test.Companion.a.<no name provided>
public final val a: Test.InnerClass
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 final fun more(): Test.InnerClass
@@ -24,7 +24,7 @@ public final class Test {
public object Some : Test.InnerClass {
private constructor Some()
public final val a: Test.Some.a.<no name provided>
public final val a: Test.InnerClass
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 final fun more(): Test.InnerClass
+1 -1
View File
@@ -1,3 +1,3 @@
package
public val oo: oo.<no name provided>
public val oo: kotlin.Any
+1 -1
View File
@@ -2,7 +2,7 @@ package
package toplevelObjectDeclarations {
public val x: kotlin.Int
public val y: toplevelObjectDeclarations.y.<no name provided>
public val y: toplevelObjectDeclarations.Foo
public val z: kotlin.Int
public object A : toplevelObjectDeclarations.Foo {
+1 -1
View File
@@ -1,7 +1,7 @@
package
package a {
public val o: a.o.<no name provided>
public val o: kotlin.Any
public fun </*0*/ T> a.A.foo(/*0*/ f: T): kotlin.Unit
public final class A {
@@ -1,6 +1,6 @@
package
public val anonObject: anonObject.<no name provided>
public val anonObject: kotlin.Any
public object A {
private constructor A()
@@ -8,7 +8,7 @@ kotlin.js.native() public final class A {
public final class B {
public constructor B()
public final val anonymous: A.B.anonymous.<no name provided>
public final val anonymous: kotlin.Any
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
@@ -8,7 +8,7 @@ public final class A {
public final class B {
public constructor B()
public final val anonymous: A.B.anonymous.<no name provided>
public final val anonymous: kotlin.Any
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
@@ -8,7 +8,7 @@ kotlin.js.native() public final class A {
public final class B {
public constructor B()
public final val anonymous: A.B.anonymous.<no name provided>
public final val anonymous: kotlin.Any
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
@@ -8,7 +8,7 @@ public final class A {
public final class B {
public constructor B()
public final val anonymous: A.B.anonymous.<no name provided>
public final val anonymous: kotlin.Any
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
@@ -8,7 +8,7 @@ kotlin.js.native() public final class A {
public final class B {
public constructor B()
public final val anonymous: A.B.anonymous.<no name provided>
public final val anonymous: kotlin.Any
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
@@ -8,7 +8,7 @@ public final class A {
public final class B {
public constructor B()
public final val anonymous: A.B.anonymous.<no name provided>
public final val anonymous: kotlin.Any
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
@@ -167,6 +167,12 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl
doTest(fileName);
}
@TestMetadata("SimpleValAnonymousObject.A.kt")
public void testSimpleValAnonymousObject() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/SimpleValAnonymousObject.A.kt");
doTest(fileName);
}
@TestMetadata("StarImportEnum.A.kt")
public void testStarImportEnum() throws Exception {
String fileName = JetTestUtils.navigationMetadata("compiler/testData/compileKotlinAgainstKotlin/StarImportEnum.A.kt");