File tree 6 files changed +34
-5
lines changed
compiler/src/dotty/tools/dotc
6 files changed +34
-5
lines changed Original file line number Diff line number Diff line change @@ -145,6 +145,15 @@ class TypeUtils:
145
145
case defn.NamedTuple (_, _) => true
146
146
case _ => false
147
147
148
+ def derivesFromNamedTuple (using Context ): Boolean = self match
149
+ case defn.NamedTuple (_, _) => true
150
+ case tp : MatchType =>
151
+ tp.bound.derivesFromNamedTuple || tp.reduced.derivesFromNamedTuple
152
+ case tp : TypeProxy => tp.superType.derivesFromNamedTuple
153
+ case tp : AndType => tp.tp1.derivesFromNamedTuple || tp.tp2.derivesFromNamedTuple
154
+ case tp : OrType => tp.tp1.derivesFromNamedTuple && tp.tp2.derivesFromNamedTuple
155
+ case _ => false
156
+
148
157
/** Drop all named elements in tuple type */
149
158
def stripNamedTuple (using Context ): Type = self.normalized.dealias match
150
159
case defn.NamedTuple (_, vals) =>
Original file line number Diff line number Diff line change @@ -543,7 +543,7 @@ object Completion:
543
543
.groupByName
544
544
545
545
val qualTpe = qual.typeOpt
546
- if qualTpe.isNamedTupleType then
546
+ if qualTpe.derivesFromNamedTuple then
547
547
namedTupleCompletionsFromType(qualTpe)
548
548
else if qualTpe.derivesFrom(defn.SelectableClass ) then
549
549
val pre = if ! TypeOps .isLegalPrefix(qualTpe) then Types .SkolemType (qualTpe) else qualTpe
Original file line number Diff line number Diff line change @@ -107,7 +107,7 @@ object PatternMatcher {
107
107
// TODO: Drop Case once we use everywhere else `isPatmatGenerated`.
108
108
109
109
private def dropNamedTuple (tree : Tree ): Tree =
110
- val tpe = tree.tpe.widen
110
+ val tpe = tree.tpe.widenDealias
111
111
if tpe.isNamedTupleType then tree.cast(tpe.stripNamedTuple) else tree
112
112
113
113
/** The plan `let x = rhs in body(x)` where `x` is a fresh variable */
Original file line number Diff line number Diff line change @@ -876,7 +876,7 @@ trait Implicits:
876
876
|| inferView(dummyTreeOfType(from), to)
877
877
(using ctx.fresh.addMode(Mode .ImplicitExploration ).setExploreTyperState()).isSuccess
878
878
// TODO: investigate why we can't TyperState#test here
879
- || from.widen.isNamedTupleType && to.derivesFrom(defn.TupleClass )
879
+ || from.widen.derivesFromNamedTuple && to.derivesFrom(defn.TupleClass )
880
880
&& from.widen.stripNamedTuple <:< to
881
881
)
882
882
Original file line number Diff line number Diff line change @@ -2706,7 +2706,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
2706
2706
body1.isInstanceOf [RefTree ] && ! isWildcardArg(body1)
2707
2707
|| body1.isInstanceOf [Literal ]
2708
2708
val symTp =
2709
- if isStableIdentifierOrLiteral || pt.isNamedTupleType then pt
2709
+ if isStableIdentifierOrLiteral || pt.dealias. isNamedTupleType then pt
2710
2710
// need to combine tuple element types with expected named type
2711
2711
else if isWildcardStarArg(body1)
2712
2712
|| pt == defn.ImplicitScrutineeTypeRef
@@ -4644,7 +4644,7 @@ class Typer(@constructorOnly nestingLevel: Int = 0) extends Namer
4644
4644
case _ : SelectionProto =>
4645
4645
tree // adaptations for selections are handled in typedSelect
4646
4646
case _ if ctx.mode.is(Mode .ImplicitsEnabled ) && tree.tpe.isValueType =>
4647
- if tree.tpe.widen.isNamedTupleType && pt.derivesFrom(defn.TupleClass ) then
4647
+ if tree.tpe.derivesFromNamedTuple && pt.derivesFrom(defn.TupleClass ) then
4648
4648
readapt(typed(untpd.Select (untpd.TypedSplice (tree), nme.toTuple)))
4649
4649
else if pt.isRef(defn.AnyValClass , skipRefined = false )
4650
4650
|| pt.isRef(defn.ObjectClass , skipRefined = false )
Original file line number Diff line number Diff line change
1
+ type Person = (name : String , age : Int )
2
+
3
+ val Bob : Person = (name = " Bob" , age = 33 )
4
+
5
+ type SI = (String , Int )
6
+
7
+ def id [X ](x : X ): X = x
8
+ val x : (String , Int ) = Bob
9
+ val y : SI = id(Bob )
10
+ val and : Person & String = ???
11
+ val _: SI = and
12
+ val or : Person | (name : " Bob" , age : 33 ) = ???
13
+ val _: SI = or
14
+
15
+ class C [P <: Person ](p : P ):
16
+ val x : (String , Int ) = p
17
+
18
+
19
+
20
+
You can’t perform that action at this time.
0 commit comments