[FIR IDE] Fix invalid body lazy resolve

This commit is contained in:
Igor Yakovlev
2021-05-06 14:57:39 +02:00
committed by TeamCityServer
parent cfc0bfd64a
commit 445f13d1bf
14 changed files with 192 additions and 80 deletions
@@ -6,13 +6,11 @@
package org.jetbrains.kotlin.fir.resolve.transformers
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic
import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.lookupSuperTypes
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
@@ -83,7 +81,7 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(
// Note that annotations are still visited here
// again, although there's no need in it
transformElement(firClass, data)
transformDeclarationContent(firClass, data) as FirClass<*>
}
}
@@ -92,6 +90,10 @@ abstract class FirAbstractTreeTransformerWithSuperTypes(
scopes.add(FirMemberTypeParameterScope(this))
}
}
open fun transformDeclarationContent(declaration: FirDeclaration, data: Any?): FirDeclaration {
return transformElement(declaration, data)
}
}
fun createSubstitutionForSupertype(superType: ConeLookupTagBasedType, session: FirSession): ConeSubstitutor {
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirDelegatedConstructorCall
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeCyclicTypeBound
import org.jetbrains.kotlin.fir.scopes.FirScope
@@ -38,7 +39,7 @@ fun <F : FirClassLikeDeclaration<F>> F.runTypeResolvePhaseForLocalClass(
}
open class FirTypeResolveTransformer(
override val session: FirSession,
final override val session: FirSession,
scopeSession: ScopeSession,
initialScopes: List<FirScope> = emptyList()
) : FirAbstractTreeTransformerWithSuperTypes(
@@ -52,7 +52,7 @@ open class FirContractResolveTransformer(
return annotationCall
}
private class FirDeclarationsContractResolveTransformer(transformer: FirBodyResolveTransformer) : FirDeclarationsResolveTransformer(transformer) {
protected open class FirDeclarationsContractResolveTransformer(transformer: FirBodyResolveTransformer) : FirDeclarationsResolveTransformer(transformer) {
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
data: ResolutionMode
@@ -224,11 +224,15 @@ open class FirContractResolveTransformer(
}
}
open fun transformDeclarationContent(firClass: FirClass<*>, data: ResolutionMode) {
firClass.transformDeclarations(this, data)
}
override fun transformRegularClass(regularClass: FirRegularClass, data: ResolutionMode): FirStatement {
regularClass.updatePhase()
regularClass.transformCompanionObject(this, data)
context.withRegularClass(regularClass, components, forContracts = true) {
regularClass.transformDeclarations(this, data)
transformDeclarationContent(regularClass, data)
}
return regularClass
}
@@ -239,7 +243,7 @@ open class FirContractResolveTransformer(
): FirStatement {
anonymousObject.updatePhase()
context.withAnonymousObject(anonymousObject, components) {
anonymousObject.transformDeclarations(this, data)
transformDeclarationContent(anonymousObject, data)
}
return anonymousObject
}