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.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());
|
||||||
}
|
}
|
||||||
}, " ");
|
}, " ");
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -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("] ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user