Add debug strings to frontend scopes-related structures

Such as:
- PackageFragmentProviders, and, in particular,
CompositePackageFragmentProviders
- JavaPackageFragments
- Scopes produced by those providers

The rationale is that a lot of frontend-facing bugs (like red code) are
easily recognizeable in resolution. But at that point you just see a
bunch of scopes, without meaningful toStrings, you don't know who has
produced them, and what's exactly wrong.

With this commit it should make debugging slightly easier: now at least
you'll be able to see that "this scope is a scope of package fragment
for foo.bar of module baz" and decide whether the declaration should or
should not have been resolved from such scope.
This commit is contained in:
Dmitry Savvinov
2021-05-21 11:35:26 +03:00
committed by teamcityserver
parent a51c65ed60
commit 708fead1cc
32 changed files with 137 additions and 48 deletions
@@ -209,7 +209,8 @@ object TopDownAnalyzerFacadeForJVM {
moduleClassResolver.compiledCodeResolver.packageFragmentProvider, moduleClassResolver.compiledCodeResolver.packageFragmentProvider,
dependenciesContainer.get<JvmBuiltInsPackageFragmentProvider>(), dependenciesContainer.get<JvmBuiltInsPackageFragmentProvider>(),
dependenciesContainer.get<OptionalAnnotationPackageFragmentProvider>() dependenciesContainer.get<OptionalAnnotationPackageFragmentProvider>()
) ),
"CompositeProvider@TopDownAnalyzerForJvm for dependencies ${dependenciesContext.module}"
) )
) )
dependenciesContext.module dependenciesContext.module
@@ -283,7 +284,8 @@ object TopDownAnalyzerFacadeForJVM {
listOf( listOf(
container.get<KotlinCodeAnalyzer>().packageFragmentProvider, container.get<KotlinCodeAnalyzer>().packageFragmentProvider,
container.get<OptionalAnnotationPackageFragmentProvider>() container.get<OptionalAnnotationPackageFragmentProvider>()
) + additionalProviders ) + additionalProviders,
"CompositeProvider@TopDownAnalzyerForJvm for $module"
) )
) )
@@ -104,8 +104,9 @@ class IncrementalPackageFragmentProvider(
JvmPackagePartSource( JvmPackagePartSource(
partName, facadeName, packageProto, nameResolver, knownJvmBinaryClass = jvmBinaryClass partName, facadeName, packageProto, nameResolver, knownJvmBinaryClass = jvmBinaryClass
), ),
deserializationComponents, classNames = { emptyList() } deserializationComponents,
) "scope for IncrementalMultifileClassPackageFragment for facadeName=$facadeName, packageFqName=$packageFqName, part $partName",
) { emptyList() }
} }
} }
) )
@@ -133,6 +133,9 @@ class JvmResolverForModuleFactory(
) )
} }
return ResolverForModule(CompositePackageFragmentProvider(providersForModule), container) return ResolverForModule(
CompositePackageFragmentProvider(providersForModule, "CompositeProvider@JvmResolver for $moduleDescriptor"),
container
)
} }
} }
@@ -269,6 +269,10 @@ private class DelegatingPackageFragmentProvider<M : ModuleInfo>(
return !packageOracle.packageExists(fqName) && fqName !in syntheticFilePackages return !packageOracle.packageExists(fqName) && fqName !in syntheticFilePackages
} }
override fun toString(): String {
return "DelegatingProvider for $module in ${resolverForProject.name}"
}
} }
private object DiagnoseUnknownModuleInfoReporter { private object DiagnoseUnknownModuleInfoReporter {
@@ -112,7 +112,10 @@ class CommonResolverForModuleFactory(
container.get<MetadataPackageFragmentProvider>() container.get<MetadataPackageFragmentProvider>()
) )
return ResolverForModule(CompositePackageFragmentProvider(packageFragmentProviders), container) return ResolverForModule(
CompositePackageFragmentProvider(packageFragmentProviders, "CompositeProvider@CommonResolver for $moduleDescriptor"),
container
)
} }
companion object { companion object {
@@ -225,7 +225,8 @@ class ClassicFrontendFacade(
listOf( listOf(
container.get<KotlinCodeAnalyzer>().packageFragmentProvider, container.get<KotlinCodeAnalyzer>().packageFragmentProvider,
container.get<JavaDescriptorResolver>().packageFragmentProvider container.get<JavaDescriptorResolver>().packageFragmentProvider
) ),
"CompositeProvider@ClassicFrontendFacade for $moduleDescriptor"
) )
) )
@@ -437,7 +437,8 @@ abstract class AbstractDiagnosticsTest : BaseDiagnosticsTest() {
listOf( listOf(
container.get<KotlinCodeAnalyzer>().packageFragmentProvider, container.get<KotlinCodeAnalyzer>().packageFragmentProvider,
container.get<JavaDescriptorResolver>().packageFragmentProvider container.get<JavaDescriptorResolver>().packageFragmentProvider
) ),
"CompositeProvider@AbstractDiagnosticsTest for $moduleDescriptor"
) )
) )
@@ -94,10 +94,9 @@ abstract class KlibMetadataPackageFragment(
nameResolver, nameResolver,
KlibMetadataVersion.INSTANCE, KlibMetadataVersion.INSTANCE,
/* containerSource = */ null, /* containerSource = */ null,
components components,
) { "scope for $this"
loadClassNames() ) { loadClassNames() }
}
} }
override fun getMemberScope(): DeserializedPackageMemberScope = _memberScope override fun getMemberScope(): DeserializedPackageMemberScope = _memberScope
@@ -183,7 +183,10 @@ class KlibMetadataModuleDescriptorFactoryImpl(
} }
return compositePackageFragmentAddend?.let { return compositePackageFragmentAddend?.let {
CompositePackageFragmentProvider(listOf(it, provider)) CompositePackageFragmentProvider(
listOf(it, provider),
"CompositeProvider@KlibMetadataModuleDescriptorFactory for $moduleDescriptor"
)
} ?: provider } ?: provider
} }
@@ -52,4 +52,6 @@ class LazyJavaPackageFragmentProvider(
override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) = override fun getSubPackagesOf(fqName: FqName, nameFilter: (Name) -> Boolean) =
getPackageFragment(fqName)?.getSubPackageFqNames().orEmpty() getPackageFragment(fqName)?.getSubPackageFqNames().orEmpty()
override fun toString(): String = "LazyJavaPackageFragmentProvider of module ${c.components.module}"
} }
@@ -103,4 +103,6 @@ class JvmPackageScope(
override fun recordLookup(name: Name, location: LookupLocation) { override fun recordLookup(name: Name, location: LookupLocation) {
c.components.lookupTracker.record(location, packageFragment, name) c.components.lookupTracker.record(location, packageFragment, name)
} }
override fun toString(): String = "scope for $packageFragment"
} }
@@ -35,7 +35,7 @@ import org.jetbrains.kotlin.storage.getValue
class LazyJavaPackageFragment( class LazyJavaPackageFragment(
outerContext: LazyJavaResolverContext, outerContext: LazyJavaResolverContext,
private val jPackage: JavaPackage private val jPackage: JavaPackage,
) : PackageFragmentDescriptorImpl(outerContext.module, jPackage.fqName) { ) : PackageFragmentDescriptorImpl(outerContext.module, jPackage.fqName) {
private val c = outerContext.childForClassOrPackage(this) private val c = outerContext.childForClassOrPackage(this)
@@ -86,7 +86,7 @@ class LazyJavaPackageFragment(
override fun getMemberScope() = scope override fun getMemberScope() = scope
override fun toString() = "Lazy Java package fragment: $fqName" override fun toString() = "Lazy Java package fragment: $fqName of module ${c.components.module}"
override fun getSource(): SourceElement = KotlinJvmBinaryPackageSourceElement(this) override fun getSource(): SourceElement = KotlinJvmBinaryPackageSourceElement(this)
} }
@@ -70,7 +70,8 @@ class DeserializedDescriptorResolver {
kotlinClass.abiStability kotlinClass.abiStability
) )
return DeserializedPackageMemberScope( return DeserializedPackageMemberScope(
descriptor, packageProto, nameResolver, kotlinClass.classHeader.metadataVersion, source, components descriptor, packageProto, nameResolver, kotlinClass.classHeader.metadataVersion, source, components,
"scope for $source in $descriptor"
) { ) {
// All classes are included into Java scope // All classes are included into Java scope
emptyList() emptyList()
@@ -92,7 +92,12 @@ class RuntimeModuleData private constructor(
) )
module.setDependencies(module) module.setDependencies(module)
module.initialize(CompositePackageFragmentProvider(listOf(javaDescriptorResolver.packageFragmentProvider, builtinsProvider))) module.initialize(
CompositePackageFragmentProvider(
listOf(javaDescriptorResolver.packageFragmentProvider, builtinsProvider),
"CompositeProvider@RuntimeModuleData for $module"
)
)
return RuntimeModuleData( return RuntimeModuleData(
deserializationComponentsForJava.components, deserializationComponentsForJava.components,
@@ -22,7 +22,8 @@ import java.util.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class CompositePackageFragmentProvider(// can be modified from outside class CompositePackageFragmentProvider(// can be modified from outside
private val providers: List<PackageFragmentProvider> private val providers: List<PackageFragmentProvider>,
private val debugName: String
) : PackageFragmentProviderOptimized { ) : PackageFragmentProviderOptimized {
init { init {
@@ -55,4 +56,6 @@ class CompositePackageFragmentProvider(// can be modified from outside
} }
return result return result
} }
override fun toString(): String = debugName
} }
@@ -101,9 +101,12 @@ class ModuleDescriptorImpl @JvmOverloads constructor(
"Dependency module ${dependency.id} was not initialized by the time contents of dependent module ${this.id} were queried" "Dependency module ${dependency.id} was not initialized by the time contents of dependent module ${this.id} were queried"
} }
} }
CompositePackageFragmentProvider(dependenciesDescriptors.map { CompositePackageFragmentProvider(
it.packageFragmentProviderForModuleContent!! dependenciesDescriptors.map {
}) it.packageFragmentProviderForModuleContent!!
},
"CompositeProvider@ModuleDescriptor for $name"
)
} }
private val isInitialized: Boolean private val isInitialized: Boolean
@@ -22,12 +22,16 @@ import org.jetbrains.kotlin.descriptors.PackageFragmentDescriptor
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.descriptorUtil.module
abstract class PackageFragmentDescriptorImpl( abstract class PackageFragmentDescriptorImpl(
module: ModuleDescriptor, module: ModuleDescriptor,
final override val fqName: FqName final override val fqName: FqName
) : DeclarationDescriptorNonRootImpl(module, Annotations.EMPTY, fqName.shortNameOrSpecial(), SourceElement.NO_SOURCE), ) : DeclarationDescriptorNonRootImpl(module, Annotations.EMPTY, fqName.shortNameOrSpecial(), SourceElement.NO_SOURCE),
PackageFragmentDescriptor { PackageFragmentDescriptor {
// Not inlined in order to not capture ref on 'module'
private val debugString: String = "package $fqName of $module"
override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: DeclarationDescriptorVisitor<R, D>, data: D): R =
visitor.visitPackageFragmentDescriptor(this, data) visitor.visitPackageFragmentDescriptor(this, data)
@@ -39,5 +43,5 @@ abstract class PackageFragmentDescriptorImpl(
return SourceElement.NO_SOURCE return SourceElement.NO_SOURCE
} }
override fun toString(): String = "package $fqName" override fun toString(): String = debugString
} }
@@ -66,4 +66,6 @@ open class SubpackagesScope(private val moduleDescriptor: ModuleDescriptor, priv
p.popIndent() p.popIndent()
p.println("}") p.println("}")
} }
override fun toString(): String = "subpackages of $fqName from $moduleDescriptor"
} }
@@ -49,12 +49,13 @@ abstract class DeserializedPackageFragmentImpl(
_proto = null _proto = null
_memberScope = DeserializedPackageMemberScope( _memberScope = DeserializedPackageMemberScope(
this, proto.`package`, nameResolver, metadataVersion, containerSource, components, this, proto.`package`, nameResolver, metadataVersion, containerSource, components,
classNames = { "scope of $this"
classDataFinder.allClassIds.filter { classId -> ) {
!classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST classDataFinder.allClassIds.filter { classId ->
}.map { it.shortClassName } !classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST
} }.map { it.shortClassName }
) }
} }
override fun getMemberScope(): MemberScope = _memberScope override fun getMemberScope(): MemberScope = _memberScope
@@ -110,10 +110,18 @@ class MetadataPackageFragment(
val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue
val (proto, nameResolver, version) = readProto(stream) val (proto, nameResolver, version) = readProto(stream)
scopes.add(DeserializedPackageMemberScope( scopes.add(
this, proto.`package`, nameResolver, version, containerSource = null, components = components, DeserializedPackageMemberScope(
classNames = { emptyList() } this,
)) proto.`package`,
nameResolver,
version,
containerSource = null,
components = components,
debugName = "scope with top-level callables and type aliases (no classes) for package part $partName of $this",
classNames = { emptyList() },
)
)
} }
// Also add the deserialized scope that can load all classes from this package // Also add the deserialized scope that can load all classes from this package
@@ -121,7 +129,9 @@ class MetadataPackageFragment(
this, ProtoBuf.Package.getDefaultInstance(), this, ProtoBuf.Package.getDefaultInstance(),
NameResolverImpl(ProtoBuf.StringTable.getDefaultInstance(), ProtoBuf.QualifiedNameTable.getDefaultInstance()), NameResolverImpl(ProtoBuf.StringTable.getDefaultInstance(), ProtoBuf.QualifiedNameTable.getDefaultInstance()),
BuiltInsBinaryVersion.INSTANCE, // Exact version does not matter here BuiltInsBinaryVersion.INSTANCE, // Exact version does not matter here
containerSource = null, components = components, classNames = { emptyList() } containerSource = null, components = components,
debugName = "scope for all classes of $this",
classNames = { emptyList() },
) { ) {
override fun hasClass(name: Name): Boolean = hasTopLevelClass(name) override fun hasClass(name: Name): Boolean = hasTopLevelClass(name)
override fun definitelyDoesNotContainName(name: Name) = false override fun definitelyDoesNotContainName(name: Name) = false
@@ -129,7 +139,7 @@ class MetadataPackageFragment(
override fun getNonDeclaredClassifierNames(): Set<Name>? = null override fun getNonDeclaredClassifierNames(): Set<Name>? = null
}) })
return ChainedMemberScope.create("Metadata scope", scopes) return ChainedMemberScope.create(".kotlin_metadata parts scope of $this", scopes)
} }
override fun getMemberScope() = memberScope() override fun getMemberScope() = memberScope()
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.ProtoBuf
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl
import org.jetbrains.kotlin.storage.StorageManager import org.jetbrains.kotlin.storage.StorageManager
import java.io.InputStream import java.io.InputStream
@@ -52,4 +53,6 @@ class BuiltInsPackageFragmentImpl private constructor(
return BuiltInsPackageFragmentImpl(fqName, storageManager, module, proto, version, isFallback) return BuiltInsPackageFragmentImpl(fqName, storageManager, module, proto, version, isFallback)
} }
} }
override fun toString(): String = "builtins package fragment for $fqName from $module"
} }
@@ -39,7 +39,8 @@ open class DeserializedPackageMemberScope(
metadataVersion: BinaryVersion, metadataVersion: BinaryVersion,
containerSource: DeserializedContainerSource?, containerSource: DeserializedContainerSource?,
components: DeserializationComponents, components: DeserializationComponents,
classNames: () -> Collection<Name> private val debugName: String,
classNames: () -> Collection<Name>,
) : DeserializedMemberScope( ) : DeserializedMemberScope(
components.createContext( components.createContext(
packageDescriptor, nameResolver, TypeTable(proto.typeTable), packageDescriptor, nameResolver, TypeTable(proto.typeTable),
@@ -74,4 +75,6 @@ open class DeserializedPackageMemberScope(
override fun addEnumEntryDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) { override fun addEnumEntryDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) {
// Do nothing // Do nothing
} }
override fun toString(): String = debugName
} }
@@ -112,7 +112,13 @@ class CompositeResolverForModuleFactory(
yieldAll(getNativeProvidersIfAny(moduleInfo, container)) yieldAll(getNativeProvidersIfAny(moduleInfo, container))
}.toList() }.toList()
return ResolverForModule(CompositePackageFragmentProvider(packageFragmentProviders), container) return ResolverForModule(
CompositePackageFragmentProvider(
packageFragmentProviders,
"CompositeProvider@CompositeResolver for $moduleDescriptor"
),
container
)
} }
private fun getCommonProvidersIfAny( private fun getCommonProvidersIfAny(
@@ -66,7 +66,10 @@ class JsResolverForModuleFactory(
val libraryProviders = createPackageFragmentProvider(moduleInfo, container, moduleContext, moduleDescriptor) val libraryProviders = createPackageFragmentProvider(moduleInfo, container, moduleContext, moduleDescriptor)
if (libraryProviders.isNotEmpty()) { if (libraryProviders.isNotEmpty()) {
packageFragmentProvider = CompositePackageFragmentProvider(listOf(packageFragmentProvider) + libraryProviders) packageFragmentProvider = CompositePackageFragmentProvider(
listOf(packageFragmentProvider) + libraryProviders,
"CompositeProvider@JsResolver for $moduleDescriptor"
)
} }
return ResolverForModule(packageFragmentProvider, container) return ResolverForModule(packageFragmentProvider, container)
@@ -403,7 +403,12 @@ internal object IDELightClassContexts {
val resolveSession = container.get<ResolveSession>() val resolveSession = container.get<ResolveSession>()
moduleDescriptor.initialize(CompositePackageFragmentProvider(listOf(resolveSession.packageFragmentProvider))) moduleDescriptor.initialize(
CompositePackageFragmentProvider(
listOf(resolveSession.packageFragmentProvider),
"CompositeProvider@IDELightClassContexts for $moduleDescriptor"
)
)
return resolveSession return resolveSession
} }
@@ -85,10 +85,12 @@ class DeserializerForClassfileDecompiler(
return emptyList() return emptyList()
} }
val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(annotationData, strings) val (nameResolver, packageProto) = JvmProtoBufUtil.readPackageDataFrom(annotationData, strings)
val dummyPackageFragment = createDummyPackageFragment(header.packageName?.let(::FqName) ?: facadeFqName.parent())
val membersScope = DeserializedPackageMemberScope( val membersScope = DeserializedPackageMemberScope(
createDummyPackageFragment(header.packageName?.let(::FqName) ?: facadeFqName.parent()), dummyPackageFragment,
packageProto, nameResolver, header.metadataVersion, packageProto, nameResolver, header.metadataVersion,
JvmPackagePartSource(binaryClassForPackageClass, packageProto, nameResolver), deserializationComponents JvmPackagePartSource(binaryClassForPackageClass, packageProto, nameResolver), deserializationComponents,
"scope of dummyPackageFragment ${dummyPackageFragment.fqName} in module $moduleDescriptor @DeserializerForClassfileDecompiler"
) { emptyList() } ) { emptyList() }
return membersScope.getContributedDescriptors().toList() return membersScope.getContributedDescriptors().toList()
} }
@@ -55,9 +55,12 @@ class KotlinMetadataDeserializerForDecompiler(
"Was called for $facadeFqName; only members of $directoryPackageFqName package are expected." "Was called for $facadeFqName; only members of $directoryPackageFqName package are expected."
} }
val dummyPackageFragment = createDummyPackageFragment(facadeFqName)
val membersScope = DeserializedPackageMemberScope( val membersScope = DeserializedPackageMemberScope(
createDummyPackageFragment(facadeFqName), proto.`package`, nameResolver, metadataVersion, containerSource = null, dummyPackageFragment, proto.`package`, nameResolver, metadataVersion, containerSource = null,
components = deserializationComponents components = deserializationComponents,
debugName = "scope of dummyPackageFragment ${dummyPackageFragment.fqName} in module " +
"${deserializationComponents.moduleDescriptor} @KotlinMetadataDeserializerForDecompiler"
) { emptyList() } ) { emptyList() }
return membersScope.getContributedDescriptors().toList() return membersScope.getContributedDescriptors().toList()
@@ -60,8 +60,11 @@ class KlibMetadataDeserializerForDecompiler(
nameResolver, nameResolver,
KlibMetadataVersion.INSTANCE, KlibMetadataVersion.INSTANCE,
containerSource = null, containerSource = null,
components = deserializationComponents components = deserializationComponents,
) { emptyList() } classNames = { emptyList() },
debugName = "scope of dummyPackageFragment $facadeFqName in ${deserializationComponents.moduleDescriptor} " +
"@KlibMetadataDeserializerForDecompiler"
)
return membersScope.getContributedDescriptors().toList() return membersScope.getContributedDescriptors().toList()
} }
@@ -136,7 +136,8 @@ class NativePlatformKindResolution : IdePlatformKindResolution {
functionInterfacePackageFragmentProvider(storageManager, builtInsModule), functionInterfacePackageFragmentProvider(storageManager, builtInsModule),
(metadataFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl) (metadataFactories.DefaultDeserializedDescriptorFactory as KlibMetadataModuleDescriptorFactoryImpl)
.createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule) .createForwardDeclarationHackPackagePartProvider(storageManager, builtInsModule)
) ),
"CompositeProvider@NativeBuiltins for $builtInsModule"
) )
) )
@@ -66,7 +66,10 @@ class NativeResolverForModuleFactory(
) )
if (klibPackageFragmentProvider != null) { if (klibPackageFragmentProvider != null) {
packageFragmentProvider = CompositePackageFragmentProvider(listOf(packageFragmentProvider, klibPackageFragmentProvider)) packageFragmentProvider = CompositePackageFragmentProvider(
listOf(packageFragmentProvider, klibPackageFragmentProvider),
"CompositeProvider@NativeResolver for $moduleDescriptor"
)
} }
return ResolverForModule(packageFragmentProvider, container) return ResolverForModule(packageFragmentProvider, container)
@@ -66,7 +66,9 @@ fun createContainerForJS(
val packagePartProviders = mutableListOf(get<KotlinCodeAnalyzer>().packageFragmentProvider) val packagePartProviders = mutableListOf(get<KotlinCodeAnalyzer>().packageFragmentProvider)
val moduleDescriptor = get<ModuleDescriptorImpl>() val moduleDescriptor = get<ModuleDescriptorImpl>()
packagePartProviders += additionalPackages packagePartProviders += additionalPackages
moduleDescriptor.initialize(CompositePackageFragmentProvider(packagePartProviders)) moduleDescriptor.initialize(
CompositePackageFragmentProvider(packagePartProviders, "CompositeProvider@createContainerForJS for $moduleDescriptor")
)
} }
return storageComponentContainer return storageComponentContainer
} }
@@ -43,6 +43,11 @@ fun createTopDownAnalyzerProviderForKonan(
val packagePartProviders = mutableListOf(get<KotlinCodeAnalyzer>().packageFragmentProvider) val packagePartProviders = mutableListOf(get<KotlinCodeAnalyzer>().packageFragmentProvider)
val moduleDescriptor = get<ModuleDescriptorImpl>() val moduleDescriptor = get<ModuleDescriptorImpl>()
packagePartProviders += additionalPackages packagePartProviders += additionalPackages
moduleDescriptor.initialize(CompositePackageFragmentProvider(packagePartProviders)) moduleDescriptor.initialize(
CompositePackageFragmentProvider(
packagePartProviders,
"CompositeProvider@createTopDownAnalyzerProviderForKonan for module ${moduleContext.module}"
)
)
} }
} }