From bc1b768591adb1a45131bcd63679915f03956fbc Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Tue, 1 Aug 2023 13:04:40 +0300 Subject: [PATCH] Router: handle self-type whether it ends in `=>` (#3602) Previously, self-type ends just before the `=>` but in the next version of scalameta it will end on `=>` instead. Let's handle both cases. --- .../scala/org/scalafmt/internal/Router.scala | 28 ++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala index 1011ae78ea..f27f6f3986 100644 --- a/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala +++ b/scalafmt-core/shared/src/main/scala/org/scalafmt/internal/Router.scala @@ -300,15 +300,14 @@ class Router(formatOps: FormatOps) { else Some(false) (arrow, Some(arrow.left), 0, nlOnly) case _ => - selfAnnotationLast match { - case Some(anno) => - val arrow = leftOwner.tokens.find(_.is[T.RightArrow]) - val expire = arrow.getOrElse(anno) - val indent = style.indent.main - (tokens(expire), arrow, indent, Some(isSelfAnnotationNL)) - case _ => - (null, None, 0, None) + val annoOpt = selfAnnotationLast.map { anno => + val indent = style.indent.main + val annoFT = tokens(anno) + val arrow = annoFT.left.is[T.RightArrow] + val expire = if (arrow) annoFT else next(nextNonComment(annoFT)) + (expire, Some(expire.left), indent, Some(isSelfAnnotationNL)) } + annoOpt.getOrElse { (null, None, 0, None) } } val lambdaPolicy = if (lambdaExpire == null) null @@ -446,11 +445,14 @@ class Router(formatOps: FormatOps) { .withIndent(style.indent.main, endIndent, After) ) - case FormatToken(T.RightArrow() | T.ContextArrow(), right, _) - if leftOwner.is[Term.FunctionTerm] || - leftOwner.is[Term.PolyFunction] || - (leftOwner.is[Template] && - leftOwner.parent.exists(_.is[Term.NewAnonymous])) => + case FormatToken(_: T.RightArrow | _: T.ContextArrow, right, _) + if (leftOwner match { + case _: Term.FunctionTerm | _: Term.PolyFunction => true + case t: Template => t.parent.exists(_.is[Term.NewAnonymous]) + case t: Self => + t.parent.exists(_.parent.exists(_.is[Term.NewAnonymous])) + case _ => false + }) => val (endOfFunction, expiresOn) = leftOwner match { case t: Term.FunctionTerm => functionExpire(t) case t => getLastNonTrivialToken(t) -> ExpiresOn.Before