Improve search for facade light class by kotlin file

LightClassUtil#getWrappingClass works for clashing facade fq names

 #KT-17855 Fixed
This commit is contained in:
Pavel V. Talanov
2017-06-06 22:08:11 +03:00
parent 417b430033
commit 2b153d5c10
8 changed files with 63 additions and 3 deletions
@@ -153,9 +153,7 @@ object LightClassUtil {
if (parent is KtFile) {
// top-level declaration
val fqName = parent.javaFileFacadeFqName
val project = declaration.project
return JavaElementFinder.getInstance(project).findClass(fqName.asString(), GlobalSearchScope.allScope(project))
return findFileFacade(parent)
}
else if (parent is KtClassBody) {
assert(parent.parent is KtClassOrObject)
@@ -165,6 +163,17 @@ object LightClassUtil {
return null
}
private fun findFileFacade(ktFile: KtFile): PsiClass? {
val fqName = ktFile.javaFileFacadeFqName
val project = ktFile.project
val classesWithMatchingFqName = JavaElementFinder.getInstance(project).findClasses(fqName.asString(), GlobalSearchScope.allScope(project))
return classesWithMatchingFqName.singleOrNull() ?:
classesWithMatchingFqName.find {
// NOTE: for multipart facades this works via FakeLightClassForFileOfPackage
it.containingFile?.virtualFile == ktFile.virtualFile
}
}
private fun getWrappingClasses(declaration: KtDeclaration): Sequence<PsiClass> {
val wrapperClass = getWrappingClass(declaration) ?: return emptySequence()
val wrapperClassOrigin = (wrapperClass as KtLightClass).kotlinOrigin