summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala33
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala20
2 files changed, 14 insertions, 39 deletions
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
index cd64c49b47..ccebcfa54d 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
@@ -126,7 +126,7 @@ self =>
val global: Global
import global._
- case class OpInfo(operand: Tree, operator: Name, targs: List[Tree], offset: Offset)
+ case class OpInfo(operand: Tree, operator: Name, offset: Offset)
class SourceFileParser(val source: SourceFile) extends Parser {
@@ -789,7 +789,7 @@ self =>
val rPos = top.pos
val end = if (rPos.isDefined) rPos.endOrPoint else opPos.endOrPoint
top = atPos(start, opinfo.offset, end) {
- makeBinop(isExpr, opinfo.operand, opinfo.operator, top, opPos, opinfo.targs)
+ makeBinop(isExpr, opinfo.operand, opinfo.operator, top, opPos)
}
}
top
@@ -1440,17 +1440,6 @@ self =>
}
}
- def advanceStack(base: List[OpInfo], top: Tree): Tree = {
- val newTop = reduceStack(true, base, top, precedence(in.name), treeInfo.isLeftAssoc(in.name))
- val op = in.name
- val pos = in.offset
- ident()
- val targs = if (in.token == LBRACKET) exprTypeArgs() else Nil
- opstack ::= OpInfo(newTop, op, targs, pos)
-
- newTop
- }
-
/** {{{
* PostfixExpr ::= InfixExpr [Id [nl]]
* InfixExpr ::= PrefixExpr
@@ -1462,21 +1451,22 @@ self =>
var top = prefixExpr()
while (isIdent) {
- top = advanceStack(base, top)
+ top = reduceStack(true, base, top, precedence(in.name), treeInfo.isLeftAssoc(in.name))
+ val op = in.name
+ opstack = OpInfo(top, op, in.offset) :: opstack
+ ident()
newLineOptWhenFollowing(isExprIntroToken)
-
if (isExprIntro) {
val next = prefixExpr()
if (next == EmptyTree)
return reduceStack(true, base, top, 0, true)
top = next
- }
- else {
+ } else {
val topinfo = opstack.head
opstack = opstack.tail
val od = stripParens(reduceStack(true, base, topinfo.operand, 0, true))
return atPos(od.pos.startOrPoint, topinfo.offset) {
- applyTypeArgs(Select(od, topinfo.operator.encode), topinfo.targs)
+ Select(od, topinfo.operator.encode)
}
}
}
@@ -1816,7 +1806,7 @@ self =>
top = reduceStack(
false, base, top, precedence(in.name), treeInfo.isLeftAssoc(in.name))
val op = in.name
- opstack = OpInfo(top, op, Nil, in.offset) :: opstack
+ opstack = OpInfo(top, op, in.offset) :: opstack
ident()
top = simplePattern()
}
@@ -1906,11 +1896,6 @@ self =>
def exprTypeArgs() = outPattern.typeArgs()
def exprSimpleType() = outPattern.simpleType()
- def applyTypeArgs(sel: Tree, targs: List[Tree]): Tree = (
- if (targs.isEmpty) sel
- else atPos(sel.pos)(TypeApply(sel, targs))
- )
-
/** Default entry points into some pattern contexts. */
def pattern(): Tree = noSeq.pattern()
def patterns(): List[Tree] = noSeq.patterns()
diff --git a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
index 4b7c03b72a..0d2fbc5372 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/TreeBuilder.scala
@@ -174,14 +174,7 @@ abstract class TreeBuilder {
}
/** Create tree representing (unencoded) binary operation expression or pattern. */
- def makeBinop(isExpr: Boolean, left: Tree, op: TermName, right: Tree, opPos: Position, targs: List[Tree] = Nil): Tree = {
- require(isExpr || targs.isEmpty, ((left, op, targs, right)))
-
- def mkSel(t: Tree) = {
- val sel = atPos(opPos union t.pos)(Select(stripParens(t), op.encode))
- if (targs.isEmpty) sel else atPos(left.pos)(TypeApply(sel, targs))
- }
-
+ def makeBinop(isExpr: Boolean, left: Tree, op: TermName, right: Tree, opPos: Position): Tree = {
def mkNamed(args: List[Tree]) =
if (isExpr) args map {
case a @ Assign(id @ Ident(name), rhs) =>
@@ -194,17 +187,14 @@ abstract class TreeBuilder {
}
if (isExpr) {
if (treeInfo.isLeftAssoc(op)) {
- Apply(mkSel(left), arguments)
- }
- else {
+ Apply(atPos(opPos union left.pos) { Select(stripParens(left), op.encode) }, arguments)
+ } else {
val x = freshTermName()
Block(
List(ValDef(Modifiers(SYNTHETIC), x, TypeTree(), stripParens(left))),
- Apply(mkSel(right), List(Ident(x)))
- )
+ Apply(atPos(opPos union right.pos) { Select(stripParens(right), op.encode) }, List(Ident(x))))
}
- }
- else {
+ } else {
Apply(Ident(op.encode), stripParens(left) :: arguments)
}
}