Skip to content

Commit 08ad703

Browse files
committed
[Lexer] Push trivia piece lexing down to SyntaxParsingContext
This is again a transitional state before SyntaxParsingContext hands the responsibility over to SyntaxTreeCreator and from there to SyntaxParseActions.
1 parent a7641a7 commit 08ad703

File tree

5 files changed

+32
-47
lines changed

5 files changed

+32
-47
lines changed

Diff for: include/swift/Parse/SyntaxParsingContext.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,7 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
264264
void addRawSyntax(ParsedRawSyntaxNode Raw);
265265

266266
/// Add Token with Trivia to the parts.
267-
void addToken(Token &Tok, const ParsedTrivia &LeadingTrivia,
268-
const ParsedTrivia &TrailingTrivia);
267+
void addToken(Token &Tok, StringRef LeadingTrivia, StringRef TrailingTrivia);
269268

270269
/// Add Syntax to the parts.
271270
void addSyntax(ParsedSyntax Node);

Diff for: lib/Parse/ParseDecl.cpp

+1-3
Original file line numberDiff line numberDiff line change
@@ -210,9 +210,7 @@ void Parser::parseTopLevel(SmallVectorImpl<Decl *> &decls) {
210210
}
211211

212212
// Finalize the syntax context.
213-
auto LeadingTriviaPieces = TriviaLexer::lexTrivia(LeadingTrivia);
214-
auto TrailingTriviaPieces = TriviaLexer::lexTrivia(TrailingTrivia);
215-
SyntaxContext->addToken(Tok, LeadingTriviaPieces, TrailingTriviaPieces);
213+
SyntaxContext->addToken(Tok, LeadingTrivia, TrailingTrivia);
216214
}
217215

