diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt index 3c6ca01f7c2..101275220fa 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirJavaFieldSymbol.kt @@ -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 { - 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) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt index 280502a647d..982234ee7bb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirSyntheticJavaPropertySymbol.kt @@ -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 { - 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) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt new file mode 100644 index 00000000000..5f1c336c426 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaFieldSymbolPointer.kt @@ -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(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) + } +} \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt new file mode 100644 index 00000000000..915926547f7 --- /dev/null +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/pointers/KtFirJavaSyntheticPropertySymbolPointer.kt @@ -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(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) + } +} \ No newline at end of file