@@ -12,18 +12,15 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.caches.getNotNullValueFor
12
12
import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.LLFirModuleData
13
13
import org.jetbrains.kotlin.analysis.low.level.api.fir.projectStructure.llFirModuleData
14
14
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirSession
15
- import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.DeserializedContainerSourceProvider
16
- import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.StubBasedAnnotationDeserializer
17
- import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.StubBasedFirDeserializationContext
18
- import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.StubBasedFirTypeDeserializer
19
- import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.deserializeClassToSymbol
20
- import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.loadStubByElement
15
+ import org.jetbrains.kotlin.analysis.low.level.api.fir.stubBased.deserialization.*
16
+ import org.jetbrains.kotlin.fir.FirSession
21
17
import org.jetbrains.kotlin.fir.caches.FirCache
22
18
import org.jetbrains.kotlin.fir.caches.firCachesFactory
23
19
import org.jetbrains.kotlin.fir.caches.getValue
24
20
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
25
21
import org.jetbrains.kotlin.fir.isNewPlaceForBodyGeneration
26
22
import org.jetbrains.kotlin.fir.java.deserialization.KotlinBuiltins
23
+ import org.jetbrains.kotlin.fir.moduleData
27
24
import org.jetbrains.kotlin.fir.realPsi
28
25
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolNamesProvider
29
26
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
@@ -36,7 +33,8 @@ import org.jetbrains.kotlin.psi.*
36
33
import org.jetbrains.kotlin.psi.psiUtil.getTopmostParentOfType
37
34
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
38
35
import org.jetbrains.kotlin.psi.stubs.KotlinClassStub
39
- import org.jetbrains.kotlin.psi.stubs.impl.*
36
+ import org.jetbrains.kotlin.psi.stubs.impl.KotlinFunctionStubImpl
37
+ import org.jetbrains.kotlin.psi.stubs.impl.KotlinPropertyStubImpl
40
38
import org.jetbrains.kotlin.serialization.deserialization.builtins.BuiltInSerializerProtocol
41
39
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
42
40
@@ -183,47 +181,31 @@ internal open class LLKotlinStubBasedLibrarySymbolProvider(
183
181
184
182
return ArrayList <FirNamedFunctionSymbol >(topLevelFunctions.size).apply {
185
183
for (function in topLevelFunctions) {
186
- val functionStub = function.stub as ? KotlinFunctionStubImpl ? : loadStubByElement(function)
187
- val functionFile = function.containingKtFile
188
- val functionOrigin = getDeclarationOriginFor(functionFile)
189
- val containerSource =
190
- deserializedContainerSourceProvider.getFacadeContainerSource(functionFile, functionStub?.origin, functionOrigin)
191
-
192
- if (! functionOrigin.isBuiltIns &&
193
- containerSource is FacadeClassSource &&
194
- containerSource.className.internalName in KotlinBuiltins
195
- ) {
196
- continue
197
- }
198
-
199
- val symbol = FirNamedFunctionSymbol (callableId)
200
- val rootContext = StubBasedFirDeserializationContext
201
- .createRootContext(session, moduleData, callableId, function, symbol, functionOrigin, containerSource)
202
-
203
- add(rootContext.memberDeserializer.loadFunction(function, null , session, symbol).symbol)
184
+ val symbol = loadFunction(
185
+ function = function,
186
+ callableId = callableId,
187
+ functionOrigin = getDeclarationOriginFor(function.containingKtFile),
188
+ deserializedContainerSourceProvider = deserializedContainerSourceProvider,
189
+ session = session,
190
+ ) ? : continue
191
+ add(symbol)
204
192
}
205
193
}
206
194
}
207
195
208
196
private fun loadPropertiesByCallableId (callableId : CallableId , foundProperties : Collection <KtProperty >? ): List <FirPropertySymbol > {
209
197
val topLevelProperties = foundProperties ? : declarationProvider.getTopLevelProperties(callableId)
210
198
211
- return buildList {
199
+ return ArrayList < FirPropertySymbol >(topLevelProperties.size). apply {
212
200
for (property in topLevelProperties) {
213
- val propertyStub = property.stub as ? KotlinPropertyStubImpl ? : loadStubByElement(property)
214
- val propertyFile = property.containingKtFile
215
- val propertyOrigin = getDeclarationOriginFor(propertyFile)
216
- val containerSource = deserializedContainerSourceProvider.getFacadeContainerSource(
217
- propertyFile,
218
- propertyStub?.origin,
219
- propertyOrigin,
220
- )
221
-
222
- val symbol = FirPropertySymbol (callableId)
223
- val rootContext = StubBasedFirDeserializationContext
224
- .createRootContext(session, moduleData, callableId, property, symbol, propertyOrigin, containerSource)
225
-
226
- add(rootContext.memberDeserializer.loadProperty(property, null , symbol).symbol)
201
+ val symbol = loadProperty(
202
+ property = property,
203
+ callableId = callableId,
204
+ propertyOrigin = getDeclarationOriginFor(property.containingKtFile),
205
+ deserializedContainerSourceProvider = deserializedContainerSourceProvider,
206
+ session = session,
207
+ ) ? : continue
208
+ add(symbol)
227
209
}
228
210
}
229
211
}
@@ -376,6 +358,83 @@ internal open class LLKotlinStubBasedLibrarySymbolProvider(
376
358
is KtProperty -> propertyCache.getValue(callableId)
377
359
else -> null
378
360
}
361
+
379
362
return callableSymbols?.singleOrNull { it.fir.realPsi == callableDeclaration }
380
363
}
364
+
365
+ companion object {
366
+ fun loadProperty (
367
+ property : KtProperty ,
368
+ callableId : CallableId ,
369
+ propertyOrigin : FirDeclarationOrigin ,
370
+ deserializedContainerSourceProvider : DeserializedContainerSourceProvider ,
371
+ session : FirSession ,
372
+ ): FirPropertySymbol ? {
373
+ val propertyStub = property.stub as ? KotlinPropertyStubImpl ? : loadStubByElement(property)
374
+ val propertyFile = property.containingKtFile
375
+ val containerSource = deserializedContainerSourceProvider.getFacadeContainerSource(
376
+ file = propertyFile,
377
+ stubOrigin = propertyStub?.origin,
378
+ declarationOrigin = propertyOrigin,
379
+ )
380
+
381
+ val symbol = FirPropertySymbol (callableId)
382
+ val rootContext = StubBasedFirDeserializationContext .createRootContext(
383
+ session = session,
384
+ moduleData = session.moduleData,
385
+ callableId = callableId,
386
+ parameterListOwner = property,
387
+ symbol = symbol,
388
+ initialOrigin = propertyOrigin,
389
+ containerSource = containerSource,
390
+ )
391
+
392
+ return rootContext.memberDeserializer.loadProperty(
393
+ property = property,
394
+ classSymbol = null ,
395
+ existingSymbol = symbol,
396
+ ).symbol
397
+ }
398
+
399
+ fun loadFunction (
400
+ function : KtNamedFunction ,
401
+ callableId : CallableId ,
402
+ functionOrigin : FirDeclarationOrigin ,
403
+ deserializedContainerSourceProvider : DeserializedContainerSourceProvider ,
404
+ session : FirSession ,
405
+ ): FirNamedFunctionSymbol ? {
406
+ val functionStub = function.stub as ? KotlinFunctionStubImpl ? : loadStubByElement(function)
407
+ val functionFile = function.containingKtFile
408
+ val containerSource = deserializedContainerSourceProvider.getFacadeContainerSource(
409
+ file = functionFile,
410
+ stubOrigin = functionStub?.origin,
411
+ declarationOrigin = functionOrigin,
412
+ )
413
+
414
+ if (! functionOrigin.isBuiltIns &&
415
+ containerSource is FacadeClassSource &&
416
+ containerSource.className.internalName in KotlinBuiltins
417
+ ) {
418
+ return null
419
+ }
420
+
421
+ val symbol = FirNamedFunctionSymbol (callableId)
422
+ val rootContext = StubBasedFirDeserializationContext .createRootContext(
423
+ session = session,
424
+ moduleData = session.moduleData,
425
+ callableId = callableId,
426
+ parameterListOwner = function,
427
+ symbol = symbol,
428
+ initialOrigin = functionOrigin,
429
+ containerSource = containerSource,
430
+ )
431
+
432
+ return rootContext.memberDeserializer.loadFunction(
433
+ function = function,
434
+ classSymbol = null ,
435
+ session = session,
436
+ existingSymbol = symbol,
437
+ ).symbol
438
+ }
439
+ }
381
440
}
0 commit comments