Skip to content

Commit c57025a

Browse files
committed
Avoid #include AST headers in Basic headers
Resolve a layering violation. `DiagnosticBehavior` was used in `LangOptions`. Introduce a dedicated 'enum' for the possible values.
1 parent 6e055d3 commit c57025a

File tree

5 files changed

+36
-10
lines changed

5 files changed

+36
-10
lines changed

include/swift/Basic/CXXStdlibKind.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
#ifndef SWIFT_BASIC_CXX_STDLIB_KIND_H
1414
#define SWIFT_BASIC_CXX_STDLIB_KIND_H
1515

16+
#include "llvm/Support/ErrorHandling.h"
17+
#include <stdint.h>
18+
#include <string>
19+
1620
namespace swift {
1721

1822
enum class CXXStdlibKind : uint8_t {

include/swift/Basic/LangOptions.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#ifndef SWIFT_BASIC_LANGOPTIONS_H
1919
#define SWIFT_BASIC_LANGOPTIONS_H
2020

21-
#include "swift/AST/DiagnosticsFrontend.h"
2221
#include "swift/Basic/CXXStdlibKind.h"
2322
#include "swift/Basic/Feature.h"
2423
#include "swift/Basic/FixedBitSet.h"
@@ -46,6 +45,7 @@
4645
namespace swift {
4746

4847
struct DiagnosticBehavior;
48+
class DiagnosticEngine;
4949

5050
/// Kind of implicit platform conditions.
5151
enum class PlatformConditionKind {
@@ -217,8 +217,14 @@ namespace swift {
217217

218218
/// Diagnostic level to report when a public declarations doesn't declare
219219
/// an introduction OS version.
220-
std::optional<DiagnosticBehavior> RequireExplicitAvailability =
221-
std::nullopt;
220+
enum class RequireExplicitAvailabilityDiagnosticBehavior : uint8_t {
221+
Ignore,
222+
Warning,
223+
Error,
224+
};
225+
RequireExplicitAvailabilityDiagnosticBehavior
226+
RequireExplicitAvailabilityBehavior =
227+
RequireExplicitAvailabilityDiagnosticBehavior::Ignore;
222228

223229
/// Introduction platform and version to suggest as fix-it
224230
/// when using RequireExplicitAvailability.

lib/AST/DiagnosticEngine.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
//===----------------------------------------------------------------------===//
1717

1818
#include "swift/AST/DiagnosticEngine.h"
19+
#include "swift/AST/DiagnosticsFrontend.h"
1920
#include "swift/AST/ASTContext.h"
2021
#include "swift/AST/ASTPrinter.h"
2122
#include "swift/AST/Decl.h"

lib/Frontend/CompilerInvocation.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1167,11 +1167,14 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
11671167
if (const Arg *A = Args.getLastArg(OPT_require_explicit_availability_EQ)) {
11681168
StringRef diagLevel = A->getValue();
11691169
if (diagLevel == "warn") {
1170-
Opts.RequireExplicitAvailability = DiagnosticBehavior::Warning;
1170+
Opts.RequireExplicitAvailabilityBehavior =
1171+
LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Warning;
11711172
} else if (diagLevel == "error") {
1172-
Opts.RequireExplicitAvailability = DiagnosticBehavior::Error;
1173+
Opts.RequireExplicitAvailabilityBehavior =
1174+
LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Error;
11731175
} else if (diagLevel == "ignore") {
1174-
Opts.RequireExplicitAvailability = std::nullopt;
1176+
Opts.RequireExplicitAvailabilityBehavior =
1177+
LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Ignore;
11751178
} else {
11761179
Diags.diagnose(SourceLoc(),
11771180
diag::error_unknown_require_explicit_availability,
@@ -1180,7 +1183,8 @@ static bool ParseLangArgs(LangOptions &Opts, ArgList &Args,
11801183
} else if (Args.getLastArg(OPT_require_explicit_availability,
11811184
OPT_require_explicit_availability_target) ||
11821185
Opts.LibraryLevel == LibraryLevel::API) {
1183-
Opts.RequireExplicitAvailability = DiagnosticBehavior::Warning;
1186+
Opts.RequireExplicitAvailabilityBehavior =
1187+
LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Warning;
11841188
}
11851189

11861190
if (const Arg *A = Args.getLastArg(OPT_require_explicit_availability_target)) {

lib/Sema/TypeCheckAvailability.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4651,10 +4651,21 @@ void swift::checkExplicitAvailability(Decl *decl) {
46514651
// Skip if the command line option was not set and
46524652
// accessors as we check the pattern binding decl instead.
46534653
auto &ctx = decl->getASTContext();
4654-
auto DiagLevel = ctx.LangOpts.RequireExplicitAvailability;
4655-
if (!DiagLevel || isa<AccessorDecl>(decl))
4654+
if (isa<AccessorDecl>(decl))
46564655
return;
46574656

4657+
DiagnosticBehavior DiagLevel;
4658+
switch (ctx.LangOpts.RequireExplicitAvailabilityBehavior) {
4659+
case LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Ignore:
4660+
return;
4661+
case LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Warning:
4662+
DiagLevel = DiagnosticBehavior::Warning;
4663+
break;
4664+
case LangOptions::RequireExplicitAvailabilityDiagnosticBehavior::Error:
4665+
DiagLevel = DiagnosticBehavior::Error;
4666+
break;
4667+
}
4668+
46584669
// Only look at decls at module level or in extensions.
46594670
// This could be changed to force having attributes on all decls.
46604671
if (!decl->getDeclContext()->isModuleScopeContext() &&
@@ -4695,7 +4706,7 @@ void swift::checkExplicitAvailability(Decl *decl) {
46954706

46964707
if (declNeedsExplicitAvailability(decl)) {
46974708
auto diag = decl->diagnose(diag::public_decl_needs_availability);
4698-
diag.limitBehavior(*DiagLevel);
4709+
diag.limitBehavior(DiagLevel);
46994710

47004711
auto suggestPlatform = ctx.LangOpts.RequireExplicitAvailabilityTarget;
47014712
if (!suggestPlatform.empty()) {

0 commit comments

Comments
 (0)