Skip to content

Commit b2982fa

Browse files
committed
[TypeChecker] Add a flag PreCheckFunctionBuilderRequest to suppress diagnostics
1 parent bc31977 commit b2982fa

File tree

2 files changed

+24
-11
lines changed

2 files changed

+24
-11
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1843,6 +1843,7 @@ class ValueWitnessRequest
18431843

18441844
struct PreCheckFunctionBuilderDescriptor {
18451845
AnyFunctionRef Fn;
1846+
bool SuppressDiagnostics;
18461847

18471848
private:
18481849
// NOTE: Since source tooling (e.g. code completion) might replace the body,
@@ -1852,8 +1853,8 @@ struct PreCheckFunctionBuilderDescriptor {
18521853
BraceStmt *Body;
18531854

18541855
public:
1855-
PreCheckFunctionBuilderDescriptor(AnyFunctionRef Fn)
1856-
: Fn(Fn), Body(Fn.getBody()) {}
1856+
PreCheckFunctionBuilderDescriptor(AnyFunctionRef Fn, bool suppressDiagnostics)
1857+
: Fn(Fn), SuppressDiagnostics(suppressDiagnostics), Body(Fn.getBody()) {}
18571858

18581859
friend llvm::hash_code
18591860
hash_value(const PreCheckFunctionBuilderDescriptor &owner) {

lib/Sema/BuilderTransform.cpp

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1485,9 +1485,11 @@ Optional<BraceStmt *> TypeChecker::applyFunctionBuilderBodyTransform(
14851485
// If we encountered an error or there was an explicit result type,
14861486
// bail out and report that to the caller.
14871487
auto &ctx = func->getASTContext();
1488-
auto request = PreCheckFunctionBuilderRequest{AnyFunctionRef(func)};
1489-
switch (evaluateOrDefault(
1490-
ctx.evaluator, request, FunctionBuilderBodyPreCheck::Error)) {
1488+
auto request =
1489+
PreCheckFunctionBuilderRequest{{AnyFunctionRef(func),
1490+
/*SuppressDiagnostics=*/false}};
1491+
switch (evaluateOrDefault(ctx.evaluator, request,
1492+
FunctionBuilderBodyPreCheck::Error)) {
14911493
case FunctionBuilderBodyPreCheck::Okay:
14921494
// If the pre-check was okay, apply the function-builder transform.
14931495
break;
@@ -1619,7 +1621,8 @@ ConstraintSystem::matchFunctionBuilder(
16191621

16201622
// Pre-check the body: pre-check any expressions in it and look
16211623
// for return statements.
1622-
auto request = PreCheckFunctionBuilderRequest{fn};
1624+
auto request =
1625+
PreCheckFunctionBuilderRequest{{fn, /*SuppressDiagnostics=*/false}};
16231626
switch (evaluateOrDefault(getASTContext().evaluator, request,
16241627
FunctionBuilderBodyPreCheck::Error)) {
16251628
case FunctionBuilderBodyPreCheck::Okay:
@@ -1705,14 +1708,17 @@ namespace {
17051708
class PreCheckFunctionBuilderApplication : public ASTWalker {
17061709
AnyFunctionRef Fn;
17071710
bool SkipPrecheck = false;
1711+
bool SuppressDiagnostics = false;
17081712
std::vector<ReturnStmt *> ReturnStmts;
17091713
bool HasError = false;
17101714

17111715
bool hasReturnStmt() const { return !ReturnStmts.empty(); }
17121716

17131717
public:
1714-
PreCheckFunctionBuilderApplication(AnyFunctionRef fn, bool skipPrecheck)
1715-
: Fn(fn), SkipPrecheck(skipPrecheck) {}
1718+
PreCheckFunctionBuilderApplication(AnyFunctionRef fn, bool skipPrecheck,
1719+
bool suppressDiagnostics)
1720+
: Fn(fn), SkipPrecheck(skipPrecheck),
1721+
SuppressDiagnostics(suppressDiagnostics) {}
17161722

17171723
const std::vector<ReturnStmt *> getReturnStmts() const { return ReturnStmts; }
17181724

@@ -1753,7 +1759,9 @@ class PreCheckFunctionBuilderApplication : public ASTWalker {
17531759
E, DC, /*replaceInvalidRefsWithErrors=*/false);
17541760
HasError |= transaction.hasDiagnostics();
17551761

1756-
transaction.abort();
1762+
if (SuppressDiagnostics)
1763+
transaction.abort();
1764+
17571765
return std::make_pair(false, HasError ? nullptr : E);
17581766
}
17591767
}
@@ -1788,11 +1796,15 @@ FunctionBuilderBodyPreCheck PreCheckFunctionBuilderRequest::evaluate(
17881796
owner.Fn.getAbstractClosureExpr()))
17891797
skipPrecheck = shouldTypeCheckInEnclosingExpression(closure);
17901798

1791-
return PreCheckFunctionBuilderApplication(owner.Fn, false).run();
1799+
return PreCheckFunctionBuilderApplication(
1800+
owner.Fn, /*skipPrecheck=*/false,
1801+
/*suppressDiagnostics=*/owner.SuppressDiagnostics)
1802+
.run();
17921803
}
17931804

17941805
std::vector<ReturnStmt *> TypeChecker::findReturnStatements(AnyFunctionRef fn) {
1795-
PreCheckFunctionBuilderApplication precheck(fn, true);
1806+
PreCheckFunctionBuilderApplication precheck(fn, /*skipPreCheck=*/true,
1807+
/*SuppressDiagnostics=*/true);
17961808
(void)precheck.run();
17971809
return precheck.getReturnStmts();
17981810
}

0 commit comments

Comments
 (0)