FIR IDE: build KtJavaFieldSymbol only for Java fields

This commit is contained in:
Ilya Kirillov
2021-03-15 18:24:40 +01:00
parent 8bf339a7cf
commit 010f1cb634
4 changed files with 18 additions and 5 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.fir.declarations.builder package org.jetbrains.kotlin.fir.declarations.builder
import kotlin.contracts.* import kotlin.contracts.*
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder
@@ -51,6 +52,7 @@ open class FirFieldBuilder : FirAnnotationContainerBuilder {
open var containerSource: DeserializedContainerSource? = null open var containerSource: DeserializedContainerSource? = null
open var dispatchReceiverType: ConeKotlinType? = null open var dispatchReceiverType: ConeKotlinType? = null
@OptIn(FirImplementationDetail::class)
override fun build(): FirField { override fun build(): FirField {
return FirFieldImpl( return FirFieldImpl(
source, source,
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.declarations.impl package org.jetbrains.kotlin.fir.declarations.impl
import org.jetbrains.kotlin.fir.FirImplementationDetail
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.FirSourceElement
import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes import org.jetbrains.kotlin.fir.declarations.FirDeclarationAttributes
@@ -29,7 +30,7 @@ import org.jetbrains.kotlin.fir.visitors.*
* DO NOT MODIFY IT MANUALLY * DO NOT MODIFY IT MANUALLY
*/ */
internal class FirFieldImpl( class FirFieldImpl @FirImplementationDetail constructor(
override val source: FirSourceElement?, override val source: FirSourceElement?,
override val session: FirSession, override val session: FirSession,
override var resolvePhase: FirResolvePhase, override var resolvePhase: FirResolvePhase,
@@ -209,6 +209,7 @@ object ImplementationConfigurator : AbstractFirTreeImplementationConfigurator()
value = "!isVar" value = "!isVar"
withGetter = true withGetter = true
} }
publicImplementation()
defaultNull("delegateFieldSymbol", "receiverTypeRef", "delegate", "getter", "setter", withGetter = true) defaultNull("delegateFieldSymbol", "receiverTypeRef", "delegate", "getter", "setter", withGetter = true)
} }
@@ -8,11 +8,12 @@ package org.jetbrains.kotlin.idea.frontend.api.fir
import com.google.common.collect.MapMaker import com.google.common.collect.MapMaker
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias import org.jetbrains.kotlin.fir.resolve.calls.originalConstructorIfTypeAlias
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.resolve.symbolProvider import org.jetbrains.kotlin.fir.resolve.symbolProvider
import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag
import org.jetbrains.kotlin.fir.resolve.inference.isFunctionalType import org.jetbrains.kotlin.fir.resolve.inference.isFunctionalType
@@ -236,10 +237,18 @@ internal class KtSymbolByFirBuilder private constructor(
} }
// todo handle cases
fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol { fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol {
if (!fir.isJavaFieldOrSubstitutionOverrideOfJavaField()) {
error("Could not build symbol for non-Java field symbol")
}
return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) } return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
} }
private fun FirField.isJavaFieldOrSubstitutionOverrideOfJavaField(): Boolean = when (this) {
is FirJavaField -> true
is FirFieldImpl -> (this as FirField).originalForSubstitutionOverride?.isJavaFieldOrSubstitutionOverrideOfJavaField() == true
else -> throwUnexpectedElementError(this)
}
} }
inner class CallableSymbolBuilder { inner class CallableSymbolBuilder {
@@ -309,7 +318,7 @@ internal class KtSymbolByFirBuilder private constructor(
} }
} }
companion object { companion object {
private fun throwUnexpectedElementError(element: Any): Nothing { private fun throwUnexpectedElementError(element: Any): Nothing {
error("Unexpected ${element::class.simpleName}") error("Unexpected ${element::class.simpleName}")