diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassData.kt similarity index 56% rename from compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt rename to compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassData.kt index 7d61cadffa0..2fc6c4ec00f 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassStubWithData.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassData.kt @@ -17,43 +17,23 @@ package org.jetbrains.kotlin.asJava.builder import com.intellij.psi.impl.java.stubs.PsiJavaFileStub -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics -interface LightClassData - -interface WithFileStubAndExtraDiagnostics: LightClassData { +interface LightClassData { val javaFileStub: PsiJavaFileStub val extraDiagnostics: Diagnostics } -interface LightClassDataForKotlinClass: LightClassData { - val classOrObject: KtClassOrObject -} - -object InvalidLightClassData: WithFileStubAndExtraDiagnostics, LightClassDataForKotlinClass { +object InvalidLightClassData: LightClassData { override val javaFileStub: PsiJavaFileStub get() = shouldNotBeCalled() override val extraDiagnostics: Diagnostics get() = shouldNotBeCalled() - override val classOrObject: KtClassOrObject - get() = shouldNotBeCalled() private fun shouldNotBeCalled(): Nothing = throw UnsupportedOperationException("Should not be called") } -data class KotlinFacadeLightClassData( +data class LightClassDataImpl( override val javaFileStub: PsiJavaFileStub, override val extraDiagnostics: Diagnostics -): LightClassData, WithFileStubAndExtraDiagnostics - -data class InnerKotlinClassLightClassData( - override val classOrObject: KtClassOrObject -): LightClassDataForKotlinClass - -data class OutermostKotlinClassLightClassData( - override val javaFileStub: PsiJavaFileStub, - override val extraDiagnostics: Diagnostics, - override val classOrObject: KtClassOrObject -): LightClassDataForKotlinClass, WithFileStubAndExtraDiagnostics +): LightClassData diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt index 82af06ca00a..edd7f60af87 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassDataProvider.kt @@ -51,7 +51,7 @@ import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics -abstract class LightClassDataProvider( +abstract class LightClassDataProvider( private val project: Project ) : CachedValueProvider { @@ -161,7 +161,7 @@ abstract class LightClassDataProvider( } class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassOrObject) : - LightClassDataProvider(classOrObject.project) { + LightClassDataProvider(classOrObject.project) { private val file: KtFile get() = classOrObject.containingKtFile @@ -175,14 +175,14 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO override fun createLightClassData( javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, - extraDiagnostics: Diagnostics): WithFileStubAndExtraDiagnostics { + extraDiagnostics: Diagnostics): LightClassData { bindingContext.get(BindingContext.CLASS, classOrObject) ?: return InvalidLightClassData - return OutermostKotlinClassLightClassData( + return LightClassDataImpl( javaFileStub, - extraDiagnostics, - classOrObject) + extraDiagnostics + ) } override val files: Collection @@ -258,7 +258,7 @@ class LightClassDataProviderForClassOrObject(private val classOrObject: KtClassO sealed class LightClassDataProviderForFileFacade private constructor( protected val project: Project, protected val facadeFqName: FqName -) : LightClassDataProvider(project) { +) : LightClassDataProvider(project) { override val packageFqName: FqName get() = facadeFqName.parent() @@ -271,8 +271,9 @@ sealed class LightClassDataProviderForFileFacade private constructor( override fun createLightClassData( javaFileStub: PsiJavaFileStub, bindingContext: BindingContext, - extraDiagnostics: Diagnostics): KotlinFacadeLightClassData { - return KotlinFacadeLightClassData(javaFileStub, extraDiagnostics) + extraDiagnostics: Diagnostics + ): LightClassDataImpl { + return LightClassDataImpl(javaFileStub, extraDiagnostics) } override val generateClassFilter: GenerationState.GenerateClassFilter diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt index 8f3d82e571c..df9654dbac0 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacade.kt @@ -31,7 +31,7 @@ import com.intellij.psi.util.PsiModificationTracker import com.intellij.util.containers.SLRUCache import org.jetbrains.annotations.NonNls import org.jetbrains.kotlin.asJava.LightClassUtil -import org.jetbrains.kotlin.asJava.builder.KotlinFacadeLightClassData +import org.jetbrains.kotlin.asJava.builder.LightClassDataImpl import org.jetbrains.kotlin.asJava.builder.LightClassDataProviderForFileFacade import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil @@ -51,17 +51,17 @@ import javax.swing.Icon class KtLightClassForFacade private constructor( manager: PsiManager, private val facadeClassFqName: FqName, - private val lightClassDataCache: CachedValue, + private val lightClassDataCache: CachedValue, files: Collection ) : KtLightClassBase(manager) { private data class StubCacheKey(val fqName: FqName, val searchScope: GlobalSearchScope) class FacadeStubCache(private val project: Project) { private inner class FacadeCacheData { - val cache = object : SLRUCache>(20, 30) { - override fun createValue(key: StubCacheKey): CachedValue { + val cache = object : SLRUCache>(20, 30) { + override fun createValue(key: StubCacheKey): CachedValue { val stubProvider = LightClassDataProviderForFileFacade.ByProjectSource(project, key.fqName, key.searchScope) - return CachedValuesManager.getManager(project).createCachedValue(stubProvider, /*trackValue = */false) + return CachedValuesManager.getManager(project).createCachedValue(stubProvider, /*trackValue = */false) } } } @@ -70,7 +70,7 @@ class KtLightClassForFacade private constructor( { CachedValueProvider.Result.create(FacadeCacheData(), PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT) }, /*trackValue = */ false) - operator fun get(qualifiedName: FqName, searchScope: GlobalSearchScope): CachedValue { + operator fun get(qualifiedName: FqName, searchScope: GlobalSearchScope): CachedValue { synchronized (cachedValue) { return cachedValue.value.cache.get(StubCacheKey(qualifiedName, searchScope)) } @@ -284,7 +284,7 @@ class KtLightClassForFacade private constructor( ): KtLightClassForFacade { // TODO: refactor, using cached value doesn't make sense for this case val cachedValue = CachedValuesManager.getManager(manager.project). - createCachedValue( + createCachedValue( LightClassDataProviderForFileFacade.ByFile(manager.project, facadeClassFqName, file), /*trackValue = */false ) return KtLightClassForFacade(manager, facadeClassFqName, cachedValue, listOf(file)) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt index 89d7c823479..bd1a6003ee9 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForSourceDeclaration.kt @@ -36,9 +36,8 @@ import org.jetbrains.kotlin.asJava.LightClassGenerationSupport import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory.getOriginalElement import org.jetbrains.kotlin.asJava.builder.LightClassData +import org.jetbrains.kotlin.asJava.builder.LightClassDataImpl import org.jetbrains.kotlin.asJava.builder.LightClassDataProviderForClassOrObject -import org.jetbrains.kotlin.asJava.builder.OutermostKotlinClassLightClassData -import org.jetbrains.kotlin.asJava.builder.WithFileStubAndExtraDiagnostics import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass import org.jetbrains.kotlin.asJava.elements.KtLightIdentifier import org.jetbrains.kotlin.asJava.elements.KtLightModifierListWithExplicitModifiers @@ -61,7 +60,7 @@ import java.util.* import javax.swing.Icon abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject) -: KtLightClassBase(classOrObject.manager), StubBasedPsiElement> { + : KtLightClassBase(classOrObject.manager), StubBasedPsiElement> { private val lightIdentifier = KtLightIdentifier(this, classOrObject) private val _extendsList by lazy(LazyThreadSafetyMode.PUBLICATION) { @@ -109,12 +108,12 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC return LightClassGenerationSupport.getInstance(project).resolveToDescriptor(classOrObject) as? ClassDescriptor } - private fun getLightClassData(): OutermostKotlinClassLightClassData { + private fun getLightClassData(): LightClassDataImpl { val lightClassData = getLightClassData(classOrObject) - if (lightClassData !is OutermostKotlinClassLightClassData) { + if (lightClassData !is LightClassDataImpl) { LOG.error("Invalid light class data for existing light class:\n$lightClassData\n${classOrObject.getElementTextWithContext()}") } - return lightClassData as OutermostKotlinClassLightClassData + return lightClassData as LightClassDataImpl } private val _containingFile: PsiFile by lazy(LazyThreadSafetyMode.PUBLICATION) { @@ -194,7 +193,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC override fun getName(): String? = classOrObject.nameAsName?.asString() - private val _modifierList : PsiModifierList by lazy(LazyThreadSafetyMode.PUBLICATION) { + private val _modifierList: PsiModifierList by lazy(LazyThreadSafetyMode.PUBLICATION) { object : KtLightModifierListWithExplicitModifiers(this@KtLightClassForSourceDeclaration, computeModifiers()) { override val delegate: PsiAnnotationOwner get() = this@KtLightClassForSourceDeclaration.delegate.modifierList!! @@ -342,17 +341,17 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC override fun getImplementsList() = _implementsList companion object { - private val JAVA_API_STUB = Key.create>("JAVA_API_STUB") + private val JAVA_API_STUB = Key.create>("JAVA_API_STUB") private val jetTokenToPsiModifier = listOf( PUBLIC_KEYWORD to PsiModifier.PUBLIC, - INTERNAL_KEYWORD to PsiModifier.PUBLIC, + INTERNAL_KEYWORD to PsiModifier.PUBLIC, PROTECTED_KEYWORD to PsiModifier.PROTECTED, FINAL_KEYWORD to PsiModifier.FINAL) fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? { - if (classOrObject.containingKtFile.isScript || classOrObject.hasModifier(KtTokens.HEADER_KEYWORD)) { + if (classOrObject.containingKtFile.isScript || classOrObject.hasModifier(KtTokens.HEADER_KEYWORD)) { return null } @@ -387,10 +386,10 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC return getLightClassCachedValue(classOrObject).value } - fun getLightClassCachedValue(classOrObject: KtClassOrObject): CachedValue { + fun getLightClassCachedValue(classOrObject: KtClassOrObject): CachedValue { var value = getOutermostClassOrObject(classOrObject).getUserData(JAVA_API_STUB) // stub computed for outer class can be used for inner/nested - ?: classOrObject.getUserData (JAVA_API_STUB) + ?: classOrObject.getUserData(JAVA_API_STUB) if (value == null) { value = CachedValuesManager.getManager(classOrObject.project).createCachedValue( LightClassDataProviderForClassOrObject(classOrObject), false) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt index 14dd494d918..917ead12c84 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/duplicateJvmSignatureUtil.kt @@ -18,7 +18,7 @@ package org.jetbrains.kotlin.asJava import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.asJava.builder.OutermostKotlinClassLightClassData +import org.jetbrains.kotlin.asJava.builder.LightClassDataImpl import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade import org.jetbrains.kotlin.diagnostics.Diagnostic @@ -42,7 +42,7 @@ fun getJvmSignatureDiagnostics(element: PsiElement, otherDiagnostics: Diagnostic } fun getDiagnosticsForClass(ktClassOrObject: KtClassOrObject): Diagnostics { - return (KtLightClassForSourceDeclaration.getLightClassData(ktClassOrObject) as? OutermostKotlinClassLightClassData)?.extraDiagnostics ?: Diagnostics.EMPTY + return (KtLightClassForSourceDeclaration.getLightClassData(ktClassOrObject) as? LightClassDataImpl)?.extraDiagnostics ?: Diagnostics.EMPTY } fun doGetDiagnostics(): Diagnostics? {