IR: make IrMemberAccessExpression and subtypes classes

Merge IrMemberAccessExpressionBase into IrMemberAccessExpression, and
IrCallWithIndexedArgumentsBase into IrFunctionAccessExpression (extract
the latter into a separate file).
This commit is contained in:
Alexander Udalov
2020-07-22 17:55:33 +02:00
parent fde7314aaf
commit ee904a975a
15 changed files with 102 additions and 127 deletions
@@ -18,6 +18,9 @@ package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
interface IrCall : IrFunctionAccessExpression { abstract class IrCall(
val superQualifierSymbol: IrClassSymbol? typeArgumentsCount: Int,
valueArgumentsCount: Int,
) : IrFunctionAccessExpression(typeArgumentsCount, valueArgumentsCount) {
abstract val superQualifierSymbol: IrClassSymbol?
} }
@@ -19,12 +19,12 @@ package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
interface IrCallableReference<S : IrSymbol> : IrMemberAccessExpression<S> { abstract class IrCallableReference<S : IrSymbol>(typeArgumentsCount: Int) : IrMemberAccessExpression<S>(typeArgumentsCount) {
val referencedName: Name abstract val referencedName: Name
} }
interface IrFunctionReference : IrCallableReference<IrFunctionSymbol> { abstract class IrFunctionReference(typeArgumentsCount: Int) : IrCallableReference<IrFunctionSymbol>(typeArgumentsCount) {
val reflectionTarget: IrFunctionSymbol? abstract val reflectionTarget: IrFunctionSymbol?
} }
val IrFunctionReference.isWithReflection: Boolean val IrFunctionReference.isWithReflection: Boolean
@@ -33,14 +33,20 @@ val IrFunctionReference.isWithReflection: Boolean
val IrFunctionReference.isAdapterWithReflection: Boolean val IrFunctionReference.isAdapterWithReflection: Boolean
get() = reflectionTarget != null && reflectionTarget != symbol get() = reflectionTarget != null && reflectionTarget != symbol
interface IrPropertyReference : IrCallableReference<IrPropertySymbol> { abstract class IrPropertyReference(typeArgumentsCount: Int) : IrCallableReference<IrPropertySymbol>(typeArgumentsCount) {
val field: IrFieldSymbol? abstract val field: IrFieldSymbol?
val getter: IrSimpleFunctionSymbol? abstract val getter: IrSimpleFunctionSymbol?
val setter: IrSimpleFunctionSymbol? abstract val setter: IrSimpleFunctionSymbol?
override val valueArgumentsCount: Int
get() = 0
} }
interface IrLocalDelegatedPropertyReference : IrCallableReference<IrLocalDelegatedPropertySymbol> { abstract class IrLocalDelegatedPropertyReference : IrCallableReference<IrLocalDelegatedPropertySymbol>(0) {
val delegate: IrVariableSymbol abstract val delegate: IrVariableSymbol
val getter: IrSimpleFunctionSymbol abstract val getter: IrSimpleFunctionSymbol
val setter: IrSimpleFunctionSymbol? abstract val setter: IrSimpleFunctionSymbol?
override val valueArgumentsCount: Int
get() = 0
} }
@@ -8,10 +8,13 @@ package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
interface IrConstructorCall : IrFunctionAccessExpression { abstract class IrConstructorCall(
override val symbol: IrConstructorSymbol typeArgumentsCount: Int,
valueArgumentsCount: Int,
) : IrFunctionAccessExpression(typeArgumentsCount, valueArgumentsCount) {
abstract override val symbol: IrConstructorSymbol
val constructorTypeArgumentsCount: Int abstract val constructorTypeArgumentsCount: Int
class ConstructorTypeArguments(internal val irConstructorCall: IrConstructorCall) : AbstractList<IrType?>() { class ConstructorTypeArguments(internal val irConstructorCall: IrConstructorCall) : AbstractList<IrType?>() {
override val size: Int override val size: Int
@@ -76,4 +79,4 @@ var IrConstructorCall.outerClassReceiver: IrExpression?
get() = dispatchReceiver get() = dispatchReceiver
set(value) { set(value) {
dispatchReceiver = value dispatchReceiver = value
} }
@@ -18,7 +18,9 @@ package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
interface IrDelegatingConstructorCall : IrFunctionAccessExpression { abstract class IrDelegatingConstructorCall(
override val symbol: IrConstructorSymbol typeArgumentsCount: Int,
valueArgumentsCount: Int,
) : IrFunctionAccessExpression(typeArgumentsCount, valueArgumentsCount) {
abstract override val symbol: IrConstructorSymbol
} }
@@ -18,7 +18,9 @@ package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
abstract class IrEnumConstructorCall(
interface IrEnumConstructorCall : IrFunctionAccessExpression { typeArgumentsCount: Int,
override val symbol: IrConstructorSymbol valueArgumentsCount: Int,
) : IrFunctionAccessExpression(typeArgumentsCount, valueArgumentsCount) {
abstract override val symbol: IrConstructorSymbol
} }
@@ -1,30 +1,19 @@
/* /*
* Copyright 2010-2016 JetBrains s.r.o. * Copyright 2010-2020 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.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/ */
package org.jetbrains.kotlin.ir.expressions.impl package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrCallWithIndexedArgumentsBase( abstract class IrFunctionAccessExpression(
typeArgumentsCount: Int, typeArgumentsCount: Int,
final override val valueArgumentsCount: Int, final override val valueArgumentsCount: Int,
) : IrMemberAccessExpressionBase<IrFunctionSymbol>(typeArgumentsCount) { ) : IrMemberAccessExpression<IrFunctionSymbol>(typeArgumentsCount) {
private val argumentsByParameterIndex: Array<IrExpression?> = arrayOfNulls(valueArgumentsCount) private val argumentsByParameterIndex: Array<IrExpression?> = arrayOfNulls(valueArgumentsCount)
override fun getValueArgument(index: Int): IrExpression? { override fun getValueArgument(index: Int): IrExpression? {
@@ -57,3 +46,6 @@ abstract class IrCallWithIndexedArgumentsBase(
} }
} }
} }
fun IrFunctionAccessExpression.putArgument(parameter: IrValueParameter, argument: IrExpression) =
putArgument(symbol.owner, parameter, argument)
@@ -5,33 +5,62 @@
package org.jetbrains.kotlin.ir.expressions package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.PropertyAccessorDescriptor
import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrTypeParameter
import org.jetbrains.kotlin.ir.declarations.IrValueParameter import org.jetbrains.kotlin.ir.declarations.IrValueParameter
import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBase
import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.defaultType import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
interface IrMemberAccessExpression<S : IrSymbol> : IrDeclarationReference { abstract class IrMemberAccessExpression<S : IrSymbol>(
var dispatchReceiver: IrExpression?
var extensionReceiver: IrExpression?
override val symbol: S
val origin: IrStatementOrigin?
val typeArgumentsCount: Int val typeArgumentsCount: Int
fun getTypeArgument(index: Int): IrType? ) : IrExpressionBase(), IrDeclarationReference {
fun putTypeArgument(index: Int, type: IrType?) var dispatchReceiver: IrExpression? = null
var extensionReceiver: IrExpression? = null
val valueArgumentsCount: Int abstract override val symbol: S
fun getValueArgument(index: Int): IrExpression?
fun putValueArgument(index: Int, valueArgument: IrExpression?) abstract val origin: IrStatementOrigin?
fun removeValueArgument(index: Int) abstract val valueArgumentsCount: Int
abstract fun getValueArgument(index: Int): IrExpression?
abstract fun putValueArgument(index: Int, valueArgument: IrExpression?)
abstract fun removeValueArgument(index: Int)
private val typeArgumentsByIndex = arrayOfNulls<IrType>(typeArgumentsCount)
fun getTypeArgument(index: Int): IrType? {
if (index >= typeArgumentsCount) {
throw AssertionError("$this: No such type argument slot: $index")
}
return typeArgumentsByIndex[index]
}
fun putTypeArgument(index: Int, type: IrType?) {
if (index >= typeArgumentsCount) {
throw AssertionError("$this: No such type argument slot: $index")
}
typeArgumentsByIndex[index] = type
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
dispatchReceiver?.accept(visitor, data)
extensionReceiver?.accept(visitor, data)
}
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
dispatchReceiver = dispatchReceiver?.transform(transformer, data)
extensionReceiver = extensionReceiver?.transform(transformer, data)
}
} }
fun IrMemberAccessExpression<*>.getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): IrType? = fun IrMemberAccessExpression<*>.getTypeArgument(typeParameterDescriptor: TypeParameterDescriptor): IrType? =
@@ -66,8 +95,6 @@ val CallableDescriptor.typeParametersCount: Int
fun IrMemberAccessExpression<*>.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) = fun IrMemberAccessExpression<*>.getTypeArgumentOrDefault(irTypeParameter: IrTypeParameter) =
getTypeArgument(irTypeParameter.index) ?: irTypeParameter.defaultType getTypeArgument(irTypeParameter.index) ?: irTypeParameter.defaultType
interface IrFunctionAccessExpression : IrMemberAccessExpression<IrFunctionSymbol>
fun IrMemberAccessExpression<*>.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) = fun IrMemberAccessExpression<*>.getValueArgument(valueParameterDescriptor: ValueParameterDescriptor) =
getValueArgument(valueParameterDescriptor.index) getValueArgument(valueParameterDescriptor.index)
@@ -112,6 +139,3 @@ fun IrMemberAccessExpression<*>.putArgument(callee: IrFunction, parameter: IrVal
callee.extensionReceiverParameter -> extensionReceiver = argument callee.extensionReceiverParameter -> extensionReceiver = argument
else -> putValueArgument(parameter.index, argument) else -> putValueArgument(parameter.index, argument)
} }
fun IrFunctionAccessExpression.putArgument(parameter: IrValueParameter, argument: IrExpression) =
putArgument(symbol.owner, parameter, argument)
@@ -36,7 +36,7 @@ class IrCallImpl(
valueArgumentsCount: Int, valueArgumentsCount: Int,
override val origin: IrStatementOrigin? = null, override val origin: IrStatementOrigin? = null,
override val superQualifierSymbol: IrClassSymbol? = null override val superQualifierSymbol: IrClassSymbol? = null
) : IrCallWithIndexedArgumentsBase(typeArgumentsCount, valueArgumentsCount), IrCall { ) : IrCall(typeArgumentsCount, valueArgumentsCount) {
init { init {
if (symbol is IrConstructorSymbol) { if (symbol is IrConstructorSymbol) {
throw AssertionError("Should be IrConstructorCall: ${this.render()}") throw AssertionError("Should be IrConstructorCall: ${this.render()}")
@@ -23,7 +23,7 @@ class IrConstructorCallImpl(
override val constructorTypeArgumentsCount: Int, override val constructorTypeArgumentsCount: Int,
valueArgumentsCount: Int, valueArgumentsCount: Int,
override val origin: IrStatementOrigin? = null, override val origin: IrStatementOrigin? = null,
) : IrCallWithIndexedArgumentsBase(typeArgumentsCount, valueArgumentsCount), IrConstructorCall { ) : IrConstructorCall(typeArgumentsCount, valueArgumentsCount) {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R = override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitConstructorCall(this, data) visitor.visitConstructorCall(this, data)
@@ -31,7 +31,7 @@ class IrDelegatingConstructorCallImpl(
override val symbol: IrConstructorSymbol, override val symbol: IrConstructorSymbol,
typeArgumentsCount: Int, typeArgumentsCount: Int,
valueArgumentsCount: Int valueArgumentsCount: Int
) : IrCallWithIndexedArgumentsBase(typeArgumentsCount, valueArgumentsCount), IrDelegatingConstructorCall { ) : IrDelegatingConstructorCall(typeArgumentsCount, valueArgumentsCount) {
override val origin: IrStatementOrigin? override val origin: IrStatementOrigin?
get() = null get() = null
@@ -30,7 +30,7 @@ class IrEnumConstructorCallImpl(
override val symbol: IrConstructorSymbol, override val symbol: IrConstructorSymbol,
typeArgumentsCount: Int, typeArgumentsCount: Int,
valueArgumentsCount: Int valueArgumentsCount: Int
) : IrCallWithIndexedArgumentsBase(typeArgumentsCount, valueArgumentsCount), IrEnumConstructorCall { ) : IrEnumConstructorCall(typeArgumentsCount, valueArgumentsCount) {
override val origin: IrStatementOrigin? override val origin: IrStatementOrigin?
get() = null get() = null
@@ -35,7 +35,7 @@ class IrFunctionReferenceImpl(
override val valueArgumentsCount: Int, override val valueArgumentsCount: Int,
override val reflectionTarget: IrFunctionSymbol? = symbol, override val reflectionTarget: IrFunctionSymbol? = symbol,
override val origin: IrStatementOrigin? = null, override val origin: IrStatementOrigin? = null,
) : IrMemberAccessExpressionBase<IrFunctionSymbol>(typeArgumentsCount), IrFunctionReference { ) : IrFunctionReference(typeArgumentsCount) {
@ObsoleteDescriptorBasedAPI @ObsoleteDescriptorBasedAPI
constructor( constructor(
startOffset: Int, startOffset: Int,
@@ -35,7 +35,7 @@ class IrLocalDelegatedPropertyReferenceImpl(
override val getter: IrSimpleFunctionSymbol, override val getter: IrSimpleFunctionSymbol,
override val setter: IrSimpleFunctionSymbol?, override val setter: IrSimpleFunctionSymbol?,
override val origin: IrStatementOrigin? = null, override val origin: IrStatementOrigin? = null,
) : IrMemberAccessExpressionBase<IrLocalDelegatedPropertySymbol>(0), IrLocalDelegatedPropertyReference { ) : IrLocalDelegatedPropertyReference() {
override val valueArgumentsCount: Int override val valueArgumentsCount: Int
get() = 0 get() = 0
@@ -1,57 +0,0 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrMemberAccessExpression
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
abstract class IrMemberAccessExpressionBase<S : IrSymbol>(
final override val typeArgumentsCount: Int
) : IrExpressionBase(), IrMemberAccessExpression<S> {
override var dispatchReceiver: IrExpression? = null
override var extensionReceiver: IrExpression? = null
private val typeArgumentsByIndex = arrayOfNulls<IrType>(typeArgumentsCount)
override fun getTypeArgument(index: Int): IrType? {
if (index >= typeArgumentsCount) {
throw AssertionError("$this: No such type argument slot: $index")
}
return typeArgumentsByIndex[index]
}
override fun putTypeArgument(index: Int, type: IrType?) {
if (index >= typeArgumentsCount) {
throw AssertionError("$this: No such type argument slot: $index")
}
typeArgumentsByIndex[index] = type
}
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
dispatchReceiver?.accept(visitor, data)
extensionReceiver?.accept(visitor, data)
}
override fun <D> transformChildren(transformer: IrElementTransformer<D>, data: D) {
dispatchReceiver = dispatchReceiver?.transform(transformer, data)
extensionReceiver = extensionReceiver?.transform(transformer, data)
}
}
@@ -36,7 +36,7 @@ class IrPropertyReferenceImpl(
override val getter: IrSimpleFunctionSymbol?, override val getter: IrSimpleFunctionSymbol?,
override val setter: IrSimpleFunctionSymbol?, override val setter: IrSimpleFunctionSymbol?,
override val origin: IrStatementOrigin? = null, override val origin: IrStatementOrigin? = null,
) : IrMemberAccessExpressionBase<IrPropertySymbol>(typeArgumentsCount), IrPropertyReference { ) : IrPropertyReference(typeArgumentsCount) {
override val valueArgumentsCount: Int override val valueArgumentsCount: Int
get() = 0 get() = 0