Skip to content

Commit 61c50a3

Browse files
committed
Implement ImportSelector with extractors
1 parent 2a3048c commit 61c50a3

File tree

8 files changed

+84
-26
lines changed

8 files changed

+84
-26
lines changed

compiler/src/dotty/tools/dotc/tasty/Toolbox.scala

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import scala.tasty.constants.Constant
44
import scala.tasty.modifiers.Modifier
55
import scala.tasty.names.Name
66
import scala.tasty.names.PossiblySignedName
7-
import scala.tasty.trees.Tree
7+
import scala.tasty.trees.{ImportSelector, Tree}
88
import scala.tasty.types.MaybeType
99

1010
object Toolbox {
@@ -128,6 +128,12 @@ object Toolbox {
128128
override def unapplyQualifiedProtected(arg: Modifier) = internal.QualifiedModifier.unapplyQualifiedProtected(arg)
129129
override def unapplyAnnotation(arg: Modifier) = internal.AnnotationModifier.unapplyAnnotation(arg)
130130

131+
// Import Selectors
132+
133+
override def unapplySimpleSelector(arg: ImportSelector) = internal.ImportSelector.unapplySimpleSelector(arg)
134+
override def unapplyRenameSelector(arg: ImportSelector) = internal.ImportSelector.unapplyRenameSelector(arg)
135+
override def unapplyOmitSelector(arg: ImportSelector) = internal.ImportSelector.unapplyOmitSelector(arg)
136+
131137
}
132138

133139
}

compiler/src/dotty/tools/dotc/tasty/internal/Import.scala

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,18 @@ package internal
33

44
import dotty.tools.dotc.ast.{Trees, tpd, untpd}
55
import dotty.tools.dotc.core.Contexts.Context
6-
import dotty.tools.dotc.core.StdNames.nme
76

87
import scala.tasty.trees
9-
import scala.tasty.trees.Import.ImportSelector
108

