Rename KotlinJavaFileStubProvider and remove StubGenerationStrategy class

This commit is contained in:
Pavel V. Talanov
2015-11-05 16:00:54 +03:00
parent f5c4f82971
commit ec48b54032
3 changed files with 32 additions and 44 deletions
@@ -429,7 +429,7 @@ public open class KtLightClassForExplicitDeclaration(
var value = outermostClassOrObject.getUserData(JAVA_API_STUB) var value = outermostClassOrObject.getUserData(JAVA_API_STUB)
if (value == null) { if (value == null) {
value = CachedValuesManager.getManager(classOrObject.project).createCachedValue( value = CachedValuesManager.getManager(classOrObject.project).createCachedValue(
KotlinJavaFileStubProvider.createForDeclaredClass(outermostClassOrObject), false) LightClassDataProviderForClassOrObject(outermostClassOrObject), false)
value = outermostClassOrObject.putUserDataIfAbsent(JAVA_API_STUB, value)!! value = outermostClassOrObject.putUserDataIfAbsent(JAVA_API_STUB, value)!!
} }
return value return value
@@ -50,7 +50,7 @@ public class KtLightClassForFacade private constructor(
private inner class FacadeCacheData { private inner class FacadeCacheData {
val cache = object : SLRUCache<StubCacheKey, CachedValue<KotlinFacadeLightClassData>>(20, 30) { val cache = object : SLRUCache<StubCacheKey, CachedValue<KotlinFacadeLightClassData>>(20, 30) {
override fun createValue(key: StubCacheKey): CachedValue<KotlinFacadeLightClassData> { override fun createValue(key: StubCacheKey): CachedValue<KotlinFacadeLightClassData> {
val stubProvider = KotlinJavaFileStubProvider.createForFacadeClass(project, key.fqName, key.searchScope) val stubProvider = LightClassDataProviderForFileFacade(project, key.fqName, key.searchScope)
return CachedValuesManager.getManager(project).createCachedValue<KotlinFacadeLightClassData>(stubProvider, /*trackValue = */false) return CachedValuesManager.getManager(project).createCachedValue<KotlinFacadeLightClassData>(stubProvider, /*trackValue = */false)
} }
} }
@@ -56,19 +56,27 @@ import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
import org.jetbrains.kotlin.utils.sure import org.jetbrains.kotlin.utils.sure
class KotlinJavaFileStubProvider<T : WithFileStubAndExtraDiagnostics> private constructor( abstract class LightClassDataProvider<T : WithFileStubAndExtraDiagnostics>(
private val project: Project, private val project: Project
private val local: Boolean,
private val stubGenerationStrategy: StubGenerationStrategy<T>
) : CachedValueProvider<T> { ) : CachedValueProvider<T> {
abstract val files: Collection<KtFile>
abstract val packageFqName: FqName
abstract fun getContext(files: Collection<KtFile>): LightClassConstructionContext
abstract fun createLightClassData(javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, extraDiagnostics: Diagnostics): T
abstract val generateClassFilter: GenerationState.GenerateClassFilter
abstract fun generate(state: GenerationState, files: Collection<KtFile>)
abstract val isLocal: Boolean
override fun compute(): CachedValueProvider.Result<T>? { override fun compute(): CachedValueProvider.Result<T>? {
val packageFqName = stubGenerationStrategy.packageFqName val packageFqName = packageFqName
val files = stubGenerationStrategy.files val files = files
checkForBuiltIns(packageFqName, files) checkForBuiltIns(packageFqName, files)
val context = stubGenerationStrategy.getContext(files) val context = getContext(files)
val javaFileStub = createJavaFileStub(packageFqName, files) val javaFileStub = createJavaFileStub(packageFqName, files)
val bindingContext: BindingContext val bindingContext: BindingContext
@@ -84,7 +92,7 @@ class KotlinJavaFileStubProvider<T : WithFileStubAndExtraDiagnostics> private co
context.bindingContext, context.bindingContext,
Lists.newArrayList(files), Lists.newArrayList(files),
/*disable not-null assertions*/false, false, /*disable not-null assertions*/false, false,
/*generateClassFilter=*/stubGenerationStrategy.generateClassFilter, /*generateClassFilter=*/generateClassFilter,
/*disableInline=*/false, /*disableInline=*/false,
/*disableOptimization=*/false, /*disableOptimization=*/false,
/*useTypeTableInSerializer=*/false, /*useTypeTableInSerializer=*/false,
@@ -93,7 +101,7 @@ class KotlinJavaFileStubProvider<T : WithFileStubAndExtraDiagnostics> private co
bindingContext = state.bindingContext bindingContext = state.bindingContext
stubGenerationStrategy.generate(state, files) generate(state, files)
val pop = stubStack.pop() val pop = stubStack.pop()
if (pop !== javaFileStub) { if (pop !== javaFileStub) {
@@ -110,8 +118,8 @@ class KotlinJavaFileStubProvider<T : WithFileStubAndExtraDiagnostics> private co
val extraDiagnostics = forExtraDiagnostics.bindingContext.diagnostics val extraDiagnostics = forExtraDiagnostics.bindingContext.diagnostics
return CachedValueProvider.Result.create( return CachedValueProvider.Result.create(
stubGenerationStrategy.createLightClassData(javaFileStub, bindingContext, extraDiagnostics), createLightClassData(javaFileStub, bindingContext, extraDiagnostics),
if (local) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT if (isLocal) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
) )
} }
@@ -162,40 +170,18 @@ class KotlinJavaFileStubProvider<T : WithFileStubAndExtraDiagnostics> private co
} }
companion object { companion object {
fun createForDeclaredClass(classOrObject: KtClassOrObject): KotlinJavaFileStubProvider<OutermostKotlinClassLightClassData> { private val LOG = Logger.getInstance(LightClassDataProvider::class.java)
return KotlinJavaFileStubProvider(
classOrObject.project,
classOrObject.isLocal(),
StubGenerationStrategyForDeclaredClass(classOrObject)
)
}
fun createForFacadeClass(
project: Project,
facadeFqName: FqName,
searchScope: GlobalSearchScope): CachedValueProvider<KotlinFacadeLightClassData> {
return KotlinJavaFileStubProvider(project, false, StubGenerationStrategyForFacadeClass(project, facadeFqName, searchScope))
}
private val LOG = Logger.getInstance(KotlinJavaFileStubProvider::class.java)
} }
} }
private interface StubGenerationStrategy<T : WithFileStubAndExtraDiagnostics> { class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassOrObject) :
val files: Collection<KtFile> LightClassDataProvider<OutermostKotlinClassLightClassData>(classOrObject.project) {
val packageFqName: FqName
fun getContext(files: Collection<KtFile>): LightClassConstructionContext
fun createLightClassData(javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, extraDiagnostics: Diagnostics): T
val generateClassFilter: GenerationState.GenerateClassFilter
fun generate(state: GenerationState, files: Collection<KtFile>)
}
private class StubGenerationStrategyForDeclaredClass(private val classOrObject: KtClassOrObject) : StubGenerationStrategy<OutermostKotlinClassLightClassData> {
private val file: KtFile private val file: KtFile
get() = classOrObject.getContainingKtFile() get() = classOrObject.getContainingKtFile()
override val isLocal: Boolean get() = classOrObject.isLocal()
override fun getContext(files: Collection<KtFile>): LightClassConstructionContext { override fun getContext(files: Collection<KtFile>): LightClassConstructionContext {
return LightClassGenerationSupport.getInstance(classOrObject.project).getContextForClassOrObject(classOrObject) return LightClassGenerationSupport.getInstance(classOrObject.project).getContextForClassOrObject(classOrObject)
} }
@@ -302,19 +288,21 @@ private class StubGenerationStrategyForDeclaredClass(private val classOrObject:
} }
override fun toString(): String { override fun toString(): String {
return StubGenerationStrategy::class.java.name + " for explicit class " + classOrObject.name return this.javaClass.name + " for " + classOrObject.name
} }
} }
private class StubGenerationStrategyForFacadeClass( class LightClassDataProviderForFileFacade(
private val project: Project, private val facadeFqName: FqName, private val searchScope: GlobalSearchScope private val project: Project, private val facadeFqName: FqName, private val searchScope: GlobalSearchScope
) : StubGenerationStrategy<KotlinFacadeLightClassData> { ) : LightClassDataProvider<KotlinFacadeLightClassData>(project) {
override val files: Collection<KtFile> override val files: Collection<KtFile>
get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope) get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope)
override val packageFqName: FqName override val packageFqName: FqName
get() = facadeFqName.parent() get() = facadeFqName.parent()
override val isLocal: Boolean get() = false
override fun getContext(files: Collection<KtFile>): LightClassConstructionContext { override fun getContext(files: Collection<KtFile>): LightClassConstructionContext {
return LightClassGenerationSupport.getInstance(project).getContextForFacade(files) return LightClassGenerationSupport.getInstance(project).getContextForFacade(files)
} }
@@ -363,6 +351,6 @@ private class StubGenerationStrategyForFacadeClass(
} }
override fun toString(): String { override fun toString(): String {
return StubGenerationStrategy::class.java.name + " for facade class" return this.javaClass.name + " for $facadeFqName"
} }
} }