[lc] KotlinAsJavaSupportBase: add more lightweight checks for facades
^KT-50241
This commit is contained in:
+22
-5
@@ -23,12 +23,11 @@ import org.jetbrains.kotlin.psi.*
|
|||||||
|
|
||||||
abstract class KotlinAsJavaSupportBase<TModule>(protected val project: Project) : KotlinAsJavaSupport() {
|
abstract class KotlinAsJavaSupportBase<TModule>(protected val project: Project) : KotlinAsJavaSupport() {
|
||||||
fun createLightFacade(file: KtFile): Pair<KtLightClassForFacade?, ModificationTracker>? {
|
fun createLightFacade(file: KtFile): Pair<KtLightClassForFacade?, ModificationTracker>? {
|
||||||
if (file.isScript()) return null
|
if (!file.facadeIsPossible()) return null
|
||||||
if (file.isCompiled && !file.name.endsWith(".class")) return null
|
|
||||||
|
|
||||||
val module = file.findModule().takeIf { facadeIsApplicable(it, file) } ?: return null
|
val module = file.findModule().takeIf { facadeIsApplicable(it, file) } ?: return null
|
||||||
val facadeFqName = file.javaFileFacadeFqName
|
val facadeFqName = file.javaFileFacadeFqName
|
||||||
val facadeFiles = if (file.isJvmMultifileClassFile && !file.isCompiled) {
|
val facadeFiles = if (file.canHaveAdditionalFilesInFacade()) {
|
||||||
findFilesForFacade(facadeFqName, module.contentSearchScope).filter(KtFile::isJvmMultifileClassFile)
|
findFilesForFacade(facadeFqName, module.contentSearchScope).filter(KtFile::isJvmMultifileClassFile)
|
||||||
} else {
|
} else {
|
||||||
listOf(file)
|
listOf(file)
|
||||||
@@ -48,6 +47,18 @@ abstract class KotlinAsJavaSupportBase<TModule>(protected val project: Project)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lightweight applicability check
|
||||||
|
*/
|
||||||
|
private fun KtFile.facadeIsPossible(): Boolean = when {
|
||||||
|
isCompiled && !name.endsWith(".class") -> false
|
||||||
|
isScript() -> false
|
||||||
|
canHaveAdditionalFilesInFacade() -> true
|
||||||
|
else -> hasTopLevelCallables()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun KtFile.canHaveAdditionalFilesInFacade(): Boolean = !isCompiled && isJvmMultifileClassFile
|
||||||
|
|
||||||
protected abstract fun KtFile.findModule(): TModule
|
protected abstract fun KtFile.findModule(): TModule
|
||||||
protected abstract fun facadeIsApplicable(module: TModule, file: KtFile): Boolean
|
protected abstract fun facadeIsApplicable(module: TModule, file: KtFile): Boolean
|
||||||
protected abstract val TModule.contentSearchScope: GlobalSearchScope
|
protected abstract val TModule.contentSearchScope: GlobalSearchScope
|
||||||
@@ -88,11 +99,17 @@ abstract class KotlinAsJavaSupportBase<TModule>(protected val project: Project)
|
|||||||
|
|
||||||
override fun getFacadeNames(packageFqName: FqName, scope: GlobalSearchScope): Collection<String> {
|
override fun getFacadeNames(packageFqName: FqName, scope: GlobalSearchScope): Collection<String> {
|
||||||
return findFilesForFacadeByPackage(packageFqName, scope).mapNotNullTo(mutableSetOf()) { file ->
|
return findFilesForFacadeByPackage(packageFqName, scope).mapNotNullTo(mutableSetOf()) { file ->
|
||||||
file.takeIf { facadeIsApplicable(it.findModule(), file) }?.javaFileFacadeFqName?.shortName()?.asString()
|
file.takeIf { it.facadeIsPossible() }
|
||||||
|
?.takeIf { facadeIsApplicable(it.findModule(), file) }
|
||||||
|
?.javaFileFacadeFqName
|
||||||
|
?.shortName()
|
||||||
|
?.asString()
|
||||||
}.toSet()
|
}.toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun Collection<KtFile>.toFacadeClasses(): List<KtLightClassForFacade> = groupBy {
|
private fun Collection<KtFile>.toFacadeClasses(): List<KtLightClassForFacade> = filter {
|
||||||
|
it.facadeIsPossible()
|
||||||
|
}.groupBy {
|
||||||
FacadeKey(it.javaFileFacadeFqName, it.isJvmMultifileClassFile, it.findModule())
|
FacadeKey(it.javaFileFacadeFqName, it.isJvmMultifileClassFile, it.findModule())
|
||||||
}.mapNotNull { (key, files) ->
|
}.mapNotNull { (key, files) ->
|
||||||
files.firstOrNull { facadeIsApplicable(key.module, it) }?.let(::getLightFacade)
|
files.firstOrNull { facadeIsApplicable(key.module, it) }?.let(::getLightFacade)
|
||||||
|
|||||||
Reference in New Issue
Block a user