[TypeChecker] Add a flag PreCheckFunctionBuilderRequest to suppress diagnostics

This commit is contained in:
Pavel Yaskevich
2020-08-17 10:16:45 -07:00
parent bc319779d5
commit b2982fa0e5
2 changed files with 24 additions and 11 deletions

View File

@@ -1485,9 +1485,11 @@ Optional<BraceStmt *> TypeChecker::applyFunctionBuilderBodyTransform(
// If we encountered an error or there was an explicit result type,
// bail out and report that to the caller.
auto &ctx = func->getASTContext();
auto request = PreCheckFunctionBuilderRequest{AnyFunctionRef(func)};
switch (evaluateOrDefault(
ctx.evaluator, request, FunctionBuilderBodyPreCheck::Error)) {
auto request =
PreCheckFunctionBuilderRequest{{AnyFunctionRef(func),
/*SuppressDiagnostics=*/false}};
switch (evaluateOrDefault(ctx.evaluator, request,
FunctionBuilderBodyPreCheck::Error)) {
case FunctionBuilderBodyPreCheck::Okay:
// If the pre-check was okay, apply the function-builder transform.
break;
@@ -1619,7 +1621,8 @@ ConstraintSystem::matchFunctionBuilder(
// Pre-check the body: pre-check any expressions in it and look
// for return statements.
auto request = PreCheckFunctionBuilderRequest{fn};
auto request =
PreCheckFunctionBuilderRequest{{fn, /*SuppressDiagnostics=*/false}};
switch (evaluateOrDefault(getASTContext().evaluator, request,
FunctionBuilderBodyPreCheck::Error)) {
case FunctionBuilderBodyPreCheck::Okay:
@@ -1705,14 +1708,17 @@ namespace {
class PreCheckFunctionBuilderApplication : public ASTWalker {
AnyFunctionRef Fn;
bool SkipPrecheck = false;
bool SuppressDiagnostics = false;
std::vector<ReturnStmt *> ReturnStmts;
bool HasError = false;
bool hasReturnStmt() const { return !ReturnStmts.empty(); }
public:
PreCheckFunctionBuilderApplication(AnyFunctionRef fn, bool skipPrecheck)
: Fn(fn), SkipPrecheck(skipPrecheck) {}
PreCheckFunctionBuilderApplication(AnyFunctionRef fn, bool skipPrecheck,
bool suppressDiagnostics)
: Fn(fn), SkipPrecheck(skipPrecheck),
SuppressDiagnostics(suppressDiagnostics) {}
const std::vector<ReturnStmt *> getReturnStmts() const { return ReturnStmts; }
@@ -1753,7 +1759,9 @@ public:
E, DC, /*replaceInvalidRefsWithErrors=*/false);
HasError |= transaction.hasDiagnostics();
transaction.abort();
if (SuppressDiagnostics)
transaction.abort();
return std::make_pair(false, HasError ? nullptr : E);
}
}
@@ -1788,11 +1796,15 @@ FunctionBuilderBodyPreCheck PreCheckFunctionBuilderRequest::evaluate(
owner.Fn.getAbstractClosureExpr()))
skipPrecheck = shouldTypeCheckInEnclosingExpression(closure);
return PreCheckFunctionBuilderApplication(owner.Fn, false).run();
return PreCheckFunctionBuilderApplication(
owner.Fn, /*skipPrecheck=*/false,
/*suppressDiagnostics=*/owner.SuppressDiagnostics)
.run();
}
std::vector<ReturnStmt *> TypeChecker::findReturnStatements(AnyFunctionRef fn) {
PreCheckFunctionBuilderApplication precheck(fn, true);
PreCheckFunctionBuilderApplication precheck(fn, /*skipPreCheck=*/true,
/*SuppressDiagnostics=*/true);
(void)precheck.run();
return precheck.getReturnStmts();
}