From 05528a051bd9f7a9e838bc2ff79b59f56c19f0b9 Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Mon, 11 Jul 2022 21:54:31 +0200 Subject: [PATCH] [light classes] rewrite findEntry to avoid resolve and move to light-classes-base module ^KT-53097 --- .../asJava/classes/{utils.kt => implUtils.kt} | 20 ++++++++++++++++++ .../kotlin/asJava/classes/implUtils.kt | 21 ------------------- 2 files changed, 20 insertions(+), 21 deletions(-) rename compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/{utils.kt => implUtils.kt} (72%) delete mode 100644 compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt diff --git a/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/utils.kt b/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt similarity index 72% rename from compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/utils.kt rename to compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt index 20530e8b6a7..dc91c5d7728 100644 --- a/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/utils.kt +++ b/compiler/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt @@ -13,9 +13,29 @@ import com.intellij.util.IncorrectOperationException import org.jetbrains.kotlin.analyzer.KotlinModificationTrackerService import org.jetbrains.kotlin.psi.* +fun KtSuperTypeList.findEntry(fqNameToFind: String): KtSuperTypeListEntry? { + val name = fqNameToFind.substringAfterLast(delimiter = '.', missingDelimiterValue = "") + if (name.isEmpty()) { + return entries.find { it.typeAsUserType?.textMatches(fqNameToFind) == true } + } + + val qualifier = fqNameToFind.substringBeforeLast('.') + val entries = entries.mapNotNull { entry -> entry.typeAsUserType?.let { entry to it } } + .filter { (_, type) -> type.referencedName == name && (type.qualifier?.textMatches(qualifier) != false) } + .ifEmpty { return null } + + return if (entries.size == 1) { + entries.first().first + } else { + val entry = entries.firstOrNull { it.second.qualifier != null } ?: entries.firstOrNull() + entry?.first + } +} + // NOTE: avoid using blocking lazy in light classes, it leads to deadlocks fun lazyPub(initializer: () -> T) = lazy(LazyThreadSafetyMode.PUBLICATION, initializer) +@Suppress("UnusedReceiverParameter") fun LightElement.cannotModify(): Nothing { throw IncorrectOperationException("Modification not implemented.") } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt deleted file mode 100644 index 45dcd23198b..00000000000 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/implUtils.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.asJava.classes - -import org.jetbrains.kotlin.asJava.LightClassGenerationSupport -import org.jetbrains.kotlin.psi.KtClassOrObject -import org.jetbrains.kotlin.psi.KtSuperTypeList -import org.jetbrains.kotlin.psi.KtSuperTypeListEntry -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameUnsafe - -fun KtSuperTypeList.findEntry(fqNameToFind: String): KtSuperTypeListEntry? { - val context = LightClassGenerationSupport.getInstance(project).analyzeWithContent(parent as KtClassOrObject) - return entries.firstOrNull { - val referencedType = context[BindingContext.TYPE, it.typeReference] - referencedType?.constructor?.declarationDescriptor?.fqNameUnsafe?.asString() == fqNameToFind - } -}