@@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1111import org.jetbrains.kotlin.fir.analysis.checkers.context.MutableCheckerContext
1212import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol
1313import org.jetbrains.kotlin.fir.analysis.checkers.processOverriddenFunctions
14- import org.jetbrains.kotlin.fir.builder.buildFunctionTypeParameter
1514import org.jetbrains.kotlin.fir.caches.FirCache
1615import org.jetbrains.kotlin.fir.caches.firCachesFactory
1716import org.jetbrains.kotlin.fir.caches.getValue
@@ -36,14 +35,14 @@ import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
3635import org.jetbrains.kotlin.fir.resolve.getSuperTypes
3736import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
3837import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
38+ import org.jetbrains.kotlin.fir.scopes.impl.toConeType
3939import org.jetbrains.kotlin.fir.scopes.processAllFunctions
4040import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
4141import org.jetbrains.kotlin.fir.symbols.SymbolInternals
4242import org.jetbrains.kotlin.fir.symbols.impl.*
4343import org.jetbrains.kotlin.fir.types.*
4444import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
4545import org.jetbrains.kotlin.fir.types.builder.buildResolvedTypeRef
46- import org.jetbrains.kotlin.ir.builders.declarations.buildTypeParameter
4746import org.jetbrains.kotlin.name.CallableId
4847import org.jetbrains.kotlin.name.ClassId
4948import org.jetbrains.kotlin.name.FqName
@@ -150,14 +149,104 @@ class SuspendTransformFirTransformer(
150149 // In the generated IR, data and dataBlocking will share an `A`, generating the error.
151150 // The error: Duplicate IR node
152151 // [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 >()
154154 typeParameters.replaceAll {
155155 buildTypeParameterCopy(it) {
156156 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+
158162 }
159163 }
160164
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+
161250 // valueParameters.replaceAll { vp ->
162251 // buildValueParameterCopy(vp) {
163252 // containingFunctionSymbol = newFunSymbol
@@ -185,7 +274,6 @@ class SuspendTransformFirTransformer(
185274 ).origin
186275 }
187276
188-
189277 funList.add(newFun.symbol)
190278 }
191279 }
0 commit comments