Refactor DescriptorRenderer's renderAccessors option

In some tests with txt (probably all except loadJava), property
accessors are not rendered at all, so a third option value (NONE) will
be useful to determine whether we need to render annotations on property
accessors as get/set/sparam-targeted annotations on the property
This commit is contained in:
Alexander Udalov
2018-08-13 13:31:05 +02:00
parent 896cf61443
commit 4219aff548
6 changed files with 57 additions and 25 deletions
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.PropertyAccessorRenderingPolicy
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.MemberComparator
import org.jetbrains.kotlin.resolve.MultiTargetPlatform import org.jetbrains.kotlin.resolve.MultiTargetPlatform
@@ -50,7 +51,6 @@ import org.jetbrains.kotlin.types.checker.KotlinTypeChecker
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.io.PrintWriter import java.io.PrintWriter
import java.io.StringWriter import java.io.StringWriter
import java.lang.AssertionError
object Renderers { object Renderers {
@@ -677,7 +677,7 @@ object Renderers {
val DEPRECATION_RENDERER = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.withOptions { val DEPRECATION_RENDERER = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.withOptions {
withoutTypeParameters = false withoutTypeParameters = false
receiverAfterName = false receiverAfterName = false
renderAccessors = true propertyAccessorRenderingPolicy = PropertyAccessorRenderingPolicy.PRETTY
}.asRenderer() }.asRenderer()
} }
@@ -43,6 +43,7 @@ import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate; import java.util.function.Predicate;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry; import static org.jetbrains.kotlin.resolve.DescriptorUtils.isEnumEntry;
@@ -366,7 +367,7 @@ public class RecursiveDescriptorComparator {
this.checkFunctionContracts = checkFunctionContracts; this.checkFunctionContracts = checkFunctionContracts;
this.recursiveFilter = recursiveFilter; this.recursiveFilter = recursiveFilter;
this.validationStrategy = validationStrategy; this.validationStrategy = validationStrategy;
this.renderer = renderer; this.renderer = rendererWithPropertyAccessors(renderer, checkPropertyAccessors);
} }
public Configuration filterRecursion(@NotNull Predicate<DeclarationDescriptor> stepIntoFilter) { public Configuration filterRecursion(@NotNull Predicate<DeclarationDescriptor> stepIntoFilter) {
@@ -381,8 +382,11 @@ public class RecursiveDescriptorComparator {
} }
public Configuration checkPropertyAccessors(boolean checkPropertyAccessors) { public Configuration checkPropertyAccessors(boolean checkPropertyAccessors) {
return new Configuration(checkPrimaryConstructors, checkPropertyAccessors, includeMethodsOfKotlinAny, return new Configuration(
renderDeclarationsFromOtherModules, checkFunctionContracts, recursiveFilter, validationStrategy, renderer); checkPrimaryConstructors, checkPropertyAccessors, includeMethodsOfKotlinAny, renderDeclarationsFromOtherModules,
checkFunctionContracts, recursiveFilter, validationStrategy,
rendererWithPropertyAccessors(renderer, checkPropertyAccessors)
);
} }
public Configuration checkFunctionContracts(boolean checkFunctionContracts) { public Configuration checkFunctionContracts(boolean checkFunctionContracts) {
@@ -409,5 +413,26 @@ public class RecursiveDescriptorComparator {
return new Configuration(checkPrimaryConstructors, checkPropertyAccessors, includeMethodsOfKotlinAny, return new Configuration(checkPrimaryConstructors, checkPropertyAccessors, includeMethodsOfKotlinAny,
renderDeclarationsFromOtherModules, checkFunctionContracts, recursiveFilter, validationStrategy, renderer); renderDeclarationsFromOtherModules, checkFunctionContracts, recursiveFilter, validationStrategy, renderer);
} }
@NotNull
private static DescriptorRenderer rendererWithPropertyAccessors(
@NotNull DescriptorRenderer renderer, boolean checkPropertyAccessors
) {
return newRenderer(renderer, options ->
options.setPropertyAccessorRenderingPolicy(
checkPropertyAccessors ? PropertyAccessorRenderingPolicy.DEBUG : PropertyAccessorRenderingPolicy.NONE
)
);
}
@NotNull
private static DescriptorRenderer newRenderer(
@NotNull DescriptorRenderer renderer, @NotNull Consumer<DescriptorRendererOptions> configure
) {
return renderer.withOptions(options -> {
configure.accept(options);
return Unit.INSTANCE;
});
}
} }
} }
@@ -210,7 +210,7 @@ interface DescriptorRendererOptions {
var typeNormalizer: (KotlinType) -> KotlinType var typeNormalizer: (KotlinType) -> KotlinType
var defaultParameterValueRenderer: ((ValueParameterDescriptor) -> String)? var defaultParameterValueRenderer: ((ValueParameterDescriptor) -> String)?
var secondaryConstructorsAsPrimary: Boolean var secondaryConstructorsAsPrimary: Boolean
var renderAccessors: Boolean var propertyAccessorRenderingPolicy: PropertyAccessorRenderingPolicy
var renderDefaultAnnotationArguments: Boolean var renderDefaultAnnotationArguments: Boolean
var alwaysRenderModifiers: Boolean var alwaysRenderModifiers: Boolean
var renderConstructorKeyword: Boolean var renderConstructorKeyword: Boolean
@@ -251,6 +251,12 @@ enum class ParameterNameRenderingPolicy {
NONE NONE
} }
enum class PropertyAccessorRenderingPolicy {
PRETTY,
DEBUG,
NONE
}
enum class DescriptorRendererModifier(val includeByDefault: Boolean) { enum class DescriptorRendererModifier(val includeByDefault: Boolean) {
VISIBILITY(true), VISIBILITY(true),
MODALITY(true), MODALITY(true),
@@ -985,25 +985,25 @@ internal class DescriptorRendererImpl(
} }
override fun visitPropertyGetterDescriptor(descriptor: PropertyGetterDescriptor, builder: StringBuilder) { override fun visitPropertyGetterDescriptor(descriptor: PropertyGetterDescriptor, builder: StringBuilder) {
if (renderAccessors) { visitPropertyAccessorDescriptor(descriptor, builder, "getter")
renderAccessorModifiers(descriptor, builder)
builder.append("getter for ")
renderProperty(descriptor.correspondingProperty, builder)
}
else {
visitFunctionDescriptor(descriptor, builder)
}
} }
override fun visitPropertySetterDescriptor(descriptor: PropertySetterDescriptor, builder: StringBuilder) { override fun visitPropertySetterDescriptor(descriptor: PropertySetterDescriptor, builder: StringBuilder) {
if (renderAccessors) { visitPropertyAccessorDescriptor(descriptor, builder, "setter")
renderAccessorModifiers(descriptor, builder) }
builder.append("setter for ")
renderProperty(descriptor.correspondingProperty, builder) private fun visitPropertyAccessorDescriptor(descriptor: PropertyAccessorDescriptor, builder: StringBuilder, kind: String) {
} when (propertyAccessorRenderingPolicy) {
else { PropertyAccessorRenderingPolicy.PRETTY -> {
visitFunctionDescriptor(descriptor, builder) renderAccessorModifiers(descriptor, builder)
builder.append("$kind for ")
renderProperty(descriptor.correspondingProperty, builder)
}
PropertyAccessorRenderingPolicy.DEBUG -> {
visitFunctionDescriptor(descriptor, builder)
}
PropertyAccessorRenderingPolicy.NONE -> {
}
} }
} }
@@ -94,7 +94,7 @@ internal class DescriptorRendererOptionsImpl : DescriptorRendererOptions {
override var parameterNameRenderingPolicy by property(ParameterNameRenderingPolicy.ALL) override var parameterNameRenderingPolicy by property(ParameterNameRenderingPolicy.ALL)
override var receiverAfterName by property(false) override var receiverAfterName by property(false)
override var renderCompanionObjectName by property(false) override var renderCompanionObjectName by property(false)
override var renderAccessors by property(false) override var propertyAccessorRenderingPolicy by property(PropertyAccessorRenderingPolicy.DEBUG)
override var renderDefaultAnnotationArguments by property(false) override var renderDefaultAnnotationArguments by property(false)
override var eachAnnotationOnNewLine: Boolean by property(false) override var eachAnnotationOnNewLine: Boolean by property(false)
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers
import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.java.JvmAbi
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy import org.jetbrains.kotlin.renderer.ParameterNameRenderingPolicy
import org.jetbrains.kotlin.renderer.PropertyAccessorRenderingPolicy
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import javax.swing.Icon import javax.swing.Icon
@@ -45,7 +46,7 @@ class KotlinMethodSmartStepTarget(
private val renderer = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS.withOptions { private val renderer = IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_NO_ANNOTATIONS.withOptions {
parameterNameRenderingPolicy = ParameterNameRenderingPolicy.NONE parameterNameRenderingPolicy = ParameterNameRenderingPolicy.NONE
withoutReturnType = true withoutReturnType = true
renderAccessors = true propertyAccessorRenderingPolicy = PropertyAccessorRenderingPolicy.PRETTY
startFromName = true startFromName = true
modifiers = emptySet() modifiers = emptySet()
} }
@@ -75,4 +76,4 @@ class KotlinMethodSmartStepTarget(
} }
return declaration!!.hashCode() return declaration!!.hashCode()
} }
} }