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:
@@ -42,6 +42,15 @@ class JvmCliVirtualFileFinder(
|
|||||||
return findBinaryClass(classId, classId.shortClassName.asString() + MetadataPackageFragment.METADATA_FILE_EXTENSION)?.inputStream
|
return findBinaryClass(classId, classId.shortClassName.asString() + MetadataPackageFragment.METADATA_FILE_EXTENSION)?.inputStream
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun hasMetadataPackage(fqName: FqName): Boolean {
|
||||||
|
var found = false
|
||||||
|
index.traverseDirectoriesInPackage(fqName, continueSearch = { dir, _ ->
|
||||||
|
found = found or dir.children.any { it.extension == MetadataPackageFragment.METADATA_FILE_EXTENSION.substring(1) }
|
||||||
|
!found
|
||||||
|
})
|
||||||
|
return found
|
||||||
|
}
|
||||||
|
|
||||||
override fun findBuiltInsData(packageFqName: FqName): InputStream? {
|
override fun findBuiltInsData(packageFqName: FqName): InputStream? {
|
||||||
// "<builtins-metadata>" is just a made-up name
|
// "<builtins-metadata>" is just a made-up name
|
||||||
// JvmDependenciesIndex requires the ClassId of the class which we're searching for, to cache the last request+result
|
// JvmDependenciesIndex requires the ClassId of the class which we're searching for, to cache the last request+result
|
||||||
|
|||||||
+3
@@ -39,6 +39,9 @@ class ReflectKotlinClassFinder(private val classLoader: ClassLoader) : KotlinCla
|
|||||||
// TODO
|
// TODO
|
||||||
override fun findMetadata(classId: ClassId): InputStream? = null
|
override fun findMetadata(classId: ClassId): InputStream? = null
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
override fun hasMetadataPackage(fqName: FqName): Boolean = false
|
||||||
|
|
||||||
// TODO: load built-ins from classLoader
|
// TODO: load built-ins from classLoader
|
||||||
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
|
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -27,6 +27,13 @@ interface KotlinMetadataFinder {
|
|||||||
*/
|
*/
|
||||||
fun findMetadata(classId: ClassId): InputStream?
|
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].
|
* @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? =
|
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(
|
class MetadataPackageFragment(
|
||||||
|
|||||||
+3
@@ -119,6 +119,9 @@ class DirectoryBasedClassFinder(
|
|||||||
// TODO
|
// TODO
|
||||||
override fun findMetadata(classId: ClassId): InputStream? = null
|
override fun findMetadata(classId: ClassId): InputStream? = null
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
override fun hasMetadataPackage(fqName: FqName): Boolean = false
|
||||||
|
|
||||||
// TODO: load built-ins from packageDirectory?
|
// TODO: load built-ins from packageDirectory?
|
||||||
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
|
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,6 +59,9 @@ class JvmIDEVirtualFileFinder(private val scope: GlobalSearchScope) : VirtualFil
|
|||||||
// TODO
|
// TODO
|
||||||
override fun findMetadata(classId: ClassId): InputStream? = null
|
override fun findMetadata(classId: ClassId): InputStream? = null
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
override fun hasMetadataPackage(fqName: FqName): Boolean = false
|
||||||
|
|
||||||
// TODO: load built-ins metadata from scope
|
// TODO: load built-ins metadata from scope
|
||||||
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
|
override fun findBuiltInsData(packageFqName: FqName): InputStream? = null
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user