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:
Alexander Udalov
2016-11-23 16:31:39 +03:00
parent bfb7b21472
commit 0dc31af73d
6 changed files with 28 additions and 1 deletions
@@ -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].
*/
@@ -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(