@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
11
11
import org.jetbrains.kotlin.fir.analysis.checkers.context.MutableCheckerContext
12
12
import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
13
13
import org.jetbrains.kotlin.fir.analysis.checkers.processOverriddenFunctions
14
- import org.jetbrains.kotlin.fir.builder.buildFunctionTypeParameter
15
14
import org.jetbrains.kotlin.fir.caches.FirCache
16
15
import org.jetbrains.kotlin.fir.caches.firCachesFactory
17
16
import org.jetbrains.kotlin.fir.caches.getValue
@@ -36,14 +35,14 @@ import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
36
35
import org.jetbrains.kotlin.fir.resolve.getSuperTypes
37
36
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
38
37
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
38
+ import org.jetbrains.kotlin.fir.scopes.impl.toConeType
39
39
import org.jetbrains.kotlin.fir.scopes.processAllFunctions
40
40
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
41
41
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
42
42
import org.jetbrains.kotlin.fir.symbols.impl.*
43
43
import org.jetbrains.kotlin.fir.types.*
44
44
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
45
45
import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
46
- import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
47
46
import org.jetbrains.kotlin.name.CallableId
48
47
import org.jetbrains.kotlin.name.ClassId
49
48
import org.jetbrains.kotlin.name.FqName
@@ -150,14 +149,104 @@ class SuspendTransformFirTransformer(
150
149
// In the generated IR, data and dataBlocking will share an `A`, generating the error.
151
150
// The error: Duplicate IR node
152
151
// [IR VALIDATION] JvmIrValidationBeforeLoweringPhase: Duplicate IR node: TYPE_PARAMETER name:A index:0 variance: superTypes:[kotlin.Any?] reified:false of FUN GENERATED[...]
153
- // TODO onebot type parameters?
152
+ // TODO copy to value parameters, receiver and return type?
153
+ val originalTypeParameterCache = mutableMapOf<FirTypeParameter , FirTypeParameter >()
154
154
typeParameters.replaceAll {
155
155
buildTypeParameterCopy(it) {
156
156
containingDeclarationSymbol = newFunSymbol // it.containingDeclarationSymbol
157
- symbol = it.symbol // FirTypeParameterSymbol()
157
+ // symbol = it.symbol // FirTypeParameterSymbol()
158
+ symbol = FirTypeParameterSymbol ()
159
+ }.also { new ->
160
+ originalTypeParameterCache[it] = new
161
+
158
162
}
159
163
}
160
164
165
+ // TODO
166
+ valueParameters.replaceAll { vp ->
167
+ buildValueParameterCopy(vp) {
168
+ symbol = FirValueParameterSymbol (vp.symbol.name)
169
+
170
+ val cachedTypeParameter = originalTypeParameterCache.entries.find { (k, v) ->
171
+ k.toConeType() == vp.returnTypeRef.coneTypeOrNull
172
+ }
173
+ val newReturnTypeRef = if (cachedTypeParameter != null ) {
174
+ returnTypeRef.withReplacedConeType(cachedTypeParameter.value.toConeType())
175
+ } else {
176
+ println (" returnTypeRef: $returnTypeRef " )
177
+ returnTypeRef.coneType.typeArguments.forEach {
178
+ println (" returnTypeRef.coneType.typeArguments: $it " )
179
+ }
180
+
181
+ returnTypeRef
182
+ }
183
+
184
+ returnTypeRef = newReturnTypeRef
185
+ }
186
+ }
187
+
188
+ // valueParameters.replaceAll { vp ->
189
+ // buildValueParameterCopy(vp) {
190
+ // //println("find: ${originalTypeParameterCache[vp.returnTypeRef]}")
191
+ // val cachedTypeParameter = originalTypeParameterCache.entries.find { (k, v) ->
192
+ // k.toConeType() == vp.returnTypeRef.coneTypeOrNull
193
+ // }
194
+ // println("cache conetype: $cachedTypeParameter")
195
+ //
196
+ // println("returnTypeRef1: $returnTypeRef")
197
+ //
198
+ // val stack = ArrayDeque<Any>()
199
+ //
200
+ // fun resolveTypeCopy() {
201
+ //
202
+ // }
203
+ //
204
+ // val type = returnTypeRef.coneTypeOrNull
205
+ // if (type != null && type.typeArguments.isNotEmpty()) {
206
+ // for (subArguments in type.typeArguments) {
207
+ //
208
+ // }
209
+ // }
210
+ //
211
+ // returnTypeRef.accept(object : FirVisitorVoid() {
212
+ // override fun visitElement(element: FirElement) {
213
+ // println("visitElement($element)")
214
+ // element.acceptChildren(this)
215
+ // }
216
+ //
217
+ // override fun visitResolvedTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
218
+ // println("visitResolvedTypeRef(${resolvedTypeRef})")
219
+ // resolvedTypeRef.type.typeArguments.forEach {
220
+ // it.type?.typeArguments
221
+ // }
222
+ // super.visitResolvedTypeRef(resolvedTypeRef)
223
+ // }
224
+ //
225
+ // override fun visitValueParameter(valueParameter: FirValueParameter) {
226
+ // println("visitValueParameter($valueParameter)")
227
+ // super.visitValueParameter(valueParameter)
228
+ // }
229
+ //
230
+ // override fun visitTypeParameter(typeParameter: FirTypeParameter) {
231
+ // println("visitTypeParameter($typeParameter)")
232
+ // super.visitTypeParameter(typeParameter)
233
+ // }
234
+ //
235
+ // override fun visitTypeParameterRef(typeParameterRef: FirTypeParameterRef) {
236
+ // println("visitTypeParameterRef($typeParameterRef)")
237
+ // super.visitTypeParameterRef(typeParameterRef)
238
+ // }
239
+ // })
240
+ //
241
+ // if (cachedTypeParameter != null) {
242
+ // returnTypeRef = returnTypeRef.withReplacedConeType(cachedTypeParameter.value.toConeType())
243
+ // }
244
+ //
245
+ // println("returnTypeRef2: $returnTypeRef")
246
+ // symbol = FirValueParameterSymbol(vp.symbol.name)
247
+ // }
248
+ // }
249
+
161
250
// valueParameters.replaceAll { vp ->
162
251
// buildValueParameterCopy(vp) {
163
252
// containingFunctionSymbol = newFunSymbol
@@ -185,7 +274,6 @@ class SuspendTransformFirTransformer(
185
274
).origin
186
275
}
187
276
188
-
189
277
funList.add(newFun.symbol)
190
278
}
191
279
}
0 commit comments