Extract TargetedAnnotations out of AnnotationsImpl
Minimize AnnotationsImpl to leave it usable in simple scenarios where there's no use-site targeted annotations, and use TargetedAnnotations in the only place in the frontend (AnnotationResolverImpl) where use-sites were needed. Also, delete kdoc on Annotations.isEmpty to prevent readers from putting too much thought into how it works. With the exception of a few places in the frontend where use-site targeted annotations are still accessed via the Annotations object, it's now an implementation detail and users (such as backends, IDE) should not care about them at all, and instead should just deal with the correct element when processing annotations
This commit is contained in:
+3
-5
@@ -108,11 +108,9 @@ class AnnotationSplitter(
|
|||||||
other.add(annotation)
|
other.add(annotation)
|
||||||
}
|
}
|
||||||
|
|
||||||
for ((annotation, useSiteTarget) in allAnnotations.getUseSiteTargetedAnnotations()) {
|
for ((annotation, target) in allAnnotations.getUseSiteTargetedAnnotations()) {
|
||||||
if (useSiteTarget == null) continue
|
if (target in applicableTargets) {
|
||||||
|
map.getOrPut(target) { arrayListOf() }.add(annotation)
|
||||||
if (useSiteTarget in applicableTargets) {
|
|
||||||
map.getOrPut(useSiteTarget) { arrayListOf() }.add(annotation)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
@@ -0,0 +1,19 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license
|
||||||
|
* that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.descriptors.annotations
|
||||||
|
|
||||||
|
class TargetedAnnotations(
|
||||||
|
private val standardAnnotations: List<AnnotationDescriptor>,
|
||||||
|
private val targetedAnnotations: List<AnnotationWithTarget>
|
||||||
|
) : Annotations {
|
||||||
|
override fun isEmpty(): Boolean = standardAnnotations.isEmpty() && targetedAnnotations.isEmpty()
|
||||||
|
|
||||||
|
override fun getUseSiteTargetedAnnotations(): List<AnnotationWithTarget> = targetedAnnotations
|
||||||
|
|
||||||
|
override fun iterator(): Iterator<AnnotationDescriptor> = standardAnnotations.iterator()
|
||||||
|
|
||||||
|
override fun toString(): String = (standardAnnotations + targetedAnnotations).toString()
|
||||||
|
}
|
||||||
@@ -17,10 +17,14 @@
|
|||||||
package org.jetbrains.kotlin.resolve;
|
package org.jetbrains.kotlin.resolve;
|
||||||
|
|
||||||
import com.intellij.psi.util.PsiTreeUtil;
|
import com.intellij.psi.util.PsiTreeUtil;
|
||||||
|
import kotlin.collections.CollectionsKt;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.kotlin.descriptors.*;
|
import org.jetbrains.kotlin.descriptors.*;
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.*;
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget;
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations;
|
||||||
|
import org.jetbrains.kotlin.descriptors.annotations.TargetedAnnotations;
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors;
|
import org.jetbrains.kotlin.diagnostics.Errors;
|
||||||
import org.jetbrains.kotlin.psi.*;
|
import org.jetbrains.kotlin.psi.*;
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver;
|
import org.jetbrains.kotlin.resolve.calls.CallResolver;
|
||||||
@@ -79,7 +83,9 @@ public class AnnotationResolverImpl extends AnnotationResolver {
|
|||||||
boolean shouldResolveArguments
|
boolean shouldResolveArguments
|
||||||
) {
|
) {
|
||||||
if (annotationEntryElements.isEmpty()) return Annotations.Companion.getEMPTY();
|
if (annotationEntryElements.isEmpty()) return Annotations.Companion.getEMPTY();
|
||||||
List<AnnotationWithTarget> result = new ArrayList<>(0);
|
|
||||||
|
List<AnnotationDescriptor> standard = new ArrayList<>();
|
||||||
|
List<AnnotationWithTarget> targeted = new ArrayList<>();
|
||||||
|
|
||||||
for (KtAnnotationEntry entryElement : annotationEntryElements) {
|
for (KtAnnotationEntry entryElement : annotationEntryElements) {
|
||||||
AnnotationDescriptor descriptor = trace.get(BindingContext.ANNOTATION, entryElement);
|
AnnotationDescriptor descriptor = trace.get(BindingContext.ANNOTATION, entryElement);
|
||||||
@@ -92,13 +98,13 @@ public class AnnotationResolverImpl extends AnnotationResolver {
|
|||||||
|
|
||||||
KtAnnotationUseSiteTarget target = entryElement.getUseSiteTarget();
|
KtAnnotationUseSiteTarget target = entryElement.getUseSiteTarget();
|
||||||
if (target != null) {
|
if (target != null) {
|
||||||
result.add(new AnnotationWithTarget(descriptor, target.getAnnotationUseSiteTarget()));
|
targeted.add(new AnnotationWithTarget(descriptor, target.getAnnotationUseSiteTarget()));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
result.add(new AnnotationWithTarget(descriptor, null));
|
standard.add(descriptor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return AnnotationsImpl.create(result);
|
return new TargetedAnnotations(CollectionsKt.toList(standard), CollectionsKt.toList(targeted));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
+1
-1
@@ -16,4 +16,4 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.descriptors.annotations
|
package org.jetbrains.kotlin.descriptors.annotations
|
||||||
|
|
||||||
data class AnnotationWithTarget(val annotation: AnnotationDescriptor, val target: AnnotationUseSiteTarget?)
|
data class AnnotationWithTarget(val annotation: AnnotationDescriptor, val target: AnnotationUseSiteTarget)
|
||||||
|
|||||||
@@ -23,12 +23,6 @@ interface Annotated {
|
|||||||
}
|
}
|
||||||
|
|
||||||
interface Annotations : Iterable<AnnotationDescriptor> {
|
interface Annotations : Iterable<AnnotationDescriptor> {
|
||||||
/**
|
|
||||||
* @return `true` iff there are no "direct" annotations applicable to this declaration. Note that even if [isEmpty] is `true`,
|
|
||||||
* there may be use-site-targeted annotations applicable to the declaration!
|
|
||||||
*
|
|
||||||
* @see getUseSiteTargetedAnnotations
|
|
||||||
*/
|
|
||||||
fun isEmpty(): Boolean
|
fun isEmpty(): Boolean
|
||||||
|
|
||||||
fun findAnnotation(fqName: FqName): AnnotationDescriptor? = firstOrNull { it.fqName == fqName }
|
fun findAnnotation(fqName: FqName): AnnotationDescriptor? = firstOrNull { it.fqName == fqName }
|
||||||
|
|||||||
+4
-34
@@ -16,40 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.descriptors.annotations
|
package org.jetbrains.kotlin.descriptors.annotations
|
||||||
|
|
||||||
class AnnotationsImpl : Annotations {
|
class AnnotationsImpl(private val annotations: List<AnnotationDescriptor>) : Annotations {
|
||||||
private val annotations: List<AnnotationDescriptor>
|
override fun isEmpty(): Boolean = annotations.isEmpty()
|
||||||
private val targetedAnnotations: List<AnnotationWithTarget>
|
|
||||||
|
|
||||||
constructor(annotations: List<AnnotationDescriptor>) {
|
override fun iterator(): Iterator<AnnotationDescriptor> = annotations.iterator()
|
||||||
this.annotations = annotations
|
|
||||||
this.targetedAnnotations = annotations.map { AnnotationWithTarget(it, null) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// List<AnnotationDescriptor> and List<AnnotationWithTarget> have the same signature
|
override fun toString(): String = annotations.toString()
|
||||||
private constructor(
|
|
||||||
targetedAnnotations: List<AnnotationWithTarget>,
|
|
||||||
@Suppress("UNUSED_PARAMETER") i: Int
|
|
||||||
) {
|
|
||||||
this.targetedAnnotations = targetedAnnotations
|
|
||||||
this.annotations = targetedAnnotations.filter { it.target == null }.map { it.annotation }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun isEmpty() = targetedAnnotations.isEmpty()
|
|
||||||
|
|
||||||
override fun getUseSiteTargetedAnnotations(): List<AnnotationWithTarget> {
|
|
||||||
return targetedAnnotations
|
|
||||||
.filter { it.target != null }
|
|
||||||
.map { AnnotationWithTarget(it.annotation, it.target!!) }
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun iterator() = annotations.iterator()
|
|
||||||
|
|
||||||
override fun toString() = annotations.toString()
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
fun create(annotationsWithTargets: List<AnnotationWithTarget>): AnnotationsImpl {
|
|
||||||
return AnnotationsImpl(annotationsWithTargets, 0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user