diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt index 38fd366c234..da05690c5a6 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForExplicitDeclaration.kt @@ -429,7 +429,7 @@ public open class KtLightClassForExplicitDeclaration( var value = outermostClassOrObject.getUserData(JAVA_API_STUB) if (value == null) { value = CachedValuesManager.getManager(classOrObject.project).createCachedValue( - KotlinJavaFileStubProvider.createForDeclaredClass(outermostClassOrObject), false) + LightClassDataProviderForClassOrObject(outermostClassOrObject), false) value = outermostClassOrObject.putUserDataIfAbsent(JAVA_API_STUB, value)!! } return value diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt index 954701294ee..80ca967ca6a 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KtLightClassForFacade.kt @@ -50,7 +50,7 @@ public class KtLightClassForFacade private constructor( private inner class FacadeCacheData { val cache = object : SLRUCache>(20, 30) { override fun createValue(key: StubCacheKey): CachedValue { - val stubProvider = KotlinJavaFileStubProvider.createForFacadeClass(project, key.fqName, key.searchScope) + val stubProvider = LightClassDataProviderForFileFacade(project, key.fqName, key.searchScope) return CachedValuesManager.getManager(project).createCachedValue(stubProvider, /*trackValue = */false) } } diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt similarity index 84% rename from compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.kt rename to compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt index 77642a24b5b..41d0d9e1919 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/KotlinJavaFileStubProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/LightClassDataProvider.kt @@ -56,19 +56,27 @@ import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.utils.sure -class KotlinJavaFileStubProvider private constructor( - private val project: Project, - private val local: Boolean, - private val stubGenerationStrategy: StubGenerationStrategy +abstract class LightClassDataProvider( + private val project: Project ) : CachedValueProvider { + abstract val files: Collection + abstract val packageFqName: FqName + + abstract fun getContext(files: Collection): LightClassConstructionContext + abstract fun createLightClassData(javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, extraDiagnostics: Diagnostics): T + + abstract val generateClassFilter: GenerationState.GenerateClassFilter + abstract fun generate(state: GenerationState, files: Collection) + abstract val isLocal: Boolean + override fun compute(): CachedValueProvider.Result? { - val packageFqName = stubGenerationStrategy.packageFqName - val files = stubGenerationStrategy.files + val packageFqName = packageFqName + val files = files checkForBuiltIns(packageFqName, files) - val context = stubGenerationStrategy.getContext(files) + val context = getContext(files) val javaFileStub = createJavaFileStub(packageFqName, files) val bindingContext: BindingContext @@ -84,7 +92,7 @@ class KotlinJavaFileStubProvider private co context.bindingContext, Lists.newArrayList(files), /*disable not-null assertions*/false, false, - /*generateClassFilter=*/stubGenerationStrategy.generateClassFilter, + /*generateClassFilter=*/generateClassFilter, /*disableInline=*/false, /*disableOptimization=*/false, /*useTypeTableInSerializer=*/false, @@ -93,7 +101,7 @@ class KotlinJavaFileStubProvider private co bindingContext = state.bindingContext - stubGenerationStrategy.generate(state, files) + generate(state, files) val pop = stubStack.pop() if (pop !== javaFileStub) { @@ -110,8 +118,8 @@ class KotlinJavaFileStubProvider private co val extraDiagnostics = forExtraDiagnostics.bindingContext.diagnostics return CachedValueProvider.Result.create( - stubGenerationStrategy.createLightClassData(javaFileStub, bindingContext, extraDiagnostics), - if (local) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT + createLightClassData(javaFileStub, bindingContext, extraDiagnostics), + if (isLocal) PsiModificationTracker.MODIFICATION_COUNT else PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT ) } @@ -162,40 +170,18 @@ class KotlinJavaFileStubProvider private co } companion object { - fun createForDeclaredClass(classOrObject: KtClassOrObject): KotlinJavaFileStubProvider { - return KotlinJavaFileStubProvider( - classOrObject.project, - classOrObject.isLocal(), - StubGenerationStrategyForDeclaredClass(classOrObject) - ) - } - - fun createForFacadeClass( - project: Project, - facadeFqName: FqName, - searchScope: GlobalSearchScope): CachedValueProvider { - return KotlinJavaFileStubProvider(project, false, StubGenerationStrategyForFacadeClass(project, facadeFqName, searchScope)) - } - - private val LOG = Logger.getInstance(KotlinJavaFileStubProvider::class.java) + private val LOG = Logger.getInstance(LightClassDataProvider::class.java) } } -private interface StubGenerationStrategy { - val files: Collection - val packageFqName: FqName +class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassOrObject) : + LightClassDataProvider(classOrObject.project) { - fun getContext(files: Collection): LightClassConstructionContext - fun createLightClassData(javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, extraDiagnostics: Diagnostics): T - - val generateClassFilter: GenerationState.GenerateClassFilter - fun generate(state: GenerationState, files: Collection) -} - -private class StubGenerationStrategyForDeclaredClass(private val classOrObject: KtClassOrObject) : StubGenerationStrategy { private val file: KtFile get() = classOrObject.getContainingKtFile() + override val isLocal: Boolean get() = classOrObject.isLocal() + override fun getContext(files: Collection): LightClassConstructionContext { return LightClassGenerationSupport.getInstance(classOrObject.project).getContextForClassOrObject(classOrObject) } @@ -302,19 +288,21 @@ private class StubGenerationStrategyForDeclaredClass(private val classOrObject: } 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 -) : StubGenerationStrategy { +) : LightClassDataProvider(project) { override val files: Collection get() = LightClassGenerationSupport.getInstance(project).findFilesForFacade(facadeFqName, searchScope) override val packageFqName: FqName get() = facadeFqName.parent() + override val isLocal: Boolean get() = false + override fun getContext(files: Collection): LightClassConstructionContext { return LightClassGenerationSupport.getInstance(project).getContextForFacade(files) } @@ -363,6 +351,6 @@ private class StubGenerationStrategyForFacadeClass( } override fun toString(): String { - return StubGenerationStrategy::class.java.name + " for facade class" + return this.javaClass.name + " for $facadeFqName" } }