Skip to content

Commit 8f9631b

Browse files
committed
[ConstraintSystem] Add unwrap optional base with optional result fix kind
1 parent c3ac038 commit 8f9631b

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

lib/Sema/CSFix.cpp

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ ForceOptional *ForceOptional::create(ConstraintSystem &cs,
5959
}
6060

6161
bool UnwrapOptionalBase::diagnose(Expr *root, const Solution &solution) const {
62-
bool resultIsOptional = false; // FIXME: figure out a way to implement this.
62+
bool resultIsOptional =
63+
getKind() == FixKind::UnwrapOptionalBaseWithOptionalResult;
6364
MemberAccessOnOptionalBaseFailure failure(root, solution, getLocator(),
6465
MemberName, resultIsOptional);
6566
return failure.diagnose();
@@ -68,7 +69,14 @@ bool UnwrapOptionalBase::diagnose(Expr *root, const Solution &solution) const {
6869
UnwrapOptionalBase *UnwrapOptionalBase::create(ConstraintSystem &cs,
6970
DeclName member,
7071
ConstraintLocator *locator) {
71-
return new (cs.getAllocator()) UnwrapOptionalBase(member, locator);
72+
return new (cs.getAllocator())
73+
UnwrapOptionalBase(FixKind::UnwrapOptionalBase, member, locator);
74+
}
75+
76+
UnwrapOptionalBase *UnwrapOptionalBase::createWithOptionalResult(
77+
ConstraintSystem &cs, DeclName member, ConstraintLocator *locator) {
78+
return new (cs.getAllocator()) UnwrapOptionalBase(
79+
FixKind::UnwrapOptionalBaseWithOptionalResult, member, locator);
7280
}
7381

7482
bool AddAddressOf::diagnose(Expr *root, const Solution &solution) const {
@@ -118,7 +126,7 @@ RelabelArguments::create(ConstraintSystem &cs,
118126

119127
bool MissingConformance::diagnose(Expr *root, const Solution &solution) const {
120128
MissingConformanceFailure failure(root, solution, getLocator(),
121-
{NonConformingType.getPointer(), Protocol});
129+
{NonConformingType, Protocol});
122130
return failure.diagnose();
123131
}
124132

lib/Sema/CSFix.h

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ enum class FixKind : uint8_t {
4343

4444
/// Unwrap an optional base when we have a member access.
4545
UnwrapOptionalBase,
46+
UnwrapOptionalBaseWithOptionalResult,
4647

4748
/// Append 'as! T' to force a downcast to the specified type.
4849
ForceDowncast,
@@ -55,8 +56,6 @@ enum class FixKind : uint8_t {
5556

5657
/// Mark function type as explicitly '@escaping'.
5758
ExplicitlyEscaping,
58-
/// Mark function type as explicitly '@escaping' to be convertable to 'Any'.
59-
ExplicitlyEscapingToAny,
6059

6160
/// Arguments have labeling failures - missing/extraneous or incorrect
6261
/// labels attached to the, fix it by suggesting proper labels.
@@ -127,9 +126,11 @@ class ForceOptional final : public ConstraintFix {
127126
class UnwrapOptionalBase final : public ConstraintFix {
128127
DeclName MemberName;
129128

130-
UnwrapOptionalBase(DeclName member, ConstraintLocator *locator)
131-
: ConstraintFix(FixKind::UnwrapOptionalBase, locator),
132-
MemberName(member) {}
129+
UnwrapOptionalBase(FixKind kind, DeclName member, ConstraintLocator *locator)
130+
: ConstraintFix(kind, locator), MemberName(member) {
131+
assert(kind == FixKind::UnwrapOptionalBase ||
132+
kind == FixKind::UnwrapOptionalBaseWithOptionalResult);
133+
}
133134

134135
public:
135136
bool diagnose(Expr *root, const Solution &solution) const override;
@@ -139,6 +140,10 @@ class UnwrapOptionalBase final : public ConstraintFix {
139140

140141
static UnwrapOptionalBase *create(ConstraintSystem &cs, DeclName member,
141142
ConstraintLocator *locator);
143+
144+
static UnwrapOptionalBase *
145+
createWithOptionalResult(ConstraintSystem &cs, DeclName member,
146+
ConstraintLocator *locator);
142147
};
143148

144149
/// Introduce a '&' to take the address of an lvalue.

0 commit comments

Comments
 (0)