Refactor: Provide API to create KtLightClassForFacade by synthetic file
This commit is contained in:
@@ -49,7 +49,7 @@ class KtLightClassForFacade private constructor(
|
||||
private inner class FacadeCacheData {
|
||||
val cache = object : SLRUCache<StubCacheKey, CachedValue<KotlinFacadeLightClassData>>(20, 30) {
|
||||
override fun createValue(key: StubCacheKey): CachedValue<KotlinFacadeLightClassData> {
|
||||
val stubProvider = LightClassDataProviderForFileFacade(project, key.fqName, key.searchScope)
|
||||
val stubProvider = LightClassDataProviderForFileFacade.ByProjectSource(project, key.fqName, key.searchScope)
|
||||
return CachedValuesManager.getManager(project).createCachedValue<KotlinFacadeLightClassData>(stubProvider, /*trackValue = */false)
|
||||
}
|
||||
}
|
||||
@@ -199,5 +199,18 @@ class KtLightClassForFacade private constructor(
|
||||
val lightClassDataCache = FacadeStubCache.getInstance(manager.project).get(facadeClassFqName, searchScope)
|
||||
return KtLightClassForFacade(manager, facadeClassFqName, lightClassDataCache, files)
|
||||
}
|
||||
|
||||
fun createForSyntheticFile(
|
||||
manager: PsiManager,
|
||||
facadeClassFqName: FqName,
|
||||
file: KtFile
|
||||
): KtLightClassForFacade {
|
||||
// TODO: refactor, using cached value doesn't make sense for this case
|
||||
val cachedValue = CachedValuesManager.getManager(manager.project).
|
||||
createCachedValue<KotlinFacadeLightClassData>(
|
||||
LightClassDataProviderForFileFacade.ByFile(manager.project, facadeClassFqName, file), /*trackValue = */false
|
||||
)
|
||||
return KtLightClassForFacade(manager, facadeClassFqName, cachedValue, listOf(file))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010-2015 JetBrains s.r.o.
|
||||
* Copyright 2010-2016 JetBrains s.r.o.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
@@ -281,12 +281,9 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO
|
||||
}
|
||||
}
|
||||
|
||||
class LightClassDataProviderForFileFacade(
|
||||
private val project: Project, private val facadeFqName: FqName, private val searchScope: GlobalSearchScope
|
||||
sealed class LightClassDataProviderForFileFacade private constructor(
|
||||
protected val project: Project, protected val facadeFqName: FqName
|
||||
) : LightClassDataProvider<KotlinFacadeLightClassData>(project) {
|
||||
override val files: Collection<KtFile>
|
||||
get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope)
|
||||
|
||||
override val packageFqName: FqName
|
||||
get() = facadeFqName.parent()
|
||||
|
||||
@@ -342,6 +339,26 @@ class LightClassDataProviderForFileFacade(
|
||||
override fun toString(): String {
|
||||
return this.javaClass.name + " for $facadeFqName"
|
||||
}
|
||||
|
||||
// create delegate by relevant files in project source using LightClassGenerationSupport
|
||||
class ByProjectSource(
|
||||
project: Project,
|
||||
facadeFqName: FqName,
|
||||
private val searchScope: GlobalSearchScope
|
||||
) : LightClassDataProviderForFileFacade(project, facadeFqName) {
|
||||
override val files: Collection<KtFile>
|
||||
get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope)
|
||||
}
|
||||
|
||||
// create delegate by single file
|
||||
class ByFile(
|
||||
project: Project,
|
||||
facadeFqName: FqName,
|
||||
private val file: KtFile
|
||||
) : LightClassDataProviderForFileFacade(project, facadeFqName) {
|
||||
override val files: Collection<KtFile>
|
||||
get() = listOf(file)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user