Render annotations with use-site target

This commit is contained in:
Yan Zhulanow
2015-07-16 16:46:09 +03:00
parent 2bacbc9046
commit d56a3f97c6
6 changed files with 32 additions and 13 deletions
@@ -26,12 +26,14 @@ import org.jetbrains.kotlin.analyzer.AnalysisResult;
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment; import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor; 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.Annotations;
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor; import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor;
import org.jetbrains.kotlin.incremental.components.NoLookupLocation; import org.jetbrains.kotlin.incremental.components.NoLookupLocation;
import org.jetbrains.kotlin.name.FqName; import org.jetbrains.kotlin.name.FqName;
import org.jetbrains.kotlin.name.Name; import org.jetbrains.kotlin.name.Name;
import org.jetbrains.kotlin.psi.JetAnnotationEntry; import org.jetbrains.kotlin.psi.JetAnnotationEntry;
import org.jetbrains.kotlin.psi.JetAnnotationUseSiteTarget;
import org.jetbrains.kotlin.psi.JetFile; import org.jetbrains.kotlin.psi.JetFile;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier; import org.jetbrains.kotlin.renderer.DescriptorRendererModifier;
@@ -124,7 +126,15 @@ public abstract class AbstractAnnotationDescriptorResolveTest extends JetLiteFix
public String fun(JetAnnotationEntry annotationEntry) { public String fun(JetAnnotationEntry annotationEntry) {
AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry); AnnotationDescriptor annotationDescriptor = context.get(BindingContext.ANNOTATION, annotationEntry);
assertNotNull(annotationDescriptor); 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) { private static String renderAnnotations(Annotations annotations) {
return StringUtil.join(annotations, new Function<AnnotationDescriptor, String>() { return StringUtil.join(annotations.getAllAnnotations(), new Function<AnnotationWithTarget, String>() {
@Override @Override
public String fun(AnnotationDescriptor annotationDescriptor) { public String fun(AnnotationWithTarget annotationWithTarget) {
return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation(annotationDescriptor); return WITH_ANNOTATION_ARGUMENT_TYPES.renderAnnotation(
annotationWithTarget.getAnnotation(), annotationWithTarget.getTarget());
} }
}, " "); }, " ");
} }
@@ -61,6 +61,6 @@ public class AnnotationDescriptorImpl implements AnnotationDescriptor {
@Override @Override
public String toString() { public String toString() {
return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderAnnotation(this); return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderAnnotation(this, null);
} }
} }
@@ -18,5 +18,7 @@ package org.jetbrains.kotlin.descriptors.annotations
public enum class AnnotationUseSiteTarget() { public enum class AnnotationUseSiteTarget() {
FIELD, FIELD,
FILE FILE;
public val renderName: String = name().toLowerCase()
} }
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.renderer
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor 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.FqName
import org.jetbrains.kotlin.name.FqNameBase import org.jetbrains.kotlin.name.FqNameBase
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -43,7 +44,7 @@ public interface DescriptorRenderer : Renderer<DeclarationDescriptor> {
public fun renderClassifierName(klass: ClassifierDescriptor): String 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 override fun render(declarationDescriptor: DeclarationDescriptor): String
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotated import org.jetbrains.kotlin.descriptors.annotations.Annotated
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor 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.FqName
import org.jetbrains.kotlin.name.FqNameBase import org.jetbrains.kotlin.name.FqNameBase
import org.jetbrains.kotlin.name.Name 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)) builder.append(if (FqName.ROOT.equalsTo(fqName)) "root package" else renderFqName(fqName))
} }
} }
private fun renderAnnotations(annotated: Annotated, builder: StringBuilder, needBrackets: Boolean = false) { private fun renderAnnotations(annotated: Annotated, builder: StringBuilder, needBrackets: Boolean = false) {
if (DescriptorRendererModifier.ANNOTATIONS !in modifiers) return if (DescriptorRendererModifier.ANNOTATIONS !in modifiers) return
val excluded = if (annotated is JetType) excludedTypeAnnotationClasses else excludedAnnotationClasses val excluded = if (annotated is JetType) excludedTypeAnnotationClasses else excludedAnnotationClasses
val annotationsBuilder = StringBuilder { val annotationsBuilder = StringBuilder {
for (annotation in annotated.getAnnotations()) { for ((annotation, target) in annotated.getAnnotations().getAllAnnotations()) {
val annotationClass = annotation.getType().getConstructor().getDeclarationDescriptor() as ClassDescriptor val annotationClass = annotation.getType().getConstructor().getDeclarationDescriptor() as ClassDescriptor
if (!excluded.contains(DescriptorUtils.getFqNameSafe(annotationClass))) { 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 { return StringBuilder {
if (target != null) {
append("@" + target.renderName + ":")
}
append(renderType(annotation.getType())) append(renderType(annotation.getType()))
if (verbose) { if (verbose) {
renderAndSortAnnotationArguments(annotation).joinTo(this, ", ", "(", ")") renderAndSortAnnotationArguments(annotation).joinTo(this, ", ", "(", ")")
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.types;
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.annotations.AnnotationDescriptor; import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationWithTarget;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.types.checker.JetTypeChecker; import org.jetbrains.kotlin.types.checker.JetTypeChecker;
@@ -60,9 +61,10 @@ public abstract class AbstractJetType implements JetType {
public String toString() { public String toString() {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (AnnotationDescriptor annotation : getAnnotations()) { for (AnnotationWithTarget annotationWithTarget : getAnnotations().getAllAnnotations()) {
sb.append("["); sb.append("[");
sb.append(DescriptorRenderer.DEBUG_TEXT.renderAnnotation(annotation)); sb.append(DescriptorRenderer.DEBUG_TEXT.renderAnnotation(
annotationWithTarget.getAnnotation(), annotationWithTarget.getTarget()));
sb.append("] "); sb.append("] ");
} }