[IR] Remove DeclarationDescriptor from IrExpression* tree API

This commit is contained in:
Roman Artemev
2019-10-22 19:28:17 +03:00
committed by romanart
parent d4fc7fcd96
commit ed79ab68ab
39 changed files with 65 additions and 129 deletions
@@ -98,7 +98,7 @@ abstract class AbstractClosureAnnotator : IrElementVisitorVoid {
override fun visitVariableAccess(expression: IrValueAccessExpression) {
val closureBuilder = closuresStack.peek() ?: return
val variableDescriptor = expression.descriptor
val variableDescriptor = expression.symbol.descriptor
if (variableDescriptor.containingDeclaration != closureBuilder.owner) {
closureBuilder.capturedValues.add(variableDescriptor)
}
@@ -294,7 +294,7 @@ class CheckIrElementVisitor(
super.visitDeclarationReference(expression)
// TODO: Fix unbound external declarations
if (expression.descriptor.isEffectivelyExternal())
if (expression.symbol.descriptor.isEffectivelyExternal())
return
// TODO: Fix unbound dynamic filed declarations
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.backend.common
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor
import org.jetbrains.kotlin.ir.IrElement
@@ -87,38 +88,38 @@ class RenderIrElementWithDescriptorsVisitor : IrElementVisitor<String, Nothing?>
"RETURN type=${expression.type.render()} from='${expression.returnTarget}'"
override fun visitCall(expression: IrCall, data: Nothing?): String =
"CALL '${expression.descriptor}' ${expression.renderSuperQualifier()}" +
"CALL '${expression.symbol.descriptor}' ${expression.renderSuperQualifier()}" +
"type=${expression.type.render()} origin=${expression.origin}"
private fun IrCall.renderSuperQualifier(): String =
superQualifierSymbol?.let { "superQualifier=${it.owner.name} " } ?: ""
override fun visitDelegatingConstructorCall(expression: IrDelegatingConstructorCall, data: Nothing?): String =
"DELEGATING_CONSTRUCTOR_CALL '${expression.descriptor}'"
"DELEGATING_CONSTRUCTOR_CALL '${expression.symbol.descriptor}'"
override fun visitEnumConstructorCall(expression: IrEnumConstructorCall, data: Nothing?): String =
"ENUM_CONSTRUCTOR_CALL '${expression.descriptor}'"
"ENUM_CONSTRUCTOR_CALL '${expression.symbol.descriptor}'"
override fun visitInstanceInitializerCall(expression: IrInstanceInitializerCall, data: Nothing?): String =
"INSTANCE_INITIALIZER_CALL classDescriptor='${expression.classDescriptor}'"
override fun visitGetValue(expression: IrGetValue, data: Nothing?): String =
"GET_VAR '${expression.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
"GET_VAR '${expression.symbol.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitSetVariable(expression: IrSetVariable, data: Nothing?): String =
"SET_VAR '${expression.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
"SET_VAR '${expression.symbol.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitGetField(expression: IrGetField, data: Nothing?): String =
"GET_FIELD '${expression.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
"GET_FIELD '${expression.symbol.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitSetField(expression: IrSetField, data: Nothing?): String =
"SET_FIELD '${expression.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
"SET_FIELD '${expression.symbol.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitGetObjectValue(expression: IrGetObjectValue, data: Nothing?): String =
"GET_OBJECT '${expression.descriptor}' type=${expression.type.render()}"
"GET_OBJECT '${expression.symbol.descriptor}' type=${expression.type.render()}"
override fun visitGetEnumValue(expression: IrGetEnumValue, data: Nothing?): String =
"GET_ENUM '${expression.descriptor}' type=${expression.type.render()}"
"GET_ENUM '${expression.symbol.descriptor}' type=${expression.type.render()}"
override fun visitStringConcatenation(expression: IrStringConcatenation, data: Nothing?): String =
"STRING_CONCATENATION type=${expression.type.render()}"
@@ -148,10 +149,10 @@ class RenderIrElementWithDescriptorsVisitor : IrElementVisitor<String, Nothing?>
"THROW type=${expression.type.render()}"
override fun visitCallableReference(expression: IrCallableReference, data: Nothing?): String =
"CALLABLE_REFERENCE '${expression.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
"CALLABLE_REFERENCE '${expression.symbol.descriptor}' type=${expression.type.render()} origin=${expression.origin}"
override fun visitClassReference(expression: IrClassReference, data: Nothing?): String =
"CLASS_REFERENCE '${expression.descriptor}' type=${expression.type.render()}"
"CLASS_REFERENCE '${expression.symbol.descriptor}' type=${expression.type.render()}"
override fun visitGetClass(expression: IrGetClass, data: Nothing?): String =
"GET_CLASS type=${expression.type.render()}"
@@ -271,16 +272,18 @@ class DumpIrTreeWithDescriptorsVisitor(out: Appendable) : IrElementVisitor<Unit,
expression.dumpLabeledElementWith(data) {
dumpTypeArguments(expression)
val descriptor = expression.symbol.descriptor as CallableDescriptor
expression.dispatchReceiver?.accept(this, "\$this")
expression.extensionReceiver?.accept(this, "\$receiver")
for (valueParameter in expression.descriptor.valueParameters) {
for (valueParameter in descriptor.valueParameters) {
expression.getValueArgument(valueParameter.index)?.accept(this, valueParameter.name.asString())
}
}
}
private fun dumpTypeArguments(expression: IrMemberAccessExpression) {
for (typeParameter in expression.descriptor.original.typeParameters) {
val descriptor = expression.symbol.descriptor as CallableDescriptor
for (typeParameter in descriptor.original.typeParameters) {
val typeArgument = expression.getTypeArgument(typeParameter) ?: continue
val renderedParameter = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeParameter)
val renderedType = typeArgument.render()
@@ -97,7 +97,7 @@ abstract class AbstractValueUsageTransformer(
with(expression) {
dispatchReceiver = dispatchReceiver?.useAsDispatchReceiver(expression)
extensionReceiver = extensionReceiver?.useAsExtensionReceiver(expression)
for (index in descriptor.valueParameters.indices) {
for (index in 0 until valueArgumentsCount) {
val argument = getValueArgument(index) ?: continue
val parameter = symbol.owner.valueParameters[index]
putValueArgument(index, argument.useAsValueArgument(expression, parameter))
@@ -76,7 +76,7 @@ private class KCallableNamePropertyTransformer(val lower: KCallableNamePropertyL
expression.startOffset,
expression.endOffset,
lower.context.irBuiltIns.stringType,
callableReference.descriptor.name.asString()
callableReference.symbol.descriptor.name.asString()
)
)
}
@@ -136,7 +136,7 @@ class FunctionInlining(val context: CommonBackendContext) : IrElementTransformer
statements.transform { it.transform(transformer, data = null) }
statements.addAll(0, evaluationStatements)
val isCoroutineIntrinsicCall = callSite.descriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(
val isCoroutineIntrinsicCall = callSite.symbol.descriptor.isBuiltInSuspendCoroutineUninterceptedOrReturn(
context.configuration.languageVersionSettings
)
@@ -434,10 +434,12 @@ class FunctionInlining(val context: CommonBackendContext) : IrElementTransformer
val variableInitializer = it.argumentExpression.transform(substitutor, data = null) // Arguments may reference the previous ones - substitute them.
val newVariable =
currentScope.scope.createTemporaryVariableWithWrappedDescriptor(
irExpression = IrBlockImpl (variableInitializer.startOffset,
variableInitializer.endOffset,
variableInitializer.type,
InlinerExpressionLocationHint((currentScope.irElement as IrSymbolOwner).symbol)).apply {
irExpression = IrBlockImpl(
variableInitializer.startOffset,
variableInitializer.endOffset,
variableInitializer.type,
InlinerExpressionLocationHint((currentScope.irElement as IrSymbolOwner).symbol)
).apply {
statements.add(variableInitializer)
},
nameHint = callee.symbol.owner.name.toString(),
@@ -454,10 +456,10 @@ class FunctionInlining(val context: CommonBackendContext) : IrElementTransformer
private class IrGetValueWithoutLocation(
symbol: IrValueSymbol,
override val origin: IrStatementOrigin? = null
) : IrTerminalDeclarationReferenceBase<IrValueSymbol, ValueDescriptor>(
) : IrTerminalDeclarationReferenceBase<IrValueSymbol>(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
symbol.owner.type,
symbol, symbol.descriptor
symbol
), IrGetValue {
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D) =
visitor.visitGetValue(this, data)