Skip to content

Commit f01f307

Browse files
committed
Keep span and attachments when typing a sequence argument
I don't know of a case where this matters currently but it's more correct.
1 parent 11a0325 commit f01f307

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -378,7 +378,7 @@ class TypeApplications(val self: Type) extends AnyVal {
378378
self.derivedExprType(tp.translateParameterized(from, to))
379379
case _ =>
380380
if (self.derivesFrom(from)) {
381-
def elemType(tp: Type): Type = tp match
381+
def elemType(tp: Type): Type = tp.widenDealias match
382382
case tp: AndOrType => tp.derivedAndOrType(elemType(tp.tp1), elemType(tp.tp2))
383383
case _ => tp.baseType(from).argInfos.head
384384
val arg = elemType(self)
@@ -402,6 +402,10 @@ class TypeApplications(val self: Type) extends AnyVal {
402402
translateParameterized(defn.RepeatedParamClass, seqClass, wildcardArg = toArray)
403403
else self
404404

405+
/** Translate a `From[T]` into a `*T`. */
406+
def translateToRepeated(from: ClassSymbol)(using Context): Type =
407+
translateParameterized(from, defn.RepeatedParamClass)
408+
405409
/** If this is an encoding of a (partially) applied type, return its arguments,
406410
* otherwise return Nil.
407411
* Existential types in arguments are returned as TypeBounds instances.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ trait TypeAssigner {
166166
else sym.info
167167

168168
private def toRepeated(tree: Tree, from: ClassSymbol)(using Context): Tree =
169-
Typed(tree, TypeTree(tree.tpe.widen.translateParameterized(from, defn.RepeatedParamClass)))
169+
Typed(tree, TypeTree(tree.tpe.widen.translateToRepeated(from)))
170170

171171
def seqToRepeated(tree: Tree)(using Context): Tree = toRepeated(tree, defn.SeqClass)
172172

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

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -736,12 +736,10 @@ class Typer extends Namer
736736
if (ctx.mode.is(Mode.QuotedPattern)) pt.translateFromRepeated(toArray = false)
737737
else pt.translateFromRepeated(toArray = false) | pt.translateFromRepeated(toArray = true)
738738
val tpdExpr = typedExpr(tree.expr, ptArg)
739-
tpdExpr.tpe.widenDealias match {
740-
case defn.ArrayOf(_) =>
741-
arrayToRepeated(tpdExpr)
742-
case _ =>
743-
seqToRepeated(tpdExpr)
744-
}
739+
val expr1 = typedExpr(tree.expr, ptArg)
740+
val fromCls = if expr1.tpe.derivesFrom(defn.ArrayClass) then defn.ArrayClass else defn.SeqClass
741+
val tpt1 = TypeTree(expr1.tpe.widen.translateToRepeated(fromCls)).withSpan(tree.tpt.span)
742+
assignType(cpy.Typed(tree)(expr1, tpt1), tpt1)
745743
}
746744
cases(
747745
ifPat = ascription(TypeTree(defn.RepeatedParamType.appliedTo(pt)), isWildcard = true),

0 commit comments

Comments
 (0)