@@ -6,6 +6,7 @@ import org.jetbrains.kotlin.ir.IrElement
66import org.jetbrains.kotlin.ir.declarations.IrClass
77import org.jetbrains.kotlin.ir.declarations.IrFile
88import org.jetbrains.kotlin.ir.declarations.IrFunction
9+ import org.jetbrains.kotlin.ir.declarations.IrVariable
910import org.jetbrains.kotlin.ir.expressions.IrConst
1011import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
1112import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
@@ -32,8 +33,16 @@ class KotlinSourceFileExtractor(
3233 }
3334 }
3435
35- data class SourceFileExtractionState (val anonymousTypeMap : MutableMap <IrClass , TypeResults > = mutableMapOf(),
36- val generatedLocalFunctionTypeMap : MutableMap <IrFunction , LocalFunctionLabels > = mutableMapOf())
36+ data class SourceFileExtractionState (val anonymousTypeMapping : MutableMap <IrClass , TypeResults > = mutableMapOf(),
37+ val generatedLocalFunctionTypeMapping : MutableMap <IrFunction , LocalFunctionLabels > = mutableMapOf(),
38+ /* *
39+ * It is not easy to assign keys to local variables, so they get
40+ * given `*` IDs. However, the same variable may be referred to
41+ * from distant places in the IR, so we need a way to find out
42+ * which label is used for a given local variable. This information
43+ * is stored in this mapping.
44+ */
45+ val variableLabelMapping : MutableMap <IrVariable , Label <DbLocalvar >> = mutableMapOf())
3746
3847 companion object {
3948 private val stateCache: MutableMap <IrFile , SourceFileExtractionState > = mutableMapOf ()
@@ -92,14 +101,29 @@ class KotlinSourceFileExtractor(
92101 return id
93102 }
94103
104+ /* *
105+ * This returns the label used for a local variable, creating one
106+ * if none currently exists.
107+ */
108+ fun <T > getVariableLabelFor (v : IrVariable ): Label <DbLocalvar > {
109+ val maybeLabel = fileExtractionState.variableLabelMapping[v]
110+ if (maybeLabel == null ) {
111+ val label = tw.getFreshIdLabel<DbLocalvar >()
112+ fileExtractionState.variableLabelMapping[v] = label
113+ return label
114+ } else {
115+ return maybeLabel
116+ }
117+ }
118+
95119 fun useAnonymousClass (c : IrClass ): TypeResults {
96- var res = fileExtractionState.anonymousTypeMap [c]
120+ var res = fileExtractionState.anonymousTypeMapping [c]
97121 if (res == null ) {
98122 val javaResult = TypeResult (tw.getFreshIdLabel<DbClass >(), " " , " " )
99123 val kotlinResult = TypeResult (tw.getFreshIdLabel<DbKt_notnull_type >(), " " , " " )
100124 tw.writeKt_notnull_types(kotlinResult.id, javaResult.id)
101125 res = TypeResults (javaResult, kotlinResult)
102- fileExtractionState.anonymousTypeMap [c] = res
126+ fileExtractionState.anonymousTypeMapping [c] = res
103127 }
104128
105129 return res
@@ -112,7 +136,7 @@ class KotlinSourceFileExtractor(
112136 logger.warnElement(Severity .ErrorSevere , " Extracting a non-local function as a local one" , f)
113137 }
114138
115- var res = fileExtractionState.generatedLocalFunctionTypeMap [f]
139+ var res = fileExtractionState.generatedLocalFunctionTypeMapping [f]
116140 if (res == null ) {
117141 val javaResult = TypeResult (tw.getFreshIdLabel<DbClass >(), " " , " " )
118142 val kotlinResult = TypeResult (tw.getFreshIdLabel<DbKt_notnull_type >(), " " , " " )
@@ -121,7 +145,7 @@ class KotlinSourceFileExtractor(
121145 TypeResults (javaResult, kotlinResult),
122146 tw.getFreshIdLabel(),
123147 tw.getFreshIdLabel())
124- fileExtractionState.generatedLocalFunctionTypeMap [f] = res
148+ fileExtractionState.generatedLocalFunctionTypeMapping [f] = res
125149 }
126150
127151 return res
0 commit comments