Further improve AvailabilityWalker changes

Access context more quickly; document each flag’s purpose; perform a faster test before a slower one.
This commit is contained in:
Brent Royal-Gordon
2019-02-04 13:50:46 -08:00
parent cbd1c59846
commit d2d1211b51
2 changed files with 16 additions and 4 deletions

View File

@@ -2311,7 +2311,7 @@ class AvailabilityWalker : public ASTWalker {
init->isImplicit() && init->isImplicit() &&
init->getParameters()->size() == 1 && init->getParameters()->size() == 1 &&
init->getParameters()->get(0)->getArgumentName() == init->getParameters()->get(0)->getArgumentName() ==
DC->getASTContext().Id_rawValue; TC.Context.Id_rawValue;
} }
public: public:
@@ -2604,11 +2604,11 @@ AvailabilityWalker::diagAvailability(const ValueDecl *D, SourceRange R,
if (!isAccessorWithDeprecatedStorage) if (!isAccessorWithDeprecatedStorage)
TC.diagnoseIfDeprecated(R, DC, D, call); TC.diagnoseIfDeprecated(R, DC, D, call);
if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailableProtocol) if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailable))
&& isa<ProtocolDecl>(D))
return false; return false;
if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailable)) if (Flags.contains(DeclAvailabilityFlag::AllowPotentiallyUnavailableProtocol)
&& isa<ProtocolDecl>(D))
return false; return false;
// Diagnose (and possibly signal) for potential unavailability // Diagnose (and possibly signal) for potential unavailability

View File

@@ -35,9 +35,21 @@ void diagAvailability(TypeChecker &TC, const Expr *E,
DeclContext *DC); DeclContext *DC);
enum class DeclAvailabilityFlag : uint8_t { enum class DeclAvailabilityFlag : uint8_t {
/// Do not diagnose uses of protocols in versions before they were introduced.
/// Used when type-checking protocol conformances, since conforming to a
/// protocol that doesn't exist yet is allowed.
AllowPotentiallyUnavailableProtocol = 1 << 0, AllowPotentiallyUnavailableProtocol = 1 << 0,
/// Diagnose uses of declarations in versions before they were introduced, but
/// do not return true to indicate that a diagnostic was emitted.
ContinueOnPotentialUnavailability = 1 << 1, ContinueOnPotentialUnavailability = 1 << 1,
/// If a diagnostic must be emitted, use a variant indicating that the usage
/// is inout and both the getter and setter must be available.
ForInout = 1 << 2, ForInout = 1 << 2,
/// Do not diagnose uses of declarations in versions before they were
/// introduced. Used to work around availability-checker bugs.
AllowPotentiallyUnavailable = 1 << 3, AllowPotentiallyUnavailable = 1 << 3,
}; };
using DeclAvailabilityFlags = OptionSet<DeclAvailabilityFlag>; using DeclAvailabilityFlags = OptionSet<DeclAvailabilityFlag>;