@@ -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,18 @@ 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 ();
1685
1700
}
1686
1701
1687
1702
// / Form a target for the initialization of a pattern from an expression.
@@ -1703,8 +1718,10 @@ class SolutionApplicationTarget {
1703
1718
1704
1719
// / Form a target for a property with an attached property wrapper that is
1705
1720
// / initialized out-of-line.
1706
- static SolutionApplicationTarget forUninitializedWrappedVar (
1707
- VarDecl *wrappedVar);
1721
+ static SolutionApplicationTarget
1722
+ forUninitializedWrappedVar (VarDecl *wrappedVar) {
1723
+ return {wrappedVar};
1724
+ }
1708
1725
1709
1726
// / Form a target for a synthesized property wrapper initializer.
1710
1727
static SolutionApplicationTarget forPropertyWrapperInitializer (
@@ -1719,7 +1736,7 @@ class SolutionApplicationTarget {
1719
1736
case Kind::stmtCondition:
1720
1737
case Kind::caseLabelItem:
1721
1738
case Kind::patternBinding:
1722
- case Kind::uninitializedWrappedVar :
1739
+ case Kind::uninitializedVar :
1723
1740
return nullptr ;
1724
1741
}
1725
1742
llvm_unreachable (" invalid expression type" );
@@ -1742,8 +1759,13 @@ class SolutionApplicationTarget {
1742
1759
case Kind::patternBinding:
1743
1760
return patternBinding->getDeclContext ();
1744
1761
1745
- case Kind::uninitializedWrappedVar:
1746
- return uninitializedWrappedVar->getDeclContext ();
1762
+ case Kind::uninitializedVar: {
1763
+ if (auto *wrappedVar =
1764
+ uninitializedVar.declaration .dyn_cast <VarDecl *>())
1765
+ return wrappedVar->getDeclContext ();
1766
+
1767
+ return patternBinding->getInitContext (uninitializedVar.index );
1768
+ }
1747
1769
}
1748
1770
llvm_unreachable (" invalid decl context type" );
1749
1771
}
@@ -1915,7 +1937,7 @@ class SolutionApplicationTarget {
1915
1937
case Kind::stmtCondition:
1916
1938
case Kind::caseLabelItem:
1917
1939
case Kind::patternBinding:
1918
- case Kind::uninitializedWrappedVar :
1940
+ case Kind::uninitializedVar :
1919
1941
return None;
1920
1942
1921
1943
case Kind::function:
@@ -1930,7 +1952,7 @@ class SolutionApplicationTarget {
1930
1952
case Kind::function:
1931
1953
case Kind::caseLabelItem:
1932
1954
case Kind::patternBinding:
1933
- case Kind::uninitializedWrappedVar :
1955
+ case Kind::uninitializedVar :
1934
1956
return None;
1935
1957
1936
1958
case Kind::stmtCondition:
@@ -1945,7 +1967,7 @@ class SolutionApplicationTarget {
1945
1967
case Kind::function:
1946
1968
case Kind::stmtCondition:
1947
1969
case Kind::patternBinding:
1948
- case Kind::uninitializedWrappedVar :
1970
+ case Kind::uninitializedVar :
1949
1971
return None;
1950
1972
1951
1973
case Kind::caseLabelItem:
@@ -1960,7 +1982,7 @@ class SolutionApplicationTarget {
1960
1982
case Kind::function:
1961
1983
case Kind::stmtCondition:
1962
1984
case Kind::caseLabelItem:
1963
- case Kind::uninitializedWrappedVar :
1985
+ case Kind::uninitializedVar :
1964
1986
return nullptr ;
1965
1987
1966
1988
case Kind::patternBinding:
@@ -1978,8 +2000,8 @@ class SolutionApplicationTarget {
1978
2000
case Kind::patternBinding:
1979
2001
return nullptr ;
1980
2002
1981
- case Kind::uninitializedWrappedVar :
1982
- return uninitializedWrappedVar ;
2003
+ case Kind::uninitializedVar :
2004
+ return uninitializedVar. declaration . dyn_cast <VarDecl *>() ;
1983
2005
}
1984
2006
llvm_unreachable (" invalid case label type" );
1985
2007
}
@@ -2013,8 +2035,13 @@ class SolutionApplicationTarget {
2013
2035
case Kind::patternBinding:
2014
2036
return patternBinding->getSourceRange ();
2015
2037
2016
- case Kind::uninitializedWrappedVar:
2017
- return uninitializedWrappedVar->getSourceRange ();
2038
+ case Kind::uninitializedVar: {
2039
+ if (auto *wrappedVar =
2040
+ uninitializedVar.declaration .dyn_cast <VarDecl *>()) {
2041
+ return wrappedVar->getSourceRange ();
2042
+ }
2043
+ return uninitializedVar.declaration .get <Pattern *>()->getSourceRange ();
2044
+ }
2018
2045
}
2019
2046
llvm_unreachable (" invalid target type" );
2020
2047
}
@@ -2037,8 +2064,13 @@ class SolutionApplicationTarget {
2037
2064
case Kind::patternBinding:
2038
2065
return patternBinding->getLoc ();
2039
2066
2040
- case Kind::uninitializedWrappedVar:
2041
- return uninitializedWrappedVar->getLoc ();
2067
+ case Kind::uninitializedVar: {
2068
+ if (auto *wrappedVar =
2069
+ uninitializedVar.declaration .dyn_cast <VarDecl *>()) {
2070
+ return wrappedVar->getLoc ();
2071
+ }
2072
+ return uninitializedVar.declaration .get <Pattern *>()->getLoc ();
2073
+ }
2042
2074
}
2043
2075
llvm_unreachable (" invalid target type" );
2044
2076
}
0 commit comments