FIR IDE: add more info to error messages

This commit is contained in:
Ilya Kirillov
2021-01-09 03:23:03 +01:00
parent c131983188
commit 1901436c96
4 changed files with 9 additions and 7 deletions
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirFile
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.idea.fir.low.level.api.util.replaceFirst import org.jetbrains.kotlin.idea.fir.low.level.api.util.replaceFirst
@@ -29,7 +30,7 @@ internal object FileStructureUtil {
firFile.declarations as MutableList<FirDeclaration> firFile.declarations as MutableList<FirDeclaration>
} else { } else {
val classLikeLookupTag = from.containingClass() val classLikeLookupTag = from.containingClass()
?: error("Class name should not be null for non-top-level & non-local declarations") ?: error("Class name should not be null for non-top-level & non-local declarations, but was null for\n${from.render()}")
val containingClass = classLikeLookupTag.toSymbol(firFile.session)?.fir as FirRegularClass val containingClass = classLikeLookupTag.toSymbol(firFile.session)?.fir as FirRegularClass
containingClass.declarations as MutableList<FirDeclaration> containingClass.declarations as MutableList<FirDeclaration>
} }
@@ -101,7 +101,7 @@ private fun KtDeclaration.findSourceNonLocalFirDeclarationByProvider(
containerClassFir.declarations.first { it.psi === this } containerClassFir.declarations.first { it.psi === this }
} }
this is KtTypeAlias -> findFir(firSymbolProvider) this is KtTypeAlias -> findFir(firSymbolProvider)
else -> error("Invalid container $this::class") else -> error("Invalid container ${this::class}\n${getElementTextInContext()}")
} }
return candidate?.takeIf { it.realPsi == this } return candidate?.takeIf { it.realPsi == this }
} }
@@ -98,7 +98,7 @@ internal class KtFirCallResolver(
is FirSimpleNamedReference -> is FirSimpleNamedReference ->
error( error(
""" """
Looks like FirFunctionCall was not resolved to BODY_RESOLVE phase, Looks like ${this::class.simpleName} && it calle reference ${calleeReference::class.simpleName} were not resolved to BODY_RESOLVE phase,
consider resolving it containing declaration before starting resolve calls consider resolving it containing declaration before starting resolve calls
${this.render()} ${this.render()}
${(this.psi as? KtElement)?.getElementTextInContext()} ${(this.psi as? KtElement)?.getElementTextInContext()}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
import org.jetbrains.kotlin.fir.originalIfFakeOverride import org.jetbrains.kotlin.fir.originalIfFakeOverride
import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner import org.jetbrains.kotlin.idea.frontend.api.ValidityTokenOwner
import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck import org.jetbrains.kotlin.idea.frontend.api.fir.utils.FirRefWithValidityCheck
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
@@ -35,11 +36,11 @@ private tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (orig
FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR FirDeclarationOrigin.SamConstructor -> KtSymbolOrigin.SAM_CONSTRUCTOR
FirDeclarationOrigin.Enhancement -> KtSymbolOrigin.JAVA FirDeclarationOrigin.Enhancement -> KtSymbolOrigin.JAVA
else -> { else -> {
val overridden = val overridden = (this as? FirCallableDeclaration<*>)?.originalIfFakeOverride()
(this as? FirCallableDeclaration<*>)?.originalIfFakeOverride() ?: throw InvalidFirDeclarationOriginForSymbol(origin) ?: throw InvalidFirDeclarationOriginForSymbol(this)
overridden.ktSymbolOrigin() overridden.ktSymbolOrigin()
} }
} }
class InvalidFirDeclarationOriginForSymbol(origin: FirDeclarationOrigin) : class InvalidFirDeclarationOriginForSymbol(declaration: FirDeclaration) :
IllegalStateException("Invalid FirDeclarationOrigin $origin") IllegalStateException("Invalid FirDeclarationOrigin ${declaration.origin::class.simpleName} for ${declaration.render()}" )