[FIR IDE] Implement pointers for JavaField and SyntheticJavaProperty symbols

This commit is contained in:
Roman Golyshev
2021-09-20 22:07:44 +03:00
committed by teamcityserver
parent b0088fd06d
commit 39116853d2
4 changed files with 78 additions and 2 deletions
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.isStatic
import org.jetbrains.kotlin.analysis.api.fir.findPsi
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaFieldSymbolPointer
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
@@ -48,7 +50,10 @@ internal class KtFirJavaFieldSymbol(
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
override fun createPointer(): KtSymbolPointer<KtJavaFieldSymbol> {
TODO("Creating pointers for java fields is not supported yet")
val containingClassId = firRef.withFir { it.containingClass()?.classId }
?: error("Cannot find parent class for java field $callableIdIfNonLocal")
return KtFirJavaFieldSymbolPointer(containingClassId, name)
}
override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -18,6 +18,7 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
import org.jetbrains.kotlin.analysis.api.fir.symbols.annotations.containsAnnotation
import org.jetbrains.kotlin.analysis.api.fir.symbols.annotations.getAnnotationClassIds
import org.jetbrains.kotlin.analysis.api.fir.symbols.annotations.toAnnotationsList
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaSyntheticPropertySymbolPointer
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
import org.jetbrains.kotlin.analysis.api.fir.utils.convertConstantExpression
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
@@ -95,7 +97,10 @@ internal class KtFirSyntheticJavaPropertySymbol(
override val origin: KtSymbolOrigin get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY }
override fun createPointer(): KtSymbolPointer<KtSyntheticJavaPropertySymbol> {
TODO("pointers to KtSyntheticJavaPropertySymbol is not supported yet")
val containingClassId = firRef.withFir { it.containingClass()?.classId }
?: error("Cannot find parent class for synthetic java property $callableIdIfNonLocal")
return KtFirJavaSyntheticPropertySymbolPointer(containingClassId, name)
}
override fun equals(other: Any?): Boolean = symbolEquals(other)
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2021 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.
*/
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.getProperties
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
internal class KtFirJavaFieldSymbolPointer(
containingClassId: ClassId,
private val fieldName: Name
) : KtFirMemberSymbolPointer<KtJavaFieldSymbol>(containingClassId) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope,
firSession: FirSession
): KtJavaFieldSymbol? {
val javaField =
candidates.getProperties(fieldName)
.mapNotNull { it.fir as? FirJavaField }
.singleOrNull()
?: return null
return firSymbolBuilder.variableLikeBuilder.buildFieldSymbol(javaField)
}
}
@@ -0,0 +1,33 @@
/*
* Copyright 2010-2021 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.
*/
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.symbols.KtSyntheticJavaPropertySymbol
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.getProperties
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.Name
internal class KtFirJavaSyntheticPropertySymbolPointer(
containingClassId: ClassId,
private val propertyName: Name
) : KtFirMemberSymbolPointer<KtSyntheticJavaPropertySymbol>(containingClassId) {
override fun KtFirAnalysisSession.chooseCandidateAndCreateSymbol(
candidates: FirScope,
firSession: FirSession
): KtSyntheticJavaPropertySymbol? {
val syntheticProperty =
candidates.getProperties(propertyName)
.mapNotNull { it.fir as? FirSyntheticProperty }
.singleOrNull()
?: return null
return firSymbolBuilder.variableLikeBuilder.buildSyntheticJavaPropertySymbol(syntheticProperty)
}
}