diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-12-27 22:29:54 +0300 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-12-28 21:05:13 +0300 |
commit | d92effc8a995086c1e0c4482f6163ef17b289ede (patch) | |
tree | fee3ba6e309abe1b6c488d62721b3ce991c5bc2e /src/compiler | |
parent | bbd03b26f1eeba5abf495f5e745c6623f0cc05b7 (diff) | |
download | scala-d92effc8a995086c1e0c4482f6163ef17b289ede.tar.gz scala-d92effc8a995086c1e0c4482f6163ef17b289ede.tar.bz2 scala-d92effc8a995086c1e0c4482f6163ef17b289ede.zip |
SI-8006 prevents infinite applyDynamicNamed desugarings
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 commit introduces the attachment that links these translation facilities,
preventing infinite applyDynamicNamed desugarings.
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) } |