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:
Dmitry Petrov
2017-01-13 16:29:40 +03:00
parent a429992e81
commit b9f9894310
45 changed files with 2094 additions and 67 deletions
@@ -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;
}