@@ -1699,6 +1699,17 @@ class SolutionApplicationTarget {
16991699 uninitializedVar.type = Type ();
17001700 }
17011701
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;
1711+ }
1712+
17021713 // / Form a target for the initialization of a pattern from an expression.
17031714 static SolutionApplicationTarget forInitialization (
17041715 Expr *initializer, DeclContext *dc, Type patternType, Pattern *pattern,
@@ -1723,6 +1734,12 @@ class SolutionApplicationTarget {
17231734 return {wrappedVar};
17241735 }
17251736
1737+ static SolutionApplicationTarget
1738+ forUninitializedVar (PatternBindingDecl *binding, unsigned index, Pattern *var,
1739+ Type patternTy) {
1740+ return {binding, index, var, patternTy};
1741+ }
1742+
17261743 // / Form a target for a synthesized property wrapper initializer.
17271744 static SolutionApplicationTarget forPropertyWrapperInitializer (
17281745 VarDecl *wrappedVar, DeclContext *dc, Expr *initializer);
@@ -1821,6 +1838,9 @@ class SolutionApplicationTarget {
18211838
18221839 // / For a pattern initialization target, retrieve the pattern.
18231840 Pattern *getInitializationPattern () const {
1841+ if (kind == Kind::uninitializedVar)
1842+ return uninitializedVar.declaration .get <Pattern *>();
1843+
18241844 assert (kind == Kind::expression);
18251845 assert (expression.contextualPurpose == CTP_Initialization);
18261846 return expression.pattern ;
@@ -1925,6 +1945,12 @@ class SolutionApplicationTarget {
19251945 }
19261946
19271947 void setPattern (Pattern *pattern) {
1948+ if (kind == Kind::uninitializedVar) {
1949+ assert (uninitializedVar.declaration .is <Pattern *>());
1950+ uninitializedVar.declaration = pattern;
1951+ return ;
1952+ }
1953+
19281954 assert (kind == Kind::expression);
19291955 assert (expression.contextualPurpose == CTP_Initialization ||
19301956 expression.contextualPurpose == CTP_ForEachStmt);
@@ -2006,6 +2032,66 @@ class SolutionApplicationTarget {
20062032 llvm_unreachable (" invalid case label type" );
20072033 }
20082034
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 ;
2091+ }
2092+ llvm_unreachable (" invalid case label type" );
2093+ }
2094+
20092095 BraceStmt *getFunctionBody () const {
20102096 assert (kind == Kind::function);
20112097 return function.body ;
0 commit comments