blob: 931f14c766814790bb9c43ac5e5825ade0b92135 [file] [log] [blame]
//===--- AccessRequests.h - Access{Level,Scope} Requests -----*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
//
// This file defines access-control requests.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_ACCESS_REQUESTS_H
#define SWIFT_ACCESS_REQUESTS_H
#include "swift/AST/AccessScope.h"
#include "swift/AST/AttrKind.h"
#include "swift/AST/Evaluator.h"
#include "swift/AST/SimpleRequest.h"
#include "swift/Basic/Statistic.h"
#include "llvm/ADT/Hashing.h"
namespace swift {
class AbstractStorageDecl;
class ExtensionDecl;
class ValueDecl;
/// Request the AccessLevel of the given ValueDecl.
class AccessLevelRequest :
public SimpleRequest<AccessLevelRequest,
AccessLevel(ValueDecl *),
RequestFlags::SeparatelyCached> {
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
AccessLevel evaluate(Evaluator &evaluator, ValueDecl *decl) const;
public:
// Separate caching.
bool isCached() const { return true; }
Optional<AccessLevel> getCachedResult() const;
void cacheResult(AccessLevel value) const;
};
/// Request the setter AccessLevel of the given AbstractStorageDecl,
/// which may be lower than its normal AccessLevel, and determines
/// the accessibility of mutating accessors.
class SetterAccessLevelRequest :
public SimpleRequest<SetterAccessLevelRequest,
AccessLevel(AbstractStorageDecl *),
RequestFlags::SeparatelyCached> {
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
AccessLevel evaluate(Evaluator &evaluator, AbstractStorageDecl *decl) const;
public:
// Separate caching.
bool isCached() const { return true; }
Optional<AccessLevel> getCachedResult() const;
void cacheResult(AccessLevel value) const;
};
using DefaultAndMax = std::pair<AccessLevel, AccessLevel>;
/// Request the Default and Max AccessLevels of the given ExtensionDecl.
class DefaultAndMaxAccessLevelRequest :
public SimpleRequest<DefaultAndMaxAccessLevelRequest,
DefaultAndMax(ExtensionDecl *),
RequestFlags::SeparatelyCached> {
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
DefaultAndMax evaluate(Evaluator &evaluator, ExtensionDecl *decl) const;
public:
// Separate caching.
bool isCached() const { return true; }
Optional<DefaultAndMax> getCachedResult() const;
void cacheResult(DefaultAndMax value) const;
};
#define SWIFT_TYPEID_ZONE AccessControl
#define SWIFT_TYPEID_HEADER "swift/AST/AccessTypeIDZone.def"
#include "swift/Basic/DefineTypeIDZone.h"
#undef SWIFT_TYPEID_ZONE
#undef SWIFT_TYPEID_HEADER
// Set up reporting of evaluated requests.
#define SWIFT_REQUEST(Zone, RequestType, Sig, Caching, LocOptions) \
template <> \
inline void reportEvaluatedRequest(UnifiedStatsReporter &stats, \
const RequestType &request) { \
++stats.getFrontendCounters().RequestType; \
}
#include "swift/AST/AccessTypeIDZone.def"
#undef SWIFT_REQUEST
} // end namespace swift
#endif // SWIFT_ACCESS_REQUESTS_H