@@ -598,7 +598,7 @@ private class ScriptToClassTransformer(
598598            val  ctorDispatchReceiverType =  expression.symbol.owner.dispatchReceiverParameter?.type
599599                ? :  if  (capturingClassesConstructors.keys.any { it.symbol ==  expression.symbol }) scriptClassReceiver.type else  null 
600600            if  (ctorDispatchReceiverType !=  null ) {
601-                 getDispatchReceiverExpression(data, expression, ctorDispatchReceiverType, expression.origin)?.let  {
601+                 getDispatchReceiverExpression(data, expression, ctorDispatchReceiverType, expression.origin,  null )?.let  {
602602                    expression.dispatchReceiver =  it
603603                }
604604            }
@@ -607,18 +607,29 @@ private class ScriptToClassTransformer(
607607    }
608608
609609    private  fun  getDispatchReceiverExpression (
610-         data :  ScriptToClassTransformerContext , expression :  IrDeclarationReference , receiverType :  IrType , origin :  IrStatementOrigin ? ,
610+         data :  ScriptToClassTransformerContext ,
611+         expression :  IrDeclarationReference ,
612+         receiverType :  IrType ,
613+         origin :  IrStatementOrigin ? ,
614+         originalReceiverParameter :  IrValueParameter ? ,
611615    ): IrExpression ?  {
612616        return  if  (receiverType ==  scriptClassReceiver.type) {
613-             getAccessCallForScriptInstance(data, expression.startOffset, expression.endOffset, origin)
617+             getAccessCallForScriptInstance(data, expression.startOffset, expression.endOffset, origin, originalReceiverParameter )
614618        } else  {
615-             getAccessCallForImplicitReceiver(data, expression, receiverType, origin)
619+             getAccessCallForImplicitReceiver(data, expression, receiverType, origin, originalReceiverParameter )
616620        }
617621    }
618622
619623    private  fun  getAccessCallForScriptInstance (
620-         data :  ScriptToClassTransformerContext , startOffset :  Int , endOffset :  Int , origin :  IrStatementOrigin ? 
621-     ) =  when  {
624+         data :  ScriptToClassTransformerContext ,
625+         startOffset :  Int ,
626+         endOffset :  Int ,
627+         origin :  IrStatementOrigin ? ,
628+         originalReceiverParameter :  IrValueParameter ? 
629+     ): IrExpression ?  =  when  {
630+         originalReceiverParameter !=  null  &&  originalReceiverParameter !=  scriptClassReceiver -> 
631+             null 
632+ 
622633        data.fieldForScriptThis !=  null  -> 
623634            IrGetFieldImpl (
624635                startOffset, endOffset,
@@ -634,30 +645,36 @@ private class ScriptToClassTransformer(
634645                        origin
635646                    )
636647            }
648+ 
637649        data.valueParameterForScriptThis !=  null  -> 
638650            IrGetValueImpl (
639651                startOffset, endOffset,
640652                scriptClassReceiver.type,
641653                data.valueParameterForScriptThis,
642654                origin
643655            )
656+ 
644657        else  ->  error(" Unexpected script transformation state: $data " 
645658    }
646659
647660    private  fun  getAccessCallForImplicitReceiver (
648661        data :  ScriptToClassTransformerContext ,
649662        expression :  IrDeclarationReference ,
650663        receiverType :  IrType ,
651-         expressionOrigin :  IrStatementOrigin ? 
664+         expressionOrigin :  IrStatementOrigin ? ,
665+         originalReceiverParameter :  IrValueParameter ? 
652666    ): IrExpression ?  {
653667        //  implicit receivers has priority (as per descriptor outer scopes)
654-         implicitReceiversFieldsWithParameters.firstOrNull { it.second.type ==  receiverType }?.let  { (field, param) -> 
668+         implicitReceiversFieldsWithParameters.firstOrNull {
669+             if  (originalReceiverParameter !=  null ) it.second ==  originalReceiverParameter
670+             else  it.second.type ==  receiverType
671+         }?.let  { (field, param) -> 
655672            val  builder =  context.createIrBuilder(expression.symbol)
656673            return  if  (data.isInScriptConstructor) {
657674                builder.irGet(param.type, param.symbol)
658675            } else  {
659676                val  scriptReceiver = 
660-                     getAccessCallForScriptInstance(data, expression.startOffset, expression.endOffset, expressionOrigin)
677+                     getAccessCallForScriptInstance(data, expression.startOffset, expression.endOffset, expressionOrigin,  null )
661678                builder.irGetField(scriptReceiver, field)
662679            }
663680        }
@@ -692,7 +709,7 @@ private class ScriptToClassTransformer(
692709                    builder.irGet(objArray.defaultType, irScript.earlierScriptsParameter!! .symbol)
693710                } else  {
694711                    val  scriptReceiver = 
695-                         getAccessCallForScriptInstance(data, expression.startOffset, expression.endOffset, expressionOrigin)
712+                         getAccessCallForScriptInstance(data, expression.startOffset, expression.endOffset, expressionOrigin,  null )
696713                    builder.irGetField(scriptReceiver, earlierScriptsField!! )
697714                }
698715            val  getPrevScriptObjectExpression =  builder.irCall(objArrayGet).apply  {
@@ -711,40 +728,13 @@ private class ScriptToClassTransformer(
711728        return  null 
712729    }
713730
714-     override  fun  visitGetField (expression :  IrGetField , data :  ScriptToClassTransformerContext ): IrExpression  {
715-         if  (irScript.needsReceiverProcessing) {
716-             val  receiver =  expression.receiver
717-             if  (receiver is  IrGetValue  &&  receiver.symbol.owner.name ==  SpecialNames .THIS ) {
718-                 val  newReceiver =  getDispatchReceiverExpression(data, expression, receiver.type, expression.origin)
719-                 if  (newReceiver !=  null ) {
720-                     val  newGetField = 
721-                         IrGetFieldImpl (expression.startOffset, expression.endOffset, expression.symbol, expression.type, newReceiver)
722-                     return  super .visitGetField(newGetField, data)
723-                 }
724-             }
725-         }
726-         return  super .visitGetField(expression, data)
727-     }
728- 
729-     override  fun  visitCall (expression :  IrCall , data :  ScriptToClassTransformerContext ): IrExpression  {
730-         if  (irScript.needsReceiverProcessing) {
731-             val  target =  expression.symbol.owner
732-             val  receiver:  IrValueParameter ?  =  target.dispatchReceiverParameter
733-             if  (receiver?.name ==  SpecialNames .THIS ) {
734-                 val  newReceiver =  getDispatchReceiverExpression(data, expression, receiver.type, expression.origin)
735-                 if  (newReceiver !=  null ) {
736-                     expression.dispatchReceiver =  newReceiver
737-                 }
738-             }
739-         }
740-         return  super .visitCall(expression, data) as  IrExpression 
741-     }
742- 
743731    override  fun  visitGetValue (expression :  IrGetValue , data :  ScriptToClassTransformerContext ): IrExpression  {
744732        if  (irScript.needsReceiverProcessing) {
745733            val  getValueParameter =  expression.symbol.owner as ?  IrValueParameter 
746734            if  (getValueParameter !=  null  &&  getValueParameter.name ==  SpecialNames .THIS ) {
747-                 val  newExpression =  getDispatchReceiverExpression(data, expression, getValueParameter.type, expression.origin)
735+                 val  newExpression =  getDispatchReceiverExpression(
736+                     data, expression, getValueParameter.type, expression.origin, getValueParameter
737+                 )
748738                if  (newExpression !=  null ) {
749739                    return  super .visitExpression(newExpression, data)
750740                }
0 commit comments