@@ -18,14 +18,19 @@ import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind
18
18
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
19
19
import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirClassChecker
20
20
import 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
21
23
import org.jetbrains.kotlin.fir.declarations.FirClass
22
24
import org.jetbrains.kotlin.fir.declarations.FirProperty
23
25
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
24
26
import org.jetbrains.kotlin.fir.declarations.utils.isSuspend
25
27
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
26
28
import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider
27
29
import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol
30
+ import org.jetbrains.kotlin.fir.scopes.impl.toConeType
31
+ import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
28
32
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
33
+ import org.jetbrains.kotlin.fir.types.FirTypeRef
29
34
import org.jetbrains.kotlin.fir.types.coneType
30
35
import org.jetbrains.kotlin.utils.memoryOptimizedMap
31
36
import org.jetbrains.kotlin.utils.memoryOptimizedPlus
@@ -101,16 +106,14 @@ class FirRpcStrictModeClassChecker(private val ctx: FirCheckersContext) : FirCla
101
106
102
107
val types = function.valueParameters.memoryOptimizedMap { parameter ->
103
108
parameter.source to vsApi {
104
- parameter.returnTypeRef.coneType.toClassSymbolVS(context.session)
109
+ parameter.returnTypeRef
105
110
}
106
- } memoryOptimizedPlus (function.returnTypeRef.source to returnClassSymbol )
111
+ } memoryOptimizedPlus (function.returnTypeRef.source to function.returnTypeRef )
107
112
108
- types.filter { (_, symbol) ->
109
- symbol != null
110
- }.forEach { (source, symbol) ->
111
- checkSerializableTypes<FirClassSymbol <* >>(
113
+ types.forEach { (source, symbol) ->
114
+ checkSerializableTypes<FirClassLikeSymbol <* >>(
112
115
context = context,
113
- clazz = symbol!! ,
116
+ typeRef = symbol,
114
117
serializablePropertiesProvider = serializablePropertiesProvider,
115
118
) { symbol, parents ->
116
119
when (symbol.classId) {
@@ -142,28 +145,54 @@ class FirRpcStrictModeClassChecker(private val ctx: FirCheckersContext) : FirCla
142
145
143
146
private fun <ContextElement > checkSerializableTypes (
144
147
context : CheckerContext ,
145
- clazz : FirClassSymbol < * > ,
148
+ typeRef : FirTypeRef ,
146
149
serializablePropertiesProvider : FirSerializablePropertiesProvider ,
147
150
parentContext : List <ContextElement > = emptyList(),
148
- checker : (FirClassSymbol <* >, List <ContextElement >) -> ContextElement ? ,
151
+ checker : (FirClassLikeSymbol <* >, List <ContextElement >) -> ContextElement ? ,
149
152
) {
150
- val newElement = checker(clazz, parentContext)
153
+ val symbol = typeRef.toClassLikeSymbol(context.session) ? : return
154
+ val newElement = checker(symbol, parentContext)
151
155
val nextContext = if (newElement != null ) {
152
156
parentContext memoryOptimizedPlus newElement
153
157
} else {
154
158
parentContext
155
159
}
156
160
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)
158
179
.serializableProperties
159
180
.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 )
162
189
}
163
- }.forEach { symbol ->
190
+ result
191
+ }.memoryOptimizedPlus(flowProps)
192
+ .forEach { symbol ->
164
193
checkSerializableTypes(
165
194
context = context,
166
- clazz = symbol,
195
+ typeRef = symbol,
167
196
serializablePropertiesProvider = serializablePropertiesProvider,
168
197
parentContext = nextContext,
169
198
checker = checker,
0 commit comments