[FIR] introduce FirReceiverParameter

^KT-54417
This commit is contained in:
Dmitrii Gridin
2022-10-12 16:26:28 +02:00
committed by Space Team
parent e6801abce8
commit be7d282974
142 changed files with 821 additions and 580 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -42,7 +42,7 @@ class FirJavaConstructor @FirImplementationDetail constructor(
override var resolvePhase: FirResolvePhase,
override val dispatchReceiverType: ConeSimpleKotlinType?,
) : FirConstructor() {
override val receiverTypeRef: FirTypeRef? get() = null
override val receiverParameter: FirReceiverParameter? get() = null
override var deprecationsProvider: DeprecationsProvider = UnresolvedDeprecationProvider
init {
@@ -96,7 +96,7 @@ class FirJavaConstructor @FirImplementationDetail constructor(
return this
}
override fun <D> transformReceiverTypeRef(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirJavaConstructor {
return this
}
@@ -133,7 +133,8 @@ class FirJavaConstructor @FirImplementationDetail constructor(
valueParameters += newValueParameters
}
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {}
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {}
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {
deprecationsProvider = newDeprecationsProvider
}
@@ -196,8 +197,8 @@ class FirJavaConstructorBuilder : FirConstructorBuilder() {
throw IllegalStateException()
}
@Deprecated("Modification of 'receiverTypeRef' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
override var receiverTypeRef: FirTypeRef?
@Deprecated("Modification of 'receiverParameter' has no impact for FirJavaConstructorBuilder", level = DeprecationLevel.HIDDEN)
override var receiverParameter: FirReceiverParameter?
get() = throw IllegalStateException()
set(@Suppress("UNUSED_PARAMETER") value) {
throw IllegalStateException()
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -52,7 +52,7 @@ class FirJavaField @FirImplementationDetail constructor(
symbol.bind(this)
}
override val receiverTypeRef: FirTypeRef? get() = null
override val receiverParameter: FirReceiverParameter? get() = null
override val isVal: Boolean get() = !isVar
override val getter: FirPropertyAccessor? get() = null
override val setter: FirPropertyAccessor? get() = null
@@ -91,7 +91,7 @@ class FirJavaField @FirImplementationDetail constructor(
return this
}
override fun <D> transformReceiverTypeRef(transformer: FirTransformer<D>, data: D): FirField {
override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirField {
return this
}
@@ -144,7 +144,7 @@ class FirJavaField @FirImplementationDetail constructor(
return this
}
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {}
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {}
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {}
override fun <D> transformDelegate(transformer: FirTransformer<D>, data: D): FirField {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -65,7 +65,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
symbol.bind(this)
}
override val receiverTypeRef: FirTypeRef?
override val receiverParameter: FirReceiverParameter?
get() = null
override val body: FirBlock?
@@ -89,7 +89,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) {
returnTypeRef.accept(visitor, data)
receiverTypeRef?.accept(visitor, data)
receiverParameter?.accept(visitor, data)
controlFlowGraphReference?.accept(visitor, data)
valueParameters.forEach { it.accept(visitor, data) }
body?.accept(visitor, data)
@@ -101,7 +101,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirSimpleFunction {
transformReturnTypeRef(transformer, data)
transformReceiverTypeRef(transformer, data)
transformReceiverParameter(transformer, data)
controlFlowGraphReference = controlFlowGraphReference?.transformSingle(transformer, data)
transformValueParameters(transformer, data)
transformBody(transformer, data)
@@ -117,7 +117,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
return this
}
override fun <D> transformReceiverTypeRef(transformer: FirTransformer<D>, data: D): FirSimpleFunction {
override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirSimpleFunction {
return this
}
@@ -156,8 +156,7 @@ class FirJavaMethod @FirImplementationDetail constructor(
returnTypeRef = newReturnTypeRef
}
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {
}
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {}
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {
deprecationsProvider = newDeprecationsProvider
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -60,7 +60,7 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
override val annotations: List<FirAnnotation> by lazy { annotationBuilder() }
override val receiverTypeRef: FirTypeRef?
override val receiverParameter: FirReceiverParameter?
get() = null
override val deprecationsProvider: DeprecationsProvider
@@ -116,7 +116,7 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
return this
}
override fun <D> transformReceiverTypeRef(transformer: FirTransformer<D>, data: D): FirValueParameter {
override fun <D> transformReceiverParameter(transformer: FirTransformer<D>, data: D): FirValueParameter {
return this
}
@@ -165,8 +165,7 @@ class FirJavaValueParameter @FirImplementationDetail constructor(
returnTypeRef = newReturnTypeRef
}
override fun replaceReceiverTypeRef(newReceiverTypeRef: FirTypeRef?) {
}
override fun replaceReceiverParameter(newReceiverParameter: FirReceiverParameter?) {}
override fun replaceDeprecationsProvider(newDeprecationsProvider: DeprecationsProvider) {
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -13,10 +13,7 @@ import org.jetbrains.kotlin.fir.caches.FirCachesFactory
import org.jetbrains.kotlin.fir.caches.createCache
import org.jetbrains.kotlin.fir.caches.firCachesFactory
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.FirConstructorBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirPrimaryConstructorBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.builder.*
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
@@ -215,7 +212,7 @@ class FirSignatureEnhancement(
val defaultQualifiers = firMethod.computeDefaultQualifiers()
val overriddenMembers = (firMethod as? FirSimpleFunction)?.overridden().orEmpty()
val hasReceiver = overriddenMembers.any { it.receiverTypeRef != null }
val hasReceiver = overriddenMembers.any { it.receiverParameter != null }
val newReceiverTypeRef = if (firMethod is FirJavaMethod && hasReceiver) {
enhanceReceiverType(firMethod, overriddenMembers, defaultQualifiers)
@@ -306,7 +303,12 @@ class FirSignatureEnhancement(
moduleData = this@FirSignatureEnhancement.moduleData
origin = FirDeclarationOrigin.Enhancement
returnTypeRef = newReturnTypeRef
receiverTypeRef = newReceiverTypeRef
receiverParameter = newReceiverTypeRef?.let { receiverType ->
buildReceiverParameter {
type = receiverType
annotations += firMethod.valueParameters.first().annotations
}
}
this.name = name!!
status = firMethod.status
symbol = FirNamedFunctionSymbol(methodId)
@@ -504,7 +506,7 @@ class FirSignatureEnhancement(
object Receiver : TypeInSignature() {
override fun getTypeRef(member: FirCallableDeclaration): FirTypeRef {
if (member is FirJavaMethod) return member.valueParameters[0].returnTypeRef
return member.receiverTypeRef!!
return member.receiverParameter?.type!!
}
}
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.
*/
@@ -166,7 +166,7 @@ class JavaOverrideChecker internal constructor(
private fun FirCallableDeclaration.isTypeParameterDependent(): Boolean =
typeParameters.isNotEmpty() || returnTypeRef.isTypeParameterDependent() ||
receiverTypeRef.isTypeParameterDependent() ||
receiverParameter?.type.isTypeParameterDependent() ||
this is FirSimpleFunction && valueParameters.any { it.returnTypeRef.isTypeParameterDependent() }
private fun FirTypeRef.extractTypeParametersTo(result: MutableCollection<FirTypeParameterRef>) {
@@ -195,7 +195,7 @@ class JavaOverrideChecker internal constructor(
private fun FirCallableDeclaration.extractTypeParametersTo(result: MutableCollection<FirTypeParameterRef>) {
result += typeParameters
returnTypeRef.extractTypeParametersTo(result)
receiverTypeRef?.extractTypeParametersTo(result)
receiverParameter?.type?.extractTypeParametersTo(result)
if (this is FirSimpleFunction) {
this.valueParameters.forEach { it.returnTypeRef.extractTypeParametersTo(result) }
}
@@ -224,7 +224,7 @@ class JavaOverrideChecker internal constructor(
baseDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES)
// NB: overrideCandidate is from Java and has no receiver
val receiverTypeRef = baseDeclaration.receiverTypeRef
val receiverTypeRef = baseDeclaration.receiverParameter?.type
val baseParameterTypes = listOfNotNull(receiverTypeRef) + baseDeclaration.valueParameters.map { it.returnTypeRef }
if (overrideCandidate.valueParameters.size != baseParameterTypes.size) return false
@@ -247,7 +247,7 @@ class JavaOverrideChecker internal constructor(
overrideCandidate.lazyResolveToPhase(FirResolvePhase.TYPES)
baseDeclaration.lazyResolveToPhase(FirResolvePhase.TYPES)
val receiverTypeRef = baseDeclaration.receiverTypeRef
val receiverTypeRef = baseDeclaration.receiverParameter?.type
return when (overrideCandidate) {
is FirSimpleFunction -> {
if (receiverTypeRef == null) {
@@ -259,7 +259,7 @@ class JavaOverrideChecker internal constructor(
}
}
is FirProperty -> {
val overrideReceiverTypeRef = overrideCandidate.receiverTypeRef
val overrideReceiverTypeRef = overrideCandidate.receiverParameter?.type
return when {
receiverTypeRef == null -> overrideReceiverTypeRef == null
overrideReceiverTypeRef == null -> false
@@ -1,12 +1,15 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Copyright 2010-2022 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.fir.resolve.calls.jvm
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirConstructor
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.declarations.FirVariable
import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.resolve.BodyResolveComponents
import org.jetbrains.kotlin.fir.resolve.calls.AbstractConeCallConflictResolver
@@ -58,7 +61,7 @@ class ConeEquivalentCallConflictResolver(
): Boolean {
if (first.symbol.callableId != second.symbol.callableId) return false
if (first.isExpect != second.isExpect) return false
if (first.receiverTypeRef?.coneType != second.receiverTypeRef?.coneType) {
if (first.receiverParameter?.type?.coneType != second.receiverParameter?.type?.coneType) {
return false
}
if (first is FirVariable != second is FirVariable) {