Skip to content

Commit 0a391cd

Browse files
Add SubMatch Tree
1 parent c535dbc commit 0a391cd

File tree

4 files changed

+16
-1
lines changed

4 files changed

+16
-1
lines changed

compiler/src/dotty/tools/dotc/ast/Trees.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,12 +608,18 @@ object Trees {
608608
extends TermTree[T] {
609609
type ThisTree[+T <: Untyped] = Match[T]
610610
def isInline = false
611+
def isSubMatch = false
611612
}
612613
class InlineMatch[+T <: Untyped] private[ast] (selector: Tree[T], cases: List[CaseDef[T]])(implicit @constructorOnly src: SourceFile)
613614
extends Match(selector, cases) {
614615
override def isInline = true
615616
override def toString = s"InlineMatch($selector, $cases)"
616617
}
618+
/** with selector match { cases } */
619+
final class SubMatch[+T <: Untyped] private[ast] (selector: Tree[T], cases: List[CaseDef[T]])(implicit @constructorOnly src: SourceFile)
620+
extends Match(selector, cases) {
621+
override def isSubMatch = true
622+
}
617623

618624
/** case pat if guard => body */
619625
case class CaseDef[+T <: Untyped] private[ast] (pat: Tree[T], guard: Tree[T], body: Tree[T])(implicit @constructorOnly src: SourceFile)
@@ -1180,6 +1186,7 @@ object Trees {
11801186
type Closure = Trees.Closure[T]
11811187
type Match = Trees.Match[T]
11821188
type InlineMatch = Trees.InlineMatch[T]
1189+
type SubMatch = Trees.SubMatch[T]
11831190
type CaseDef = Trees.CaseDef[T]
11841191
type Labeled = Trees.Labeled[T]
11851192
type Return = Trees.Return[T]
@@ -1329,6 +1336,7 @@ object Trees {
13291336
def Match(tree: Tree)(selector: Tree, cases: List[CaseDef])(using Context): Match = tree match {
13301337
case tree: Match if (selector eq tree.selector) && (cases eq tree.cases) => tree
13311338
case tree: InlineMatch => finalize(tree, untpd.InlineMatch(selector, cases)(sourceFile(tree)))
1339+
case tree: SubMatch => finalize(tree, untpd.SubMatch(selector, cases)(sourceFile(tree)))
13321340
case _ => finalize(tree, untpd.Match(selector, cases)(sourceFile(tree)))
13331341
}
13341342
def CaseDef(tree: Tree)(pat: Tree, guard: Tree, body: Tree)(using Context): CaseDef = tree match {

compiler/src/dotty/tools/dotc/ast/tpd.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,9 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
143143
def InlineMatch(selector: Tree, cases: List[CaseDef])(using Context): Match =
144144
ta.assignType(untpd.InlineMatch(selector, cases), selector, cases)
145145

146+
def SubMatch(selector: Tree, cases: List[CaseDef])(using Context): Match =
147+
ta.assignType(untpd.SubMatch(selector, cases), selector, cases)
148+
146149
def Labeled(bind: Bind, expr: Tree)(using Context): Labeled =
147150
ta.assignType(untpd.Labeled(bind, expr))
148151

compiler/src/dotty/tools/dotc/ast/untpd.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
411411
def Closure(env: List[Tree], meth: Tree, tpt: Tree)(implicit src: SourceFile): Closure = new Closure(env, meth, tpt)
412412
def Match(selector: Tree, cases: List[CaseDef])(implicit src: SourceFile): Match = new Match(selector, cases)
413413
def InlineMatch(selector: Tree, cases: List[CaseDef])(implicit src: SourceFile): Match = new InlineMatch(selector, cases)
414+
def SubMatch(selector: Tree, cases: List[CaseDef])(implicit src: SourceFile): SubMatch = new SubMatch(selector, cases)
414415
def CaseDef(pat: Tree, guard: Tree, body: Tree)(implicit src: SourceFile): CaseDef = new CaseDef(pat, guard, body)
415416
def Labeled(bind: Bind, expr: Tree)(implicit src: SourceFile): Labeled = new Labeled(bind, expr)
416417
def Return(expr: Tree, from: Tree)(implicit src: SourceFile): Return = new Return(expr, from)

compiler/src/dotty/tools/dotc/printing/RefinedPrinter.scala

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -565,7 +565,10 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
565565
selTxt ~ keywordStr(" match ") ~ blockText(cases)
566566
}
567567
case CaseDef(pat, guard, body) =>
568-
keywordStr("case ") ~ inPattern(toText(pat)) ~ optText(guard)(keywordStr(" if ") ~ _) ~ " => " ~ caseBlockText(body)
568+
val bodyText = body match
569+
case t: SubMatch => keywordStr(" with ") ~ toText(t)
570+
case t => " => " ~ caseBlockText(t)
571+
keywordStr("case ") ~ inPattern(toText(pat)) ~ optText(guard)(keywordStr(" if ") ~ _) ~ bodyText
569572
case Labeled(bind, expr) =>
570573
changePrec(GlobalPrec) { toText(bind.name) ~ keywordStr("[") ~ toText(bind.symbol.info) ~ keywordStr("]: ") ~ toText(expr) }
571574
case Return(expr, from) =>

0 commit comments

Comments
 (0)