Introduce IrGetValue as a replacement for IrThisReference / IrGetExtensionReceiver / IrGetVariable.

This commit is contained in:
Dmitry Petrov
2016-09-30 17:45:41 +03:00
parent 8efe326904
commit a51efaacc9
82 changed files with 409 additions and 457 deletions
@@ -1,26 +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
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
interface IrGetExtensionReceiver : IrDeclarationReference, IrExpressionWithCopy {
override val descriptor: ReceiverParameterDescriptor
override fun copy(): IrGetExtensionReceiver
}
@@ -1,29 +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
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
interface IrThisReference : IrExpression, IrExpressionWithCopy {
val classDescriptor: ClassDescriptor
override fun copy(): IrThisReference
}
val IrThisReference.receiverParameter: ReceiverParameterDescriptor
get() = classDescriptor.thisAsReceiverParameter
@@ -16,18 +16,20 @@
package org.jetbrains.kotlin.ir.expressions
import org.jetbrains.kotlin.descriptors.ValueDescriptor
import org.jetbrains.kotlin.descriptors.VariableDescriptor
interface IrVariableAccessExpression : IrDeclarationReference {
override val descriptor: VariableDescriptor
interface IrValueAccessExpression : IrDeclarationReference {
override val descriptor: ValueDescriptor
val origin: IrStatementOrigin?
}
interface IrGetVariable : IrVariableAccessExpression, IrExpressionWithCopy {
override fun copy(): IrGetVariable
interface IrGetValue : IrValueAccessExpression, IrExpressionWithCopy {
override fun copy(): IrGetValue
}
interface IrSetVariable : IrVariableAccessExpression {
interface IrSetVariable : IrValueAccessExpression {
override val descriptor: VariableDescriptor
var value: IrExpression
}
@@ -1,33 +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.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.ir.expressions.IrGetExtensionReceiver
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrGetExtensionReceiverImpl(
startOffset: Int,
endOffset: Int,
descriptor: ReceiverParameterDescriptor
) : IrTerminalDeclarationReferenceBase<ReceiverParameterDescriptor>(startOffset, endOffset, descriptor.type, descriptor), IrGetExtensionReceiver {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitGetExtensionReceiver(this, data)
override fun copy(): IrGetExtensionReceiver =
IrGetExtensionReceiverImpl(startOffset, endOffset, descriptor)
}
@@ -16,19 +16,18 @@
package org.jetbrains.kotlin.ir.expressions.impl
import org.jetbrains.kotlin.descriptors.VariableDescriptor
import org.jetbrains.kotlin.ir.expressions.IrGetVariable
import org.jetbrains.kotlin.descriptors.ValueDescriptor
import org.jetbrains.kotlin.ir.expressions.IrGetValue
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
import org.jetbrains.kotlin.ir.expressions.impl.IrTerminalDeclarationReferenceBase
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
class IrGetVariableImpl(
startOffset: Int, endOffset: Int, descriptor: VariableDescriptor,
class IrGetValueImpl(
startOffset: Int, endOffset: Int, descriptor: ValueDescriptor,
override val origin: IrStatementOrigin? = null
) : IrTerminalDeclarationReferenceBase<VariableDescriptor>(startOffset, endOffset, descriptor.type, descriptor), IrGetVariable {
) : IrTerminalDeclarationReferenceBase<ValueDescriptor>(startOffset, endOffset, descriptor.type, descriptor), IrGetValue {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitGetVariable(this, data)
visitor.visitGetValue(this, data)
override fun copy(): IrGetVariable =
IrGetVariableImpl(startOffset, endOffset, descriptor, origin)
override fun copy(): IrGetValue =
IrGetValueImpl(startOffset, endOffset, descriptor, origin)
}
@@ -1,35 +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.descriptors.ClassDescriptor
import org.jetbrains.kotlin.ir.expressions.IrThisReference
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.types.KotlinType
class IrThisReferenceImpl(
startOffset: Int,
endOffset: Int,
type: KotlinType,
override val classDescriptor: ClassDescriptor
) : IrTerminalExpressionBase(startOffset, endOffset, type), IrThisReference {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitThisReference(this, data)
override fun copy(): IrThisReference =
IrThisReferenceImpl(startOffset, endOffset, type, classDescriptor)
}
@@ -48,6 +48,7 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
protected open fun mapSuperQualifier(qualifier: ClassDescriptor?) = qualifier
protected open fun mapClassReference(descriptor: ClassDescriptor) = descriptor
protected open fun mapValueReference(descriptor: ValueDescriptor) = descriptor
protected open fun mapVariableReference(descriptor: VariableDescriptor) = descriptor
protected open fun mapPropertyReference(descriptor: PropertyDescriptor) = descriptor
protected open fun mapReceiverParameterReference(descriptor: ReceiverParameterDescriptor) = descriptor
@@ -234,13 +235,6 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
expression.arguments.map { it.transform(this, null) }
)
override fun visitThisReference(expression: IrThisReference): IrThisReference =
IrThisReferenceImpl(
expression.startOffset, expression.endOffset,
expression.type,
mapClassReference(expression.classDescriptor)
)
override fun visitGetObjectValue(expression: IrGetObjectValue): IrGetObjectValue =
IrGetObjectValueImpl(
expression.startOffset, expression.endOffset,
@@ -255,10 +249,10 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapClassReference(expression.descriptor)
)
override fun visitGetVariable(expression: IrGetVariable): IrGetVariable =
IrGetVariableImpl(
override fun visitGetValue(expression: IrGetValue): IrGetValue =
IrGetValueImpl(
expression.startOffset, expression.endOffset,
mapVariableReference(expression.descriptor),
mapValueReference(expression.descriptor),
mapStatementOrigin(expression.origin)
)
@@ -289,12 +283,6 @@ open class DeepCopyIrTree : IrElementTransformerVoid() {
mapSuperQualifier(expression.superQualifier)
)
override fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver): IrGetExtensionReceiver =
IrGetExtensionReceiverImpl(
expression.startOffset, expression.endOffset,
mapReceiverParameterReference(expression.descriptor)
)
override fun visitCall(expression: IrCall): IrCall =
shallowCopyCall(expression).transformValueArguments(expression)
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.ir.util
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.expressions.*
@@ -102,12 +103,6 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitReturn(expression: IrReturn, data: Nothing?): String =
"RETURN type=${expression.type.render()} from='${expression.returnTarget.ref()}'"
override fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver, data: Nothing?): String =
"\$RECEIVER of '${expression.descriptor.containingDeclaration.ref()}' type=${expression.type.render()}"
override fun visitThisReference(expression: IrThisReference, data: Nothing?): String =
"THIS of '${expression.classDescriptor.ref()}' type=${expression.type.render()}"
override fun visitCall(expression: IrCall, data: Nothing?): String =
"CALL '${expression.descriptor.ref()}' ${expression.renderSuperQualifier()}" +
"type=${expression.type.render()} origin=${expression.origin}"
@@ -124,7 +119,7 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: Nothing?): String =
"INSTANCE_INITIALIZER_CALL classDescriptor='${expression.classDescriptor.ref()}'"
override fun visitGetVariable(expression: IrGetVariable, data: Nothing?): String =
override fun visitGetValue(expression: IrGetValue, data: Nothing?): String =
"GET_VAR '${expression.descriptor.ref()}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?): String =
@@ -212,7 +207,10 @@ class RenderIrElementVisitor : IrElementVisitor<String, Nothing?> {
DECLARATION_RENDERER.render(this.descriptor)
internal fun DeclarationDescriptor.ref(): String =
REFERENCE_RENDERER.render(this)
if (this is ReceiverParameterDescriptor)
"<receiver: ${containingDeclaration.ref()}>"
else
REFERENCE_RENDERER.render(this)
internal fun KotlinType.render(): String =
DECLARATION_RENDERER.renderType(this)
@@ -65,19 +65,17 @@ interface IrElementTransformer<in D> : IrElementVisitor<IrElement, D> {
override fun visitBlock(expression: IrBlock, data: D) = visitContainerExpression(expression, data)
override fun visitComposite(expression: IrComposite, data: D) = visitContainerExpression(expression, data)
override fun visitStringConcatenation(expression: IrStringConcatenation, data: D) = visitExpression(expression, data)
override fun visitThisReference(expression: IrThisReference, data: D) = visitExpression(expression, data)
override fun visitDeclarationReference(expression: IrDeclarationReference, data: D) = visitExpression(expression, data)
override fun visitSingletonReference(expression: IrGetSingletonValue, data: D) = visitDeclarationReference(expression, data)
override fun visitGetObjectValue(expression: IrGetObjectValue, data: D) = visitSingletonReference(expression, data)
override fun visitGetEnumValue(expression: IrGetEnumValue, data: D) = visitSingletonReference(expression, data)
override fun visitVariableAccess(expression: IrVariableAccessExpression, data: D) = visitDeclarationReference(expression, data)
override fun visitGetVariable(expression: IrGetVariable, data: D) = visitVariableAccess(expression, data)
override fun visitSetVariable(expression: IrSetVariable, data: D) = visitVariableAccess(expression, data)
override fun visitValueAccess(expression: IrValueAccessExpression, data: D) = visitDeclarationReference(expression, data)
override fun visitGetValue(expression: IrGetValue, data: D) = visitValueAccess(expression, data)
override fun visitSetVariable(expression: IrSetVariable, data: D) = visitValueAccess(expression, data)
override fun visitFieldAccess(expression: IrFieldAccessExpression, data: D) = visitDeclarationReference(expression, data)
override fun visitGetField(expression: IrGetField, data: D) = visitFieldAccess(expression, data)
override fun visitSetField(expression: IrSetField, data: D) = visitFieldAccess(expression, data)
override fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver, data: D) = visitDeclarationReference(expression, data)
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: D): IrElement = visitDeclarationReference(expression, data)
override fun visitCall(expression: IrCall, data: D) = visitMemberAccess(expression, data)
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: D) = visitMemberAccess(expression, data)
@@ -101,9 +101,6 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
open fun visitStringConcatenation(expression: IrStringConcatenation) = visitExpression(expression)
override final fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?) = visitStringConcatenation(expression)
open fun visitThisReference(expression: IrThisReference) = visitExpression(expression)
override final fun visitThisReference(expression: IrThisReference, data: Nothing?) = visitThisReference(expression)
open fun visitDeclarationReference(expression: IrDeclarationReference) = visitExpression(expression)
override final fun visitDeclarationReference(expression: IrDeclarationReference, data: Nothing?) = visitDeclarationReference(expression)
@@ -116,13 +113,13 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
open fun visitGetEnumValue(expression: IrGetEnumValue) = visitSingletonReference(expression)
override final fun visitGetEnumValue(expression: IrGetEnumValue, data: Nothing?) = visitGetEnumValue(expression)
open fun visitVariableAccess(expression: IrVariableAccessExpression) = visitDeclarationReference(expression)
override final fun visitVariableAccess(expression: IrVariableAccessExpression, data: Nothing?) = visitVariableAccess(expression)
open fun visitValueAccess(expression: IrValueAccessExpression) = visitDeclarationReference(expression)
override final fun visitValueAccess(expression: IrValueAccessExpression, data: Nothing?) = visitValueAccess(expression)
open fun visitGetVariable(expression: IrGetVariable) = visitVariableAccess(expression)
override final fun visitGetVariable(expression: IrGetVariable, data: Nothing?) = visitGetVariable(expression)
open fun visitGetValue(expression: IrGetValue) = visitValueAccess(expression)
override final fun visitGetValue(expression: IrGetValue, data: Nothing?) = visitGetValue(expression)
open fun visitSetVariable(expression: IrSetVariable) = visitVariableAccess(expression)
open fun visitSetVariable(expression: IrSetVariable) = visitValueAccess(expression)
override final fun visitSetVariable(expression: IrSetVariable, data: Nothing?) = visitSetVariable(expression)
open fun visitFieldAccess(expression: IrFieldAccessExpression) = visitDeclarationReference(expression)
@@ -134,9 +131,6 @@ abstract class IrElementTransformerVoid : IrElementTransformer<Nothing?> {
open fun visitSetField(expression: IrSetField) = visitFieldAccess(expression)
override final fun visitSetField(expression: IrSetField, data: Nothing?) = visitSetField(expression)
open fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver) = visitDeclarationReference(expression)
override final fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver, data: Nothing?) = visitGetExtensionReceiver(expression)
open fun visitMemberAccess(expression: IrMemberAccessExpression) = visitDeclarationReference(expression)
override final fun visitMemberAccess(expression: IrMemberAccessExpression, data: Nothing?) = visitMemberAccess(expression)
@@ -51,19 +51,17 @@ interface IrElementVisitor<out R, in D> {
fun visitBlock(expression: IrBlock, data: D) = visitContainerExpression(expression, data)
fun visitComposite(expression: IrComposite, data: D) = visitContainerExpression(expression, data)
fun visitStringConcatenation(expression: IrStringConcatenation, data: D) = visitExpression(expression, data)
fun visitThisReference(expression: IrThisReference, data: D) = visitExpression(expression, data)
fun visitDeclarationReference(expression: IrDeclarationReference, data: D) = visitExpression(expression, data)
fun visitSingletonReference(expression: IrGetSingletonValue, data: D) = visitDeclarationReference(expression, data)
fun visitGetObjectValue(expression: IrGetObjectValue, data: D) = visitSingletonReference(expression, data)
fun visitGetEnumValue(expression: IrGetEnumValue, data: D) = visitSingletonReference(expression, data)
fun visitVariableAccess(expression: IrVariableAccessExpression, data: D) = visitDeclarationReference(expression, data)
fun visitGetVariable(expression: IrGetVariable, data: D) = visitVariableAccess(expression, data)
fun visitSetVariable(expression: IrSetVariable, data: D) = visitVariableAccess(expression, data)
fun visitValueAccess(expression: IrValueAccessExpression, data: D) = visitDeclarationReference(expression, data)
fun visitGetValue(expression: IrGetValue, data: D) = visitValueAccess(expression, data)
fun visitSetVariable(expression: IrSetVariable, data: D) = visitValueAccess(expression, data)
fun visitFieldAccess(expression: IrFieldAccessExpression, data: D) = visitDeclarationReference(expression, data)
fun visitGetField(expression: IrGetField, data: D) = visitFieldAccess(expression, data)
fun visitSetField(expression: IrSetField, data: D) = visitFieldAccess(expression, data)
fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver, data: D) = visitDeclarationReference(expression, data)
fun visitMemberAccess(expression: IrMemberAccessExpression, data: D) = visitDeclarationReference(expression, data)
fun visitCall(expression: IrCall, data: D) = visitMemberAccess(expression, data)
fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: D) = visitMemberAccess(expression, data)
@@ -99,9 +99,6 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitStringConcatenation(expression: IrStringConcatenation) = visitExpression(expression)
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?) = visitStringConcatenation(expression)
fun visitThisReference(expression: IrThisReference) = visitExpression(expression)
override fun visitThisReference(expression: IrThisReference, data: Nothing?) = visitThisReference(expression)
fun visitDeclarationReference(expression: IrDeclarationReference) = visitExpression(expression)
override fun visitDeclarationReference(expression: IrDeclarationReference, data: Nothing?) = visitDeclarationReference(expression)
@@ -114,11 +111,11 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitGetEnumValue(expression: IrGetEnumValue) = visitSingletonReference(expression)
override fun visitGetEnumValue(expression: IrGetEnumValue, data: Nothing?) = visitGetEnumValue(expression)
fun visitVariableAccess(expression: IrVariableAccessExpression) = visitDeclarationReference(expression)
override fun visitVariableAccess(expression: IrVariableAccessExpression, data: Nothing?) = visitVariableAccess(expression)
fun visitVariableAccess(expression: IrValueAccessExpression) = visitDeclarationReference(expression)
override fun visitValueAccess(expression: IrValueAccessExpression, data: Nothing?) = visitVariableAccess(expression)
fun visitGetVariable(expression: IrGetVariable) = visitVariableAccess(expression)
override fun visitGetVariable(expression: IrGetVariable, data: Nothing?) = visitGetVariable(expression)
fun visitGetVariable(expression: IrGetValue) = visitVariableAccess(expression)
override fun visitGetValue(expression: IrGetValue, data: Nothing?) = visitGetVariable(expression)
fun visitSetVariable(expression: IrSetVariable) = visitVariableAccess(expression)
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?) = visitSetVariable(expression)
@@ -132,9 +129,6 @@ interface IrElementVisitorVoid : IrElementVisitor<Unit, Nothing?> {
fun visitSetField(expression: IrSetField) = visitFieldAccess(expression)
override fun visitSetField(expression: IrSetField, data: Nothing?) = visitSetField(expression)
fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver) = visitDeclarationReference(expression)
override fun visitGetExtensionReceiver(expression: IrGetExtensionReceiver, data: Nothing?) = visitGetExtensionReceiver(expression)
fun visitMemberAccess(expression: IrMemberAccessExpression) = visitDeclarationReference(expression)
override fun visitMemberAccess(expression: IrMemberAccessExpression, data: Nothing?) = visitMemberAccess(expression)