Skip to content

Commit 19caca7

Browse files
committed
libSyntax: Root parsing context should hold a reference to the current token in the parser, NFC.
Since all parsing contexts need a reference to the current token of the parser, we should pass the token reference to the root context. Therefore, the derived sub-contexts can just copy it while being spawned.
1 parent 295c7f3 commit 19caca7

File tree

5 files changed

+15
-14
lines changed

5 files changed

+15
-14
lines changed

include/swift/Syntax/SyntaxParsingContext.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,12 @@ enum class SyntaxParsingContextKind: uint8_t {
5858
/// create syntax nodes.
5959
class SyntaxParsingContext {
6060
protected:
61-
SyntaxParsingContext(SourceFile &SF, unsigned BufferID);
61+
SyntaxParsingContext(SourceFile &SF, unsigned BufferID, Token &Tok);
6262
SyntaxParsingContext(SyntaxParsingContext &Another);
6363
public:
6464
struct ContextInfo;
6565
ContextInfo &ContextData;
66+
const Token &Tok;
6667

6768
// Add a token syntax at the given source location to the context; this
6869
// token node can be used to build more complex syntax nodes in later call
@@ -86,8 +87,8 @@ class SyntaxParsingContext {
8687
class SyntaxParsingContextRoot: public SyntaxParsingContext {
8788
SourceFile &File;
8889
public:
89-
SyntaxParsingContextRoot(SourceFile &File, unsigned BufferID):
90-
SyntaxParsingContext(File, BufferID), File(File) {}
90+
SyntaxParsingContextRoot(SourceFile &File, unsigned BufferID, Token &Tok):
91+
SyntaxParsingContext(File, BufferID, Tok), File(File) {}
9192
~SyntaxParsingContextRoot();
9293
void addTokenSyntax(SourceLoc Loc) override {};
9394
void makeNode(SyntaxKind Kind) override {};
@@ -109,10 +110,9 @@ class SyntaxParsingContextChild: public SyntaxParsingContext {
109110
SyntaxParsingContext *Parent;
110111
SyntaxParsingContext *&ContextHolder;
111112
const SyntaxContextKind Kind;
112-
Token &Tok;
113113
public:
114114
SyntaxParsingContextChild(SyntaxParsingContext *&ContextHolder,
115-
SyntaxContextKind Kind, Token &Tok);
115+
SyntaxContextKind Kind);
116116
~SyntaxParsingContextChild();
117117
void makeNode(SyntaxKind Kind) override;
118118
void addTokenSyntax(SourceLoc Loc) override;

lib/Parse/ParseDecl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2148,7 +2148,7 @@ ParserResult<Decl>
21482148
Parser::parseDecl(ParseDeclOptions Flags,
21492149
llvm::function_ref<void(Decl*)> Handler) {
21502150
SyntaxParsingContextChild DeclParsingContext(SyntaxContext,
2151-
SyntaxContextKind::Decl, Tok);
2151+
SyntaxContextKind::Decl);
21522152
if (Tok.is(tok::pound_if)) {
21532153
auto IfConfigResult = parseIfConfig(
21542154
[&](SmallVectorImpl<ASTNode> &Decls, bool IsActive) {

lib/Parse/ParseExpr.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ using namespace swift::syntax;
4141
ParserResult<Expr> Parser::parseExprImpl(Diag<> Message, bool isExprBasic) {
4242
// Start a context for creating expression syntax.
4343
SyntaxParsingContextChild ExprParsingContext(SyntaxContext,
44-
SyntaxContextKind::Expr, Tok);
44+
SyntaxContextKind::Expr);
4545

4646
// If we are parsing a refutable pattern, check to see if this is the start
4747
// of a let/var/is pattern. If so, parse it to an UnresolvedPatternExpr and
@@ -1806,7 +1806,7 @@ ParserResult<Expr> Parser::parseExprStringLiteral() {
18061806
SyntaxContext->addTokenSyntax(Tok.getLoc());
18071807
SyntaxContext->makeNode(SyntaxKind::StringLiteralExpr);
18081808
SyntaxParsingContextChild LocalContext(SyntaxContext,
1809-
SyntaxContextKind::Expr, Tok);
1809+
SyntaxContextKind::Expr);
18101810

18111811
// FIXME: Avoid creating syntax nodes for string interpolation.
18121812
LocalContext.disable();

lib/Parse/Parser.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ Parser::Parser(std::unique_ptr<Lexer> Lex, SourceFile &SF,
434434
TokReceiver(SF.shouldKeepTokens() ?
435435
new TokenRecorder(SF) :
436436
new ConsumeTokenReceiver()),
437-
SyntaxContext(new syntax::SyntaxParsingContextRoot(SF, L->getBufferID())) {
437+
SyntaxContext(new syntax::SyntaxParsingContextRoot(SF, L->getBufferID(), Tok)) {
438438

439439
State = PersistentState;
440440
if (!State) {

lib/Syntax/SyntaxParsingContext.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,13 @@ SyntaxParsingContext::ContextInfo::createFromBack(SyntaxKind Kind, unsigned N) {
180180
assert(Size - N + 1 == PendingSyntax.size());
181181
}
182182

183-
SyntaxParsingContext::SyntaxParsingContext(SourceFile &SF, unsigned BufferID):
184-
ContextData(*new ContextInfo(SF, BufferID)) {}
183+
SyntaxParsingContext::
184+
SyntaxParsingContext(SourceFile &SF, unsigned BufferID, Token &Tok):
185+
ContextData(*new ContextInfo(SF, BufferID)), Tok(Tok) {}
185186

186187
SyntaxParsingContext::SyntaxParsingContext(SyntaxParsingContext &Another):
187188
ContextData(*new ContextInfo(Another.ContextData.allTokens(),
188-
Another.ContextData.Enabled)) {}
189+
Another.ContextData.Enabled)), Tok(Another.Tok) {}
189190

190191
SyntaxParsingContext::~SyntaxParsingContext() { delete &ContextData; }
191192

@@ -240,9 +241,9 @@ SyntaxParsingContextRoot &SyntaxParsingContextChild::getRoot() {
240241

241242
SyntaxParsingContextChild::
242243
SyntaxParsingContextChild(SyntaxParsingContext *&ContextHolder,
243-
SyntaxContextKind Kind, Token &Tok):
244+
SyntaxContextKind Kind):
244245
SyntaxParsingContext(*ContextHolder), Parent(ContextHolder),
245-
ContextHolder(ContextHolder), Kind(Kind), Tok(Tok) {
246+
ContextHolder(ContextHolder), Kind(Kind) {
246247
ContextHolder = this;
247248
if (ContextData.Enabled)
248249
ContextData.setContextStart(Tok.getLoc());

0 commit comments

Comments
 (0)