[FIR] introduce FirReceiverParameter
^KT-54417
This commit is contained in:
committed by
Space Team
parent
e6801abce8
commit
be7d282974
+7
-6
@@ -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
|
||||
|
||||
+4
-5
@@ -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) {
|
||||
|
||||
|
||||
+10
-8
@@ -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
|
||||
|
||||
+6
-3
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user