From d3cab96ca07924e91a9d9a98c2934b60a2aa88e9 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 17 Dec 2020 17:42:29 +0100 Subject: [PATCH] FIR IDE: consider declaration to be lazy resolvable if it has fqName --- .../api/element/builder/FirElementBuilder.kt | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt index fdbc9b84ee3..4452f947608 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/element/builder/FirElementBuilder.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder import com.intellij.psi.PsiElement +import com.intellij.psi.util.parentOfType +import com.intellij.psi.util.parentsOfType import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe @@ -16,6 +18,7 @@ import org.jetbrains.kotlin.idea.util.getElementTextInContext import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.isAncestor +import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral import org.jetbrains.kotlin.psi2ir.deparenthesize /** @@ -83,9 +86,9 @@ internal inline fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate: var container: PsiElement? = this while (container != null && container !is KtFile) { if (container is KtNamedDeclaration - && (container is KtClassOrObject || container is KtDeclarationWithBody || container is KtProperty || container is KtTypeAlias) + && (container.isNonAnonymousClassOrObject() || container is KtDeclarationWithBody || container is KtProperty || container is KtTypeAlias) && container !is KtPrimaryConstructor - && !KtPsiUtil.isLocal(container) + && container.hasFqName() && container !is KtEnumEntry && container.containingClassOrObject !is KtEnumEntry && predicate(container) @@ -97,6 +100,14 @@ internal inline fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate: return null } +private fun KtDeclaration.isNonAnonymousClassOrObject() = + this is KtClassOrObject + && !this.isObjectLiteral() + + +private fun KtDeclaration.hasFqName(): Boolean = + parentsOfType(withSelf = false).all { it.isNonAnonymousClassOrObject() } + internal fun PsiElement.getNonLocalContainingInBodyDeclarationWith(): KtNamedDeclaration? = getNonLocalContainingOrThisDeclaration { declaration -> when (declaration) {