Skip to content

Commit a3022b7

Browse files
committed
[CSClosure] Generalize syntactic element simplification
Syntactic elements could be found in a closure or an accessor which could also be a result builder.
1 parent a0693f3 commit a3022b7

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

lib/Sema/CSClosure.cpp

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1116,17 +1116,39 @@ bool isConditionOfStmt(ConstraintLocatorBuilder locator) {
11161116

11171117
ConstraintSystem::SolutionKind
11181118
ConstraintSystem::simplifySyntacticElementConstraint(
1119-
ASTNode element, ContextualTypeInfo context, bool isDiscarded,
1119+
ASTNode element, ContextualTypeInfo contextInfo, bool isDiscarded,
11201120
TypeMatchOptions flags, ConstraintLocatorBuilder locator) {
1121-
auto *closure = castToExpr<ClosureExpr>(locator.getAnchor());
11221121

1123-
SyntacticElementConstraintGenerator generator(
1124-
*this, closure, getClosureType(closure)->getResult(),
1125-
getConstraintLocator(locator));
1122+
DeclContext *context;
1123+
Type resultType;
1124+
1125+
auto anchor = locator.getAnchor();
1126+
1127+
if (auto *closure = getAsExpr<ClosureExpr>(anchor)) {
1128+
context = closure;
1129+
resultType = getClosureType(closure)->getResult();
1130+
} else if (auto *fn = getAsDecl<AbstractFunctionDecl>(anchor)) {
1131+
context = fn;
1132+
resultType = AnyFunctionRef(fn).getBodyResultType();
1133+
} else {
1134+
return SolutionKind::Error;
1135+
}
1136+
1137+
AnyFunctionRef fn = AnyFunctionRef::fromFunctionDeclContext(context);
1138+
1139+
// If this element belongs to a result builder, let's use its result type.
1140+
{
1141+
auto transform = resultBuilderTransformed.find(fn);
1142+
if (transform != resultBuilderTransformed.end())
1143+
resultType = transform->second.bodyResultType;
1144+
}
1145+
1146+
SyntacticElementConstraintGenerator generator(*this, fn, resultType,
1147+
getConstraintLocator(locator));
11261148

11271149
if (auto *expr = element.dyn_cast<Expr *>()) {
1128-
SolutionApplicationTarget target(expr, closure, context.purpose,
1129-
context.getType(), isDiscarded);
1150+
SolutionApplicationTarget target(expr, context, contextInfo.purpose,
1151+
contextInfo.getType(), isDiscarded);
11301152

11311153
if (generateConstraints(target, FreeTypeVariableBinding::Disallow))
11321154
return SolutionKind::Error;
@@ -1136,12 +1158,12 @@ ConstraintSystem::simplifySyntacticElementConstraint(
11361158
} else if (auto *stmt = element.dyn_cast<Stmt *>()) {
11371159
generator.visit(stmt);
11381160
} else if (auto *cond = element.dyn_cast<StmtConditionElement *>()) {
1139-
if (generateConstraints({*cond}, closure))
1161+
if (generateConstraints({*cond}, context))
11401162
return SolutionKind::Error;
11411163
} else if (auto *pattern = element.dyn_cast<Pattern *>()) {
1142-
generator.visitPattern(pattern, context);
1164+
generator.visitPattern(pattern, contextInfo);
11431165
} else if (auto *caseItem = element.dyn_cast<CaseLabelItem *>()) {
1144-
generator.visitCaseItem(caseItem, context);
1166+
generator.visitCaseItem(caseItem, contextInfo);
11451167
} else {
11461168
generator.visit(element.get<Decl *>());
11471169
}

0 commit comments

Comments
 (0)