Skip to content

Commit e39a177

Browse files
committed
add GenericImport
1 parent 6076772 commit e39a177

File tree

4 files changed

+27
-15
lines changed

4 files changed

+27
-15
lines changed

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

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -794,17 +794,28 @@ object Trees {
794794
}
795795

796796

797+
abstract class GenericImport[-T >: Untyped](implicit @constructorOnly src: SourceFile)
798+
extends DenotingTree[T] {
799+
type ThisTree[-T >: Untyped] <: GenericImport[T]
800+
val expr: Tree[T]
801+
val selectors: List[untpd.ImportSelector]
802+
}
803+
797804
/** import expr.selectors
798805
* where a selector is either an untyped `Ident`, `name` or
799806
* an untyped thicket consisting of `name` and `rename`.
800807
*/
801808
case class Import[-T >: Untyped] private[ast] (expr: Tree[T], selectors: List[untpd.ImportSelector])(implicit @constructorOnly src: SourceFile)
802-
extends DenotingTree[T] {
809+
extends GenericImport[T] {
803810
type ThisTree[-T >: Untyped] = Import[T]
804811
}
805812

813+
/** export expr.selectors
814+
* where a selector is either an untyped `Ident`, `name` or
815+
* an untyped thicket consisting of `name` and `rename`.
816+
*/
806817
case class Export[-T >: Untyped] private[ast] (expr: Tree[T], selectors: List[untpd.ImportSelector])(implicit @constructorOnly src: SourceFile)
807-
extends Tree[T] {
818+
extends GenericImport[T] {
808819
type ThisTree[-T >: Untyped] = Export[T]
809820
}
810821

compiler/src/dotty/tools/dotc/core/tasty/TreeUnpickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -980,7 +980,7 @@ class TreeUnpickler(reader: TastyReader,
980980
readTerm()(using ctx.withOwner(exprOwner))
981981
}
982982

983-
inline def readImportLike(mkTree: (Tree, List[untpd.ImportSelector]) => Tree)()(using Context): Tree = {
983+
inline def readImportLike(inline mkTree: (Tree, List[untpd.ImportSelector]) => Tree)()(using Context): Tree = {
984984
val start = currentAddr
985985
assert(sourcePathAt(start).isEmpty)
986986
readByte()

compiler/src/dotty/tools/dotc/transform/FirstTransform.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ class FirstTransform extends MiniPhase with InfoTransformer { thisPhase =>
152152
}
153153

154154
override def transformOther(tree: Tree)(using Context): Tree = tree match {
155-
case tree: (Import | Export) => EmptyTree
155+
case tree: GenericApply[Type] => EmptyTree
156156
case tree: NamedArg => transformAllDeep(tree.arg)
157157
case tree => if (tree.isType) toTypeTree(tree) else tree
158158
}

compiler/src/dotty/tools/dotc/typer/Typer.scala

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2235,7 +2235,8 @@ class Typer extends Namer
22352235
def localDummy(cls: ClassSymbol, impl: untpd.Template)(using Context): Symbol =
22362236
newLocalDummy(cls, impl.span)
22372237

2238-
def typedImport(imp: untpd.Import, sym: Symbol)(using Context): Import = {
2238+
inline def typedGenericImport[T <: GenericImport[Untyped]](imp: T)(
2239+
inline mkTree: (Tree, List[untpd.ImportSelector]) => imp.ThisTree[Type])(using Context): imp.ThisTree[Type] = {
22392240
val expr1 = typedExpr(imp.expr, AnySelectionProto)
22402241
checkLegalImportPath(expr1)
22412242
val selectors1: List[untpd.ImportSelector] = imp.selectors.mapConserve { sel =>
@@ -2244,19 +2245,19 @@ class Typer extends Namer
22442245
sel.imported, sel.renamed, untpd.TypedSplice(typedType(sel.bound)))
22452246
.asInstanceOf[untpd.ImportSelector]
22462247
}
2247-
assignType(cpy.Import(imp)(expr1, selectors1), sym)
2248+
mkTree(expr1, selectors1)
2249+
}
2250+
2251+
def typedImport(imp: untpd.Import, sym: Symbol)(using Context): Import = {
2252+
typedGenericImport(imp)((expr1, selectors1) =>
2253+
assignType(cpy.Import(imp)(expr1, selectors1), sym)
2254+
)
22482255
}
22492256

22502257
def typedExport(exp: untpd.Export)(using Context): Export = {
2251-
val expr1 = typedExpr(exp.expr, AnySelectionProto)
2252-
checkLegalImportPath(expr1)
2253-
val selectors1: List[untpd.ImportSelector] = exp.selectors.mapConserve { sel =>
2254-
if sel.bound.isEmpty then sel
2255-
else cpy.ImportSelector(sel)(
2256-
sel.imported, sel.renamed, untpd.TypedSplice(typedType(sel.bound)))
2257-
.asInstanceOf[untpd.ImportSelector]
2258-
}
2259-
assignType(cpy.Export(exp)(expr1, selectors1))
2258+
typedGenericImport(exp)((expr1, selectors1) =>
2259+
assignType(cpy.Export(exp)(expr1, selectors1))
2260+
)
22602261
}
22612262

22622263
def typedPackageDef(tree: untpd.PackageDef)(using Context): Tree =

0 commit comments

Comments
 (0)