Skip to content

Commit 2364270

Browse files
authored
Merge pull request #6041 from dotty-staging/fix-import-implied
Refine `import implied` rules to smooth migration
2 parents 2dbc77c + d077feb commit 2364270

28 files changed

+242
-112
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,7 +396,7 @@ object desugar {
396396
if (enumCases.isEmpty)
397397
ctx.error("Enumerations must constain at least one case", namePos)
398398
val enumCompanionRef = new TermRefTree()
399-
val enumImport = Import(impliedOnly = false, enumCompanionRef, enumCases.flatMap(caseIds))
399+
val enumImport = Import(importImplied = false, enumCompanionRef, enumCases.flatMap(caseIds))
400400
(enumImport :: enumStats, enumCases, enumCompanionRef)
401401
}
402402
else (stats, Nil, EmptyTree)

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -751,7 +751,7 @@ object Trees {
751751
* where a selector is either an untyped `Ident`, `name` or
752752
* an untyped thicket consisting of `name` and `rename`.
753753
*/
754-
case class Import[-T >: Untyped] private[ast] (impliedOnly: Boolean, expr: Tree[T], selectors: List[Tree[Untyped]])(implicit @constructorOnly src: SourceFile)
754+
case class Import[-T >: Untyped] private[ast] (importImplied: Boolean, expr: Tree[T], selectors: List[Tree[Untyped]])(implicit @constructorOnly src: SourceFile)
755755
extends DenotingTree[T] {
756756
type ThisTree[-T >: Untyped] = Import[T]
757757
}
@@ -1140,9 +1140,9 @@ object Trees {
11401140
case tree: Template if (constr eq tree.constr) && (parents eq tree.parents) && (derived eq tree.derived) && (self eq tree.self) && (body eq tree.unforcedBody) => tree
11411141
case tree => finalize(tree, untpd.Template(constr, parents, derived, self, body)(sourceFile(tree)))
11421142
}
1143-
def Import(tree: Tree)(impliedOnly: Boolean, expr: Tree, selectors: List[untpd.Tree])(implicit ctx: Context): Import = tree match {
1144-
case tree: Import if (impliedOnly == tree.impliedOnly) && (expr eq tree.expr) && (selectors eq tree.selectors) => tree
1145-
case _ => finalize(tree, untpd.Import(impliedOnly, expr, selectors)(sourceFile(tree)))
1143+
def Import(tree: Tree)(importImplied: Boolean, expr: Tree, selectors: List[untpd.Tree])(implicit ctx: Context): Import = tree match {
1144+
case tree: Import if (importImplied == tree.importImplied) && (expr eq tree.expr) && (selectors eq tree.selectors) => tree
1145+
case _ => finalize(tree, untpd.Import(importImplied, expr, selectors)(sourceFile(tree)))
11461146
}
11471147
def PackageDef(tree: Tree)(pid: RefTree, stats: List[Tree])(implicit ctx: Context): PackageDef = tree match {
11481148
case tree: PackageDef if (pid eq tree.pid) && (stats eq tree.stats) => tree
@@ -1283,8 +1283,8 @@ object Trees {
12831283
cpy.TypeDef(tree)(name, transform(rhs))
12841284
case tree @ Template(constr, parents, self, _) if tree.derived.isEmpty =>
12851285
cpy.Template(tree)(transformSub(constr), transform(tree.parents), Nil, transformSub(self), transformStats(tree.body))
1286-
case Import(impliedOnly, expr, selectors) =>
1287-
cpy.Import(tree)(impliedOnly, transform(expr), selectors)
1286+
case Import(importImplied, expr, selectors) =>
1287+
cpy.Import(tree)(importImplied, transform(expr), selectors)
12881288
case PackageDef(pid, stats) =>
12891289
cpy.PackageDef(tree)(transformSub(pid), transformStats(stats)(localCtx))
12901290
case Annotated(arg, annot) =>
@@ -1403,7 +1403,7 @@ object Trees {
14031403
this(x, rhs)
14041404
case tree @ Template(constr, parents, self, _) if tree.derived.isEmpty =>
14051405
this(this(this(this(x, constr), parents), self), tree.body)
1406-
case Import(impliedOnly, expr, selectors) =>
1406+
case Import(importImplied, expr, selectors) =>
14071407
this(x, expr)
14081408
case PackageDef(pid, stats) =>
14091409
this(this(x, pid), stats)(localCtx)

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,8 @@ object tpd extends Trees.Instance[Type] with TypedTreeInfo {
326326
Block(cdef :: Nil, New(cls.typeRef, Nil))
327327
}
328328

329-
def Import(impliedOnly: Boolean, expr: Tree, selectors: List[untpd.Tree])(implicit ctx: Context): Import =
330-
ta.assignType(untpd.Import(impliedOnly, expr, selectors), ctx.newImportSymbol(ctx.owner, expr))
329+
def Import(importImplied: Boolean, expr: Tree, selectors: List[untpd.Tree])(implicit ctx: Context): Import =
330+
ta.assignType(untpd.Import(importImplied, expr, selectors), ctx.newImportSymbol(ctx.owner, expr))
331331

332332
def PackageDef(pid: RefTree, stats: List[Tree])(implicit ctx: Context): PackageDef =
333333
ta.assignType(untpd.PackageDef(pid, stats), pid)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ object untpd extends Trees.Instance[Untyped] with UntypedTreeInfo {
323323
def Template(constr: DefDef, parents: List[Tree], derived: List[Tree], self: ValDef, body: LazyTreeList)(implicit src: SourceFile): Template =
324324
if (derived.isEmpty) new Template(constr, parents, self, body)
325325
else new DerivingTemplate(constr, parents ++ derived, self, body, derived.length)
326-
def Import(impliedOnly: Boolean, expr: Tree, selectors: List[Tree])(implicit src: SourceFile): Import = new Import(impliedOnly, expr, selectors)
326+
def Import(importImplied: Boolean, expr: Tree, selectors: List[Tree])(implicit src: SourceFile): Import = new Import(importImplied, expr, selectors)
327327
def PackageDef(pid: RefTree, stats: List[Tree])(implicit src: SourceFile): PackageDef = new PackageDef(pid, stats)
328328
def Annotated(arg: Tree, annot: Tree)(implicit src: SourceFile): Annotated = new Annotated(arg, annot)
329329

compiler/src/dotty/tools/dotc/core/ConstraintHandling.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,8 @@ trait ConstraintHandling[AbstractContext] {
8585

8686
val oldBounds @ TypeBounds(lo, hi) = constraint.nonParamBounds(param)
8787
val equalBounds = isUpper && (lo eq bound) || !isUpper && (bound eq hi)
88-
if (equalBounds && !bound.existsPart(_.isInstanceOf[WildcardType])) {
88+
if (equalBounds &&
89+
!bound.existsPart(bp => bp.isInstanceOf[WildcardType] || (bp eq param))) {
8990
// The narrowed bounds are equal and do not contain wildcards,
9091
// so we can remove `param` from the constraint.
9192
// (Handling wildcards requires choosing a bound, but we don't know which

compiler/src/dotty/tools/dotc/core/Contexts.scala

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,11 @@ object Contexts {
151151
/** The current type comparer. This ones updates itself automatically for
152152
* each new context.
153153
*/
154-
private[this] var _typeComparer: TypeComparer = null
155-
protected def typeComparer_=(typeComparer: TypeComparer): Unit = {
156-
assert(typeComparer.ctx eq this)
157-
_typeComparer = typeComparer
158-
}
159-
final def typeComparer: TypeComparer = {
160-
if (_typeComparer == null) _typeComparer = outer.typeComparer.copyIn(this)
154+
private[this] var _typeComparer: TypeComparer = _
155+
protected def typeComparer_=(typeComparer: TypeComparer): Unit = _typeComparer = typeComparer
156+
def typeComparer: TypeComparer = {
157+
if (_typeComparer.ctx ne this)
158+
_typeComparer = _typeComparer.copyIn(this)
161159
_typeComparer
162160
}
163161

@@ -406,7 +404,7 @@ object Contexts {
406404
case _ => None
407405
}
408406
ctx.fresh.setImportInfo(
409-
new ImportInfo(implicit ctx => sym, imp.selectors, impNameOpt, imp.impliedOnly))
407+
new ImportInfo(implicit ctx => sym, imp.selectors, impNameOpt, imp.importImplied))
410408
}
411409

412410
/** Does current phase use an erased types interpretation? */
@@ -422,29 +420,31 @@ object Contexts {
422420
def useColors: Boolean =
423421
base.settings.color.value == "always"
424422

425-
protected def init(outer: Context): this.type = {
423+
protected def init(outer: Context, origin: Context): this.type = {
424+
util.Stats.record("Context.fresh")
426425
_outer = outer
427-
_period = outer.period
428-
_mode = outer.mode
429-
_owner = outer.owner
430-
_tree = outer.tree
431-
_scope = outer.scope
432-
_typerState = outer.typerState
433-
_typeAssigner = outer.typeAssigner
434-
_importInfo = outer.importInfo
435-
_gadt = outer.gadt
436-
_searchHistory = outer.searchHistory
437-
_source = outer.source
438-
_moreProperties = outer.moreProperties
439-
_store = outer.store
426+
_period = origin.period
427+
_mode = origin.mode
428+
_owner = origin.owner
429+
_tree = origin.tree
430+
_scope = origin.scope
431+
_typerState = origin.typerState
432+
_typeAssigner = origin.typeAssigner
433+
_importInfo = origin.importInfo
434+
_gadt = origin.gadt
435+
_searchHistory = origin.searchHistory
436+
_typeComparer = origin.typeComparer
437+
_source = origin.source
438+
_moreProperties = origin.moreProperties
439+
_store = origin.store
440440
this
441441
}
442442

443-
/** A fresh clone of this context. */
444-
def fresh: FreshContext = {
445-
util.Stats.record("Context.fresh")
446-
new FreshContext(base).init(this)
447-
}
443+
/** A fresh clone of this context embedded in this context. */
444+
def fresh: FreshContext = freshOver(this)
445+
446+
/** A fresh clone of this context embedded in the specified `outer` context. */
447+
def freshOver(outer: Context): FreshContext = new FreshContext(base).init(outer, this)
448448

449449
final def withOwner(owner: Symbol): Context =
450450
if (owner ne this.owner) fresh.setOwner(owner) else this

compiler/src/dotty/tools/dotc/core/Mode.scala

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,7 @@ object Mode {
101101

102102
/** We are synthesizing the receiver of an extension method */
103103
val SynthesizeExtMethodReceiver: Mode = newMode(23, "SynthesizeExtMethodReceiver")
104+
105+
/** Are we trying to find a hidden implicit? */
106+
val FindHiddenImplicits: Mode = newMode(24, "FindHiddenImplicits")
104107
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -532,10 +532,10 @@ class TreePickler(pickler: TastyPickler) {
532532
}
533533
pickleStats(tree.constr :: rest)
534534
}
535-
case Import(impliedOnly, expr, selectors) =>
535+
case Import(importImplied, expr, selectors) =>
536536
writeByte(IMPORT)
537537
withLength {
538-
if (impliedOnly) writeByte(IMPLIED)
538+
if (importImplied) writeByte(IMPLIED)
539539
pickleTree(expr)
540540
pickleSelectors(selectors)
541541
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -954,10 +954,10 @@ class TreeUnpickler(reader: TastyReader,
954954
assert(sourcePathAt(start).isEmpty)
955955
readByte()
956956
readEnd()
957-
val impliedOnly = nextByte == IMPLIED
958-
if (impliedOnly) readByte()
957+
val importImplied = nextByte == IMPLIED
958+
if (importImplied) readByte()
959959
val expr = readTerm()
960-
setSpan(start, Import(impliedOnly, expr, readSelectors()))
960+
setSpan(start, Import(importImplied, expr, readSelectors()))
961961
}
962962

963963
def readSelectors()(implicit ctx: Context): List[untpd.Tree] = nextByte match {

compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1049,7 +1049,7 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
10491049
val to = untpd.Ident(toName)
10501050
if (toName.isEmpty) from else untpd.Thicket(from, untpd.Ident(toName))
10511051
})
1052-
Import(impliedOnly = false, expr, selectors)
1052+
Import(importImplied = false, expr, selectors)
10531053

10541054
case TEMPLATEtree =>
10551055
setSym()

0 commit comments

Comments
 (0)