[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
This commit is contained in:
Alexander Udalov
2024-10-07 14:56:30 +02:00
committed by intellij-monorepo-bot
parent a4bd7743a6
commit c251b6961f

View File

@@ -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))
}
}
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
)
}
}