Files
swift-mirror/include/swift/SyntaxParse/SyntaxTreeCreator.h
Alex Hoppen efb91f70a1 [libSyntax] Handle deferred node data in SyntaxParseActions
By now ParsedRawSyntaxNode does not have any knowledge about deferred
node data anymore, which frees up SyntaxParseActions (and, in
particular its sublass SyntaxTreeCreator) to perform optimisations to
more efficiently create and record deferred nodes.
2021-03-09 14:26:08 +01:00

78 lines
2.6 KiB
C++

//===--- SyntaxTreeCreator.h - Syntax Tree Creation ------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 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
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SYNTAX_PARSE_SYNTAXTREECREATOR_H
#define SWIFT_SYNTAX_PARSE_SYNTAXTREECREATOR_H
#include "swift/Parse/SyntaxParseActions.h"
#include "swift/Syntax/References.h"
#include "llvm/ADT/StringRef.h"
namespace swift {
class SourceManager;
class SyntaxParsingCache;
class SourceFile;
namespace syntax {
class SyntaxArena;
class SourceFileSyntax;
}
/// Receives the parsed syntax info from the parser and constructs a persistent
/// syntax tree by converting the data into \c RawSyntax objects, allocated from
/// a \c SyntaxArena.
///
/// It also handles caching re-usable RawSyntax objects and skipping parsed
/// nodes via consulting a \c SyntaxParsingCache.
class SyntaxTreeCreator: public SyntaxParseActions {
SourceManager &SM;
unsigned BufferID;
RC<syntax::SyntaxArena> Arena;
/// A string allocated in \c Arena that contains an exact copy of the source
/// file for which this \c SyntaxTreeCreator creates a syntax tree. \c
/// RawSyntax nodes can safely reference text inside this buffer since they
/// retain the \c SyntaxArena which holds the buffer.
StringRef ArenaSourceBuffer;
/// A cache of nodes that can be reused when creating the current syntax
/// tree.
SyntaxParsingCache *SyntaxCache;
public:
SyntaxTreeCreator(SourceManager &SM, unsigned bufferID,
SyntaxParsingCache *syntaxCache,
RC<syntax::SyntaxArena> arena);
~SyntaxTreeCreator();
Optional<syntax::SourceFileSyntax>
realizeSyntaxRoot(OpaqueSyntaxNode root, const SourceFile &SF) override;
private:
OpaqueSyntaxNode recordToken(tok tokenKind, StringRef leadingTrivia,
StringRef trailingTrivia,
CharSourceRange range) override;
OpaqueSyntaxNode recordMissingToken(tok tokenKind, SourceLoc loc) override;
OpaqueSyntaxNode
recordRawSyntax(syntax::SyntaxKind kind,
ArrayRef<OpaqueSyntaxNode> elements) override;
std::pair<size_t, OpaqueSyntaxNode>
lookupNode(size_t lexerOffset, syntax::SyntaxKind kind) override;
};
} // end namespace swift
#endif