@@ -108,7 +108,25 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
108108 case class GenAlias (pat : Tree , expr : Tree )(implicit @ constructorOnly src : SourceFile ) extends Tree
109109 case class ContextBounds (bounds : TypeBoundsTree , cxBounds : List [Tree ])(implicit @ constructorOnly src : SourceFile ) extends TypTree
110110 case class PatDef (mods : Modifiers , pats : List [Tree ], tpt : Tree , rhs : Tree )(implicit @ constructorOnly src : SourceFile ) extends DefTree
111- case class Export (impliedOnly : Boolean , expr : Tree , selectors : List [Tree ])(implicit @ constructorOnly src : SourceFile ) extends Tree
111+ case class Export (expr : Tree , selectors : List [ImportSelector ])(implicit @ constructorOnly src : SourceFile ) extends Tree
112+
113+ case class ImportSelector (imported : Ident , renamed : Tree = EmptyTree , bound : Tree = EmptyTree )(implicit @ constructorOnly src : SourceFile ) extends Tree {
114+
115+ /** It's a `given` selector */
116+ val isGiven : Boolean = imported.name.isEmpty
117+
118+ /** It's a `given` or `_` selector */
119+ val isWildcard : Boolean = isGiven || imported.name == nme.WILDCARD
120+
121+ /** The imported name, EmptyTermName if it's a given selector */
122+ val name : TermName = imported.name.asInstanceOf [TermName ]
123+
124+ /** The renamed part (which might be `_`), if present, or `name`, if missing */
125+ val rename : TermName = renamed match
126+ case Ident (rename : TermName ) => rename
127+ case _ => name
128+ }
129+
112130 case class Number (digits : String , kind : NumberKind )(implicit @ constructorOnly src : SourceFile ) extends TermTree
113131
114132 enum NumberKind {
@@ -344,7 +362,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
344362 def Template (constr : DefDef , parents : List [Tree ], derived : List [Tree ], self : ValDef , body : LazyTreeList )(implicit src : SourceFile ): Template =
345363 if (derived.isEmpty) new Template (constr, parents, self, body)
346364 else new DerivingTemplate (constr, parents ++ derived, self, body, derived.length)
347- def Import (importGiven : Boolean , expr : Tree , selectors : List [Tree ])(implicit src : SourceFile ): Import = new Import (importGiven, expr, selectors)
365+ def Import (expr : Tree , selectors : List [ImportSelector ])(implicit src : SourceFile ): Import = new Import (expr, selectors)
348366 def PackageDef (pid : RefTree , stats : List [Tree ])(implicit src : SourceFile ): PackageDef = new PackageDef (pid, stats)
349367 def Annotated (arg : Tree , annot : Tree )(implicit src : SourceFile ): Annotated = new Annotated (arg, annot)
350368
@@ -561,9 +579,13 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
561579 case tree : PatDef if (mods eq tree.mods) && (pats eq tree.pats) && (tpt eq tree.tpt) && (rhs eq tree.rhs) => tree
562580 case _ => finalize(tree, untpd.PatDef (mods, pats, tpt, rhs)(tree.source))
563581 }
564- def Export (tree : Tree )(impliedOnly : Boolean , expr : Tree , selectors : List [Tree ])(implicit ctx : Context ): Tree = tree match {
565- case tree : Export if (impliedOnly == tree.impliedOnly) && (expr eq tree.expr) && (selectors eq tree.selectors) => tree
566- case _ => finalize(tree, untpd.Export (impliedOnly, expr, selectors)(tree.source))
582+ def Export (tree : Tree )(expr : Tree , selectors : List [ImportSelector ])(implicit ctx : Context ): Tree = tree match {
583+ case tree : Export if (expr eq tree.expr) && (selectors eq tree.selectors) => tree
584+ case _ => finalize(tree, untpd.Export (expr, selectors)(tree.source))
585+ }
586+ def ImportSelector (tree : Tree )(imported : Ident , renamed : Tree , bound : Tree )(implicit ctx : Context ): Tree = tree match {
587+ case tree : ImportSelector if (imported eq tree.imported) && (renamed eq tree.renamed) && (bound eq tree.bound) => tree
588+ case _ => finalize(tree, untpd.ImportSelector (imported, renamed, bound)(tree.source))
567589 }
568590 def Number (tree : Tree )(digits : String , kind : NumberKind )(implicit ctx : Context ): Tree = tree match {
569591 case tree : Number if (digits == tree.digits) && (kind == tree.kind) => tree
@@ -621,8 +643,10 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
621643 cpy.ContextBounds (tree)(transformSub(bounds), transform(cxBounds))
622644 case PatDef (mods, pats, tpt, rhs) =>
623645 cpy.PatDef (tree)(mods, transform(pats), transform(tpt), transform(rhs))
624- case Export (impliedOnly, expr, selectors) =>
625- cpy.Export (tree)(impliedOnly, transform(expr), selectors)
646+ case Export (expr, selectors) =>
647+ cpy.Export (tree)(transform(expr), selectors)
648+ case ImportSelector (imported, renamed, bound) =>
649+ cpy.ImportSelector (tree)(transformSub(imported), transform(renamed), transform(bound))
626650 case Number (_, _) | TypedSplice (_) =>
627651 tree
628652 case _ =>
@@ -676,8 +700,10 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
676700 this (this (x, bounds), cxBounds)
677701 case PatDef (mods, pats, tpt, rhs) =>
678702 this (this (this (x, pats), tpt), rhs)
679- case Export (_, expr, _) =>
703+ case Export (expr, _) =>
680704 this (x, expr)
705+ case ImportSelector (imported, renamed, bound) =>
706+ this (this (this (x, imported), renamed), bound)
681707 case Number (_, _) =>
682708 x
683709 case TypedSplice (splice) =>
0 commit comments