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:
committed by
teamcityserver
parent
a51c65ed60
commit
708fead1cc
+7
-6
@@ -49,12 +49,13 @@ abstract class DeserializedPackageFragmentImpl(
|
||||
_proto = null
|
||||
_memberScope = DeserializedPackageMemberScope(
|
||||
this, proto.`package`, nameResolver, metadataVersion, containerSource, components,
|
||||
classNames = {
|
||||
classDataFinder.allClassIds.filter { classId ->
|
||||
!classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST
|
||||
}.map { it.shortClassName }
|
||||
}
|
||||
)
|
||||
"scope of $this"
|
||||
) {
|
||||
classDataFinder.allClassIds.filter { classId ->
|
||||
!classId.isNestedClass && classId !in ClassDeserializer.BLACK_LIST
|
||||
}.map { it.shortClassName }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun getMemberScope(): MemberScope = _memberScope
|
||||
|
||||
+16
-6
@@ -110,10 +110,18 @@ class MetadataPackageFragment(
|
||||
val stream = finder.findMetadata(ClassId(fqName, Name.identifier(partName))) ?: continue
|
||||
val (proto, nameResolver, version) = readProto(stream)
|
||||
|
||||
scopes.add(DeserializedPackageMemberScope(
|
||||
this, proto.`package`, nameResolver, version, containerSource = null, components = components,
|
||||
classNames = { emptyList() }
|
||||
))
|
||||
scopes.add(
|
||||
DeserializedPackageMemberScope(
|
||||
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
|
||||
@@ -121,7 +129,9 @@ class MetadataPackageFragment(
|
||||
this, ProtoBuf.Package.getDefaultInstance(),
|
||||
NameResolverImpl(ProtoBuf.StringTable.getDefaultInstance(), ProtoBuf.QualifiedNameTable.getDefaultInstance()),
|
||||
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 definitelyDoesNotContainName(name: Name) = false
|
||||
@@ -129,7 +139,7 @@ class MetadataPackageFragment(
|
||||
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()
|
||||
|
||||
+3
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
||||
import org.jetbrains.kotlin.metadata.ProtoBuf
|
||||
import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.module
|
||||
import org.jetbrains.kotlin.serialization.deserialization.DeserializedPackageFragmentImpl
|
||||
import org.jetbrains.kotlin.storage.StorageManager
|
||||
import java.io.InputStream
|
||||
@@ -52,4 +53,6 @@ class BuiltInsPackageFragmentImpl private constructor(
|
||||
return BuiltInsPackageFragmentImpl(fqName, storageManager, module, proto, version, isFallback)
|
||||
}
|
||||
}
|
||||
|
||||
override fun toString(): String = "builtins package fragment for $fqName from $module"
|
||||
}
|
||||
|
||||
+4
-1
@@ -39,7 +39,8 @@ open class DeserializedPackageMemberScope(
|
||||
metadataVersion: BinaryVersion,
|
||||
containerSource: DeserializedContainerSource?,
|
||||
components: DeserializationComponents,
|
||||
classNames: () -> Collection<Name>
|
||||
private val debugName: String,
|
||||
classNames: () -> Collection<Name>,
|
||||
) : DeserializedMemberScope(
|
||||
components.createContext(
|
||||
packageDescriptor, nameResolver, TypeTable(proto.typeTable),
|
||||
@@ -74,4 +75,6 @@ open class DeserializedPackageMemberScope(
|
||||
override fun addEnumEntryDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) {
|
||||
// Do nothing
|
||||
}
|
||||
|
||||
override fun toString(): String = debugName
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user