Skip to content

Commit 7be748d

Browse files
committed
[libSyntax] Store Range of ParsedRawSyntaxNode in dedicated field
Essentially all ParsedRawSyntaxNode types have a range associated with them, so let's just store it in a dedicated field with a common getter. Additionally, this cleans up the recorded storage to just contain an OpaqueSyntaxNode. When deferred nodes are being handled by SyntaxParseActions, we can use this OpaqueNode storage to store either recorded or deferred node data, which is left to be interpreted by the SyntaxParseAction.
1 parent ffaf867 commit 7be748d

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)