@@ -1559,7 +1559,7 @@ class SolutionApplicationTarget {
1559
1559
stmtCondition,
1560
1560
caseLabelItem,
1561
1561
patternBinding,
1562
- uninitializedWrappedVar ,
1562
+ uninitializedVar ,
1563
1563
} kind;
1564
1564
1565
1565
private:
@@ -1631,9 +1631,15 @@ class SolutionApplicationTarget {
1631
1631
DeclContext *dc;
1632
1632
} caseLabelItem;
1633
1633
1634
- PatternBindingDecl *patternBinding;
1634
+ struct {
1635
+ // / Index into pattern binding declaration (if any).
1636
+ unsigned index;
1637
+ PointerUnion<VarDecl *, Pattern *> declaration;
1638
+ // / Type associated with the declaration.
1639
+ Type type;
1640
+ } uninitializedVar;
1635
1641
1636
- VarDecl *uninitializedWrappedVar ;
1642
+ PatternBindingDecl *patternBinding ;
1637
1643
};
1638
1644
1639
1645
// If the pattern contains a single variable that has an attached
@@ -1679,9 +1685,29 @@ class SolutionApplicationTarget {
1679
1685
this ->patternBinding = patternBinding;
1680
1686
}
1681
1687
1682
- SolutionApplicationTarget (VarDecl *wrappedVar) {
1683
- kind = Kind::uninitializedWrappedVar;
1684
- this ->uninitializedWrappedVar = wrappedVar;
1688
+ SolutionApplicationTarget (VarDecl *uninitializedWrappedVar)
1689
+ : kind(Kind::uninitializedVar) {
1690
+ if (auto *PDB = uninitializedWrappedVar->getParentPatternBinding ()) {
1691
+ patternBinding = PDB;
1692
+ uninitializedVar.index =
1693
+ PDB->getPatternEntryIndexForVarDecl (uninitializedWrappedVar);
1694
+ } else {
1695
+ uninitializedVar.index = 0 ;
1696
+ }
1697
+
1698
+ uninitializedVar.declaration = uninitializedWrappedVar;
1699
+ uninitializedVar.type = Type ();
1700
+ }
1701
+
1702
+ SolutionApplicationTarget (PatternBindingDecl *binding, unsigned index,
1703
+ Pattern *var, Type patternTy)
1704
+ : kind(Kind::uninitializedVar) {
1705
+ assert (patternBinding);
1706
+
1707
+ patternBinding = binding;
1708
+ uninitializedVar.index = index;
1709
+ uninitializedVar.declaration = var;
1710
+ uninitializedVar.type = patternTy;
1685
1711
}
1686
1712
1687
1713
// / Form a target for the initialization of a pattern from an expression.
@@ -1703,8 +1729,16 @@ class SolutionApplicationTarget {
1703
1729
1704
1730
// / Form a target for a property with an attached property wrapper that is
1705
1731
// / initialized out-of-line.
1706
- static SolutionApplicationTarget forUninitializedWrappedVar (
1707
- VarDecl *wrappedVar);
1732
+ static SolutionApplicationTarget
1733
+ forUninitializedWrappedVar (VarDecl *wrappedVar) {
1734
+ return {wrappedVar};
1735
+ }
1736
+
1737
+ static SolutionApplicationTarget
1738
+ forUninitializedVar (PatternBindingDecl *binding, unsigned index, Pattern *var,
1739
+ Type patternTy) {
1740
+ return {binding, index, var, patternTy};
1741
+ }
1708
1742
1709
1743
// / Form a target for a synthesized property wrapper initializer.
1710
1744
static SolutionApplicationTarget forPropertyWrapperInitializer (
@@ -1719,7 +1753,7 @@ class SolutionApplicationTarget {
1719
1753
case Kind::stmtCondition:
1720
1754
case Kind::caseLabelItem:
1721
1755
case Kind::patternBinding:
1722
- case Kind::uninitializedWrappedVar :
1756
+ case Kind::uninitializedVar :
1723
1757
return nullptr ;
1724
1758
}
1725
1759
llvm_unreachable (" invalid expression type" );
@@ -1742,8 +1776,13 @@ class SolutionApplicationTarget {
1742
1776
case Kind::patternBinding:
1743
1777
return patternBinding->getDeclContext ();
1744
1778
1745
- case Kind::uninitializedWrappedVar:
1746
- return uninitializedWrappedVar->getDeclContext ();
1779
+ case Kind::uninitializedVar: {
1780
+ if (auto *wrappedVar =
1781
+ uninitializedVar.declaration .dyn_cast <VarDecl *>())
1782
+ return wrappedVar->getDeclContext ();
1783
+
1784
+ return patternBinding->getInitContext (uninitializedVar.index );
1785
+ }
1747
1786
}
1748
1787
llvm_unreachable (" invalid decl context type" );
1749
1788
}
@@ -1799,6 +1838,9 @@ class SolutionApplicationTarget {
1799
1838
1800
1839
// / For a pattern initialization target, retrieve the pattern.
1801
1840
Pattern *getInitializationPattern () const {
1841
+ if (kind == Kind::uninitializedVar)
1842
+ return uninitializedVar.declaration .get <Pattern *>();
1843
+
1802
1844
assert (kind == Kind::expression);
1803
1845
assert (expression.contextualPurpose == CTP_Initialization);
1804
1846
return expression.pattern ;
@@ -1903,6 +1945,12 @@ class SolutionApplicationTarget {
1903
1945
}
1904
1946
1905
1947
void setPattern (Pattern *pattern) {
1948
+ if (kind == Kind::uninitializedVar) {
1949
+ assert (uninitializedVar.declaration .is <Pattern *>());
1950
+ uninitializedVar.declaration = pattern;
1951
+ return ;
1952
+ }
1953
+
1906
1954
assert (kind == Kind::expression);
1907
1955
assert (expression.contextualPurpose == CTP_Initialization ||
1908
1956
expression.contextualPurpose == CTP_ForEachStmt);
@@ -1915,7 +1963,7 @@ class SolutionApplicationTarget {
1915
1963
case Kind::stmtCondition:
1916
1964
case Kind::caseLabelItem:
1917
1965
case Kind::patternBinding:
1918
- case Kind::uninitializedWrappedVar :
1966
+ case Kind::uninitializedVar :
1919
1967
return None;
1920
1968
1921
1969
case Kind::function:
@@ -1930,7 +1978,7 @@ class SolutionApplicationTarget {
1930
1978
case Kind::function:
1931
1979
case Kind::caseLabelItem:
1932
1980
case Kind::patternBinding:
1933
- case Kind::uninitializedWrappedVar :
1981
+ case Kind::uninitializedVar :
1934
1982
return None;
1935
1983
1936
1984
case Kind::stmtCondition:
@@ -1945,7 +1993,7 @@ class SolutionApplicationTarget {
1945
1993
case Kind::function:
1946
1994
case Kind::stmtCondition:
1947
1995
case Kind::patternBinding:
1948
- case Kind::uninitializedWrappedVar :
1996
+ case Kind::uninitializedVar :
1949
1997
return None;
1950
1998
1951
1999
case Kind::caseLabelItem:
@@ -1960,7 +2008,7 @@ class SolutionApplicationTarget {
1960
2008
case Kind::function:
1961
2009
case Kind::stmtCondition:
1962
2010
case Kind::caseLabelItem:
1963
- case Kind::uninitializedWrappedVar :
2011
+ case Kind::uninitializedVar :
1964
2012
return nullptr ;
1965
2013
1966
2014
case Kind::patternBinding:
@@ -1978,8 +2026,68 @@ class SolutionApplicationTarget {
1978
2026
case Kind::patternBinding:
1979
2027
return nullptr ;
1980
2028
1981
- case Kind::uninitializedWrappedVar:
1982
- return uninitializedWrappedVar;
2029
+ case Kind::uninitializedVar:
2030
+ return uninitializedVar.declaration .dyn_cast <VarDecl *>();
2031
+ }
2032
+ llvm_unreachable (" invalid case label type" );
2033
+ }
2034
+
2035
+ Pattern *getAsUninitializedVar () const {
2036
+ switch (kind) {
2037
+ case Kind::expression:
2038
+ case Kind::function:
2039
+ case Kind::stmtCondition:
2040
+ case Kind::caseLabelItem:
2041
+ case Kind::patternBinding:
2042
+ return nullptr ;
2043
+
2044
+ case Kind::uninitializedVar:
2045
+ return uninitializedVar.declaration .dyn_cast <Pattern *>();
2046
+ }
2047
+ llvm_unreachable (" invalid case label type" );
2048
+ }
2049
+
2050
+ Type getTypeOfUninitializedVar () const {
2051
+ switch (kind) {
2052
+ case Kind::expression:
2053
+ case Kind::function:
2054
+ case Kind::stmtCondition:
2055
+ case Kind::caseLabelItem:
2056
+ case Kind::patternBinding:
2057
+ return nullptr ;
2058
+
2059
+ case Kind::uninitializedVar:
2060
+ return uninitializedVar.type ;
2061
+ }
2062
+ llvm_unreachable (" invalid case label type" );
2063
+ }
2064
+
2065
+ PatternBindingDecl *getPatternBindingOfUninitializedVar () const {
2066
+ switch (kind) {
2067
+ case Kind::expression:
2068
+ case Kind::function:
2069
+ case Kind::stmtCondition:
2070
+ case Kind::caseLabelItem:
2071
+ case Kind::patternBinding:
2072
+ return nullptr ;
2073
+
2074
+ case Kind::uninitializedVar:
2075
+ return patternBinding;
2076
+ }
2077
+ llvm_unreachable (" invalid case label type" );
2078
+ }
2079
+
2080
+ unsigned getIndexOfUninitializedVar () const {
2081
+ switch (kind) {
2082
+ case Kind::expression:
2083
+ case Kind::function:
2084
+ case Kind::stmtCondition:
2085
+ case Kind::caseLabelItem:
2086
+ case Kind::patternBinding:
2087
+ return 0 ;
2088
+
2089
+ case Kind::uninitializedVar:
2090
+ return uninitializedVar.index ;
1983
2091
}
1984
2092
llvm_unreachable (" invalid case label type" );
1985
2093
}
@@ -2013,8 +2121,13 @@ class SolutionApplicationTarget {
2013
2121
case Kind::patternBinding:
2014
2122
return patternBinding->getSourceRange ();
2015
2123
2016
- case Kind::uninitializedWrappedVar:
2017
- return uninitializedWrappedVar->getSourceRange ();
2124
+ case Kind::uninitializedVar: {
2125
+ if (auto *wrappedVar =
2126
+ uninitializedVar.declaration .dyn_cast <VarDecl *>()) {
2127
+ return wrappedVar->getSourceRange ();
2128
+ }
2129
+ return uninitializedVar.declaration .get <Pattern *>()->getSourceRange ();
2130
+ }
2018
2131
}
2019
2132
llvm_unreachable (" invalid target type" );
2020
2133
}
@@ -2037,8 +2150,13 @@ class SolutionApplicationTarget {
2037
2150
case Kind::patternBinding:
2038
2151
return patternBinding->getLoc ();
2039
2152
2040
- case Kind::uninitializedWrappedVar:
2041
- return uninitializedWrappedVar->getLoc ();
2153
+ case Kind::uninitializedVar: {
2154
+ if (auto *wrappedVar =
2155
+ uninitializedVar.declaration .dyn_cast <VarDecl *>()) {
2156
+ return wrappedVar->getLoc ();
2157
+ }
2158
+ return uninitializedVar.declaration .get <Pattern *>()->getLoc ();
2159
+ }
2042
2160
}
2043
2161
llvm_unreachable (" invalid target type" );
2044
2162
}
0 commit comments