@@ -18,14 +18,19 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
1818import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
1919import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirClassChecker
2020import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirFunctionCallChecker
21+ import org.jetbrains.kotlin.fir.analysis.checkers.extractArgumentsTypeRefAndSource
22+ import org.jetbrains.kotlin.fir.analysis.checkers.toClassLikeSymbol
2123import org.jetbrains.kotlin.fir.declarations.FirClass
2224import org.jetbrains.kotlin.fir.declarations.FirProperty
2325import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
2426import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
2527import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
2628import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
2729import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
30+ import org.jetbrains.kotlin.fir.scopes.impl.toConeType
31+ import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
2832import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
33+ import org.jetbrains.kotlin.fir.types.FirTypeRef
2934import org.jetbrains.kotlin.fir.types.coneType
3035import org.jetbrains.kotlin.utils.memoryOptimizedMap
3136import org.jetbrains.kotlin.utils.memoryOptimizedPlus
@@ -101,16 +106,14 @@ class FirRpcStrictModeClassChecker(private val ctx: FirCheckersContext) : FirCla
101106
102107 val types = function.valueParameters.memoryOptimizedMap { parameter ->
103108 parameter.source to vsApi {
104- parameter.returnTypeRef.coneType.toClassSymbolVS(context.session)
109+ parameter.returnTypeRef
105110 }
106- } memoryOptimizedPlus (function.returnTypeRef.source to returnClassSymbol )
111+ } memoryOptimizedPlus (function.returnTypeRef.source to function.returnTypeRef )
107112
108- types.filter { (_, symbol) ->
109- symbol != null
110- }.forEach { (source, symbol) ->
111- checkSerializableTypes<FirClassSymbol <* >>(
113+ types.forEach { (source, symbol) ->
114+ checkSerializableTypes<FirClassLikeSymbol <* >>(
112115 context = context,
113- clazz = symbol!! ,
116+ typeRef = symbol,
114117 serializablePropertiesProvider = serializablePropertiesProvider,
115118 ) { symbol, parents ->
116119 when (symbol.classId) {
@@ -142,28 +145,54 @@ class FirRpcStrictModeClassChecker(private val ctx: FirCheckersContext) : FirCla
142145
143146 private fun <ContextElement > checkSerializableTypes (
144147 context : CheckerContext ,
145- clazz : FirClassSymbol < * > ,
148+ typeRef : FirTypeRef ,
146149 serializablePropertiesProvider : FirSerializablePropertiesProvider ,
147150 parentContext : List <ContextElement > = emptyList(),
148- checker : (FirClassSymbol <* >, List <ContextElement >) -> ContextElement ? ,
151+ checker : (FirClassLikeSymbol <* >, List <ContextElement >) -> ContextElement ? ,
149152 ) {
150- val newElement = checker(clazz, parentContext)
153+ val symbol = typeRef.toClassLikeSymbol(context.session) ? : return
154+ val newElement = checker(symbol, parentContext)
151155 val nextContext = if (newElement != null ) {
152156 parentContext memoryOptimizedPlus newElement
153157 } else {
154158 parentContext
155159 }
156160
157- serializablePropertiesProvider.getSerializablePropertiesForClass(clazz)
161+ if (symbol !is FirClassSymbol <* >) {
162+ return
163+ }
164+
165+ val extracted = extractArgumentsTypeRefAndSource(typeRef)
166+ .orEmpty()
167+ .withIndex()
168+ .associate { (i, refSource) ->
169+ symbol.typeParameterSymbols[i].toConeType() to refSource.typeRef
170+ }
171+
172+ val flowProps: List <FirTypeRef > = if (symbol.classId == RpcClassId .flow) {
173+ listOf<FirTypeRef >(extracted.values.toList()[0 ]!! )
174+ } else {
175+ emptyList()
176+ }
177+
178+ serializablePropertiesProvider.getSerializablePropertiesForClass(symbol)
158179 .serializableProperties
159180 .mapNotNull { property ->
160- vsApi {
161- property.propertySymbol.resolvedReturnType.toClassSymbolVS(context.session)
181+ val resolvedTypeRef = property.propertySymbol.resolvedReturnTypeRef
182+ val result = if (resolvedTypeRef.toClassLikeSymbol(context.session) != null ) {
183+ resolvedTypeRef
184+ } else {
185+ extracted[property.propertySymbol.resolvedReturnType]
186+ }
187+ if (result == null ) {
188+ print (1 )
162189 }
163- }.forEach { symbol ->
190+ result
191+ }.memoryOptimizedPlus(flowProps)
192+ .forEach { symbol ->
164193 checkSerializableTypes(
165194 context = context,
166- clazz = symbol,
195+ typeRef = symbol,
167196 serializablePropertiesProvider = serializablePropertiesProvider,
168197 parentContext = nextContext,
169198 checker = checker,
0 commit comments