From ef07d6312f29036a3e0d90c060a543fc6b60275e Mon Sep 17 00:00:00 2001 From: Albert Meltzer <7529386+kitbellew@users.noreply.github.com> Date: Wed, 6 Mar 2024 10:18:28 -0800 Subject: [PATCH] Trees: add `Type.Block`, containing TypeDefs To support SIP-53, it's been defined as `TypeBlock` under https://dotty.epfl.ch/docs/internals/syntax.html. --- .../shared/src/main/scala/scala/meta/Trees.scala | 3 +++ .../meta/internal/prettyprinters/TreeSyntax.scala | 1 + .../scala/meta/tests/api/SurfaceSuite.scala | 1 + .../scala/meta/tests/trees/ReflectionSuite.scala | 3 ++- .../tests/prettyprinters/SyntacticSuite.scala | 15 +++++++++++++++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/scalameta/trees/shared/src/main/scala/scala/meta/Trees.scala b/scalameta/trees/shared/src/main/scala/scala/meta/Trees.scala index bd9e1013fc..42c836f1bd 100644 --- a/scalameta/trees/shared/src/main/scala/scala/meta/Trees.scala +++ b/scalameta/trees/shared/src/main/scala/scala/meta/Trees.scala @@ -424,6 +424,9 @@ object Type { @ast class ParamClause(values: List[Param]) extends Member.ParamClause @ast class Match(tpe: Type, cases: List[TypeCase] @nonEmpty) extends Type with Tree.WithCases + + @ast class Block(typeDefs: List[Stat.TypeDef], tpe: Type) extends Type + def fresh(): Type.Name = fresh("fresh") def fresh(prefix: String): Type.Name = Type.Name(prefix + Fresh.nextId()) } diff --git a/scalameta/trees/shared/src/main/scala/scala/meta/internal/prettyprinters/TreeSyntax.scala b/scalameta/trees/shared/src/main/scala/scala/meta/internal/prettyprinters/TreeSyntax.scala index 0cd1399926..a533237411 100644 --- a/scalameta/trees/shared/src/main/scala/scala/meta/internal/prettyprinters/TreeSyntax.scala +++ b/scalameta/trees/shared/src/main/scala/scala/meta/internal/prettyprinters/TreeSyntax.scala @@ -705,6 +705,7 @@ object TreeSyntax { } val cbounds = r(t.cbounds.map { s(kw(":"), " ", _) }) s(w(mods, " "), variance, t.name, t.tparamClause, tbounds, vbounds, cbounds) + case t: Type.Block => s(w(r(t.typeDefs, "; "), "; "), t.tpe) // Pat case t: Pat.Var => diff --git a/tests/jvm/src/test/scala-2.13/scala/meta/tests/api/SurfaceSuite.scala b/tests/jvm/src/test/scala-2.13/scala/meta/tests/api/SurfaceSuite.scala index 6777f437c8..f70143c101 100644 --- a/tests/jvm/src/test/scala-2.13/scala/meta/tests/api/SurfaceSuite.scala +++ b/tests/jvm/src/test/scala-2.13/scala/meta/tests/api/SurfaceSuite.scala @@ -469,6 +469,7 @@ class SurfaceSuite extends FunSuite { |scala.meta.Type.Apply |scala.meta.Type.ApplyInfix |scala.meta.Type.ArgClause + |scala.meta.Type.Block |scala.meta.Type.Bounds |scala.meta.Type.ByName |scala.meta.Type.ContextFunction diff --git a/tests/jvm/src/test/scala-2.13/scala/meta/tests/trees/ReflectionSuite.scala b/tests/jvm/src/test/scala-2.13/scala/meta/tests/trees/ReflectionSuite.scala index 717e41595b..c20297fa2e 100644 --- a/tests/jvm/src/test/scala-2.13/scala/meta/tests/trees/ReflectionSuite.scala +++ b/tests/jvm/src/test/scala-2.13/scala/meta/tests/trees/ReflectionSuite.scala @@ -24,7 +24,7 @@ class ReflectionSuite extends FunSuite { val sym = symbolOf[scala.meta.Tree] assert(sym.isRoot) val root = sym.asRoot - assertEquals((root.allBranches.length, root.allLeafs.length), (50, 408)) + assertEquals((root.allBranches.length, root.allLeafs.length), (50, 410)) } test("If") { @@ -98,6 +98,7 @@ class ReflectionSuite extends FunSuite { |List[scala.meta.Mod] |List[scala.meta.Pat] |List[scala.meta.Source] + |List[scala.meta.Stat.TypeDef] |List[scala.meta.Stat] |List[scala.meta.Term.Name] |List[scala.meta.Term.Param] diff --git a/tests/shared/src/test/scala/scala/meta/tests/prettyprinters/SyntacticSuite.scala b/tests/shared/src/test/scala/scala/meta/tests/prettyprinters/SyntacticSuite.scala index 13e434ce9e..7107f6ce56 100644 --- a/tests/shared/src/test/scala/scala/meta/tests/prettyprinters/SyntacticSuite.scala +++ b/tests/shared/src/test/scala/scala/meta/tests/prettyprinters/SyntacticSuite.scala @@ -2064,4 +2064,19 @@ class SyntacticSuite extends scala.meta.tests.parsers.ParseSuite { ) } + test("#3610 Type.Block 1") { + val tree = Type.Block(Nil, pname("Int")) + assertEquals(tree.syntax, "Int") + } + + test("#3610 Type.Block 2") { + val tree = Type.Block(List(Decl.Type(Nil, pname("t"), Nil, noBounds)), pname("t")) + assertEquals(tree.syntax, "type t; t") + } + + test("#3610 Type.Block 3") { + val tree = Type.Block(List(Defn.Type(Nil, pname("t"), Nil, pname("Int"))), pname("t")) + assertEquals(tree.syntax, "type t = Int; t") + } + }