119
object Import {
1210

1311
def apply(tree: tpd.Tree)(implicit ctx: Context): trees.Import = Impl(tree, ctx)
1412

1513
def unapplyImport(tree: trees.Tree): Option[trees.Import.Data] = tree match {
16-
case Impl(Trees.Import(expr, selectors), ctx) => Some(Term(expr)(ctx), selectors.map(importSelector(_)(ctx)))
14+
case Impl(Trees.Import(expr, selectors), ctx) => Some(Term(expr)(ctx), selectors.map(ImportSelector(_)(ctx)))
1715
case _ => None
1816
}
1917

20-
private def importSelector(tree: untpd.Tree)(implicit ctx: Context): ImportSelector = tree match {
21-
case id@Trees.Ident(_) => ImportSelector.Simple(Id(id))
22-
case Trees.Thicket((id@Trees.Ident(_)) :: Trees.Ident(nme.WILDCARD) :: Nil) => ImportSelector.Omit(Id(id))
23-
case Trees.Thicket((id1@Trees.Ident(_)) :: (id2@Trees.Ident(_)) :: Nil) => ImportSelector.Rename(Id(id1), Id(id2))
24-
}
25-
2618
private case class Impl(tree: tpd.Tree, ctx: Context) extends trees.Import with Positioned {
2719
override def toString: String = {
2820
import Toolbox.extractor
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package dotty.tools.dotc.tasty
2+
package internal
3+
4+
import dotty.tools.dotc.ast.{Trees, tpd, untpd}
5+
import dotty.tools.dotc.core.Contexts.Context
6+
import dotty.tools.dotc.core.StdNames.nme
7+
8+
import scala.tasty.trees
9+
10+
object ImportSelector {
11+
12+
def apply(tree: untpd.Tree)(implicit ctx: Context): trees.ImportSelector = Impl(tree, ctx)
13+
14+
def unapplySimpleSelector(tree: trees.ImportSelector): Option[trees.SimpleSelector.Data] = tree match {
15+
case Impl(id@Trees.Ident(_), ctx) => Some(Id(id)(ctx))
16+
case _ => None
17+
}
18+
19+
def unapplyRenameSelector(tree: trees.ImportSelector): Option[trees.RenameSelector.Data] = tree match {
20+
case Impl(Trees.Thicket((id1@Trees.Ident(_)) :: (id2@Trees.Ident(_)) :: Nil), ctx) if id2.name != nme.WILDCARD => Some(Id(id1)(ctx), Id(id2)(ctx))
21+
case _ => None
22+
}
23+
24+
def unapplyOmitSelector(tree: trees.ImportSelector): Option[trees.OmitSelector.Data] = tree match {
25+
case Impl(Trees.Thicket((id@Trees.Ident(_)) :: Trees.Ident(nme.WILDCARD) :: Nil), ctx) => Some(Id(id)(ctx))
26+
case _ => None
27+
}
28+
29+
private case class Impl(tree: untpd.Tree, ctx: Context) extends trees.ImportSelector {
30+
override def toString: String = {
31+
import Toolbox.extractor
32+
this match {
33+
case trees.SimpleSelector(id) => s"SimpleSelector($id)"
34+
case trees.RenameSelector(id1, id2) => s"RenameSelector($id1, $id2)"
35+
case trees.OmitSelector(id) => s"OmitSelector($id)"
36+
}
37+
}
38+
}
39+
40+
}

library/src/scala/runtime/tasty/Toolbox.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import scala.tasty._
55
import scala.tasty.constants.Constant
66
import scala.tasty.modifiers.Modifier
77
import scala.tasty.trees
8-
import scala.tasty.trees.Tree
8+
import scala.tasty.trees.{ImportSelector, Tree}
99
import scala.tasty.types.MaybeType
1010

1111
@implicitNotFound("Could not find implicit tasty.Toolbox. Default toolbox can be imported with `import dotty.tools.dotc.tasty.Toolbox._`")
@@ -130,4 +130,11 @@ trait Toolbox {
130130
def unapplyQualifiedProtected(arg: Modifier): Option[modifiers.QualifiedProtected.Data]
131131
def unapplyAnnotation(arg: Modifier): Option[modifiers.Annotation.Data]
132132

133+
// Import selectors
134+
135+
def unapplySimpleSelector(arg: ImportSelector): Option[trees.SimpleSelector.Data]
136+
def unapplyRenameSelector(arg: ImportSelector): Option[trees.RenameSelector.Data]
137+
def unapplyOmitSelector(arg: ImportSelector): Option[trees.OmitSelector.Data]
138+
139+
133140
}

library/src/scala/tasty/trees/Import.scala

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,4 @@ trait Import extends Statement
88
object Import {
99
type Data = (Term, List[ImportSelector])
1010
def unapply(arg: Tree)(implicit toolbox: Toolbox): Option[Data] = toolbox.unapplyImport(arg)
11-
12-
sealed trait ImportSelector
13-
object ImportSelector {
14-
final case class Simple(id: Id) extends ImportSelector
15-
final case class Rename(id1: Id, id2: Id) extends ImportSelector
16-
final case class Omit(id: Id) extends ImportSelector
17-
}
1811
}
19-
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package scala.tasty
2+
package trees
3+
4+
import scala.runtime.tasty.Toolbox
5+
6+
trait ImportSelector
7+
8+
object SimpleSelector {
9+
type Data = Id
10+
def unapply(arg: ImportSelector)(implicit toolbox: Toolbox): Option[Data] = toolbox.unapplySimpleSelector(arg)
11+
}
12+
13+
object RenameSelector {
14+
type Data = (Id, Id)
15+
def unapply(arg: ImportSelector)(implicit toolbox: Toolbox): Option[Data] = toolbox.unapplyRenameSelector(arg)
16+
}
17+
18+
object OmitSelector {
19+
type Data = Id
20+
def unapply(arg: ImportSelector)(implicit toolbox: Toolbox): Option[Data] = toolbox.unapplyOmitSelector(arg)
21+
}

tests/pos/tasty/definitions.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ object definitions {
4545
case class Import(expr: Term, selector: List[ImportSelector]) extends Statement
4646

4747
enum ImportSelector {
48-
case Simple(id: Id)
49-
case Rename(id1: Id, id2: Id)
50-
case Omit(id1: Id)
48+
case SimpleSelector(id: Id)
49+
case RenameSelector(id1: Id, id2: Id)
50+
case OmitSelector(id1: Id)
5151
}
5252

5353
case class Id(name: String) extends Positioned // untyped ident

tests/run-with-compiler/tasty-extractors-2.check

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@ AndType(NameRef(TypeName(Simple(Int)), SymRef(Symbol(<root>.scala), ThisType(Sym
2222
Typed(Literal(Int(1)), Or(Ident(TypeName(Simple(Int))), Ident(TypeName(Simple(String)))))
2323
OrType(NameRef(TypeName(Simple(Int)), SymRef(Symbol(<root>.scala), ThisType(SymRef(Symbol(<root>), NoPrefix)))), NameRef(TypeName(Simple(String)), NameRef(Simple(Predef), SymRef(Symbol(<root>.scala), ThisType(SymRef(Symbol(<root>), NoPrefix))))))
2424

25-
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(Simple(Id(mutable))))), Literal(Int(1)))
25+
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(SimpleSelector(Id(mutable))))), Literal(Int(1)))
2626
ConstantType(Int(1))
2727

28-
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(Simple(Id(mutable)), Simple(Id(immutable))))), Literal(Int(2)))
28+
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(SimpleSelector(Id(mutable)), SimpleSelector(Id(immutable))))), Literal(Int(2)))
2929
ConstantType(Int(2))
3030

31-
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(Rename(Id(mutable),Id(mut))))), Literal(Int(3)))
31+
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(RenameSelector(Id(mutable), Id(mut))))), Literal(Int(3)))
3232
ConstantType(Int(3))
3333

34-
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(Omit(Id(mutable))))), Literal(Int(4)))
34+
Block(List(Import(Select(Ident(Simple(scala)), Simple(collection)), List(OmitSelector(Id(mutable))))), Literal(Int(4)))
3535
ConstantType(Int(4))
3636

3737
Block(List(ClassDef(TypeName(Simple(Foo)), DefDef(Simple(<init>), List(), List(List()), Synthetic(), None, List()), List(Apply(Select(New(Synthetic()), Simple(<init>)), Nil)), None, List(), List())), Literal(Unit()))

0 commit comments

Comments
 (0)