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.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<AnnotationDescriptor, String>() {
return StringUtil.join(annotations.getAllAnnotations(), new Function<AnnotationWithTarget, String>() {
@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());
}
}, " ");
}
@@ -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);
}
}
@@ -18,5 +18,7 @@ package org.jetbrains.kotlin.descriptors.annotations
public enum class AnnotationUseSiteTarget() {
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.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<DeclarationDescriptor> {
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
@@ -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, ", ", "(", ")")
@@ -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("] ");
}