[FIR] Pass context data flow on code fragment analysis
This commit is contained in:
+9
-1
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.dfa
|
package org.jetbrains.kotlin.fir.resolve.dfa
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.toPersistentSet
|
||||||
import org.jetbrains.kotlin.contracts.description.LogicOperationKind
|
import org.jetbrains.kotlin.contracts.description.LogicOperationKind
|
||||||
import org.jetbrains.kotlin.contracts.description.canBeRevisited
|
import org.jetbrains.kotlin.contracts.description.canBeRevisited
|
||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
@@ -238,7 +239,14 @@ abstract class FirDataFlowAnalyzer(
|
|||||||
// ----------------------------------- Code Fragment ------------------------------------------
|
// ----------------------------------- Code Fragment ------------------------------------------
|
||||||
|
|
||||||
fun enterCodeFragment(codeFragment: FirCodeFragment) {
|
fun enterCodeFragment(codeFragment: FirCodeFragment) {
|
||||||
graphBuilder.enterCodeFragment(codeFragment).mergeIncomingFlow()
|
graphBuilder.enterCodeFragment(codeFragment).mergeIncomingFlow { flow ->
|
||||||
|
val realVariablesFromContext = codeFragment.codeFragmentContext?.variables.orEmpty()
|
||||||
|
for ((symbol, exactTypes) in realVariablesFromContext) {
|
||||||
|
val realVariable = variableStorage.getOrCreateIfReal(flow, symbol.fir) as? RealVariable ?: continue
|
||||||
|
val typeStatement = PersistentTypeStatement(realVariable, exactTypes.toPersistentSet())
|
||||||
|
flow.addTypeStatement(typeStatement)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun exitCodeFragment(): ControlFlowGraph {
|
fun exitCodeFragment(): ControlFlowGraph {
|
||||||
|
|||||||
+2
-1
@@ -531,7 +531,8 @@ class BodyResolveContext(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun <T> withScopesForCodeFragment(codeFragment: FirCodeFragment, holder: SessionHolder, f: () -> T): T {
|
fun <T> withScopesForCodeFragment(codeFragment: FirCodeFragment, holder: SessionHolder, f: () -> T): T {
|
||||||
val towerDataContext = codeFragment.towerDataContext ?: error("Context is not set for a code fragment")
|
val codeFragmentContext = codeFragment.codeFragmentContext ?: error("Context is not set for a code fragment")
|
||||||
|
val towerDataContext = codeFragmentContext.towerDataContext
|
||||||
|
|
||||||
val fragmentImportTowerDataElements = computeImportingScopes(file, holder.session, holder.scopeSession)
|
val fragmentImportTowerDataElements = computeImportingScopes(file, holder.session, holder.scopeSession)
|
||||||
.map { it.asTowerDataElement(isLocal = false) }
|
.map { it.asTowerDataElement(isLocal = false) }
|
||||||
|
|||||||
@@ -10,12 +10,12 @@ import org.jetbrains.kotlin.fir.containingClassForLocalAttr
|
|||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.LookupTagInternals
|
import org.jetbrains.kotlin.fir.symbols.impl.LookupTagInternals
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
|
||||||
|
|
||||||
fun FirClassLikeDeclaration.getContainingDeclaration(session: FirSession): FirClassLikeDeclaration? {
|
fun FirClassLikeDeclaration.getContainingDeclaration(session: FirSession): FirClassLikeDeclaration? {
|
||||||
if (isLocal) {
|
if (isLocal) {
|
||||||
@@ -88,6 +88,11 @@ var FirConstructor.originalConstructorIfTypeAlias: FirConstructor? by FirDeclara
|
|||||||
val FirConstructorSymbol.isTypeAliasedConstructor: Boolean
|
val FirConstructorSymbol.isTypeAliasedConstructor: Boolean
|
||||||
get() = fir.originalConstructorIfTypeAlias != null
|
get() = fir.originalConstructorIfTypeAlias != null
|
||||||
|
|
||||||
private object CodeFragmentTowerDataContext : FirDeclarationDataKey()
|
interface FirCodeFragmentContext {
|
||||||
|
val towerDataContext: FirTowerDataContext
|
||||||
|
val variables: Map<FirBasedSymbol<*>, Set<ConeKotlinType>>
|
||||||
|
}
|
||||||
|
|
||||||
var FirCodeFragment.towerDataContext: FirTowerDataContext? by FirDeclarationDataRegistry.data(CodeFragmentTowerDataContext)
|
private object CodeFragmentContextDataKey : FirDeclarationDataKey()
|
||||||
|
|
||||||
|
var FirCodeFragment.codeFragmentContext: FirCodeFragmentContext? by FirDeclarationDataRegistry.data(CodeFragmentContextDataKey)
|
||||||
Reference in New Issue
Block a user