Skip to content

Commit d64c19e

Browse files
committed
[ConstraintSystem] Solution application target for uninitialized pattern binding
1 parent a72b057 commit d64c19e

File tree

1 file changed

+86
-0
lines changed

1 file changed

+86
-0
lines changed

include/swift/Sema/ConstraintSystem.h

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)