@@ -83,6 +83,15 @@ object Parsers {
83
83
def atPos [T <: Positioned ](start : Offset )(t : T ): T =
84
84
atPos(start, start)(t)
85
85
86
+ def startOffset (t : Positioned ): Int =
87
+ if (t.pos.exists) t.pos.start else in.offset
88
+
89
+ def pointOffset (t : Positioned ): Int =
90
+ if (t.pos.exists) t.pos.point else in.offset
91
+
92
+ def endOffset (t : Positioned ): Int =
93
+ if (t.pos.exists) t.pos.end else in.lastOffset
94
+
86
95
def nameStart : Offset =
87
96
if (in.token == BACKQUOTED_IDENT ) in.offset + 1 else in.offset
88
97
@@ -448,7 +457,7 @@ object Parsers {
448
457
val topInfo = opStack.head
449
458
opStack = opStack.tail
450
459
val od = reduceStack(base, topInfo.operand, 0 , true )
451
- return atPos(od.pos.start , topInfo.offset) {
460
+ return atPos(startOffset(od) , topInfo.offset) {
452
461
PostfixOp (od, topInfo.operator)
453
462
}
454
463
}
@@ -492,7 +501,7 @@ object Parsers {
492
501
493
502
/** Accept identifier acting as a selector on given tree `t`. */
494
503
def selector (t : Tree ): Tree =
495
- atPos(t.pos.start , in.offset) { Select (t, ident()) }
504
+ atPos(startOffset(t) , in.offset) { Select (t, ident()) }
496
505
497
506
/** Selectors ::= ident { `.' ident()
498
507
*
@@ -728,7 +737,7 @@ object Parsers {
728
737
729
738
def refinedTypeRest (t : Tree ): Tree = {
730
739
newLineOptWhenFollowedBy(LBRACE )
731
- if (in.token == LBRACE ) refinedTypeRest(atPos(t.pos.start ) { RefinedTypeTree (t, refinement()) })
740
+ if (in.token == LBRACE ) refinedTypeRest(atPos(startOffset(t) ) { RefinedTypeTree (t, refinement()) })
732
741
else t
733
742
}
734
743
@@ -749,7 +758,7 @@ object Parsers {
749
758
def annotType (): Tree = annotTypeRest(simpleType())
750
759
751
760
def annotTypeRest (t : Tree ): Tree =
752
- if (in.token == AT ) annotTypeRest(atPos(t.pos.start ) { Annotated (t, annot()) })
761
+ if (in.token == AT ) annotTypeRest(atPos(startOffset(t) ) { Annotated (t, annot()) })
753
762
else t
754
763
755
764
/** SimpleType ::= SimpleType TypeArgs
@@ -780,19 +789,19 @@ object Parsers {
780
789
val handleSingletonType : Tree => Tree = t =>
781
790
if (in.token == TYPE ) {
782
791
in.nextToken()
783
- atPos(t.pos.start ) { SingletonTypeTree (t) }
792
+ atPos(startOffset(t) ) { SingletonTypeTree (t) }
784
793
} else t
785
794
786
795
private def simpleTypeRest (t : Tree ): Tree = in.token match {
787
796
case HASH => simpleTypeRest(typeProjection(t))
788
- case LBRACKET => simpleTypeRest(atPos(t.pos.start ) { AppliedTypeTree (t, typeArgs(namedOK = true )) })
797
+ case LBRACKET => simpleTypeRest(atPos(startOffset(t) ) { AppliedTypeTree (t, typeArgs(namedOK = true )) })
789
798
case _ => t
790
799
}
791
800
792
801
private def typeProjection (t : Tree ): Tree = {
793
802
accept(HASH )
794
803
val id = typeIdent()
795
- atPos(t.pos.start, id.pos.start ) { Select (t, id.name) }
804
+ atPos(startOffset(t), startOffset(id) ) { Select (t, id.name) }
796
805
}
797
806
798
807
/** NamedTypeArg ::= id `=' Type
@@ -846,7 +855,7 @@ object Parsers {
846
855
val t = toplevelTyp()
847
856
if (isIdent(nme.raw.STAR )) {
848
857
in.nextToken()
849
- atPos(t.pos.start ) { PostfixOp (t, nme.raw.STAR ) }
858
+ atPos(startOffset(t) ) { PostfixOp (t, nme.raw.STAR ) }
850
859
} else t
851
860
}
852
861
@@ -971,7 +980,7 @@ object Parsers {
971
980
val t = expr1(location)
972
981
if (in.token == ARROW ) {
973
982
placeholderParams = saved
974
- closureRest(t.pos.start , location, convertToParams(t))
983
+ closureRest(startOffset(t) , location, convertToParams(t))
975
984
}
976
985
else if (isWildcard(t)) {
977
986
placeholderParams = placeholderParams ::: saved
@@ -1025,7 +1034,7 @@ object Parsers {
1025
1034
assert(handlerStart != - 1 )
1026
1035
syntaxError(
1027
1036
new EmptyCatchBlock (body),
1028
- Position (handlerStart, handler.pos.end )
1037
+ Position (handlerStart, endOffset( handler) )
1029
1038
)
1030
1039
case _ =>
1031
1040
}
@@ -1035,7 +1044,7 @@ object Parsers {
1035
1044
else {
1036
1045
if (handler.isEmpty) warning(
1037
1046
EmptyCatchAndFinallyBlock (body),
1038
- source atPos Position (tryOffset, body.pos.end )
1047
+ source atPos Position (tryOffset, endOffset( body) )
1039
1048
)
1040
1049
EmptyTree
1041
1050
}
@@ -1057,21 +1066,21 @@ object Parsers {
1057
1066
case EQUALS =>
1058
1067
t match {
1059
1068
case Ident (_) | Select (_, _) | Apply (_, _) =>
1060
- atPos(t.pos.start , in.skipToken()) { Assign (t, expr()) }
1069
+ atPos(startOffset(t) , in.skipToken()) { Assign (t, expr()) }
1061
1070
case _ =>
1062
1071
t
1063
1072
}
1064
1073
case COLON =>
1065
1074
ascription(t, location)
1066
1075
case MATCH =>
1067
- atPos(t.pos.start , in.skipToken()) {
1076
+ atPos(startOffset(t) , in.skipToken()) {
1068
1077
inBraces(Match (t, caseClauses()))
1069
1078
}
1070
1079
case _ =>
1071
1080
t
1072
1081
}
1073
1082
1074
- def ascription (t : Tree , location : Location .Value ) = atPos(t.pos.start , in.skipToken()) {
1083
+ def ascription (t : Tree , location : Location .Value ) = atPos(startOffset(t) , in.skipToken()) {
1075
1084
in.token match {
1076
1085
case USCORE =>
1077
1086
val uscoreStart = in.skipToken()
@@ -1105,7 +1114,7 @@ object Parsers {
1105
1114
val id = termIdent()
1106
1115
val paramExpr =
1107
1116
if (location == Location .InBlock && in.token == COLON )
1108
- atPos(id.pos.start , in.skipToken()) { Typed (id, infixType()) }
1117
+ atPos(startOffset(id) , in.skipToken()) { Typed (id, infixType()) }
1109
1118
else
1110
1119
id
1111
1120
closureRest(start, location, convertToParam(paramExpr, mods) :: Nil )
@@ -1194,13 +1203,13 @@ object Parsers {
1194
1203
in.nextToken()
1195
1204
simpleExprRest(selector(t), canApply = true )
1196
1205
case LBRACKET =>
1197
- val tapp = atPos(t.pos.start , in.offset) { TypeApply (t, typeArgs(namedOK = true )) }
1206
+ val tapp = atPos(startOffset(t) , in.offset) { TypeApply (t, typeArgs(namedOK = true )) }
1198
1207
simpleExprRest(tapp, canApply = true )
1199
1208
case LPAREN | LBRACE if canApply =>
1200
- val app = atPos(t.pos.start , in.offset) { Apply (t, argumentExprs()) }
1209
+ val app = atPos(startOffset(t) , in.offset) { Apply (t, argumentExprs()) }
1201
1210
simpleExprRest(app, canApply = true )
1202
1211
case USCORE =>
1203
- atPos(t.pos.start , in.skipToken()) { PostfixOp (t, nme.WILDCARD ) }
1212
+ atPos(startOffset(t) , in.skipToken()) { PostfixOp (t, nme.WILDCARD ) }
1204
1213
case _ =>
1205
1214
t
1206
1215
}
@@ -1284,7 +1293,7 @@ object Parsers {
1284
1293
if (in.token == IF ) guard()
1285
1294
else {
1286
1295
val pat = pattern1()
1287
- if (in.token == EQUALS ) atPos(pat.pos.start , in.skipToken()) { GenAlias (pat, expr()) }
1296
+ if (in.token == EQUALS ) atPos(startOffset( pat) , in.skipToken()) { GenAlias (pat, expr()) }
1288
1297
else generatorRest(pat)
1289
1298
}
1290
1299
@@ -1293,7 +1302,7 @@ object Parsers {
1293
1302
def generator (): Tree = generatorRest(pattern1())
1294
1303
1295
1304
def generatorRest (pat : Tree ) =
1296
- atPos(pat.pos.start , accept(LARROW )) { GenFrom (pat, expr()) }
1305
+ atPos(startOffset( pat) , accept(LARROW )) { GenFrom (pat, expr()) }
1297
1306
1298
1307
/** ForExpr ::= `for' (`(' Enumerators `)' | `{' Enumerators `}')
1299
1308
* {nl} [`yield'] Expr
@@ -1357,7 +1366,7 @@ object Parsers {
1357
1366
val pattern = () => {
1358
1367
val pat = pattern1()
1359
1368
if (isIdent(nme.raw.BAR ))
1360
- atPos(pat.pos.start ) { Alternative (pat :: patternAlts()) }
1369
+ atPos(startOffset( pat) ) { Alternative (pat :: patternAlts()) }
1361
1370
else pat
1362
1371
}
1363
1372
@@ -1383,15 +1392,15 @@ object Parsers {
1383
1392
// compatibility for Scala2 `x @ _*` syntax
1384
1393
infixPattern() match {
1385
1394
case pt @ Ident (tpnme.WILDCARD_STAR ) =>
1386
- migrationWarningOrError(" The syntax `x @ _*' is no longer supported; use `x : _*' instead" , p.pos.start )
1387
- atPos(p.pos.start , offset) { Typed (p, pt) }
1395
+ migrationWarningOrError(" The syntax `x @ _*' is no longer supported; use `x : _*' instead" , startOffset(p) )
1396
+ atPos(startOffset(p) , offset) { Typed (p, pt) }
1388
1397
case p =>
1389
- atPos(p.pos.start , offset) { Bind (name, p) }
1398
+ atPos(startOffset(p) , offset) { Bind (name, p) }
1390
1399
}
1391
1400
case p @ Ident (tpnme.WILDCARD_STAR ) =>
1392
1401
// compatibility for Scala2 `_*` syntax
1393
- migrationWarningOrError(" The syntax `_*' is no longer supported; use `x : _*' instead" , p.pos.start )
1394
- atPos(p.pos.start ) { Typed (Ident (nme.WILDCARD ), p) }
1402
+ migrationWarningOrError(" The syntax `_*' is no longer supported; use `x : _*' instead" , startOffset(p) )
1403
+ atPos(startOffset(p) ) { Typed (Ident (nme.WILDCARD ), p) }
1395
1404
case p =>
1396
1405
p
1397
1406
}
@@ -1415,7 +1424,7 @@ object Parsers {
1415
1424
val simplePattern = () => in.token match {
1416
1425
case IDENTIFIER | BACKQUOTED_IDENT | THIS =>
1417
1426
path(thisOK = true ) match {
1418
- case id @ Ident (nme.raw.MINUS ) if isNumericLit => literal(id.pos.start )
1427
+ case id @ Ident (nme.raw.MINUS ) if isNumericLit => literal(startOffset(id) )
1419
1428
case t => simplePatternRest(t)
1420
1429
}
1421
1430
case USCORE =>
@@ -1445,9 +1454,9 @@ object Parsers {
1445
1454
def simplePatternRest (t : Tree ): Tree = {
1446
1455
var p = t
1447
1456
if (in.token == LBRACKET )
1448
- p = atPos(t.pos.start , in.offset) { TypeApply (p, typeArgs()) }
1457
+ p = atPos(startOffset(t) , in.offset) { TypeApply (p, typeArgs()) }
1449
1458
if (in.token == LPAREN )
1450
- p = atPos(t.pos.start , in.offset) { Apply (p, argumentPatterns()) }
1459
+ p = atPos(startOffset(t) , in.offset) { Apply (p, argumentPatterns()) }
1451
1460
p
1452
1461
}
1453
1462
@@ -1573,7 +1582,8 @@ object Parsers {
1573
1582
case Select (qual, name) => cpy.Select (tree)(adjustStart(start)(qual), name)
1574
1583
case _ => tree
1575
1584
}
1576
- if (start < tree1.pos.start) tree1.withPos(tree1.pos.withStart(start))
1585
+ if (tree1.pos.exists && start < tree1.pos.start)
1586
+ tree1.withPos(tree1.pos.withStart(start))
1577
1587
else tree1
1578
1588
}
1579
1589
@@ -1771,7 +1781,7 @@ object Parsers {
1771
1781
case imp : Import =>
1772
1782
imp
1773
1783
case sel @ Select (qual, name) =>
1774
- val selector = atPos(sel.pos.point ) { Ident (name) }
1784
+ val selector = atPos(pointOffset( sel) ) { Ident (name) }
1775
1785
cpy.Import (sel)(qual, selector :: Nil )
1776
1786
case t =>
1777
1787
accept(DOT )
@@ -1804,7 +1814,7 @@ object Parsers {
1804
1814
def importSelector (): Tree = {
1805
1815
val from = termIdentOrWildcard()
1806
1816
if (from.name != nme.WILDCARD && in.token == ARROW )
1807
- atPos(from.pos.start , in.skipToken()) {
1817
+ atPos(startOffset( from) , in.skipToken()) {
1808
1818
Thicket (from, termIdentOrWildcard())
1809
1819
}
1810
1820
else from
@@ -2085,7 +2095,7 @@ object Parsers {
2085
2095
2086
2096
/** Create a tree representing a packaging */
2087
2097
def makePackaging (start : Int , pkg : Tree , stats : List [Tree ]): PackageDef = pkg match {
2088
- case x : RefTree => atPos(start, pkg.pos.point )(PackageDef (x, stats))
2098
+ case x : RefTree => atPos(start, pointOffset( pkg) )(PackageDef (x, stats))
2089
2099
}
2090
2100
2091
2101
/** Packaging ::= package QualId [nl] `{' TopStatSeq `}'
0 commit comments