218216
bool Parser::parseTopLevelSIL() {

Diff for: lib/Parse/ParseExpr.cpp

+14-27
Original file line numberDiff line numberDiff line change
@@ -1730,7 +1730,6 @@ parseStringSegments(SmallVectorImpl<Lexer::StringSegment> &Segments,
17301730
unsigned &InterpolationCount) {
17311731
SourceLoc Loc = EntireTok.getLoc();
17321732
ParserStatus Status;
1733-
ParsedTrivia EmptyTrivia;
17341733
bool First = true;
17351734

17361735
DeclNameRef appendLiteral(
@@ -1785,7 +1784,7 @@ parseStringSegments(SmallVectorImpl<Lexer::StringSegment> &Segments,
17851784
// such token to the context.
17861785
Token content(tok::string_segment,
17871786
CharSourceRange(Segment.Loc, Segment.Length).str());
1788-
SyntaxContext->addToken(content, EmptyTrivia, EmptyTrivia);
1787+
SyntaxContext->addToken(content, StringRef(), StringRef());
17891788
break;
17901789
}
17911790

@@ -1799,14 +1798,14 @@ parseStringSegments(SmallVectorImpl<Lexer::StringSegment> &Segments,
17991798
// Backslash is part of an expression segment.
18001799
SourceLoc BackSlashLoc = Segment.Loc.getAdvancedLoc(-1 - DelimiterLen);
18011800
Token BackSlash(tok::backslash, CharSourceRange(BackSlashLoc, 1).str());
1802-
ExprContext.addToken(BackSlash, EmptyTrivia, EmptyTrivia);
1801+
ExprContext.addToken(BackSlash, StringRef(), StringRef());
18031802

18041803
// Custom delimiter may be a part of an expression segment.
18051804
if (HasCustomDelimiter) {
18061805
SourceLoc DelimiterLoc = Segment.Loc.getAdvancedLoc(-DelimiterLen);
18071806
Token Delimiter(tok::raw_string_delimiter,
18081807
CharSourceRange(DelimiterLoc, DelimiterLen).str());
1809-
ExprContext.addToken(Delimiter, EmptyTrivia, EmptyTrivia);
1808+
ExprContext.addToken(Delimiter, StringRef(), StringRef());
18101809
}
18111810

18121811
// Create a temporary lexer that lexes from the body of the string.
@@ -1909,20 +1908,17 @@ ParserResult<Expr> Parser::parseExprStringLiteral() {
19091908
// Make unknown tokens to represent the open and close quote.
19101909
Token OpenQuote(QuoteKind, OpenQuoteStr);
19111910
Token CloseQuote(QuoteKind, CloseQuoteStr);
1912-
ParsedTrivia EmptyTrivia;
19131911
StringRef EntireTrailingTrivia = TrailingTrivia;
19141912

19151913
if (HasCustomDelimiter) {
1916-
auto LeadingTriviaPieces = TriviaLexer::lexTrivia(LeadingTrivia);
19171914
Token OpenDelimiter(tok::raw_string_delimiter, OpenDelimiterStr);
19181915
// When a custom delimiter is present, it owns the leading trivia.
1919-
SyntaxContext->addToken(OpenDelimiter, LeadingTriviaPieces, EmptyTrivia);
1916+
SyntaxContext->addToken(OpenDelimiter, LeadingTrivia, StringRef());
19201917

1921-
SyntaxContext->addToken(OpenQuote, EmptyTrivia, EmptyTrivia);
1918+
SyntaxContext->addToken(OpenQuote, StringRef(), StringRef());
19221919
} else {
1923-
auto LeadingTriviaPieces = TriviaLexer::lexTrivia(LeadingTrivia);
19241920
// Without custom delimiter the quote owns trailing trivia.
1925-
SyntaxContext->addToken(OpenQuote, LeadingTriviaPieces, EmptyTrivia);
1921+
SyntaxContext->addToken(OpenQuote, LeadingTrivia, StringRef());
19261922
}
19271923

19281924
// The simple case: just a single literal segment.
@@ -1943,24 +1939,19 @@ ParserResult<Expr> Parser::parseExprStringLiteral() {
19431939
auto Segment = Segments.front();
19441940
Token content(tok::string_segment,
19451941
CharSourceRange(Segment.Loc, Segment.Length).str());
1946-
SyntaxContext->addToken(content, EmptyTrivia, EmptyTrivia);
1942+
SyntaxContext->addToken(content, StringRef(), StringRef());
19471943
}
19481944

19491945
if (HasCustomDelimiter) {
1950-
SyntaxContext->addToken(CloseQuote, EmptyTrivia, EmptyTrivia);
1946+
SyntaxContext->addToken(CloseQuote, StringRef(), StringRef());
19511947

19521948
Token CloseDelimiter(tok::raw_string_delimiter, CloseDelimiterStr);
19531949
// When a custom delimiter is present it owns the trailing trivia.
1954-
auto EntireTrailingTriviaPieces =
1955-
TriviaLexer::lexTrivia(EntireTrailingTrivia);
1956-
SyntaxContext->addToken(CloseDelimiter, EmptyTrivia,
1957-
EntireTrailingTriviaPieces);
1950+
SyntaxContext->addToken(CloseDelimiter, StringRef(),
1951+
EntireTrailingTrivia);
19581952
} else {
19591953
// Without custom delimiter the quote owns trailing trivia.
1960-
auto EntireTrailingTriviaPieces =
1961-
TriviaLexer::lexTrivia(EntireTrailingTrivia);
1962-
SyntaxContext->addToken(CloseQuote, EmptyTrivia,
1963-
EntireTrailingTriviaPieces);
1954+
SyntaxContext->addToken(CloseQuote, StringRef(), EntireTrailingTrivia);
19641955
}
19651956

19661957
return makeParserResult(
@@ -2019,20 +2010,16 @@ ParserResult<Expr> Parser::parseExprStringLiteral() {
20192010
}
20202011

20212012
if (HasCustomDelimiter) {
2022-
SyntaxContext->addToken(CloseQuote, EmptyTrivia, EmptyTrivia);
2013+
SyntaxContext->addToken(CloseQuote, StringRef(), StringRef());
20232014

20242015
Token CloseDelimiter(tok::raw_string_delimiter, CloseDelimiterStr);
20252016
// When a custom delimiter is present it owns the trailing trivia.
2026-
auto EntireTrailingTriviaPieces =
2027-
TriviaLexer::lexTrivia(EntireTrailingTrivia);
2028-
SyntaxContext->addToken(CloseDelimiter, EmptyTrivia,
2029-
EntireTrailingTriviaPieces);
2017+
SyntaxContext->addToken(CloseDelimiter, StringRef(), EntireTrailingTrivia);
20302018
} else {
20312019
// Without custom delimiter the quote owns trailing trivia.
20322020
auto EntireTrailingTriviaPieces =
20332021
TriviaLexer::lexTrivia(EntireTrailingTrivia);
2034-
SyntaxContext->addToken(CloseQuote, EmptyTrivia,
2035-
EntireTrailingTriviaPieces);
2022+
SyntaxContext->addToken(CloseQuote, StringRef(), EntireTrailingTrivia);
20362023
}
20372024

20382025
if (AppendingExpr->getBody()->getNumElements() == 1) {

Diff for: lib/Parse/Parser.cpp

+2-6
Original file line numberDiff line numberDiff line change
@@ -606,9 +606,7 @@ void Parser::consumeExtraToken(Token Extra) {
606606

607607
SourceLoc Parser::consumeToken() {
608608
TokReceiver->receive(Tok);
609-
auto LeadingTriviaPieces = TriviaLexer::lexTrivia(LeadingTrivia);
610-
auto TrailingTriviaPieces = TriviaLexer::lexTrivia(TrailingTrivia);
611-
SyntaxContext->addToken(Tok, LeadingTriviaPieces, TrailingTriviaPieces);
609+
SyntaxContext->addToken(Tok, LeadingTrivia, TrailingTrivia);
612610
return consumeTokenWithoutFeedingReceiver();
613611
}
614612

@@ -643,9 +641,7 @@ SourceLoc Parser::consumeStartingCharacterOfCurrentToken(tok Kind, size_t Len) {
643641
void Parser::markSplitToken(tok Kind, StringRef Txt) {
644642
SplitTokens.emplace_back();
645643
SplitTokens.back().setToken(Kind, Txt);
646-
ParsedTrivia EmptyTrivia;
647-
auto LeadingTriviaPieces = TriviaLexer::lexTrivia(LeadingTrivia);
648-
SyntaxContext->addToken(SplitTokens.back(), LeadingTriviaPieces, EmptyTrivia);
644+
SyntaxContext->addToken(SplitTokens.back(), LeadingTrivia, StringRef());
649645
TokReceiver->receive(SplitTokens.back());
650646
}
651647

Diff for: lib/Parse/SyntaxParsingContext.cpp

+14-9
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@
1818
#include "swift/AST/Module.h"
1919
#include "swift/AST/SourceFile.h"
2020
#include "swift/Basic/Defer.h"
21-
#include "swift/Parse/ParsedSyntax.h"
21+
#include "swift/Parse/Lexer.h"
2222
#include "swift/Parse/ParsedRawSyntaxRecorder.h"
23+
#include "swift/Parse/ParsedSyntax.h"
2324
#include "swift/Parse/ParsedSyntaxRecorder.h"
2425
#include "swift/Parse/SyntaxParseActions.h"
2526
#include "swift/Parse/SyntaxParsingCache.h"
@@ -203,18 +204,22 @@ ParsedTokenSyntax SyntaxParsingContext::popToken() {
203204
}
204205

205206
/// Add Token with Trivia to the parts.
206-
void SyntaxParsingContext::addToken(Token &Tok,
207-
const ParsedTrivia &LeadingTrivia,
208-
const ParsedTrivia &TrailingTrivia) {
207+
void SyntaxParsingContext::addToken(Token &Tok, StringRef LeadingTrivia,
208+
StringRef TrailingTrivia) {
209209
if (!Enabled)
210210
return;
211211

212+
auto LeadingTriviaPieces = TriviaLexer::lexTrivia(LeadingTrivia);
213+
auto TrailingTriviaPieces = TriviaLexer::lexTrivia(TrailingTrivia);
214+
212215
ParsedRawSyntaxNode raw;
213-
if (shouldDefer())
214-
raw = ParsedRawSyntaxNode::makeDeferred(Tok, LeadingTrivia, TrailingTrivia,
215-
*this);
216-
else
217-
raw = getRecorder().recordToken(Tok, LeadingTrivia, TrailingTrivia);
216+
if (shouldDefer()) {
217+
raw = ParsedRawSyntaxNode::makeDeferred(Tok, LeadingTriviaPieces,
218+
TrailingTriviaPieces, *this);
219+
} else {
220+
raw = getRecorder().recordToken(Tok, LeadingTriviaPieces,
221+
TrailingTriviaPieces);
222+
}
218223
addRawSyntax(std::move(raw));
219224
}
220225

0 commit comments

Comments
 (0)