Merge use-site targeted annotations into corresponding Annotations

Add PropertyDescriptor.backingField/delegateField to store annotations
on the field directly in an otherwise almost empty descriptor instance,
instead of storing them with use-sites in the corresponding property
descriptor. Instead of AnnotationWithTarget, create AnnotationDescriptor
instances in AnnotationSplitter. Change DescriptorRenderer to render
annotations on "related" declarations when needed, with the explicit
use-site target if applicable.

Most changes in diagnostic test data are related to the fact that
annotations which are known to have an incompatible use-site to the
declaration they're applied at (such as `@param:`-annotation on a
function), are now not loaded at all. It's fine because the code is
erroneous, so it doesn't really matter how do we load annotations with
invalid targets (some of this logic is also changed freely in subsequent
commits). Some changes are also explained by the fact that for example
an annotation on the property which is only applicable to FIELD is now
rendered with an explicit use-site target `@field:`, regardless of
whether it did have that use-site target syntactically or not.

Basically, after this change there's no point in calling
Annotations.getUseSiteTargetedAnnotations/getAllAnnotations anymore
because it's easier and more intuitive to just use Annotations of the
corresponding descriptor -- the backing / delegate field (introduced in
this commit) or the extension receiver / setter parameter (related
behavior was fixed in previous commits). Usages of
use-site-target-related methods will be refactored out in subsequent
commits
This commit is contained in:
Alexander Udalov
2018-08-14 16:45:11 +02:00
parent 8c21e86ded
commit fc87043cb3
68 changed files with 436 additions and 386 deletions
@@ -1,6 +1,6 @@
package
public fun foo(/*0*/ @delegate:Field @delegate:Prop x: kotlin.Int): kotlin.Int
public fun foo(/*0*/ x: kotlin.Int): kotlin.Int
public final class CustomDelegate {
public constructor CustomDelegate()
@@ -24,19 +24,19 @@ public final class CustomDelegate {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@delegate:Field public final class SomeClass {
@delegate:Field public constructor SomeClass()
public final class SomeClass {
public constructor SomeClass()
@delegate:Field @delegate:Prop protected final val delegatedProperty: kotlin.String
@delegate:Field @delegate:Prop public final val propertyWithCustomGetter: kotlin.Int
@delegate:Field @delegate:Prop protected final val simpleProperty: kotlin.String = "text"
public final val propertyWithCustomGetter: kotlin.Int
protected final val simpleProperty: kotlin.String = "text"
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 final class WithPrimaryConstructor {
public constructor WithPrimaryConstructor(/*0*/ a: kotlin.String, /*1*/ @param:Field @param:Prop b: kotlin.String)
@delegate:Field @delegate:Prop public final val a: kotlin.String
public constructor WithPrimaryConstructor(/*0*/ a: kotlin.String, /*1*/ @Field @Prop b: kotlin.String)
public final val a: kotlin.String
public final val b: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -15,13 +15,13 @@ public final class CustomDelegate {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@field:Ann public final class SomeClass {
@field:Ann public constructor SomeClass()
@field:Ann protected final val delegatedProperty: kotlin.String
@field:Ann public final val propertyWithCustomGetter: kotlin.Int
public final class SomeClass {
public constructor SomeClass()
protected final val delegatedProperty: kotlin.String
public final val propertyWithCustomGetter: kotlin.Int
@field:Ann protected final val simpleProperty: kotlin.String = "text"
@field:Ann protected final val simplePropertyWithAnnotationList: kotlin.String = "text"
@field:Ann public final fun anotherFun(/*0*/ @field:Ann s: kotlin.String): kotlin.Unit
public final fun anotherFun(/*0*/ s: kotlin.String): kotlin.Unit
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
@@ -15,14 +15,14 @@ public final class CustomDelegate {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@get:Ann public final class SomeClass {
@get:Ann public constructor SomeClass()
public final class SomeClass {
public constructor SomeClass()
protected final val delegatedProperty: kotlin.String
protected final var mutableProperty: kotlin.String
public final val propertyWithCustomGetter: kotlin.Int
protected final val simpleProperty: kotlin.String = "text"
protected final val simplePropertyWithAnnotationList: kotlin.String = "text"
@get:Ann public final fun annotationOnFunction(/*0*/ a: kotlin.Int): kotlin.Int
public final fun annotationOnFunction(/*0*/ a: kotlin.Int): kotlin.Int
public final fun anotherFun(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -8,7 +8,7 @@ public final annotation class Ann : kotlin.Annotation {
}
public final class PrimaryConstructorClass {
public constructor PrimaryConstructorClass(/*0*/ @param:Ann a: kotlin.String, /*1*/ @param:Ann @param:Second b: kotlin.String, /*2*/ @param:Ann c: kotlin.String)
public constructor PrimaryConstructorClass(/*0*/ a: kotlin.String, /*1*/ b: kotlin.String, /*2*/ @Ann c: kotlin.String)
public final val c: kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -22,10 +22,10 @@ public final annotation class Second : kotlin.Annotation {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@param:Ann public final class SomeClass {
@param:Ann public constructor SomeClass(/*0*/ @param:Ann a: kotlin.String)
@param:Ann protected final val simpleProperty: kotlin.String = "text"
@param:Ann public final fun anotherFun(): kotlin.Unit
public final class SomeClass {
public constructor SomeClass(/*0*/ a: kotlin.String)
protected final val simpleProperty: kotlin.String = "text"
public final fun anotherFun(): kotlin.Unit
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
@@ -22,14 +22,14 @@ public final annotation class Second : kotlin.Annotation {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@property:Ann public final class SomeClass {
@property:Ann public constructor SomeClass(/*0*/ s: kotlin.String)
@property:Ann protected final val p1: kotlin.String = ""
@property:Ann @property:Second protected final val p2: kotlin.String = ""
@property:Ann protected final var p3: kotlin.String
@property:Ann protected final val p4: kotlin.String
@property:Ann public final var propertyWithCustomSetter: kotlin.Int
@property:Ann public final fun anotherFun(): kotlin.Unit
public final class SomeClass {
public constructor SomeClass(/*0*/ s: kotlin.String)
@Ann protected final val p1: kotlin.String = ""
@Ann @Second protected final val p2: kotlin.String = ""
@Ann protected final var p3: kotlin.String
@Ann protected final val p4: kotlin.String
@Ann public final var propertyWithCustomSetter: kotlin.Int
public final fun anotherFun(): kotlin.Unit
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
@@ -10,11 +10,11 @@ public final annotation class Ann : kotlin.Annotation {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@receiver:Ann public final class SomeClass {
@receiver:Ann public constructor SomeClass(/*0*/ @receiver:Ann a: kotlin.String)
@receiver:Ann protected final val simpleProperty: kotlin.String = "text"
public final class SomeClass {
public constructor SomeClass(/*0*/ a: kotlin.String)
protected final val simpleProperty: kotlin.String = "text"
public final val @receiver:Ann kotlin.String.extensionProperty2: kotlin.String
@receiver:Ann public final fun anotherFun(): kotlin.Unit
public final fun anotherFun(): kotlin.Unit
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
@@ -16,14 +16,14 @@ public final class CustomDelegate {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@set:Ann public final class SomeClass {
public final class SomeClass {
public constructor SomeClass()
protected final var delegatedProperty: kotlin.String
protected final var mutableProperty: kotlin.String
protected final var mutablePropertyWithAnnotationList: kotlin.String
public final var propertyWithCustomSetter: kotlin.Int
@set:Ann protected final val simpleProperty: kotlin.String = "text"
@set:Ann public final fun annotationOnFunction(/*0*/ a: kotlin.Int): kotlin.Int
protected final val simpleProperty: kotlin.String = "text"
public final fun annotationOnFunction(/*0*/ a: kotlin.Int): kotlin.Int
public final fun anotherFun(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -16,14 +16,14 @@ public final class CustomDelegate {
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@setparam:Ann public final class SomeClass {
@setparam:Ann public constructor SomeClass()
public final class SomeClass {
public constructor SomeClass()
@setparam:Ann protected final var delegatedProperty: kotlin.String
@setparam:Ann protected final var mutableProperty: kotlin.String
@setparam:Ann protected final var mutablePropertyWithAnnotationList: kotlin.String
@setparam:Ann public final var propertyWithCustomSetter: kotlin.Int
@setparam:Ann protected final val simpleProperty: kotlin.String = "text"
@setparam:Ann public final fun anotherFun(): kotlin.Unit
protected final val simpleProperty: kotlin.String = "text"
public final fun anotherFun(): kotlin.Unit
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,10 +1,10 @@
package
package bar {
@file:bar.foo public val prop: [ERROR : No type, no body]
@file:bar.bar @file:bar.baz public fun func(): kotlin.Unit
public val prop: [ERROR : No type, no body]
public fun func(): kotlin.Unit
@file:bar.baz public final class C {
public final class C {
public constructor C()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -1,6 +1,6 @@
package
@foo @bar @file:baz public fun test(): kotlin.Unit
@foo @bar public fun test(): kotlin.Unit
public final annotation class bar : kotlin.Annotation {
public constructor bar()
@@ -1,6 +1,6 @@
package
@foo @bar @file:baz public fun test(): kotlin.Unit
@foo @bar public fun test(): kotlin.Unit
public final annotation class bar : kotlin.Annotation {
public constructor bar()
@@ -1,11 +1,11 @@
package
public fun test1(/*0*/ @file:kotlin.Suppress(names = {""}) x: kotlin.Int): kotlin.Unit
@file:kotlin.Suppress(names = {""}) public fun test2(): kotlin.Unit
public fun @file:kotlin.Suppress(names = {""}) kotlin.Int.test3(): kotlin.Unit
public fun test1(/*0*/ x: kotlin.Int): kotlin.Unit
public fun test2(): kotlin.Unit
public fun kotlin.Int.test3(): kotlin.Unit
public final class OnType {
public constructor OnType(/*0*/ x: @file:kotlin.Suppress(names = {""}) kotlin.Int)
public constructor OnType(/*0*/ x: kotlin.Int)
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,11 +1,11 @@
package
public fun test1(/*0*/ @file:kotlin.Suppress(names = {""}) x: kotlin.Int): kotlin.Unit
@file:kotlin.Suppress(names = {""}) public fun test2(): kotlin.Unit
public fun @file:kotlin.Suppress(names = {""}) kotlin.Int.test3(): kotlin.Unit
public fun test1(/*0*/ x: kotlin.Int): kotlin.Unit
public fun test2(): kotlin.Unit
public fun kotlin.Int.test3(): kotlin.Unit
public final class OnType {
public constructor OnType(/*0*/ x: @file:kotlin.Suppress(names = {""}) kotlin.Int)
public constructor OnType(/*0*/ x: kotlin.Int)
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 val @receiver:Fancy kotlin.Int.asVal: kotlin.Int
public fun ((@receiver:Fancy kotlin.Int) -> kotlin.Unit).complexReceiver1(): kotlin.Unit
public fun ((kotlin.Int) -> @receiver:Fancy kotlin.Unit).complexReceiver2(): kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).complexReceiver1(): kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).complexReceiver2(): kotlin.Unit
public fun @receiver:Fancy kotlin.String.myExtension(): kotlin.Unit
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) public final annotation class Fancy : kotlin.Annotation {
@@ -1,8 +1,8 @@
package
public val @receiver:Fancy kotlin.Int.asVal: kotlin.Int
public fun ((@receiver:Fancy kotlin.Int) -> kotlin.Unit).complexReceiver1(): kotlin.Unit
public fun ((kotlin.Int) -> @receiver:Fancy kotlin.Unit).complexReceiver2(): kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).complexReceiver1(): kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).complexReceiver2(): kotlin.Unit
public fun @receiver:Fancy kotlin.String.myExtension(): kotlin.Unit
@kotlin.annotation.Target(allowedTargets = {AnnotationTarget.VALUE_PARAMETER}) public final annotation class Fancy : kotlin.Annotation {
@@ -1,16 +1,16 @@
package
public final class A {
public constructor A(/*0*/ @param:Ann @Ann x: kotlin.Int, /*1*/ @param:RepeatableAnn @Ann y: kotlin.Int)
@property:Ann @RepeatableAnn @property:RepeatableAnn @field:Ann public final val a: kotlin.Int = 0
@Ann @property:Ann @field:Ann public final val b: kotlin.Int = 0
public constructor A(/*0*/ @Ann @Ann x: kotlin.Int, /*1*/ @RepeatableAnn @Ann y: kotlin.Int)
@Ann @RepeatableAnn @RepeatableAnn @field:Ann public final val a: kotlin.Int = 0
@Ann @Ann @field:Ann public final val b: kotlin.Int = 0
@field:RepeatableAnn @field:RepeatableAnn public final val c: kotlin.Int = 0
@property:RepeatableAnn @RepeatableAnn public final val d: kotlin.Int = 0
@property:RepeatableAnn @RepeatableAnn @delegate:RepeatableAnn public final val e: kotlin.String
@property:Ann @delegate:Ann public final val f: kotlin.String
@RepeatableAnn @RepeatableAnn public final val d: kotlin.Int = 0
@RepeatableAnn @RepeatableAnn @delegate:RepeatableAnn public final val e: kotlin.String
@Ann @delegate:Ann public final val f: kotlin.String
@Ann @delegate:Ann public final val g: kotlin.String
@Ann @field:Ann public final val h: kotlin.String = ""
@property:Ann @field:Ann public final val i: kotlin.String = ""
@Ann @field:Ann public final val i: kotlin.String = ""
public final val x: kotlin.Int
public final val y: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
@@ -26,10 +26,10 @@ public final annotation class Ann : kotlin.Annotation {
}
public final class B {
public constructor B(/*0*/ @param:fieldOrPropAnn x: kotlin.Int, /*1*/ y: kotlin.Int)
public constructor B(/*0*/ @fieldOrPropAnn x: kotlin.Int, /*1*/ y: kotlin.Int)
@getSetAndParamAnn @setparam:getSetAndParamAnn public final var w: kotlin.Int
@fieldOrPropAnn public final val x: kotlin.Int
@property:fieldOrPropAnn @fieldOrPropAnn public final val y: kotlin.Int
@fieldOrPropAnn @fieldOrPropAnn public final val y: kotlin.Int
@fieldOrPropAnn @field:fieldOrPropAnn public final val z: kotlin.Int = 42
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
@@ -1,9 +1,9 @@
package
public fun test1(/*0*/ i: @setparam:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test2(/*0*/ i: @param:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test3(/*0*/ i: @receiver:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test4(): @setparam:kotlin.Suppress(names = {}) kotlin.Int
public fun test5(/*0*/ i: (@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit): kotlin.Unit
public fun test7(): (@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit
public fun ((@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit).test6(): kotlin.Unit
public fun test1(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test2(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test3(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test4(): kotlin.Int
public fun test5(/*0*/ i: (kotlin.Int) -> kotlin.Unit): kotlin.Unit
public fun test7(): (kotlin.Int) -> kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).test6(): kotlin.Unit
@@ -1,9 +1,9 @@
package
public fun test1(/*0*/ i: @setparam:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test2(/*0*/ i: @param:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test3(/*0*/ i: @receiver:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test4(): @setparam:kotlin.Suppress(names = {}) kotlin.Int
public fun test5(/*0*/ i: (@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit): kotlin.Unit
public fun test7(): (@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit
public fun ((@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit).test6(): kotlin.Unit
public fun test1(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test2(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test3(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test4(): kotlin.Int
public fun test5(/*0*/ i: (kotlin.Int) -> kotlin.Unit): kotlin.Unit
public fun test7(): (kotlin.Int) -> kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).test6(): kotlin.Unit
@@ -1,9 +1,9 @@
package
public fun test1(/*0*/ i: @setparam:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test2(/*0*/ i: @param:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test3(/*0*/ i: @receiver:kotlin.Suppress(names = {}) kotlin.Int): kotlin.Unit
public fun test4(): @setparam:kotlin.Suppress(names = {}) kotlin.Int
public fun test5(/*0*/ i: (@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit): kotlin.Unit
public fun test7(): (@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit
public fun ((@setparam:kotlin.Suppress(names = {}) kotlin.Int) -> kotlin.Unit).test6(): kotlin.Unit
public fun test1(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test2(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test3(/*0*/ i: kotlin.Int): kotlin.Unit
public fun test4(): kotlin.Int
public fun test5(/*0*/ i: (kotlin.Int) -> kotlin.Unit): kotlin.Unit
public fun test7(): (kotlin.Int) -> kotlin.Unit
public fun ((kotlin.Int) -> kotlin.Unit).test6(): kotlin.Unit