Skip to content

Commit e9495ee

Browse files
committed
FormatTokens: use getHead/Last, not tree tokens
Also, rename or refactor some methods.
1 parent caf427a commit e9495ee

File tree

4 files changed

+40
-40
lines changed

4 files changed

+40
-40
lines changed

scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatOps.scala

+7-7
Original file line numberDiff line numberDiff line change
@@ -289,9 +289,9 @@ class FormatOps(
289289
def alt = getLastToken(t)
290290
t match {
291291
case t: Defn.Def =>
292-
t.body.tokens.headOption.fold(alt) {
293-
case head: T.LeftBrace if t.body.is[Term.Block] => head
294-
case head => tokenBefore(head).left
292+
tokens.getHeadOpt(t.body).fold(alt) { ft =>
293+
if (ft.left.is[T.LeftBrace] && t.body.is[Term.Block]) ft.left
294+
else prevNonCommentBefore(ft).left
295295
}
296296
case _: Ctor.Primary =>
297297
close match {
@@ -820,7 +820,7 @@ class FormatOps(
820820
if (opFollowsComment) getLastNonTrivialToken(app.lhs) else opToken
821821
}
822822

823-
private def getLastEnclosedToken(tree: Tree): T = {
823+
def getLastEnclosedToken(tree: Tree): T = {
824824
tokens.getLastExceptParen(tree.tokens).left
825825
}
826826

@@ -1777,8 +1777,8 @@ class FormatOps(
17771777
val callPolicy = CallSite.getFoldedPolicy(lia.lhs)
17781778
if (callPolicy.nonEmpty) getPolicySplits(0, callPolicy)
17791779
else {
1780-
val lp = body.tokens.headOption.filter(_.is[T.LeftParen])
1781-
val ok = lp.flatMap(matchingOpt).exists(_.end >= lia.op.pos.end)
1780+
// lia is enclosed in parens if and only if lia == ia (== body)
1781+
val ok = isEnclosedInParens(body)
17821782
getSplits(getSlbSplit(getLastToken(if (ok) lia.lhs else lia.op)))
17831783
}
17841784
case _ =>
@@ -2655,7 +2655,7 @@ class FormatOps(
26552655
def getBlocks(ft: FormatToken, nft: FormatToken, all: Boolean): Result =
26562656
ft.meta.leftOwner match {
26572657
case t @ Term.For(s, b)
2658-
if !nft.right.is[T.KwDo] && !isLastToken(ft.left, t) =>
2658+
if !nft.right.is[T.KwDo] && !isTokenLastOrAfter(ft.left, t) =>
26592659
Some((b, seq(all, s)))
26602660
case _ => None
26612661
}

scalafmt-core/shared/src/main/scala/org/scalafmt/internal/FormatTokens.scala

+12-11
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ import scala.meta.tokens.Tokens
77

88
import org.scalafmt.config.ScalafmtConfig
99
import org.scalafmt.rewrite.FormatTokensRewrite
10-
import org.scalafmt.util.StyleMap
11-
import org.scalafmt.util.TokenOps
12-
import org.scalafmt.util.TreeOps
13-
import org.scalafmt.util.Whitespace
10+
import org.scalafmt.util._
1411

1512
class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
1613
val arr: Array[FormatToken]
@@ -99,10 +96,8 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
9996
@inline private def areMatchingParens(close: Token)(open: => Token): Boolean =
10097
close.is[Token.RightParen] && areMatching(close)(open)
10198

102-
def isEnclosedInParens(tokens: Tokens): Boolean =
103-
getClosingIfInParens(tokens).isDefined
10499
def isEnclosedInParens(tree: Tree): Boolean =
105-
isEnclosedInParens(tree.tokens)
100+
getClosingIfInParens(tree).isDefined
106101

107102
def getClosingIfInParens(
108103
last: FormatToken
@@ -114,8 +109,10 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
114109
Some(afterLast)
115110
else None
116111
}
117-
def getClosingIfInParens(tokens: Tokens): Option[FormatToken] =
112+
def getClosingIfInParens(tree: Tree): Option[FormatToken] = {
113+
val tokens = tree.tokens
118114
getHeadOpt(tokens).flatMap(getClosingIfInParens(getLastNonTrivial(tokens)))
115+
}
119116

120117
def getLastExceptParen(tokens: Tokens): FormatToken = {
121118
val last = getLastNonTrivial(tokens)
@@ -166,6 +163,7 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
166163
after(tokens.head)
167164
def getHead(tree: Tree): FormatToken =
168165
getHead(tree.tokens)
166+
169167
def getHeadOpt(tokens: Tokens): Option[FormatToken] =
170168
tokens.headOption.map(after)
171169
def getHeadOpt(tree: Tree): Option[FormatToken] =
@@ -175,6 +173,7 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
175173
apply(TokenOps.findLastVisibleToken(tokens))
176174
def getLast(tree: Tree): FormatToken =
177175
getLast(tree.tokens)
176+
178177
def getLastOpt(tokens: Tokens): Option[FormatToken] =
179178
TokenOps.findLastVisibleTokenOpt(tokens).map(apply)
180179
def getLastOpt(tree: Tree): Option[FormatToken] =
@@ -184,6 +183,7 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
184183
apply(TokenOps.findLastNonTrivialToken(tokens))
185184
def getLastNonTrivial(tree: Tree): FormatToken =
186185
getLastNonTrivial(tree.tokens)
186+
187187
def getLastNonTrivialOpt(tokens: Tokens): Option[FormatToken] =
188188
TokenOps.findLastNonTrivialTokenOpt(tokens).map(apply)
189189
def getLastNonTrivialOpt(tree: Tree): Option[FormatToken] =
@@ -208,10 +208,10 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
208208
@inline
209209
def justBefore(token: Token): FormatToken = apply(token, -1)
210210
@inline
211-
def tokenJustBefore(tree: Tree): FormatToken = justBefore(tree.tokens.head)
211+
def tokenJustBefore(tree: Tree): FormatToken = prev(getHead(tree))
212212

213213
def tokenJustBeforeOpt(tree: Tree): Option[FormatToken] =
214-
tree.tokens.headOption.map(justBefore)
214+
getHeadOpt(tree).map(prev)
215215
def tokenJustBeforeOpt(trees: Seq[Tree]): Option[FormatToken] =
216216
trees.headOption.flatMap(tokenJustBeforeOpt)
217217

@@ -220,7 +220,8 @@ class FormatTokens(leftTok2tok: Map[TokenOps.TokenHash, Int])(
220220
@inline
221221
def tokenBefore(token: Token): FormatToken = prevNonComment(justBefore(token))
222222
@inline
223-
def tokenBefore(tree: Tree): FormatToken = tokenBefore(tree.tokens.head)
223+
def tokenBefore(tree: Tree): FormatToken =
224+
prevNonComment(tokenJustBefore(tree))
224225
@inline
225226
def tokenBefore(trees: Seq[Tree]): FormatToken = tokenBefore(trees.head)
226227

scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala

+9-9
Original file line numberDiff line numberDiff line change
@@ -1489,13 +1489,13 @@ class Router(formatOps: FormatOps) {
14891489
case Some(p: Term.ApplyInfix) => startsInfix(p, ai)
14901490
case _ => true
14911491
})
1492-
val roTokens = rightOwner.tokens
1493-
isFirstToken(lb, roTokens) && rightOwner.parent.exists {
1492+
val roPos = rightOwner.pos
1493+
isTokenHeadOrBefore(lb, roPos) && rightOwner.parent.exists {
14941494
case p: Term.ApplyInfix => // exclude start of infix
14951495
startsInfix(p, rightOwner)
14961496
case p =>
1497-
isFirstToken(lb, p) &&
1498-
matchingOpt(lb).exists(isLastToken(_, roTokens))
1497+
isTokenHeadOrBefore(lb, p) &&
1498+
matchingOpt(lb).exists(isTokenLastOrAfter(_, roPos))
14991499
}
15001500
} =>
15011501
Seq(Split(Space, 0))
@@ -1672,7 +1672,7 @@ class Router(formatOps: FormatOps) {
16721672
case x: Term.Match => SelectLike(x, getKwMatchAfterDot(t))
16731673
}
16741674
val prevSelect = findPrevSelect(thisSelect, enclosed)
1675-
val expire = tokens.getLastExceptParen(expireTree.tokens).left
1675+
val expire = getLastEnclosedToken(expireTree)
16761676
val indentLen = style.indent.main
16771677

16781678
def breakOnNextDot: Policy =
@@ -1940,7 +1940,7 @@ class Router(formatOps: FormatOps) {
19401940
// If/For/While/For with (
19411941
case FormatToken(open: T.LeftParen, _, _) if (leftOwner match {
19421942
case _: Term.If | _: Term.While | _: Term.For | _: Term.ForYield =>
1943-
!isFirstToken(open, leftOwner)
1943+
!isTokenHeadOrBefore(open, leftOwner)
19441944
case _ => false
19451945
}) =>
19461946
val close = matching(open)
@@ -2010,7 +2010,7 @@ class Router(formatOps: FormatOps) {
20102010
case _: Term.While | _: Term.For =>
20112011
!nextNonComment(formatToken).right.is[T.KwDo]
20122012
case _ => false
2013-
}) && !isLastToken(close, leftOwner) =>
2013+
}) && !isTokenLastOrAfter(close, leftOwner) =>
20142014
val body = leftOwner match {
20152015
case t: Term.If => t.thenp
20162016
case t: Term.For => t.body
@@ -2307,7 +2307,7 @@ class Router(formatOps: FormatOps) {
23072307

23082308
// Term.For
23092309
case ft @ FormatToken(rb: T.RightBrace, _, _)
2310-
if leftOwner.is[Term.For] && !isLastToken(rb, leftOwner) &&
2310+
if leftOwner.is[Term.For] && !isTokenLastOrAfter(rb, leftOwner) &&
23112311
!nextNonComment(formatToken).right.is[T.KwDo] =>
23122312
val body = leftOwner.asInstanceOf[Term.For].body
23132313
def nlSplit(cost: Int) = Split(Newline, cost)
@@ -2517,7 +2517,7 @@ class Router(formatOps: FormatOps) {
25172517
def modNoNL = {
25182518
def allowSpace = rightOwner match {
25192519
case _: Term.If | _: Term.While | _: Term.For | _: Term.ForYield =>
2520-
isLastToken(close, rightOwner)
2520+
isTokenLastOrAfter(close, rightOwner)
25212521
case _ => true
25222522
}
25232523
Space(style.spaces.inParentheses && allowSpace)

scalafmt-core/shared/src/main/scala/org/scalafmt/util/TreeOps.scala

+12-13
Original file line numberDiff line numberDiff line change
@@ -88,10 +88,9 @@ object TreeOps {
8888
val ret = Map.newBuilder[TokenHash, Tree]
8989
ret.sizeHint(tree.tokens.length)
9090

91-
def addTok(token: Token, tree: Tree) =
92-
ret += hash(ftoks.after(token).left) -> tree
93-
def addTree(t: Tree, tree: Tree) =
94-
t.tokens.find(!_.is[Trivia]).foreach(addTok(_, tree))
91+
def addFT(ft: FormatToken, tree: Tree): Unit = ret += hash(ft.left) -> tree
92+
def addTok(token: Token, tree: Tree) = addFT(ftoks.after(token), tree)
93+
def addTree(t: Tree, o: Tree) = ftoks.getHeadOpt(t).foreach(addFT(_, o))
9594
def addAll(trees: Seq[Tree]) = trees.foreach(x => addTree(x, x))
9695

9796
def addDefnTokens(
@@ -412,23 +411,23 @@ object TreeOps {
412411
isSuperfluousParenthesis(open.asInstanceOf[LeftParen], owner)
413412

414413
def isSuperfluousParenthesis(open: LeftParen, owner: Tree): Boolean =
415-
!isTuple(owner) && isFirstToken(open, owner)
414+
!isTuple(owner) && isTokenHeadOrBefore(open, owner)
416415

417416
@inline
418-
def isFirstToken(token: Token, owner: Tree): Boolean =
419-
isFirstToken(token, owner.tokens)
417+
def isTokenHeadOrBefore(token: Token, owner: Tree): Boolean =
418+
isTokenHeadOrBefore(token, owner.pos)
420419

421420
@inline
422-
def isFirstToken(token: Token, owner: Tokens): Boolean =
423-
owner.headOption.contains(token)
421+
def isTokenHeadOrBefore(token: Token, pos: Position): Boolean =
422+
pos.start >= token.start
424423

425424
@inline
426-
def isLastToken(token: Token, owner: Tree): Boolean =
427-
isLastToken(token, owner.tokens)
425+
def isTokenLastOrAfter(token: Token, owner: Tree): Boolean =
426+
isTokenLastOrAfter(token, owner.pos)
428427

429428
@inline
430-
def isLastToken(token: Token, owner: Tokens): Boolean =
431-
owner.lastOption.contains(token)
429+
def isTokenLastOrAfter(token: Token, pos: Position): Boolean =
430+
pos.end <= token.end
432431

433432
def isCallSite(tree: Tree)(implicit style: ScalafmtConfig): Boolean =
434433
tree match {

0 commit comments

Comments
 (0)