Skip to content

Commit e0ed130

Browse files
committed
Constify DiagnosticState::determineBehavior
Split out the state mutation into a new `updateFor` function that we call for diagnostic emission, allowing `DiagnosticTransaction::hasErrors` to query the behavior without mutating any state.
1 parent 7d10f95 commit e0ed130

File tree

2 files changed

+17
-9
lines changed

2 files changed

+17
-9
lines changed

include/swift/AST/DiagnosticEngine.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,10 @@ namespace swift {
995995

996996
/// Figure out the Behavior for the given diagnostic, taking current
997997
/// state such as fatality into account.
998-
DiagnosticBehavior determineBehavior(const Diagnostic &diag);
998+
DiagnosticBehavior determineBehavior(const Diagnostic &diag) const;
999+
1000+
/// Updates the diagnostic state for a diagnostic to emit.
1001+
void updateFor(DiagnosticBehavior behavior);
9991002

10001003
bool hadAnyError() const { return anyErrorOccurred; }
10011004
bool hasFatalErrorOccurred() const { return fatalErrorOccurred; }
@@ -1023,7 +1026,7 @@ namespace swift {
10231026

10241027
/// Returns a Boolean value indicating whether warnings belonging to the
10251028
/// diagnostic group identified by `id` should be escalated to errors.
1026-
bool getWarningsAsErrorsForDiagGroupID(DiagGroupID id) {
1029+
bool getWarningsAsErrorsForDiagGroupID(DiagGroupID id) const {
10271030
return warningsAsErrors[(unsigned)id];
10281031
}
10291032

lib/AST/DiagnosticEngine.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1263,7 +1263,8 @@ llvm::cl::opt<bool> AssertOnError("swift-diagnostics-assert-on-error",
12631263
llvm::cl::opt<bool> AssertOnWarning("swift-diagnostics-assert-on-warning",
12641264
llvm::cl::init(false));
12651265

1266-
DiagnosticBehavior DiagnosticState::determineBehavior(const Diagnostic &diag) {
1266+
DiagnosticBehavior
1267+
DiagnosticState::determineBehavior(const Diagnostic &diag) const {
12671268
// We determine how to handle a diagnostic based on the following rules
12681269
// 1) Map the diagnostic to its "intended" behavior, applying the behavior
12691270
// limit for this particular emission
@@ -1310,21 +1311,23 @@ DiagnosticBehavior DiagnosticState::determineBehavior(const Diagnostic &diag) {
13101311
if (suppressRemarks)
13111312
lvl = DiagnosticBehavior::Ignore;
13121313
}
1314+
return lvl;
1315+
}
13131316

1314-
// 5) Update current state for use during the next diagnostic
1315-
if (lvl == DiagnosticBehavior::Fatal) {
1317+
void DiagnosticState::updateFor(DiagnosticBehavior behavior) {
1318+
// Update current state for use during the next diagnostic
1319+
if (behavior == DiagnosticBehavior::Fatal) {
13161320
fatalErrorOccurred = true;
13171321
anyErrorOccurred = true;
1318-
} else if (lvl == DiagnosticBehavior::Error) {
1322+
} else if (behavior == DiagnosticBehavior::Error) {
13191323
anyErrorOccurred = true;
13201324
}
13211325

13221326
ASSERT((!AssertOnError || !anyErrorOccurred) && "We emitted an error?!");
1323-
ASSERT((!AssertOnWarning || (lvl != DiagnosticBehavior::Warning)) &&
1327+
ASSERT((!AssertOnWarning || (behavior != DiagnosticBehavior::Warning)) &&
13241328
"We emitted a warning?!");
13251329

1326-
previousBehavior = lvl;
1327-
return lvl;
1330+
previousBehavior = behavior;
13281331
}
13291332

13301333
void DiagnosticEngine::flushActiveDiagnostic() {
@@ -1369,6 +1372,8 @@ std::optional<DiagnosticInfo>
13691372
DiagnosticEngine::diagnosticInfoForDiagnostic(const Diagnostic &diagnostic,
13701373
bool includeDiagnosticName) {
13711374
auto behavior = state.determineBehavior(diagnostic);
1375+
state.updateFor(behavior);
1376+
13721377
if (behavior == DiagnosticBehavior::Ignore)
13731378
return std::nullopt;
13741379

0 commit comments

Comments
 (0)