Files
swift-mirror/include/swift/SyntaxParse/SyntaxTreeCreator.h
Alex Hoppen 3adefd375c [Lexer] Push trivia piece lexing down to SyntaxParseActions
The SyntaxParseActions can decide how to handle the raw trivia, either
lex them into pieces or store them raw to be lexed when needed.
2021-02-05 08:15:54 +01:00

78 lines
2.5 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"
namespace swift {
class RawSyntaxTokenCache;
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 cache of nodes that can be reused when creating the current syntax
/// tree.
SyntaxParsingCache *SyntaxCache;
/// Tokens nodes that have already been created and may be reused in other
/// parts of the syntax tree.
std::unique_ptr<RawSyntaxTokenCache> TokenCache;
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,
CharSourceRange range) override;
void discardRecordedNode(OpaqueSyntaxNode node) override;
std::pair<size_t, OpaqueSyntaxNode>
lookupNode(size_t lexerOffset, syntax::SyntaxKind kind) override;
};
} // end namespace swift
#endif