[FIR IDE] Initial FIR LightClass implementation

This commit is contained in:
Igor Yakovlev
2020-09-22 16:21:30 +03:00
committed by Ilya Kirillov
parent c881cf7af6
commit b742a475ff
38 changed files with 2774 additions and 49 deletions
@@ -36,9 +36,21 @@ import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.utils.sure
class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport() {
open class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport() {
private val psiManager: PsiManager = PsiManager.getInstance(project)
protected open fun createLightClassForSourceDeclaration(classOrObject: KtClassOrObject): KtLightClass? =
KtLightClassForSourceDeclaration.create(classOrObject)
protected open fun createLightClassForScript(script: KtScript): KtLightClass? =
KtLightClassForScript.create(script)
protected open fun createLightClassForFacade(
manager: PsiManager,
facadeClassFqName: FqName,
searchScope: GlobalSearchScope
): KtLightClass? = KtLightClassForFacade.createForFacade(psiManager, facadeClassFqName, searchScope)
override fun getFacadeNames(packageFqName: FqName, scope: GlobalSearchScope): Collection<String> {
val facadeFilesInPackage = project.runReadActionInSmartMode {
KotlinFileFacadeClassByPackageIndex.getInstance().get(packageFqName.asString(), project, scope)
@@ -139,7 +151,7 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport
if (virtualFile != null) {
when {
ProjectRootsUtil.isProjectSourceFile(project, virtualFile) ->
return KtLightClassForSourceDeclaration.create(classOrObject)
return createLightClassForSourceDeclaration(classOrObject)
ProjectRootsUtil.isLibraryClassFile(project, virtualFile) ->
return getLightClassForDecompiledClassOrObject(classOrObject)
ProjectRootsUtil.isLibrarySourceFile(project, virtualFile) ->
@@ -152,17 +164,17 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport
classOrObject.containingFile.originalFile.virtualFile != null
) {
// explicit request to create light class from dummy.kt
return KtLightClassForSourceDeclaration.create(classOrObject)
return createLightClassForSourceDeclaration(classOrObject)
}
return null
}
override fun getLightClassForScript(script: KtScript): KtLightClassForScript? {
override fun getLightClassForScript(script: KtScript): KtLightClass? {
if (!script.isValid) {
return null
}
return KtLightClassForScript.create(script)
return createLightClassForScript(script)
}
override fun getFacadeClasses(facadeFqName: FqName, scope: GlobalSearchScope): Collection<PsiClass> {
@@ -229,7 +241,7 @@ class IDEKotlinAsJavaSupport(private val project: Project) : KotlinAsJavaSupport
private fun tryCreateFacadesForSourceFiles(moduleInfo: IdeaModuleInfo, facadeFqName: FqName): PsiClass? {
if (moduleInfo !is ModuleSourceInfo && moduleInfo !is PlatformModuleInfo) return null
return KtLightClassForFacade.createForFacade(psiManager, facadeFqName, moduleInfo.contentScope())
return createLightClassForFacade(psiManager, facadeFqName, moduleInfo.contentScope())
}
override fun findFilesForFacade(facadeFqName: FqName, scope: GlobalSearchScope): Collection<KtFile> {