From 7d37bb1f7864310b13899ff04e4be649deb8e3a7 Mon Sep 17 00:00:00 2001 From: Dmitrii Gridin Date: Thu, 6 Apr 2023 21:18:03 +0200 Subject: [PATCH] [LC] FakeFileForLightClass: drop stub access from equals/hashCode ^KT-57857 Fixed --- .../classes/KtLightClassForFacadeBase.kt | 6 ++-- .../asJava/classes/KtLightClassForScript.kt | 4 +-- .../asJava/elements/FakeFileForLightClass.kt | 31 +++++++++++-------- .../light/classes/symbol/SymbolFakeFile.kt | 10 ++---- .../classes/SymbolLightClassForFacade.kt | 2 +- .../kotlin/asJava/classes/KtLightClassImpl.kt | 8 ++--- 6 files changed, 30 insertions(+), 31 deletions(-) diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt index 17868d009c9..4f856b9412b 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForFacadeBase.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -29,7 +29,7 @@ import org.jetbrains.kotlin.psi.KtStringTemplateExpression import org.jetbrains.kotlin.psi.psiUtil.siblings import javax.swing.Icon -abstract class KtLightClassForFacadeBase constructor( +abstract class KtLightClassForFacadeBase( override val facadeClassFqName: FqName, final override val files: Collection ) : KtLightClassBase(files.first().manager), KtLightClassForFacade { @@ -54,7 +54,7 @@ abstract class KtLightClassForFacadeBase constructor( private val packageClsFile by lazyPub { FakeFileForLightClass( firstFileInFacade, - lightClass = { this }, + lightClass = this, packageFqName = facadeClassFqName.parent() ) } diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt index c2b766725e4..81db9a2e4df 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/classes/KtLightClassForScript.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -33,7 +33,7 @@ abstract class KtLightClassForScript(val script: KtScript) : KtLightClassBase(sc private val _containingFile by lazyPub { FakeFileForLightClass( script.containingKtFile, - lightClass = { this }, + lightClass = this, packageFqName = fqName.parent(), ) } diff --git a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt index 7a89866f166..2fdc62c1dd5 100644 --- a/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt +++ b/analysis/light-classes-base/src/org/jetbrains/kotlin/asJava/elements/FakeFileForLightClass.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -31,9 +31,19 @@ import java.lang.ref.Reference open class FakeFileForLightClass( val ktFile: KtFile, - private val lightClass: () -> KtLightClass, + private val lightClass: KtLightClass, private val packageFqName: FqName = ktFile.packageFqName, ) : ClsFileImpl(ktFile.viewProvider) { + @Deprecated("A light class should be provided directly") + constructor( + ktFile: KtFile, + lightClass: () -> KtLightClass, + packageFqName: FqName = ktFile.packageFqName, + ) : this( + ktFile = ktFile, + lightClass = lightClass(), + packageFqName = packageFqName, + ) override fun getVirtualFile(): VirtualFile = ktFile.virtualFile ?: ktFile.originalFile.virtualFile ?: super.getVirtualFile() @@ -49,7 +59,7 @@ open class FakeFileForLightClass( override fun getStub() = createFakeJavaFileStub() - override fun getClasses() = arrayOf(lightClass()) + override fun getClasses() = arrayOf(lightClass) override fun getNavigationElement() = ktFile @@ -92,29 +102,24 @@ open class FakeFileForLightClass( // this should be equal to current compiler target language level override fun getLanguageLevel() = LanguageLevel.JDK_1_8 - override fun hashCode(): Int { - val thisClass = lightClass() - if (thisClass is KtLightClassForSourceDeclaration) return ktFile.hashCode() - return thisClass.hashCode() - } + override fun hashCode(): Int = if (lightClass is KtLightClassForSourceDeclaration) ktFile.hashCode() else lightClass.hashCode() override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is FakeFileForLightClass) return false - val thisClass = lightClass() - val anotherClass = other.lightClass() - if (thisClass is KtLightClassForSourceDeclaration) { + val anotherClass = other.lightClass + if (lightClass is KtLightClassForSourceDeclaration) { return anotherClass is KtLightClassForSourceDeclaration && ktFile == other.ktFile } - return thisClass == anotherClass + return lightClass == anotherClass } override fun isEquivalentTo(another: PsiElement?) = this == another override fun setPackageName(packageName: String) { - if (lightClass() is KtLightClassForFacade) { + if (lightClass is KtLightClassForFacade) { ktFile.packageDirective?.fqName = FqName(packageName) } else { super.setPackageName(packageName) diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolFakeFile.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolFakeFile.kt index dd67d04a247..a33816a081b 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolFakeFile.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/SymbolFakeFile.kt @@ -10,16 +10,13 @@ import com.intellij.psi.PsiElement import com.intellij.psi.ResolveState import com.intellij.psi.scope.PsiScopeProcessor import org.jetbrains.kotlin.asJava.classes.KtLightClass -import org.jetbrains.kotlin.asJava.classes.getOutermostClassOrObject import org.jetbrains.kotlin.asJava.elements.FakeFileForLightClass -import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.psi.KtClassOrObject -internal class SymbolFakeFile(private val classOrObject: KtClassOrObject, ktClass: KtLightClass) : FakeFileForLightClass( +internal class SymbolFakeFile(classOrObject: KtClassOrObject, ktClass: KtLightClass) : FakeFileForLightClass( classOrObject.containingKtFile, - { if (classOrObject.isTopLevel()) ktClass else getOutermostClassOrObject(classOrObject).toLightClass()!! }, + ktClass, ) { - override fun findReferenceAt(offset: Int) = ktFile.findReferenceAt(offset) override fun processDeclarations( @@ -34,8 +31,7 @@ internal class SymbolFakeFile(private val classOrObject: KtClassOrObject, ktClas // so that Java resolve can find classes located in that package val packageName = packageName if (packageName.isNotEmpty()) return true - - val aPackage = JavaPsiFacade.getInstance(classOrObject.project).findPackage(packageName) + val aPackage = JavaPsiFacade.getInstance(project).findPackage(packageName) if (aPackage != null && !aPackage.processDeclarations(processor, state, null, place)) return false return true diff --git a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt index 66bd492e176..036316357c5 100644 --- a/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt +++ b/analysis/symbol-light-classes/src/org/jetbrains/kotlin/light/classes/symbol/classes/SymbolLightClassForFacade.kt @@ -144,7 +144,7 @@ internal class SymbolLightClassForFacade( private val packageClsFile = FakeFileForLightClass( firstFileInFacade, - lightClass = { this }, + lightClass = this, packageFqName = facadeClassFqName.parent() ) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt index 1389ad99952..2a3cbdc391c 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/classes/KtLightClassImpl.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -117,10 +117,8 @@ abstract class KtLightClassImpl( abstract override fun copy(): PsiElement private val _containingFile: PsiFile by lazyPub { - object : FakeFileForLightClass( - classOrObject.containingKtFile, - { if (classOrObject.isTopLevel()) this else getOutermostClassOrObject(classOrObject).toLightClass()!! }, - ) { + val lightClass = if (classOrObject.isTopLevel()) this else getOutermostClassOrObject(classOrObject).toLightClass()!! + object : FakeFileForLightClass(classOrObject.containingKtFile, lightClass) { override fun findReferenceAt(offset: Int) = ktFile.findReferenceAt(offset) override fun processDeclarations(