diff options
author | Eugene Burmako <xeno.by@gmail.com> | 2013-05-12 14:53:25 +0200 |
---|---|---|
committer | Eugene Burmako <xeno.by@gmail.com> | 2013-05-12 22:18:59 +0200 |
commit | adef4b526833a804dcbc160ff67c83e42c9fc2ee (patch) | |
tree | efa187b493141b363053765e07cff8e401bcc7be /src/compiler/scala/tools/nsc/typechecker/Typers.scala | |
parent | 7f29f8512d4975cf3a5a0b536a8910e4e3b4316b (diff) | |
download | scala-adef4b526833a804dcbc160ff67c83e42c9fc2ee.tar.gz scala-adef4b526833a804dcbc160ff67c83e42c9fc2ee.tar.bz2 scala-adef4b526833a804dcbc160ff67c83e42c9fc2ee.zip |
SI-5923 instantiates targs in deferred macro applications
In January I submitted a pull request that, as I thought back then,
fixes SI-5923: https://github.com/scala/scala/commit/fe60284769.
The pull request was merged, and everyone was happy that the bug got fixed.
Unfortunately, the fix was: a) incomplete, b) broke something else,
as noticed by Miles in https://groups.google.com/d/topic/scala-internals/7pA9CiiD3u8/discussion.
Now we got a real fix in 2.10.x (https://github.com/scala/scala/commit/90ac5c4e13),
and it's my pleasure to port it to master.
Diffstat (limited to 'src/compiler/scala/tools/nsc/typechecker/Typers.scala')
-rw-r--r-- | src/compiler/scala/tools/nsc/typechecker/Typers.scala | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala index 001808e6bc..2de59056ef 100644 --- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala +++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala @@ -1091,7 +1091,6 @@ trait Typers extends Adaptations with Tags { instantiateToMethodType(mt) case _ => - def vanillaAdapt(tree: Tree) = { def shouldInsertApply(tree: Tree) = mode.inAll(EXPRmode | FUNmode) && (tree.tpe match { case _: MethodType | _: OverloadedType | _: PolyType => false case _ => applyPossible @@ -1107,16 +1106,15 @@ trait Typers extends Adaptations with Tags { } if (tree.isType) adaptType() + else if (mode.inExprModeButNot(FUNmode) && treeInfo.isMacroApplication(tree)) + macroExpandApply(this, tree, mode, pt) else if (mode.inAll(PATTERNmode | FUNmode)) adaptConstrPattern() else if (shouldInsertApply(tree)) insertApply() - else if (!context.undetparams.isEmpty && !mode.inPolyMode) { // (9) + else if (context.undetparams.nonEmpty && !mode.inPolyMode) { // (9) assert(!mode.inHKMode, mode) //@M - if (mode.inExprModeButNot(FUNmode) && pt.typeSymbol == UnitClass) - instantiateExpectingUnit(tree, mode) - else - instantiate(tree, mode, pt) + instantiatePossiblyExpectingUnit(tree, mode, pt) } else if (tree.tpe <:< pt) { tree } else { @@ -1242,9 +1240,6 @@ trait Typers extends Adaptations with Tags { fallBack } } - val tree1 = if (mode.inExprModeButNot(FUNmode) && treeInfo.isMacroApplication(tree)) macroExpandApply(this, tree, mode, pt) else tree - if (tree == tree1) vanillaAdapt(tree1) else tree1 - } } def instantiate(tree: Tree, mode: Mode, pt: Type): Tree = { @@ -1264,6 +1259,13 @@ trait Typers extends Adaptations with Tags { } } + def instantiatePossiblyExpectingUnit(tree: Tree, mode: Mode, pt: Type): Tree = { + if (mode.inExprModeButNot(FUNmode) && pt.typeSymbol == UnitClass) + instantiateExpectingUnit(tree, mode) + else + instantiate(tree, mode, pt) + } + private def isAdaptableWithView(qual: Tree) = { val qtpe = qual.tpe.widen ( !isPastTyper |