Introduce KotlinMetadataFinder#hasMetadataPackage
Before creating a MetadataPackageFragment, check that the corresponding directory (across the classpath) contains at least one .kotlin_metadata file. Otherwise we're creating packages for every simple name queried during the resolution and sometimes prefer a (empty) package to the existing class, for example when the latter class is star-imported
This commit is contained in:
+7
@@ -27,6 +27,13 @@ interface KotlinMetadataFinder {
|
||||
*/
|
||||
fun findMetadata(classId: ClassId): InputStream?
|
||||
|
||||
/**
|
||||
* @return `true` iff this finder is able to locate the package with the given [fqName], containing .kotlin_metadata files.
|
||||
* Note that returning `true` makes [MetadataPackageFragmentProvider] construct the package fragment for the package,
|
||||
* and that fact can alter the qualified name expression resolution in the compiler front-end
|
||||
*/
|
||||
fun hasMetadataPackage(fqName: FqName): Boolean
|
||||
|
||||
/**
|
||||
* @return an [InputStream] which should be used to load the .kotlin_builtins file for package with the given [packageFqName].
|
||||
*/
|
||||
|
||||
+3
-1
@@ -60,7 +60,9 @@ class MetadataPackageFragmentProvider(
|
||||
}
|
||||
|
||||
override fun findPackage(fqName: FqName): DeserializedPackageFragment? =
|
||||
MetadataPackageFragment(fqName, storageManager, moduleDescriptor, packagePartProvider, finder)
|
||||
if (finder.hasMetadataPackage(fqName))
|
||||
MetadataPackageFragment(fqName, storageManager, moduleDescriptor, packagePartProvider, finder)
|
||||
else null
|
||||
}
|
||||
|
||||
class MetadataPackageFragment(
|
||||
|
||||
Reference in New Issue
Block a user