Skip to content

Commit 26dc01b

Browse files
authored
Merge pull request #36274 from ahoppen/pr/range-in-parsedrawsyntaxnode
[libSyntax] Store Range of ParsedRawSyntaxNode in dedicated field
2 parents 308fb5e + 7be748d commit 26dc01b

File tree

3 files changed

+25
-53
lines changed

3 files changed

+25
-53
lines changed

include/swift/Parse/ParsedRawSyntaxNode.h

Lines changed: 20 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,9 @@ class ParsedRawSyntaxNode {
5050

5151
struct RecordedSyntaxNode {
5252
OpaqueSyntaxNode OpaqueNode;
53-
CharSourceRange Range;
5453
};
5554
struct DeferredLayoutNode {
5655
MutableArrayRef<ParsedRawSyntaxNode> Children;
57-
CharSourceRange Range;
5856
};
5957
struct DeferredTokenNode {
6058
SourceLoc TokLoc;
@@ -68,6 +66,8 @@ class ParsedRawSyntaxNode {
6866
DeferredLayoutNode DeferredLayout;
6967
DeferredTokenNode DeferredToken;
7068
};
69+
/// The range of this node, including trivia.
70+
CharSourceRange Range;
7171
uint16_t SynKind;
7272
uint16_t TokKind;
7373
DataKind DK;
@@ -76,15 +76,17 @@ class ParsedRawSyntaxNode {
7676

7777
ParsedRawSyntaxNode(syntax::SyntaxKind k, CharSourceRange r,
7878
MutableArrayRef<ParsedRawSyntaxNode> deferredNodes)
79-
: DeferredLayout({deferredNodes, r}),
80-
SynKind(uint16_t(k)), TokKind(uint16_t(tok::unknown)),
81-
DK(DataKind::DeferredLayout) {
79+
: DeferredLayout({deferredNodes}), Range(r), SynKind(uint16_t(k)),
80+
TokKind(uint16_t(tok::unknown)), DK(DataKind::DeferredLayout) {
8281
assert(getKind() == k && "Syntax kind with too large value!");
8382
}
8483

8584
ParsedRawSyntaxNode(tok tokKind, SourceLoc tokLoc, unsigned tokLength,
8685
StringRef leadingTrivia, StringRef trailingTrivia)
8786
: DeferredToken{tokLoc, tokLength, leadingTrivia, trailingTrivia},
87+
Range{tokLoc.getAdvancedLoc(-leadingTrivia.size()),
88+
(unsigned)leadingTrivia.size() + tokLength +
89+
(unsigned)trailingTrivia.size()},
8890
SynKind(uint16_t(syntax::SyntaxKind::Token)),
8991
TokKind(uint16_t(tokKind)), DK(DataKind::DeferredToken) {
9092
assert(getTokenKind() == tokKind && "Token kind is too large value!");
@@ -94,19 +96,14 @@ class ParsedRawSyntaxNode {
9496

9597
public:
9698
ParsedRawSyntaxNode()
97-
: RecordedData{},
98-
SynKind(uint16_t(syntax::SyntaxKind::Unknown)),
99-
TokKind(uint16_t(tok::unknown)),
100-
DK(DataKind::Null) {
101-
}
102-
103-
ParsedRawSyntaxNode(syntax::SyntaxKind k, tok tokKind,
104-
CharSourceRange r, OpaqueSyntaxNode n,
105-
bool IsMissing = false)
106-
: RecordedData{n, r},
107-
SynKind(uint16_t(k)), TokKind(uint16_t(tokKind)),
108-
DK(DataKind::Recorded),
109-
IsMissing(IsMissing) {
99+
: RecordedData{}, Range(), SynKind(uint16_t(syntax::SyntaxKind::Unknown)),
100+
TokKind(uint16_t(tok::unknown)), DK(DataKind::Null) {}
101+
102+
ParsedRawSyntaxNode(syntax::SyntaxKind k, tok tokKind, CharSourceRange r,
103+
OpaqueSyntaxNode n, bool IsMissing = false)
104+
: RecordedData{n}, Range(r), SynKind(uint16_t(k)),
105+
TokKind(uint16_t(tokKind)), DK(DataKind::Recorded),
106+
IsMissing(IsMissing) {
110107
assert(getKind() == k && "Syntax kind with too large value!");
111108
assert(getTokenKind() == tokKind && "Token kind with too large value!");
112109
}
@@ -138,6 +135,7 @@ class ParsedRawSyntaxNode {
138135
DeferredToken = std::move(other.DeferredToken);
139136
break;
140137
}
138+
Range = std::move(other.Range);
141139
SynKind = std::move(other.SynKind);
142140
TokKind = std::move(other.TokKind);
143141
DK = std::move(other.DK);
@@ -196,30 +194,19 @@ class ParsedRawSyntaxNode {
196194
case DataKind::Null:
197195
break;
198196
}
197+
copy.Range = Range;
199198
copy.SynKind = SynKind;
200199
copy.TokKind = TokKind;
201200
copy.DK = DK;
202201
copy.IsMissing = IsMissing;
203202
return copy;
204203
}
205204

206-
CharSourceRange getDeferredRange() const {
207-
switch (DK) {
208-
case DataKind::DeferredLayout:
209-
return getDeferredLayoutRange();
210-
case DataKind::DeferredToken:
211-
return getDeferredTokenRangeWithTrivia();
212-
default:
213-
llvm_unreachable("node not deferred");
214-
}
215-
}
205+
/// Returns the range of this node including leading and trailing trivia.
206+
CharSourceRange getRange() const { return Range; }
216207

217208
// Recorded Data ===========================================================//
218209

219-
CharSourceRange getRecordedRange() const {
220-
assert(isRecorded());
221-
return RecordedData.Range;
222-
}
223210
const OpaqueSyntaxNode &getOpaqueNode() const {
224211
assert(isRecorded());
225212
return RecordedData.OpaqueNode;
@@ -233,10 +220,6 @@ class ParsedRawSyntaxNode {
233220

234221
// Deferred Layout Data ====================================================//
235222

236-
CharSourceRange getDeferredLayoutRange() const {
237-
assert(DK == DataKind::DeferredLayout);
238-
return DeferredLayout.Range;
239-
}
240223
ArrayRef<ParsedRawSyntaxNode> getDeferredChildren() const {
241224
assert(DK == DataKind::DeferredLayout);
242225
return DeferredLayout.Children;
@@ -259,6 +242,7 @@ class ParsedRawSyntaxNode {
259242
default:
260243
llvm_unreachable("node not deferred");
261244
}
245+
copy.Range = Range;
262246
copy.SynKind = SynKind;
263247
copy.TokKind = TokKind;
264248
copy.DK = DK;
@@ -268,16 +252,6 @@ class ParsedRawSyntaxNode {
268252

269253
// Deferred Token Data =====================================================//
270254

271-
CharSourceRange getDeferredTokenRangeWithTrivia() const {
272-
assert(DK == DataKind::DeferredToken);
273-
auto leadTriviaLen = DeferredToken.LeadingTrivia.size();
274-
auto trailTriviaLen = DeferredToken.TrailingTrivia.size();
275-
276-
SourceLoc begin = DeferredToken.TokLoc.getAdvancedLoc(-leadTriviaLen);
277-
unsigned len = leadTriviaLen + DeferredToken.TokLength + trailTriviaLen;
278-
279-
return CharSourceRange{begin, len};
280-
}
281255
CharSourceRange getDeferredTokenRange() const {
282256
assert(DK == DataKind::DeferredToken);
283257
return CharSourceRange{DeferredToken.TokLoc, DeferredToken.TokLength};

lib/Parse/ParsedRawSyntaxRecorder.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,11 @@ ParsedRawSyntaxRecorder::recordRawSyntax(SyntaxKind kind,
8585
if (subnode.isNull()) {
8686
subnodes.push_back(nullptr);
8787
} else if (subnode.isRecorded()) {
88-
localRange = subnode.getRecordedRange();
88+
localRange = subnode.getRange();
8989
subnodes.push_back(subnode.takeOpaqueNode());
9090
} else {
9191
auto recorded = getRecordedNode(subnode.copyDeferred(), *this);
92-
localRange = recorded.getRecordedRange();
92+
localRange = recorded.getRange();
9393
subnodes.push_back(recorded.takeOpaqueNode());
9494
}
9595

@@ -131,7 +131,7 @@ ParsedRawSyntaxNode ParsedRawSyntaxRecorder::makeDeferred(
131131
for (auto &node : deferredNodes) {
132132
// Cached range.
133133
if (!node.isNull() && !node.isMissing()) {
134-
auto nodeRange = node.getDeferredRange();
134+
auto nodeRange = node.getRange();
135135
if (nodeRange.isValid()) {
136136
if (range.isInvalid())
137137
range = nodeRange;
@@ -185,9 +185,7 @@ void ParsedRawSyntaxRecorder::verifyElementRanges(ArrayRef<ParsedRawSyntaxNode>
185185
for (const auto &elem: elements) {
186186
if (elem.isMissing() || elem.isNull())
187187
continue;
188-
CharSourceRange range = elem.isRecorded()
189-
? elem.getRecordedRange()
190-
: elem.getDeferredRange();
188+
CharSourceRange range = elem.getRange();
191189
if (range.isValid()) {
192190
assert((prevEndLoc.isInvalid() || range.getStart() == prevEndLoc)
193191
&& "Non-contiguous child ranges?");

lib/Parse/SyntaxParsingContext.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ size_t SyntaxParsingContext::lookupNode(size_t LexerOffset, SourceLoc Loc) {
8888
return 0;
8989
}
9090
Mode = AccumulationMode::SkippedForIncrementalUpdate;
91-
auto length = foundNode.getRecordedRange().getByteLength();
91+
auto length = foundNode.getRange().getByteLength();
9292
getStorage().push_back(std::move(foundNode));
9393
return length;
9494
}

0 commit comments

Comments
 (0)