Render annotations with use-site target
This commit is contained in:
+15
-4
@@ -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());
|
||||
}
|
||||
}, " ");
|
||||
}
|
||||
|
||||
+1
-1
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+3
-1
@@ -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("] ");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user