blob: f201f8ae9209996a6c2644840dd0497e83c47a44 [file] [log] [blame]
//===--- ParseRequests.h - Parsing Requests ---------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2019 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 parsing requests.
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_PARSE_REQUESTS_H
#define SWIFT_PARSE_REQUESTS_H
#include "swift/AST/ASTTypeIDs.h"
#include "swift/AST/EvaluatorDependencies.h"
#include "swift/AST/SimpleRequest.h"
#include "swift/Basic/Fingerprint.h"
#include "swift/Syntax/SyntaxNodes.h"
namespace swift {
/// Report that a request of the given kind is being evaluated, so it
/// can be recorded by the stats reporter.
template<typename Request>
void reportEvaluatedRequest(UnifiedStatsReporter &stats,
const Request &request);
struct FingerprintAndMembers {
Optional<Fingerprint> fingerprint = None;
ArrayRef<Decl *> members = {};
bool operator==(const FingerprintAndMembers &x) const {
return fingerprint == x.fingerprint && members == x.members;
}
};
void simple_display(llvm::raw_ostream &out, const FingerprintAndMembers &value);
/// Parse the members of a nominal type declaration or extension.
/// Return a fingerprint and the members.
class ParseMembersRequest
: public SimpleRequest<ParseMembersRequest,
FingerprintAndMembers(IterableDeclContext *),
RequestFlags::Cached> {
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
FingerprintAndMembers evaluate(Evaluator &evaluator,
IterableDeclContext *idc) const;
public:
// Caching
bool isCached() const { return true; }
};
/// Parse the body of a function, initializer, or deinitializer.
class ParseAbstractFunctionBodyRequest :
public SimpleRequest<ParseAbstractFunctionBodyRequest,
BraceStmt *(AbstractFunctionDecl *),
RequestFlags::SeparatelyCached>
{
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
BraceStmt *evaluate(Evaluator &evaluator, AbstractFunctionDecl *afd) const;
public:
// Caching
bool isCached() const { return true; }
Optional<BraceStmt *> getCachedResult() const;
void cacheResult(BraceStmt *value) const;
};
struct SourceFileParsingResult {
ArrayRef<Decl *> TopLevelDecls;
Optional<ArrayRef<Token>> CollectedTokens;
Optional<llvm::MD5> InterfaceHash;
Optional<syntax::SourceFileSyntax> SyntaxRoot;
};
/// Parse the top-level decls of a SourceFile.
class ParseSourceFileRequest
: public SimpleRequest<
ParseSourceFileRequest, SourceFileParsingResult(SourceFile *),
RequestFlags::SeparatelyCached | RequestFlags::DependencySource> {
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
SourceFileParsingResult evaluate(Evaluator &evaluator, SourceFile *SF) const;
public:
// Caching.
bool isCached() const { return true; }
Optional<SourceFileParsingResult> getCachedResult() const;
void cacheResult(SourceFileParsingResult result) const;
public:
evaluator::DependencySource
readDependencySource(const evaluator::DependencyRecorder &) const;
};
void simple_display(llvm::raw_ostream &out,
const CodeCompletionCallbacksFactory *factory);
class CodeCompletionSecondPassRequest
: public SimpleRequest<CodeCompletionSecondPassRequest,
bool(SourceFile *, CodeCompletionCallbacksFactory *),
RequestFlags::Uncached|RequestFlags::DependencySource> {
public:
using SimpleRequest::SimpleRequest;
private:
friend SimpleRequest;
// Evaluation.
bool evaluate(Evaluator &evaluator, SourceFile *SF,
CodeCompletionCallbacksFactory *Factory) const;
public:
evaluator::DependencySource
readDependencySource(const evaluator::DependencyRecorder &) const;
};
/// The zone number for the parser.
#define SWIFT_TYPEID_ZONE Parse
#define SWIFT_TYPEID_HEADER "swift/AST/ParseTypeIDZone.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/ParseTypeIDZone.def"
#undef SWIFT_REQUEST
} // end namespace swift
#endif // SWIFT_PARSE_REQUESTS_H