KT-15677 KT-15775
Update parser & descriptor renderer to handle parenthesized types and function types properly. Resolve annotations in parenthesized types. AnnotationsImpl.isEmpty() returned false for targeted annotations only (e.g., 'fun @receiver:Ann C?.foo()'). Properly keep track of targeted annotations.
This commit is contained in:
+1
-1
@@ -38,7 +38,7 @@ class AnnotationsImpl : Annotations {
|
||||
this.annotations = targetedAnnotations.filter { it.target == null }.map { it.annotation }
|
||||
}
|
||||
|
||||
override fun isEmpty() = annotations.isEmpty()
|
||||
override fun isEmpty() = targetedAnnotations.isEmpty()
|
||||
|
||||
override fun findAnnotation(fqName: FqName) = annotations.firstOrNull {
|
||||
val descriptor = it.type.constructor.declarationDescriptor
|
||||
|
||||
@@ -166,6 +166,15 @@ abstract class DescriptorRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
enum class AnnotationArgumentsRenderingPolicy(
|
||||
val includeAnnotationArguments: Boolean = false,
|
||||
val includeEmptyAnnotationArguments: Boolean = false
|
||||
) {
|
||||
NO_ARGUMENTS(),
|
||||
UNLESS_EMPTY(true),
|
||||
ALWAYS_PARENTHESIZED(true, true)
|
||||
}
|
||||
|
||||
interface DescriptorRendererOptions {
|
||||
var classifierNamePolicy: ClassifierNamePolicy
|
||||
var withDefinedIn: Boolean
|
||||
@@ -185,7 +194,11 @@ interface DescriptorRendererOptions {
|
||||
var textFormat: RenderingFormat
|
||||
var excludedAnnotationClasses: Set<FqName>
|
||||
var excludedTypeAnnotationClasses: Set<FqName>
|
||||
var includeAnnotationArguments: Boolean
|
||||
|
||||
var annotationArgumentsRenderingPolicy: AnnotationArgumentsRenderingPolicy
|
||||
val includeAnnotationArguments: Boolean get() = annotationArgumentsRenderingPolicy.includeAnnotationArguments
|
||||
val includeEmptyAnnotationArguments: Boolean get() = annotationArgumentsRenderingPolicy.includeEmptyAnnotationArguments
|
||||
|
||||
var includePropertyConstant: Boolean
|
||||
var parameterNameRenderingPolicy: ParameterNameRenderingPolicy
|
||||
var withoutTypeParameters: Boolean
|
||||
|
||||
@@ -47,7 +47,10 @@ internal class DescriptorRendererImpl(
|
||||
}
|
||||
|
||||
private val functionTypeAnnotationsRenderer: DescriptorRendererImpl by lazy {
|
||||
this.withOptions { excludedTypeAnnotationClasses += listOf(KotlinBuiltIns.FQ_NAMES.extensionFunctionType) } as DescriptorRendererImpl
|
||||
this.withOptions {
|
||||
excludedTypeAnnotationClasses += listOf(KotlinBuiltIns.FQ_NAMES.extensionFunctionType)
|
||||
annotationArgumentsRenderingPolicy = AnnotationArgumentsRenderingPolicy.ALWAYS_PARENTHESIZED
|
||||
} as DescriptorRendererImpl
|
||||
}
|
||||
private val functionTypeParameterTypesRenderer: DescriptorRenderer by lazy {
|
||||
this.withOptions { excludedTypeAnnotationClasses += listOf(KotlinBuiltIns.FQ_NAMES.parameterName) }
|
||||
@@ -413,7 +416,7 @@ internal class DescriptorRendererImpl(
|
||||
|
||||
if (includeAnnotationArguments) {
|
||||
val arguments = renderAndSortAnnotationArguments(annotation)
|
||||
if (arguments.isNotEmpty()) {
|
||||
if (includeEmptyAnnotationArguments || arguments.isNotEmpty()) {
|
||||
arguments.joinTo(this, ", ", "(", ")")
|
||||
}
|
||||
}
|
||||
|
||||
@@ -98,7 +98,7 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
|
||||
ExcludedTypeAnnotations.annotationsForNullabilityAndMutability
|
||||
+ ExcludedTypeAnnotations.internalAnnotationsForResolve)
|
||||
|
||||
override var includeAnnotationArguments: Boolean by property(false)
|
||||
override var annotationArgumentsRenderingPolicy by property(AnnotationArgumentsRenderingPolicy.NO_ARGUMENTS)
|
||||
|
||||
override var alwaysRenderModifiers by property(false)
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ import kotlin.Unit;
|
||||
import kotlin.jvm.functions.Function1;
|
||||
import org.jetbrains.kotlin.descriptors.*;
|
||||
import org.jetbrains.kotlin.name.Name;
|
||||
import org.jetbrains.kotlin.renderer.AnnotationArgumentsRenderingPolicy;
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier;
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRendererOptions;
|
||||
@@ -39,7 +40,7 @@ public class MemberComparator implements Comparator<DeclarationDescriptor> {
|
||||
public Unit invoke(DescriptorRendererOptions options) {
|
||||
options.setWithDefinedIn(false);
|
||||
options.setVerbose(true);
|
||||
options.setIncludeAnnotationArguments(true);
|
||||
options.setAnnotationArgumentsRenderingPolicy(AnnotationArgumentsRenderingPolicy.UNLESS_EMPTY);
|
||||
options.setModifiers(DescriptorRendererModifier.ALL);
|
||||
return Unit.INSTANCE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user