From d56a3f97c631c189c0a1aafaf0bedd69220f5e18 Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Thu, 16 Jul 2015 16:46:09 +0300 Subject: [PATCH] Render annotations with use-site target --- ...stractAnnotationDescriptorResolveTest.java | 19 +++++++++++++++---- .../annotations/AnnotationDescriptorImpl.java | 2 +- .../annotations/AnnotationUseSiteTarget.kt | 4 +++- .../kotlin/renderer/DescriptorRenderer.kt | 3 ++- .../kotlin/renderer/DescriptorRendererImpl.kt | 11 +++++++---- .../kotlin/types/AbstractJetType.java | 6 ++++-- 6 files changed, 32 insertions(+), 13 deletions(-) diff --git a/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java b/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java index 55e9d94199f..0d063903825 100644 --- a/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java +++ b/compiler/tests/org/jetbrains/kotlin/resolve/annotation/AbstractAnnotationDescriptorResolveTest.java @@ -26,12 +26,14 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.descriptors.*; 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.impl.AnonymousFunctionDescriptor; import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.psi.JetAnnotationEntry; +import org.jetbrains.kotlin.psi.JetAnnotationUseSiteTarget; import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRendererModifier; @@ -124,7 +126,15 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix public String fun(JetAnnotationEntry annotationEntry) { AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry); assertNotNull(annotationDescriptor); - return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation(annotationDescriptor); + + JetAnnotationUseSiteTarget target = annotationEntry.getUseSiteTarget(); + + if (target != null) { + return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation( + annotationDescriptor, target.getAnnotationUseSiteTarget()); + } + + return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation(annotationDescriptor, null); } }, " "); @@ -354,10 +364,11 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix } private static String renderAnnotations(Annotations annotations) { - return StringUtil.join(annotations, new Function() { + return StringUtil.join(annotations.getAllAnnotations(), new Function() { @Override - public String fun(AnnotationDescriptor annotationDescriptor) { - return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation(annotationDescriptor); + public String fun(AnnotationWithTarget annotationWithTarget) { + return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation( + annotationWithTarget.getAnnotation(), annotationWithTarget.getTarget()); } }, " "); } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptorImpl.java b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptorImpl.java index c1d50318fa9..3e444db785b 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationDescriptorImpl.java @@ -61,6 +61,6 @@ public class AnnotationDescriptorImpl implements AnnotationDescriptor { @Override public String toString() { - return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderAnnotation(this); + return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderAnnotation(this, null); } } diff --git a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt index 951c5863f12..f35796bd649 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/descriptors/annotations/AnnotationUseSiteTarget.kt @@ -18,5 +18,7 @@ package org.jetbrains.kotlin.descriptors.annotations public enum class AnnotationUseSiteTarget() { FIELD, - FILE + FILE; + + public val renderName: String = name().toLowerCase() } \ No newline at end of file diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt index 3c90a98a6a9..6862ff181a7 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRenderer.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.renderer import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameBase import org.jetbrains.kotlin.name.Name @@ -43,7 +44,7 @@ public interface DescriptorRenderer : Renderer { public fun renderClassifierName(klass: ClassifierDescriptor): String - public fun renderAnnotation(annotation: AnnotationDescriptor): String + public fun renderAnnotation(annotation: AnnotationDescriptor, target: AnnotationUseSiteTarget? = null): String override fun render(declarationDescriptor: DeclarationDescriptor): String diff --git a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt index a748ec8fe3b..304ddac3d7f 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/renderer/DescriptorRendererImpl.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqNameBase import org.jetbrains.kotlin.name.Name @@ -334,18 +335,17 @@ internal class DescriptorRendererImpl( builder.append(if (FqName.ROOT.equalsTo(fqName)) "root package" else renderFqName(fqName)) } } - private fun renderAnnotations(annotated: Annotated, builder: StringBuilder, needBrackets: Boolean = false) { if (DescriptorRendererModifier.ANNOTATIONS !in modifiers) return val excluded = if (annotated is JetType) excludedTypeAnnotationClasses else excludedAnnotationClasses val annotationsBuilder = StringBuilder { - for (annotation in annotated.getAnnotations()) { + for ((annotation, target) in annotated.getAnnotations().getAllAnnotations()) { val annotationClass = annotation.getType().getConstructor().getDeclarationDescriptor() as ClassDescriptor if (!excluded.contains(DescriptorUtils.getFqNameSafe(annotationClass))) { - append(renderAnnotation(annotation)).append(" ") + append(renderAnnotation(annotation, target)).append(" ") } } } @@ -363,8 +363,11 @@ internal class DescriptorRendererImpl( } } - override fun renderAnnotation(annotation: AnnotationDescriptor): String { + override fun renderAnnotation(annotation: AnnotationDescriptor, target: AnnotationUseSiteTarget?): String { return StringBuilder { + if (target != null) { + append("@" + target.renderName + ":") + } append(renderType(annotation.getType())) if (verbose) { renderAndSortAnnotationArguments(annotation).joinTo(this, ", ", "(", ")") diff --git a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java index b9d6679a6c7..ea1a80cd2f1 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java +++ b/core/descriptors/src/org/jetbrains/kotlin/types/AbstractJetType.java @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.types; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; +import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget; import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.types.checker.JetTypeChecker; @@ -60,9 +61,10 @@ public abstract class AbstractJetType implements JetType { public String toString() { StringBuilder sb = new StringBuilder(); - for (AnnotationDescriptor annotation : getAnnotations()) { + for (AnnotationWithTarget annotationWithTarget : getAnnotations().getAllAnnotations()) { sb.append("["); - sb.append(DescriptorRenderer.DEBUG_TEXT.renderAnnotation(annotation)); + sb.append(DescriptorRenderer.DEBUG_TEXT.renderAnnotation( + annotationWithTarget.getAnnotation(), annotationWithTarget.getTarget())); sb.append("] "); }