[AA] KT-56617 Implement equals/hashCode without accessing firSymbol
This commit is contained in:
committed by
Space Team
parent
46d443770e
commit
26e2c48a46
+23
-4
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||||
|
|
||||||
|
import com.intellij.codeInsight.PsiEquivalenceUtil
|
||||||
import com.intellij.psi.PsiClass
|
import com.intellij.psi.PsiClass
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisApiInternals
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||||
@@ -47,6 +48,12 @@ internal class KtFirPsiJavaClassSymbol(
|
|||||||
override val psi: PsiClass,
|
override val psi: PsiClass,
|
||||||
override val analysisSession: KtFirAnalysisSession,
|
override val analysisSession: KtFirAnalysisSession,
|
||||||
) : KtNamedClassOrObjectSymbol(), KtFirPsiSymbol<PsiClass, FirRegularClassSymbol> {
|
) : KtNamedClassOrObjectSymbol(), KtFirPsiSymbol<PsiClass, FirRegularClassSymbol> {
|
||||||
|
init {
|
||||||
|
require(psi.qualifiedName != null) {
|
||||||
|
"${KtFirPsiJavaClassSymbol::class.simpleName} requires a PSI class with a qualified name."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [javaClass] is used to defer some properties to the compiler's view of a Java class.
|
* [javaClass] is used to defer some properties to the compiler's view of a Java class.
|
||||||
*/
|
*/
|
||||||
@@ -56,6 +63,9 @@ internal class KtFirPsiJavaClassSymbol(
|
|||||||
|
|
||||||
override val classIdIfNonLocal: ClassId? by cached { psi.classIdIfNonLocal }
|
override val classIdIfNonLocal: ClassId? by cached { psi.classIdIfNonLocal }
|
||||||
|
|
||||||
|
private val qualifiedName: String
|
||||||
|
get() = withValidityAssertion { psi.qualifiedName!! }
|
||||||
|
|
||||||
override val origin: KtSymbolOrigin
|
override val origin: KtSymbolOrigin
|
||||||
get() = withValidityAssertion { KtSymbolOrigin.JAVA }
|
get() = withValidityAssertion { KtSymbolOrigin.JAVA }
|
||||||
|
|
||||||
@@ -90,6 +100,19 @@ internal class KtFirPsiJavaClassSymbol(
|
|||||||
|
|
||||||
override val contextReceivers: List<KtContextReceiver> get() = withValidityAssertion { emptyList() }
|
override val contextReceivers: List<KtContextReceiver> get() = withValidityAssertion { emptyList() }
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (other === this) return true
|
||||||
|
if (other == null || other !is KtNamedClassOrObjectSymbol) return false
|
||||||
|
|
||||||
|
val otherPsiClass = other.psi as? PsiClass ?: return false
|
||||||
|
return PsiEquivalenceUtil.areElementsEquivalent(psi, otherPsiClass)
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Since [PsiEquivalenceUtil] doesn't have a hash code function, we use the class's fully qualified name as a conservative hash code.
|
||||||
|
*/
|
||||||
|
override fun hashCode(): Int = qualifiedName.hashCode()
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// Slow Operations (requiring access to the underlying FIR class symbol)
|
// Slow Operations (requiring access to the underlying FIR class symbol)
|
||||||
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
@@ -121,8 +144,4 @@ internal class KtFirPsiJavaClassSymbol(
|
|||||||
override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> = withValidityAssertion {
|
override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> = withValidityAssertion {
|
||||||
createNamedClassOrObjectSymbolPointer()
|
createNamedClassOrObjectSymbolPointer()
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO (marco): Can we implement equality and hash code without falling back to the symbol?
|
|
||||||
override fun equals(other: Any?): Boolean = symbolEquals(other)
|
|
||||||
override fun hashCode(): Int = symbolHashCode()
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user