@@ -737,6 +737,30 @@ namespace {
737
737
}
738
738
}
739
739
740
+ // / Use this if you're doing getAs<TupleType> on a Type (and it succeeds)
741
+ // / to compute the spaces for it. Handy for disambiguating fields
742
+ // / that are tuples from associated values.
743
+ // /
744
+ // / .e((a: X, b: X)) -> ((a: X, b: X))
745
+ // / vs .f(a: X, b: X) -> (a: X, b: X)
746
+ static void getTupleTypeSpaces (Type &outerType,
747
+ TupleType *tty,
748
+ SmallVectorImpl<Space> &spaces) {
749
+ ArrayRef<TupleTypeElt> ttyElts = tty->getElements ();
750
+ if (isa<ParenType>(outerType.getPointer ())) {
751
+ // We had an actual tuple!
752
+ SmallVector<Space, 4 > innerSpaces;
753
+ for (auto &elt: ttyElts)
754
+ innerSpaces.push_back (Space::forType (elt.getType (), elt.getName ()));
755
+ spaces.push_back (
756
+ Space::forConstructor (tty, Identifier (), innerSpaces));
757
+ } else {
758
+ // We're looking at the fields of a constructor here.
759
+ for (auto &elt: ttyElts)
760
+ spaces.push_back (Space::forType (elt.getType (), elt.getName ()));
761
+ }
762
+ };
763
+
740
764
// Decompose a type into its component spaces.
741
765
static void decompose (TypeChecker &TC, const DeclContext *DC, Type tp,
742
766
SmallVectorImpl<Space> &arr) {
@@ -776,20 +800,7 @@ namespace {
776
800
SmallVector<Space, 4 > constElemSpaces;
777
801
if (eedTy) {
778
802
if (auto *TTy = eedTy->getAs <TupleType>()) {
779
- if (isa<ParenType>(eedTy.getPointer ())) {
780
- // We had an actual tuple!
781
- SmallVector<Space, 4 > innerElemSpaces;
782
- for (auto &elt: TTy->getElements ())
783
- innerElemSpaces.push_back (
784
- Space::forType (elt.getType (), elt.getName ()));
785
- constElemSpaces.push_back (
786
- Space::forConstructor (TTy, Identifier (), innerElemSpaces));
787
- } else {
788
- // We're just looking at fields of a constructor here.
789
- for (auto &elt: TTy->getElements ())
790
- constElemSpaces.push_back (
791
- Space::forType (elt.getType (), elt.getName ()));
792
- }
803
+ Space::getTupleTypeSpaces (eedTy, TTy, constElemSpaces);
793
804
} else if (auto *TTy = dyn_cast<ParenType>(eedTy.getPointer ())) {
794
805
constElemSpaces.push_back (
795
806
Space::forType (TTy->getUnderlyingType (), Identifier ()));
@@ -1452,14 +1463,11 @@ namespace {
1452
1463
// FIXME: SE-0155 makes this case unreachable.
1453
1464
if (SP->getKind () == PatternKind::Named
1454
1465
|| SP->getKind () == PatternKind::Any) {
1455
- if (auto *TTy = SP->getType ()->getAs <TupleType>()) {
1456
- for (auto ty : TTy->getElements ()) {
1457
- conArgSpace.push_back (Space::forType (ty.getType (),
1458
- ty.getName ()));
1459
- }
1460
- } else {
1466
+ Type outerType = SP->getType ();
1467
+ if (auto *TTy = outerType->getAs <TupleType>())
1468
+ Space::getTupleTypeSpaces (outerType, TTy, conArgSpace);
1469
+ else
1461
1470
conArgSpace.push_back (projectPattern (TC, SP));
1462
- }
1463
1471
} else if (SP->getKind () == PatternKind::Tuple) {
1464
1472
Space argTupleSpace = projectPattern (TC, SP);
1465
1473
// Tuples are modeled as if they are enums with a single, nameless
0 commit comments