From 1ee0892f733c4e0f32421bbd4444faac2f894107 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Mon, 9 Nov 2020 10:22:41 +0300 Subject: [PATCH] [ULC] Fix NPE on generating data class ctor parameters --- .../jetbrains/kotlin/asJava/classes/ultraLightClass.kt | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt index e368530dba6..c870ac26212 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/ultraLightClass.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.load.kotlin.TypeMappingMode import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DelegationResolver import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.annotations.JVM_STATIC_ANNOTATION_FQ_NAME @@ -334,12 +335,19 @@ open class KtUltraLightClass(classOrObject: KtClassOrObject, internal val suppor private fun addMethodsFromDataClass(result: MutableList) { if (!classOrObject.hasModifier(DATA_KEYWORD)) return + val ktClass = classOrObject as? KtClass ?: return val descriptor = classOrObject.resolve() as? ClassDescriptor ?: return val bindingContext = classOrObject.analyze() // Force resolving data class members set descriptor.unsubstitutedMemberScope.getContributedDescriptors() + val areCtorParametersAreAnalyzed = ktClass.primaryConstructorParameters + .filter { it.hasValOrVar() } + .all { bindingContext.get(BindingContext.PRIMARY_CONSTRUCTOR_PARAMETER, it) != null } + + if (!areCtorParametersAreAnalyzed) return + object : DataClassMethodGenerator(classOrObject, bindingContext) { private fun addFunction(descriptor: FunctionDescriptor, declarationForOrigin: KtDeclaration? = null) { result.add(createGeneratedMethodFromDescriptor(descriptor, JvmDeclarationOriginKind.OTHER, declarationForOrigin))