FIR IDE: consider declaration to be lazy resolvable if it has fqName
This commit is contained in:
+13
-2
@@ -6,6 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
|
package org.jetbrains.kotlin.idea.fir.low.level.api.element.builder
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
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.annotations.TestOnly
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.annotations.ThreadSafe
|
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.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
import org.jetbrains.kotlin.psi.psiUtil.isAncestor
|
||||||
|
import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
|
||||||
import org.jetbrains.kotlin.psi2ir.deparenthesize
|
import org.jetbrains.kotlin.psi2ir.deparenthesize
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -83,9 +86,9 @@ internal inline fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate:
|
|||||||
var container: PsiElement? = this
|
var container: PsiElement? = this
|
||||||
while (container != null && container !is KtFile) {
|
while (container != null && container !is KtFile) {
|
||||||
if (container is KtNamedDeclaration
|
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
|
&& container !is KtPrimaryConstructor
|
||||||
&& !KtPsiUtil.isLocal(container)
|
&& container.hasFqName()
|
||||||
&& container !is KtEnumEntry
|
&& container !is KtEnumEntry
|
||||||
&& container.containingClassOrObject !is KtEnumEntry
|
&& container.containingClassOrObject !is KtEnumEntry
|
||||||
&& predicate(container)
|
&& predicate(container)
|
||||||
@@ -97,6 +100,14 @@ internal inline fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate:
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtDeclaration.isNonAnonymousClassOrObject() =
|
||||||
|
this is KtClassOrObject
|
||||||
|
&& !this.isObjectLiteral()
|
||||||
|
|
||||||
|
|
||||||
|
private fun KtDeclaration.hasFqName(): Boolean =
|
||||||
|
parentsOfType<KtDeclaration>(withSelf = false).all { it.isNonAnonymousClassOrObject() }
|
||||||
|
|
||||||
internal fun PsiElement.getNonLocalContainingInBodyDeclarationWith(): KtNamedDeclaration? =
|
internal fun PsiElement.getNonLocalContainingInBodyDeclarationWith(): KtNamedDeclaration? =
|
||||||
getNonLocalContainingOrThisDeclaration { declaration ->
|
getNonLocalContainingOrThisDeclaration { declaration ->
|
||||||
when (declaration) {
|
when (declaration) {
|
||||||
|
|||||||
Reference in New Issue
Block a user