diff options
Diffstat (limited to 'src/compiler')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala | 14 | ||||
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 6 |
2 files changed, 17 insertions, 3 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala b/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala index 86bf846f1c..14f47a00fd 100644 --- a/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala +++ b/src/compiler/scala/tools/nsc/typechecker/StdAttachments.scala @@ -151,4 +151,18 @@ trait StdAttachments { * because someone has put MacroImplRefAttachment on it. */ def isMacroImplRef(tree: Tree): Boolean = tree.attachments.get[MacroImplRefAttachment.type].isDefined + + /** Since mkInvoke, the applyDynamic/selectDynamic/etc desugarer, is disconnected + * from typedNamedApply, the applyDynamicNamed argument rewriter, the latter + * doesn’t know whether it needs to apply the rewriting because the application + * has just been desugared or it needs to hold on because it’s already performed + * a desugaring on this tree. This has led to SI-8006. + * + * This attachment solves the problem by providing a means of communication + * between the two Dynamic desugarers, which solves the aforementioned issue. + */ + case object DynamicRewriteAttachment + def markDynamicRewrite(tree: Tree): Tree = tree.updateAttachment(DynamicRewriteAttachment) + def unmarkDynamicRewrite(tree: Tree): Tree = tree.removeAttachment[DynamicRewriteAttachment.type] + def isDynamicRewrite(tree: Tree): Boolean = tree.attachments.get[DynamicRewriteAttachment.type].isDefined } diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 7ff9e854b1..910da77ca8 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -3369,7 +3369,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper (args exists isNamedArg) || // uses a named argument isNamedApplyBlock(fun)) { // fun was transformed to a named apply block => // integrate this application into the block - if (dyna.isApplyDynamicNamed(fun)) dyna.typedNamedApply(tree, fun, args, mode, pt) + if (dyna.isApplyDynamicNamed(fun) && isDynamicRewrite(fun)) dyna.typedNamedApply(tree, fun, args, mode, pt) else tryNamesDefaults } else { val tparams = context.extractUndetparams() @@ -3927,7 +3927,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper gen.mkTuple(List(CODE.LIT(""), arg)) } - val t = treeCopy.Apply(orig, fun, args map argToBinding) + val t = treeCopy.Apply(orig, unmarkDynamicRewrite(fun), args map argToBinding) wrapErrors(t, _.typed(t, mode, pt)) } @@ -3992,7 +3992,7 @@ trait Typers extends Adaptations with Tags with TypersTracking with PatternTyper val nameStringLit = atPos(treeSelection.pos.withStart(treeSelection.pos.point).makeTransparent) { Literal(Constant(name.decode)) } - atPos(qual.pos)(Apply(fun, List(nameStringLit))) + markDynamicRewrite(atPos(qual.pos)(Apply(fun, List(nameStringLit)))) case _ => setError(tree) } |