From c251b6961fad0da1ea747df9bc1eb5f8c9bf31ff Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 7 Oct 2024 14:56:30 +0200 Subject: [PATCH] [kotlin] Minor, move noarg descriptor utils to IDE plugin sources In the main Kotlin repo, they were only used from the old JVM backend implementation of noarg, which is being removed right now. #KT-71197 GitOrigin-RevId: 4faae27bfc6c5e8aec5c10c7e7bb3a09825ad351 --- .../NoArgUltraLightClassModifierExtension.kt | 37 +++++++++++++++---- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/plugins/kotlin/compiler-plugins/noarg/common/src/org/jetbrains/kotlin/idea/compilerPlugin/noarg/NoArgUltraLightClassModifierExtension.kt b/plugins/kotlin/compiler-plugins/noarg/common/src/org/jetbrains/kotlin/idea/compilerPlugin/noarg/NoArgUltraLightClassModifierExtension.kt index 95050ed9c212..1e1e7b358922 100644 --- a/plugins/kotlin/compiler-plugins/noarg/common/src/org/jetbrains/kotlin/idea/compilerPlugin/noarg/NoArgUltraLightClassModifierExtension.kt +++ b/plugins/kotlin/compiler-plugins/noarg/common/src/org/jetbrains/kotlin/idea/compilerPlugin/noarg/NoArgUltraLightClassModifierExtension.kt @@ -3,18 +3,19 @@ package org.jetbrains.kotlin.idea.compilerPlugin.noarg import com.intellij.openapi.project.Project -import org.jetbrains.kotlin.idea.compilerPlugin.CachedAnnotationNames -import org.jetbrains.kotlin.idea.compilerPlugin.getAnnotationNames import org.jetbrains.kotlin.asJava.UltraLightClassModifierExtension import org.jetbrains.kotlin.asJava.classes.KtUltraLightClass import org.jetbrains.kotlin.asJava.classes.createGeneratedMethodFromDescriptor import org.jetbrains.kotlin.asJava.elements.KtLightMethod -import org.jetbrains.kotlin.descriptors.ClassDescriptor -import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.descriptors.* +import org.jetbrains.kotlin.descriptors.annotations.Annotations +import org.jetbrains.kotlin.descriptors.impl.ClassConstructorDescriptorImpl import org.jetbrains.kotlin.extensions.AnnotationBasedExtension -import org.jetbrains.kotlin.noarg.AbstractNoArgExpressionCodegenExtension -import org.jetbrains.kotlin.noarg.AbstractNoArgExpressionCodegenExtension.Companion.isZeroParameterConstructor +import org.jetbrains.kotlin.idea.compilerPlugin.CachedAnnotationNames +import org.jetbrains.kotlin.idea.compilerPlugin.getAnnotationNames import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.descriptorUtil.builtIns +import org.jetbrains.kotlin.resolve.jvm.annotations.findJvmOverloadsAnnotation import org.jetbrains.kotlin.util.isAnnotated import org.jetbrains.kotlin.util.isOrdinaryClass @@ -63,8 +64,28 @@ class NoArgUltraLightClassModifierExtension(project: Project) : if (classDescriptor.constructors.any { isZeroParameterConstructor(it) }) return - val constructorDescriptor = AbstractNoArgExpressionCodegenExtension.createNoArgConstructorDescriptor(classDescriptor) + val constructorDescriptor = createNoArgConstructorDescriptor(classDescriptor) methodsList.add(parentClass.createGeneratedMethodFromDescriptor(constructorDescriptor)) } -} \ No newline at end of file + + private fun isZeroParameterConstructor(constructor: ClassConstructorDescriptor): Boolean { + val parameters = constructor.valueParameters + return parameters.isEmpty() || + (parameters.all { it.declaresDefaultValue() } && (constructor.isPrimary || constructor.findJvmOverloadsAnnotation() != null)) + } + + private fun createNoArgConstructorDescriptor(containingClass: ClassDescriptor): ConstructorDescriptor = + ClassConstructorDescriptorImpl.createSynthesized(containingClass, Annotations.EMPTY, false, SourceElement.NO_SOURCE).apply { + initialize( + null, + calculateDispatchReceiverParameter(), + emptyList(), + emptyList(), + emptyList(), + containingClass.builtIns.unitType, + Modality.OPEN, + DescriptorVisibilities.PUBLIC + ) + } +}