KT-11410: generate light classes from multifile class parts in binaries
if explicitly requested by fqName
This commit is contained in:
+5
@@ -149,6 +149,11 @@ class CliLightClassGenerationSupport(project: Project) : LightClassGenerationSup
|
|||||||
KtLightClassForFacade.createForFacade(psiManager, facadeFqName, scope, filesForFacade))
|
KtLightClassForFacade.createForFacade(psiManager, facadeFqName, scope, filesForFacade))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getMultifilePartClasses(partFqName: FqName, scope: GlobalSearchScope): Collection<PsiClass> {
|
||||||
|
//
|
||||||
|
return emptyList()
|
||||||
|
}
|
||||||
|
|
||||||
override fun findFilesForFacade(facadeFqName: FqName, scope: GlobalSearchScope): Collection<KtFile> {
|
override fun findFilesForFacade(facadeFqName: FqName, scope: GlobalSearchScope): Collection<KtFile> {
|
||||||
if (facadeFqName.isRoot) return emptyList()
|
if (facadeFqName.isRoot) return emptyList()
|
||||||
|
|
||||||
|
|||||||
@@ -92,6 +92,7 @@ public class JavaElementFinder extends PsiElementFinder implements KotlinFinderM
|
|||||||
findClassesAndObjects(qualifiedName, scope, answer);
|
findClassesAndObjects(qualifiedName, scope, answer);
|
||||||
|
|
||||||
answer.addAll(lightClassGenerationSupport.getFacadeClasses(qualifiedName, scope));
|
answer.addAll(lightClassGenerationSupport.getFacadeClasses(qualifiedName, scope));
|
||||||
|
answer.addAll(lightClassGenerationSupport.getMultifilePartClasses(qualifiedName, scope));
|
||||||
|
|
||||||
return sortByClasspath(answer, scope).toArray(new PsiClass[answer.size()]);
|
return sortByClasspath(answer, scope).toArray(new PsiClass[answer.size()]);
|
||||||
}
|
}
|
||||||
|
|||||||
+3
-1
@@ -75,6 +75,9 @@ public abstract class LightClassGenerationSupport {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public abstract Collection<PsiClass> getFacadeClasses(@NotNull FqName facadeFqName, @NotNull GlobalSearchScope scope);
|
public abstract Collection<PsiClass> getFacadeClasses(@NotNull FqName facadeFqName, @NotNull GlobalSearchScope scope);
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
public abstract Collection<PsiClass> getMultifilePartClasses(@NotNull FqName partFqName, @NotNull GlobalSearchScope scope);
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public abstract Collection<PsiClass> getFacadeClassesInPackage(@NotNull FqName packageFqName, @NotNull GlobalSearchScope scope);
|
public abstract Collection<PsiClass> getFacadeClassesInPackage(@NotNull FqName packageFqName, @NotNull GlobalSearchScope scope);
|
||||||
|
|
||||||
@@ -86,5 +89,4 @@ public abstract class LightClassGenerationSupport {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public abstract LightClassConstructionContext getContextForFacade(@NotNull Collection<KtFile> files);
|
public abstract LightClassConstructionContext getContextForFacade(@NotNull Collection<KtFile> files);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
+18
@@ -174,6 +174,24 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getMultifilePartClasses(partFqName: FqName, scope: GlobalSearchScope): Collection<PsiClass> {
|
||||||
|
val facadeKtFiles = StaticFacadeIndexUtil.getMultifileClassForPart(partFqName, scope, project)
|
||||||
|
val partShortName = partFqName.shortName().asString()
|
||||||
|
val partClassFileShortName = partShortName + ".class"
|
||||||
|
|
||||||
|
return facadeKtFiles.mapNotNull { facadeKtFile ->
|
||||||
|
if (facadeKtFile is KtClsFile) {
|
||||||
|
val partClassFile = facadeKtFile.virtualFile.parent.findChild(partClassFileShortName) ?: return@mapNotNull null
|
||||||
|
val javaClsClass = createClsJavaClassFromVirtualFile(facadeKtFile, partClassFile, null) ?: return@mapNotNull null
|
||||||
|
KtLightClassForDecompiledDeclaration(javaClsClass, null, facadeKtFile)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// TODO should we build light classes for parts from source?
|
||||||
|
null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun createLightClassForFileFacade(
|
fun createLightClassForFileFacade(
|
||||||
facadeFqName: FqName,
|
facadeFqName: FqName,
|
||||||
facadeFiles: List<KtFile>,
|
facadeFiles: List<KtFile>,
|
||||||
|
|||||||
Reference in New Issue
Block a user