diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt index f5298d4d7c7..7abd3595f7c 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ClassGenerator.kt @@ -60,7 +60,7 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe val irPrimaryConstructor = generatePrimaryConstructor(irClass, ktClassOrObject) if (irPrimaryConstructor != null) { - generatePropertiesDeclaredInPrimaryConstructor(irClass, irPrimaryConstructor, ktClassOrObject) + generateDeclarationsForPrimaryConstructorParameters(irClass, irPrimaryConstructor, ktClassOrObject) } generateMembersDeclaredInSupertypeList(irClass, ktClassOrObject) @@ -256,12 +256,16 @@ class ClassGenerator(declarationGenerator: DeclarationGenerator) : DeclarationGe return irPrimaryConstructor } - private fun generatePropertiesDeclaredInPrimaryConstructor( + private fun generateDeclarationsForPrimaryConstructorParameters( irClass: IrClass, irPrimaryConstructor: IrConstructor, ktClassOrObject: KtClassOrObject ) { ktClassOrObject.primaryConstructor?.let { ktPrimaryConstructor -> + irPrimaryConstructor.valueParameters.forEach { + context.symbolTable.introduceValueParameter(it) + } + ktPrimaryConstructor.valueParameters.forEachIndexed { i, ktParameter -> val irValueParameter = irPrimaryConstructor.valueParameters[i] if (ktParameter.hasValOrVar()) { diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt index 949f5e32a65..47a6e50b206 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/DelegatedPropertyGenerator.kt @@ -97,9 +97,9 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D ktDelegate.startOffset, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR, accessorDescriptor - ).buildWithScope { irGetter -> - FunctionGenerator(declarationGenerator).generateFunctionParameterDeclarations(irGetter, ktProperty, null) - irGetter.body = generateBody(irGetter) + ).buildWithScope { irAccessor -> + FunctionGenerator(declarationGenerator).generateFunctionParameterDeclarations(irAccessor, ktProperty, null) + irAccessor.body = generateBody(irAccessor) } @@ -189,6 +189,19 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D createBodyGenerator(scopeOwner).createStatementGenerator() ) + private fun createLocalDelegatedPropertyReference( + ktElement: KtElement, + type: KotlinType, + variableDescriptor: VariableDescriptorWithAccessors, + irDelegateSymbol: IrVariableSymbol, + scopeOwner: IrSymbol + ): IrLocalDelegatedPropertyReference = + ReflectionReferencesGenerator(createBodyGenerator(scopeOwner).createStatementGenerator()).generateLocalDelegatedPropertyReference( + ktElement.startOffset, ktElement.endOffset, + type, variableDescriptor, irDelegateSymbol, + IrStatementOrigin.PROPERTY_REFERENCE_FOR_DELEGATE + ) + fun generateLocalDelegatedProperty( ktProperty: KtProperty, ktDelegate: KtPropertyDelegate, @@ -197,36 +210,24 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D ): IrLocalDelegatedProperty { val kPropertyType = getKPropertyTypeForLocalDelegatedProperty(variableDescriptor) - val irActualDelegateInitializer = - generateInitializerBodyForPropertyDelegate( - variableDescriptor, kPropertyType, - ktDelegate, - scopeOwnerSymbol - ).expression - val delegateType = irActualDelegateInitializer.type - - val delegateDescriptor = createLocalPropertyDelegatedDescriptor(variableDescriptor, delegateType, kPropertyType) - - val irDelegate = context.symbolTable.declareVariable( - ktDelegate.startOffset, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATE, - delegateDescriptor, irActualDelegateInitializer - ) - val irLocalDelegatedProperty = IrLocalDelegatedPropertyImpl( ktProperty.startOffset, ktProperty.endOffset, IrDeclarationOrigin.DEFINED, - variableDescriptor, irDelegate) + variableDescriptor + ).apply { + delegate = generateDelegateVariableForLocalDelegatedProperty(ktDelegate, variableDescriptor, kPropertyType, scopeOwnerSymbol) + } + val irDelegate = irLocalDelegatedProperty.delegate val getterDescriptor = variableDescriptor.getter!! val delegateReceiverValue = createVariableValueForDelegate(irDelegate.symbol, ktDelegate) irLocalDelegatedProperty.getter = createLocalPropertyAccessor(getterDescriptor, ktDelegate) { irGetter -> generateDelegatedPropertyGetterBody( - irGetter, - ktDelegate, getterDescriptor, delegateReceiverValue, - createCallableReference( - ktDelegate, delegateDescriptor.kPropertyType, - delegateDescriptor.correspondingLocalProperty, + irGetter,ktDelegate, getterDescriptor, delegateReceiverValue, + createLocalDelegatedPropertyReference( + ktDelegate, kPropertyType, + variableDescriptor, irDelegate.symbol, irGetter.symbol ) ) @@ -238,9 +239,9 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D createLocalPropertyAccessor(setterDescriptor, ktDelegate) { irSetter -> generateDelegatedPropertySetterBody( irSetter, ktDelegate, setterDescriptor, delegateReceiverValue, - createCallableReference( - ktDelegate, delegateDescriptor.kPropertyType, - delegateDescriptor.correspondingLocalProperty, + createLocalDelegatedPropertyReference( + ktDelegate, kPropertyType, + variableDescriptor, irDelegate.symbol, irSetter.symbol ) ) @@ -250,19 +251,77 @@ class DelegatedPropertyGenerator(declarationGenerator: DeclarationGenerator) : D return irLocalDelegatedProperty } + private fun generateDelegateVariableForLocalDelegatedProperty( + ktDelegate: KtPropertyDelegate, + variableDescriptor: VariableDescriptorWithAccessors, + kPropertyType: KotlinType, + scopeOwner: IrSymbol + ): IrVariable { + val delegateType = getLocalDelegatedPropertyDelegateType(variableDescriptor, ktDelegate) + val delegateDescriptor = createLocalPropertyDelegatedDescriptor(variableDescriptor, delegateType, kPropertyType) + + return context.symbolTable.declareVariable( + ktDelegate.startOffset, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATE, + delegateDescriptor + ).also { irVariable -> + irVariable.initializer = generateInitializerForLocalDelegatedPropertyDelegate( + variableDescriptor, kPropertyType, ktDelegate, + irVariable.symbol, + scopeOwner + ) + } + } + + private fun getLocalDelegatedPropertyDelegateType( + variableDescriptor: VariableDescriptorWithAccessors, + ktDelegate: KtPropertyDelegate + ): KotlinType { + val provideDelegateResolvedCall = get(BindingContext.PROVIDE_DELEGATE_RESOLVED_CALL, variableDescriptor) + return if (provideDelegateResolvedCall != null) + provideDelegateResolvedCall.resultingDescriptor.returnType!! + else + getInferredTypeWithImplicitCastsOrFail(ktDelegate.expression!!) + } + + private fun generateInitializerForLocalDelegatedPropertyDelegate( + variableDescriptor: VariableDescriptorWithAccessors, + kPropertyType: KotlinType, + ktDelegate: KtPropertyDelegate, + delegateSymbol: IrVariableSymbol, + scopeOwner: IrSymbol + ): IrExpression { + val ktDelegateExpression = ktDelegate.expression!! + val irDelegateInitializer = createBodyGenerator(scopeOwner).createStatementGenerator().generateExpression(ktDelegateExpression) + + val provideDelegateResolvedCall = get(BindingContext.PROVIDE_DELEGATE_RESOLVED_CALL, variableDescriptor) ?: + return irDelegateInitializer + + val statementGenerator = createBodyGenerator(scopeOwner).createStatementGenerator() + + val provideDelegateCall = statementGenerator.pregenerateCall(provideDelegateResolvedCall).apply { + setExplicitReceiverValue(OnceExpressionValue(irDelegateInitializer)) + irValueArgumentsByIndex[1] = + createLocalDelegatedPropertyReference(ktDelegate, kPropertyType, variableDescriptor, delegateSymbol, scopeOwner) + } + + return CallGenerator(statementGenerator).generateCall(ktDelegate.startOffset, ktDelegate.endOffset, provideDelegateCall) + } + private fun createVariableValueForDelegate(irDelegate: IrVariableSymbol, ktDelegate: KtPropertyDelegate) = VariableLValue(ktDelegate.startOffset, ktDelegate.endOffset, irDelegate) - private fun createLocalPropertyAccessor( - getterDescriptor: VariableAccessorDescriptor, ktDelegate: KtPropertyDelegate, + private inline fun createLocalPropertyAccessor( + getterDescriptor: VariableAccessorDescriptor, + ktDelegate: KtPropertyDelegate, generateBody: (IrFunction) -> IrBody ) = context.symbolTable.declareSimpleFunction( ktDelegate.startOffset, ktDelegate.endOffset, IrDeclarationOrigin.DELEGATED_PROPERTY_ACCESSOR, getterDescriptor - ).buildWithScope { - it.body = generateBody(it) + ).buildWithScope { irAccessor -> + FunctionGenerator(declarationGenerator).generateFunctionParameterDeclarations(irAccessor, ktDelegate, null) + irAccessor.body = generateBody(irAccessor) } private fun createLocalPropertyDelegatedDescriptor( diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 101d2529c5a..a24628b8365 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol import org.jetbrains.kotlin.psi.KtCallableReferenceExpression import org.jetbrains.kotlin.psi.KtClassLiteralExpression import org.jetbrains.kotlin.psi.psiUtil.endOffset @@ -92,6 +93,29 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St throw AssertionError("Unexpected callable reference: $callableDescriptor") } + fun generateLocalDelegatedPropertyReference( + startOffset: Int, + endOffset: Int, + type: KotlinType, + variableDescriptor: VariableDescriptorWithAccessors, + irDelegateSymbol: IrVariableSymbol, + origin: IrStatementOrigin? + ): IrLocalDelegatedPropertyReference { + val getterDescriptor = variableDescriptor.getter ?: + throw AssertionError("Local delegated property should have a getter: $variableDescriptor") + val setterDescriptor = variableDescriptor.setter + + val getterSymbol = context.symbolTable.referenceFunction(getterDescriptor) + val setterSymbol = setterDescriptor?.let { context.symbolTable.referenceFunction(it) } + + return IrLocalDelegatedPropertyReferenceImpl( + startOffset, endOffset, type, + variableDescriptor, + irDelegateSymbol, getterSymbol, setterSymbol, + origin + ) + } + private fun generatePropertyReference( startOffset: Int, endOffset: Int, diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/SymbolTable.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/SymbolTable.kt index 7cff5c60aaa..1a0f81632cb 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/SymbolTable.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/SymbolTable.kt @@ -131,6 +131,14 @@ class SymbolTable { return owner } + fun introduceLocal(descriptor: D, symbol: S) { + val scope = currentScope ?: throw AssertionError("No active scope") + scope[descriptor]?.let { + throw AssertionError("$descriptor is already bound to $it") + } + scope[descriptor] = symbol + } + fun enterScope(owner: DeclarationDescriptor) { currentScope = Scope(owner, currentScope) } @@ -258,6 +266,10 @@ class SymbolTable { { IrValueParameterImpl(startOffset, endOffset, origin, it) } ) + fun introduceValueParameter(irValueParameter: IrValueParameter) { + valueParameterSymbolTable.introduceLocal(irValueParameter.descriptor, irValueParameter.symbol) + } + fun referenceValueParameter(descriptor: ParameterDescriptor) = valueParameterSymbolTable.referenced(descriptor) { throw AssertionError("Undefined parameter referenced: $descriptor\n${valueParameterSymbolTable.dump()}") diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt index ff8a2305531..954f6c16763 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrClass.kt @@ -17,6 +17,8 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.ClassDescriptor +import org.jetbrains.kotlin.descriptors.ValueDescriptor +import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.ir.symbols.IrClassSymbol interface IrClass : IrSymbolDeclaration, IrDeclarationContainer, IrTypeParametersContainer { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt index 309472fb88b..94df56c6835 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclarationOrigin.kt @@ -29,6 +29,7 @@ interface IrDeclarationOrigin { object LOCAL_FUNCTION_FOR_LAMBDA : IrDeclarationOriginImpl("LOCAL_FUNCTION_FOR_LAMBDA") object CATCH_PARAMETER : IrDeclarationOriginImpl("CATCH_PARAMETER") object NEW_INSTANCE_RECEIVER : IrDeclarationOriginImpl("NEW_INSTANCE_RECEIVER") + object PRIMARY_CONSTRUCTOR_PARAMETER : IrDeclarationOriginImpl("PRIMARY_CONSTRUCTOR_PARAMETER") object IR_TEMPORARY_VARIABLE : IrDeclarationOriginImpl("IR_TEMPORARY_VARIABLE") } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt index bcf1388f303..b1501b0575d 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrClassImpl.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.utils.SmartList import java.util.* +import kotlin.collections.ArrayList class IrClassImpl( startOffset: Int, @@ -62,6 +63,6 @@ class IrClassImpl( override fun transformChildren(transformer: IrElementTransformer, data: D) { newInstanceReceiver = newInstanceReceiver?.transform(transformer, data) typeParameters.transform { it.transform(transformer, data) } - declarations.transform { it.transform(transformer, data) as IrDeclaration } + declarations.transform { it.transform(transformer, data) } } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt index e1ce659455a..290c8956e7c 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrCallableReference.kt @@ -16,14 +16,13 @@ package org.jetbrains.kotlin.ir.expressions -import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor -import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol interface IrCallableReference : IrMemberAccessExpression { - override val descriptor: CallableMemberDescriptor + override val descriptor: CallableDescriptor } interface IrFunctionReference : IrCallableReference { @@ -37,3 +36,10 @@ interface IrPropertyReference : IrCallableReference { val getter: IrFunctionSymbol? val setter: IrFunctionSymbol? } + +interface IrLocalDelegatedPropertyReference : IrCallableReference { + override val descriptor: VariableDescriptorWithAccessors + val delegate: IrVariableSymbol + val getter: IrFunctionSymbol + val setter: IrFunctionSymbol? +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt index 494ea644da5..8a149ed56a7 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/IrMemberAccessExpression.kt @@ -24,7 +24,7 @@ interface IrMemberAccessExpression : IrExpression { var dispatchReceiver: IrExpression? var extensionReceiver: IrExpression? - val descriptor: CallableMemberDescriptor + val descriptor: CallableDescriptor val origin: IrStatementOrigin? // NB `typeParameterDescriptor` should be taken from `descriptor.original` diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallableReferenceBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt similarity index 53% rename from compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallableReferenceBase.kt rename to compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt index 6630ed21390..c9819f813d3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrCallableReferenceBase.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrFunctionReferenceImpl.kt @@ -17,31 +17,14 @@ package org.jetbrains.kotlin.ir.expressions.impl import org.jetbrains.kotlin.descriptors.FunctionDescriptor -import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor -import org.jetbrains.kotlin.ir.expressions.* -import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol +import org.jetbrains.kotlin.ir.expressions.IrFunctionReference +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.createFunctionSymbol import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.types.KotlinType -abstract class IrCallableReferenceBase( - startOffset: Int, - endOffset: Int, - type: KotlinType, - typeArguments: Map?, - numValueArguments: Int, - override val origin: IrStatementOrigin? = null -) : IrCallableReference, - IrCallWithIndexedArgumentsBase( - startOffset, endOffset, - type, - numValueArguments, - typeArguments, - origin - ) - class IrFunctionReferenceImpl( startOffset: Int, endOffset: Int, @@ -50,9 +33,10 @@ class IrFunctionReferenceImpl( typeArguments: Map?, origin: IrStatementOrigin? = null ) : IrFunctionReference, - IrCallableReferenceBase( - startOffset, endOffset, type, typeArguments, + IrCallWithIndexedArgumentsBase( + startOffset, endOffset, type, symbol.descriptor.valueParameters.size, + typeArguments, origin ) { @@ -70,31 +54,4 @@ class IrFunctionReferenceImpl( override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitFunctionReference(this, data) -} - -class IrPropertyReferenceImpl( - startOffset: Int, - endOffset: Int, - type: KotlinType, - override val descriptor: PropertyDescriptor, - override val field: IrFieldSymbol?, - override val getter: IrFunctionSymbol?, - override val setter: IrFunctionSymbol?, - typeArguments: Map?, - override val origin: IrStatementOrigin? = null -) : IrPropertyReference, - IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments) -{ - override fun accept(visitor: IrElementVisitor, data: D): R = - visitor.visitPropertyReference(this, data) - - private fun throwNoValueArguments(): Nothing { - throw UnsupportedOperationException("Property reference $descriptor has no value arguments") - } - - override fun getValueArgument(index: Int): IrExpression? = throwNoValueArguments() - - override fun putValueArgument(index: Int, valueArgument: IrExpression?) = throwNoValueArguments() - - override fun removeValueArgument(index: Int) = throwNoValueArguments() } \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt new file mode 100644 index 00000000000..5c7431cbbc4 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrLocalDelegatedPropertyReferenceImpl.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2010-2017 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.VariableDescriptorWithAccessors +import org.jetbrains.kotlin.ir.expressions.IrLocalDelegatedPropertyReference +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.symbols.IrVariableSymbol +import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.types.KotlinType + +class IrLocalDelegatedPropertyReferenceImpl( + startOffset: Int, + endOffset: Int, + type: KotlinType, + override val descriptor: VariableDescriptorWithAccessors, + override val delegate: IrVariableSymbol, + override val getter: IrFunctionSymbol, + override val setter: IrFunctionSymbol?, + origin: IrStatementOrigin? = null +) : IrLocalDelegatedPropertyReference, + IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, null, origin) +{ + override fun accept(visitor: IrElementVisitor, data: D): R = + visitor.visitLocalDelegatedPropertyReference(this, data) +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt new file mode 100644 index 00000000000..5f7a8791ce4 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrNoArgumentsCallableReferenceBase.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2017 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.TypeParameterDescriptor +import org.jetbrains.kotlin.ir.expressions.IrCallableReference +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.types.KotlinType + +abstract class IrNoArgumentsCallableReferenceBase( + startOffset: Int, + endOffset: Int, + type: KotlinType, + typeArguments: Map?, + override val origin: IrStatementOrigin? = null +) : IrCallableReference, + IrMemberAccessExpressionBase(startOffset, endOffset, type, typeArguments) +{ + private fun throwNoValueArguments(): Nothing { + throw UnsupportedOperationException("Property reference $descriptor has no value arguments") + } + + override fun getValueArgument(index: Int): IrExpression? = throwNoValueArguments() + + override fun putValueArgument(index: Int, valueArgument: IrExpression?) = throwNoValueArguments() + + override fun removeValueArgument(index: Int) = throwNoValueArguments() +} + diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt new file mode 100644 index 00000000000..374b31e7790 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/expressions/impl/IrPropertyReferenceImpl.kt @@ -0,0 +1,43 @@ +/* + * Copyright 2010-2017 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.PropertyDescriptor +import org.jetbrains.kotlin.descriptors.TypeParameterDescriptor +import org.jetbrains.kotlin.ir.expressions.IrPropertyReference +import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin +import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol +import org.jetbrains.kotlin.ir.symbols.IrFunctionSymbol +import org.jetbrains.kotlin.ir.visitors.IrElementVisitor +import org.jetbrains.kotlin.types.KotlinType + +class IrPropertyReferenceImpl( + startOffset: Int, + endOffset: Int, + type: KotlinType, + override val descriptor: PropertyDescriptor, + override val field: IrFieldSymbol?, + override val getter: IrFunctionSymbol?, + override val setter: IrFunctionSymbol?, + typeArguments: Map?, + origin: IrStatementOrigin? = null +) : IrPropertyReference, + IrNoArgumentsCallableReferenceBase(startOffset, endOffset, type, typeArguments, origin) +{ + override fun accept(visitor: IrElementVisitor, data: D): R = + visitor.visitPropertyReference(this, data) +} \ No newline at end of file diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt index d617f1e7542..dad61a359c0 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeepCopyIrTree.kt @@ -376,7 +376,7 @@ class DeepCopyIrTree(private val symbolsRemapper: DeepCopySymbolsRemapper) : IrE mapStatementOrigin(expression.origin) ).transformValueArguments(expression) - override fun visitPropertyReference(expression: IrPropertyReference): IrExpression = + override fun visitPropertyReference(expression: IrPropertyReference): IrPropertyReference = IrPropertyReferenceImpl( expression.startOffset, expression.endOffset, expression.type, @@ -386,7 +386,18 @@ class DeepCopyIrTree(private val symbolsRemapper: DeepCopySymbolsRemapper) : IrE expression.setter?.let { symbolsRemapper.getReferencedFunction(it) }, expression.getTypeArgumentsMap(), mapStatementOrigin(expression.origin) - ).transformValueArguments(expression) + ).transformReceiverArguments(expression) + + override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference): IrLocalDelegatedPropertyReference = + IrLocalDelegatedPropertyReferenceImpl( + expression.startOffset, expression.endOffset, + expression.type, + expression.descriptor, + symbolsRemapper.getReferencedVariable(expression.delegate), + symbolsRemapper.getReferencedFunction(expression.getter), + expression.setter?.let { symbolsRemapper.getReferencedFunction(it) }, + mapStatementOrigin(expression.origin) + ) override fun visitClassReference(expression: IrClassReference): IrClassReference = IrClassReferenceImpl( diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt index 9fce080daea..28b180a5805 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/RenderIrElement.kt @@ -198,6 +198,17 @@ class RenderIrElementVisitor : IrElementVisitor { append(" ") } + override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: Nothing?): String = + buildString { + append("LOCAL_DELEGATED_PROPERTY_REFERENCE ") + append("'${expression.descriptor.ref()}' ") + append("delegate='${expression.delegate.descriptor.ref()}' ") + append("getter='${expression.getter.descriptor.ref()}' ") + appendNullableAttribute("setter=", expression.setter) { "'${it.descriptor.ref()}'"} + append("type=${expression.type.render()} ") + append("origin=${expression.origin}") + } + override fun visitClassReference(expression: IrClassReference, data: Nothing?): String = "CLASS_REFERENCE '${expression.descriptor.ref()}' type=${expression.type.render()}" diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt index 9c2eaaa53e6..5f2c5cfbe00 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/transform.kt @@ -16,9 +16,11 @@ package org.jetbrains.kotlin.ir.util -inline fun MutableList.transform(transformation: (T) -> T) { +import org.jetbrains.kotlin.ir.IrElement + +inline fun MutableList.transform(transformation: (T) -> IrElement) { forEachIndexed { i, item -> - set(i, transformation(item)) + set(i, transformation(item) as T) } } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformer.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformer.kt index 640d6414dd0..43da6cb9ccf 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformer.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformer.kt @@ -92,6 +92,7 @@ interface IrElementTransformer : IrElementVisitor { override fun visitCallableReference(expression: IrCallableReference, data: D) = visitMemberAccess(expression, data) override fun visitFunctionReference(expression: IrFunctionReference, data: D) = visitCallableReference(expression, data) override fun visitPropertyReference(expression: IrPropertyReference, data: D) = visitCallableReference(expression, data) + override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: D) = visitCallableReference(expression, data) override fun visitClassReference(expression: IrClassReference, data: D) = visitDeclarationReference(expression, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformerVoid.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformerVoid.kt index 3143a433e5d..88c99d71766 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformerVoid.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementTransformerVoid.kt @@ -175,6 +175,10 @@ abstract class IrElementTransformerVoid : IrElementTransformer { open fun visitPropertyReference(expression: IrPropertyReference) = visitCallableReference(expression) override final fun visitPropertyReference(expression: IrPropertyReference, data: Nothing?): IrElement = visitPropertyReference(expression) + open fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference) = visitCallableReference(expression) + override final fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: Nothing?) = + visitLocalDelegatedPropertyReference(expression) + open fun visitClassReference(expression: IrClassReference) = visitDeclarationReference(expression) override final fun visitClassReference(expression: IrClassReference, data: Nothing?) = visitClassReference(expression) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt index b6c86563b48..bf9fc67f0bb 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitor.kt @@ -78,6 +78,7 @@ interface IrElementVisitor { fun visitCallableReference(expression: IrCallableReference, data: D) = visitMemberAccess(expression, data) fun visitFunctionReference(expression: IrFunctionReference, data: D) = visitCallableReference(expression, data) fun visitPropertyReference(expression: IrPropertyReference, data: D) = visitCallableReference(expression, data) + fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: D) = visitCallableReference(expression, data) fun visitClassReference(expression: IrClassReference, data: D) = visitDeclarationReference(expression, data) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt index f225d98b462..d5f334892ec 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/visitors/IrElementVisitorVoid.kt @@ -171,6 +171,9 @@ interface IrElementVisitorVoid : IrElementVisitor { fun visitPropertyReference(expression: IrPropertyReference) = visitCallableReference(expression) override fun visitPropertyReference(expression: IrPropertyReference, data: Nothing?) = visitPropertyReference(expression) + fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference) = visitCallableReference(expression) + override fun visitLocalDelegatedPropertyReference(expression: IrLocalDelegatedPropertyReference, data: Nothing?) = visitLocalDelegatedPropertyReference(expression) + fun visitClassReference(expression: IrClassReference) = visitDeclarationReference(expression) override fun visitClassReference(expression: IrClassReference, data: Nothing?) = visitClassReference(expression) diff --git a/compiler/testData/ir/irText/classes/primaryConstructor.txt b/compiler/testData/ir/irText/classes/primaryConstructor.txt index 36750b5de6d..9fd4496563f 100644 --- a/compiler/testData/ir/irText/classes/primaryConstructor.txt +++ b/compiler/testData/ir/irText/classes/primaryConstructor.txt @@ -1,5 +1,6 @@ FILE /primaryConstructor.kt CLASS CLASS Test1 + $new: VALUE_PARAMETER CONSTRUCTOR public constructor Test1(x: kotlin.Int, y: kotlin.Int) VALUE_PARAMETER value-parameter x: kotlin.Int VALUE_PARAMETER value-parameter y: kotlin.Int @@ -30,6 +31,7 @@ FILE /primaryConstructor.kt FUN FAKE_OVERRIDE public open override fun hashCode(): kotlin.Int FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String CLASS CLASS Test2 + $new: VALUE_PARAMETER CONSTRUCTOR public constructor Test2(x: kotlin.Int, y: kotlin.Int) VALUE_PARAMETER value-parameter x: kotlin.Int VALUE_PARAMETER value-parameter y: kotlin.Int @@ -60,6 +62,7 @@ FILE /primaryConstructor.kt FUN FAKE_OVERRIDE public open override fun hashCode(): kotlin.Int FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String CLASS CLASS Test3 + $new: VALUE_PARAMETER CONSTRUCTOR public constructor Test3(x: kotlin.Int, y: kotlin.Int) VALUE_PARAMETER value-parameter x: kotlin.Int VALUE_PARAMETER value-parameter y: kotlin.Int diff --git a/compiler/testData/ir/irText/declarations/localDelegatedProperties.txt b/compiler/testData/ir/irText/declarations/localDelegatedProperties.txt index 31fb59ad532..8da441d5b02 100644 --- a/compiler/testData/ir/irText/declarations/localDelegatedProperties.txt +++ b/compiler/testData/ir/irText/declarations/localDelegatedProperties.txt @@ -10,7 +10,7 @@ FILE /localDelegatedProperties.kt BLOCK_BODY RETURN type=kotlin.Nothing from='(): Int' CONST Int type=kotlin.Int value='42' - CALLABLE_REFERENCE '(): Int' type=() -> kotlin.Int origin=LAMBDA + FUNCTION_REFERENCE '(): Int' type=() -> kotlin.Int origin=LAMBDA FUN DELEGATED_PROPERTY_ACCESSOR local final fun (): kotlin.Int BLOCK_BODY RETURN type=kotlin.Nothing from='(): Int' @@ -18,7 +18,7 @@ FILE /localDelegatedProperties.kt : Int $receiver: GET_VAR '`x$delegate`: Lazy' type=kotlin.Lazy origin=null thisRef: CONST Null type=kotlin.Nothing? value='null' - property: CALLABLE_REFERENCE 'x: Int' type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + property: LOCAL_DELEGATED_PROPERTY_REFERENCE 'x: Int' delegate='`x$delegate`: Lazy' getter='(): Int' setter=null type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE CALL 'println(Int): Unit' type=kotlin.Unit origin=null message: CALL '(): Int' type=kotlin.Int origin=GET_LOCAL_PROPERTY FUN public fun test2(): kotlin.Unit @@ -35,8 +35,9 @@ FILE /localDelegatedProperties.kt : Int $receiver: GET_VAR '`x$delegate`: HashMap /* = HashMap */' type=kotlin.collections.HashMap /* = java.util.HashMap */ origin=null thisRef: CONST Null type=kotlin.Nothing? value='null' - property: CALLABLE_REFERENCE 'x: Int' type=kotlin.reflect.KMutableProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + property: LOCAL_DELEGATED_PROPERTY_REFERENCE 'x: Int' delegate='`x$delegate`: HashMap /* = HashMap */' getter='(): Int' setter='(Int): Int' type=kotlin.reflect.KMutableProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE FUN DELEGATED_PROPERTY_ACCESSOR local final fun (value: kotlin.Int): kotlin.Int + VALUE_PARAMETER value-parameter value: kotlin.Int BLOCK_BODY RETURN type=kotlin.Nothing from='(Int): Int' TYPE_OP type=kotlin.Int origin=IMPLICIT_CAST typeOperand=kotlin.Int @@ -44,7 +45,7 @@ FILE /localDelegatedProperties.kt : Int $receiver: GET_VAR '`x$delegate`: HashMap /* = HashMap */' type=kotlin.collections.HashMap /* = java.util.HashMap */ origin=null thisRef: CONST Null type=kotlin.Nothing? value='null' - property: CALLABLE_REFERENCE 'x: Int' type=kotlin.reflect.KMutableProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + property: LOCAL_DELEGATED_PROPERTY_REFERENCE 'x: Int' delegate='`x$delegate`: HashMap /* = HashMap */' getter='(): Int' setter='(Int): Int' type=kotlin.reflect.KMutableProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE value: GET_VAR 'value-parameter value: Int' type=kotlin.Int origin=null TYPE_OP type=kotlin.Unit origin=IMPLICIT_COERCION_TO_UNIT typeOperand=kotlin.Unit CALL '(Int): Int' type=kotlin.Int origin=EQ diff --git a/compiler/testData/ir/irText/declarations/parameters/delegatedMembers.txt b/compiler/testData/ir/irText/declarations/parameters/delegatedMembers.txt index 4813768ef8c..237e9a32cee 100644 --- a/compiler/testData/ir/irText/declarations/parameters/delegatedMembers.txt +++ b/compiler/testData/ir/irText/declarations/parameters/delegatedMembers.txt @@ -20,6 +20,7 @@ FILE /delegatedMembers.kt FUN FAKE_OVERRIDE public open override fun hashCode(): kotlin.Int FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String CLASS CLASS Test + $new: VALUE_PARAMETER TYPE_PARAMETER CONSTRUCTOR public constructor Test(impl: IBase) TYPE_PARAMETER diff --git a/compiler/testData/ir/irText/declarations/provideDelegate/local.txt b/compiler/testData/ir/irText/declarations/provideDelegate/local.txt index c240ddf9c4d..b8499649768 100644 --- a/compiler/testData/ir/irText/declarations/provideDelegate/local.txt +++ b/compiler/testData/ir/irText/declarations/provideDelegate/local.txt @@ -1,5 +1,6 @@ FILE /local.kt CLASS CLASS Delegate + $new: VALUE_PARAMETER CONSTRUCTOR public constructor Delegate(value: kotlin.String) VALUE_PARAMETER value-parameter value: kotlin.String BLOCK_BODY @@ -27,6 +28,7 @@ FILE /local.kt FUN FAKE_OVERRIDE public open override fun hashCode(): kotlin.Int FUN FAKE_OVERRIDE public open override fun toString(): kotlin.String CLASS CLASS DelegateProvider + $new: VALUE_PARAMETER CONSTRUCTOR public constructor DelegateProvider(value: kotlin.String) VALUE_PARAMETER value-parameter value: kotlin.String BLOCK_BODY @@ -62,11 +64,11 @@ FILE /local.kt $this: CALL 'constructor DelegateProvider(String)' type=DelegateProvider origin=null value: CONST String type=kotlin.String value='OK' thisRef: CONST Null type=kotlin.Nothing? value='null' - property: CALLABLE_REFERENCE 'testMember: String' type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + property: LOCAL_DELEGATED_PROPERTY_REFERENCE 'testMember: String' delegate='`testMember$delegate`: Delegate' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE FUN DELEGATED_PROPERTY_ACCESSOR local final fun (): kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='(): String' CALL 'getValue(Any?, Any?): String' type=kotlin.String origin=null $this: GET_VAR '`testMember$delegate`: Delegate' type=Delegate origin=null thisRef: CONST Null type=kotlin.Nothing? value='null' - property: CALLABLE_REFERENCE 'testMember: String' type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + property: LOCAL_DELEGATED_PROPERTY_REFERENCE 'testMember: String' delegate='`testMember$delegate`: Delegate' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE diff --git a/compiler/testData/ir/irText/declarations/provideDelegate/localDifferentReceivers.txt b/compiler/testData/ir/irText/declarations/provideDelegate/localDifferentReceivers.txt index da8994c6545..c5a74043809 100644 --- a/compiler/testData/ir/irText/declarations/provideDelegate/localDifferentReceivers.txt +++ b/compiler/testData/ir/irText/declarations/provideDelegate/localDifferentReceivers.txt @@ -1,5 +1,6 @@ FILE /localDifferentReceivers.kt CLASS CLASS MyClass + $new: VALUE_PARAMETER CONSTRUCTOR public constructor MyClass(value: kotlin.String) VALUE_PARAMETER value-parameter value: kotlin.String BLOCK_BODY @@ -41,14 +42,14 @@ FILE /localDifferentReceivers.kt $receiver: CALL 'constructor MyClass(String)' type=MyClass origin=null value: CONST String type=kotlin.String value='O' host: CONST Null type=kotlin.Nothing? value='null' - p: CALLABLE_REFERENCE 'testO: String' type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + p: LOCAL_DELEGATED_PROPERTY_REFERENCE 'testO: String' delegate='`testO$delegate`: String' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE FUN DELEGATED_PROPERTY_ACCESSOR local final fun (): kotlin.String BLOCK_BODY RETURN type=kotlin.Nothing from='(): String' CALL 'getValue(Any?, Any) on String: String' type=kotlin.String origin=null $receiver: GET_VAR '`testO$delegate`: String' type=kotlin.String origin=null receiver: CONST Null type=kotlin.Nothing? value='null' - p: CALLABLE_REFERENCE 'testO: String' type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + p: LOCAL_DELEGATED_PROPERTY_REFERENCE 'testO: String' delegate='`testO$delegate`: String' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE LOCAL_DELEGATED_PROPERTY val testK: kotlin.String VAR DELEGATE val `testK$delegate`: kotlin.String CONST String type=kotlin.String value='K' @@ -58,7 +59,7 @@ FILE /localDifferentReceivers.kt CALL 'getValue(Any?, Any) on String: String' type=kotlin.String origin=null $receiver: GET_VAR '`testK$delegate`: String' type=kotlin.String origin=null receiver: CONST Null type=kotlin.Nothing? value='null' - p: CALLABLE_REFERENCE 'testK: String' type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE + p: LOCAL_DELEGATED_PROPERTY_REFERENCE 'testK: String' delegate='`testK$delegate`: String' getter='(): String' setter=null type=kotlin.reflect.KProperty0 origin=PROPERTY_REFERENCE_FOR_DELEGATE VAR val testOK: kotlin.String CALL 'plus(Any?): String' type=kotlin.String origin=PLUS $this: CALL '(): String' type=kotlin.String origin=GET_LOCAL_PROPERTY