Skip to content

Commit c8acecd

Browse files
committed
[libSyntax] Store DataKind and OpaqueSyntaxNode in ParsedRawSyntaxNode as RecordedOrDeferredNode
This is mostly a clean-up commit. ParsedRawSyntaxNode stores an OpaqueSyntaxNode and its DataKind so it might as well use a RecordedOrDeferredNode.
1 parent efb91f7 commit c8acecd

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

include/swift/Parse/ParsedRawSyntaxNode.h

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,14 @@ class ParsedRawSyntaxNode {
4444
friend class ParsedRawSyntaxRecorder;
4545
using DataKind = RecordedOrDeferredNode::Kind;
4646

47-
OpaqueSyntaxNode Data;
47+
/// The opaque data of this node. Needs to be interpreted by the \c
48+
/// SyntaxParseActions, which created it.
49+
RecordedOrDeferredNode Data;
50+
4851
/// The range of this node, including trivia.
4952
CharSourceRange Range;
5053
uint16_t SynKind;
5154
uint16_t TokKind;
52-
DataKind DK;
5355
/// Primary used for capturing a deferred missing token.
5456
bool IsMissing = false;
5557

@@ -58,21 +60,22 @@ class ParsedRawSyntaxNode {
5860

5961
public:
6062
ParsedRawSyntaxNode()
61-
: Data(nullptr), Range(), SynKind(uint16_t(syntax::SyntaxKind::Unknown)),
62-
TokKind(uint16_t(tok::unknown)), DK(DataKind::Null) {}
63+
: Data(nullptr, DataKind::Null), Range(),
64+
SynKind(uint16_t(syntax::SyntaxKind::Unknown)),
65+
TokKind(uint16_t(tok::unknown)) {}
6366

6467
ParsedRawSyntaxNode(OpaqueSyntaxNode Opaque, CharSourceRange Range,
6568
syntax::SyntaxKind SynKind, tok TokKind, DataKind DK,
6669
bool IsMissing)
67-
: Data(Opaque), Range(Range), SynKind(uint16_t(SynKind)),
68-
TokKind(uint16_t(TokKind)), DK(DK), IsMissing(IsMissing) {
70+
: Data(Opaque, DK), Range(Range), SynKind(uint16_t(SynKind)),
71+
TokKind(uint16_t(TokKind)), IsMissing(IsMissing) {
6972
assert(getKind() == SynKind && "Syntax kind with too large value!");
7073
assert(getTokenKind() == TokKind && "Token kind with too large value!");
7174
}
7275

7376
#ifndef NDEBUG
7477
bool ensureDataIsNotRecorded() {
75-
if (DK != DataKind::Recorded)
78+
if (getDataKind() != DataKind::Recorded)
7679
return true;
7780
llvm::dbgs() << "Leaking node: ";
7881
dump(llvm::dbgs());
@@ -88,7 +91,6 @@ class ParsedRawSyntaxNode {
8891
Range = std::move(other.Range);
8992
SynKind = std::move(other.SynKind);
9093
TokKind = std::move(other.TokKind);
91-
DK = std::move(other.DK);
9294
IsMissing = std::move(other.IsMissing);
9395
other.reset();
9496
return *this;
@@ -102,12 +104,14 @@ class ParsedRawSyntaxNode {
102104

103105
/// Returns the type of this node (recorded, deferred layout, deferred token,
104106
/// null).
105-
DataKind getDataKind() const { return DK; }
107+
DataKind getDataKind() const { return Data.getKind(); }
106108

107109
/// Returns the opaque data of this node. This must be interpreted by the
108110
/// \c SyntaxParseAction, which likely also needs the node type to know
109111
/// what type of node the data represents.
110-
OpaqueSyntaxNode getData() const { return Data; }
112+
OpaqueSyntaxNode getData() const { return Data.getOpaque(); }
113+
114+
RecordedOrDeferredNode getRecordedOrDeferredNode() const { return Data; }
111115

112116
/// Return the opaque data of this node and reset it.
113117
OpaqueSyntaxNode takeData() {
@@ -126,22 +130,23 @@ class ParsedRawSyntaxNode {
126130
return getTokenKind() == tokKind;
127131
}
128132

129-
bool isNull() const {
130-
return DK == DataKind::Null;
131-
}
133+
bool isNull() const { return getDataKind() == DataKind::Null; }
132134

133-
bool isRecorded() const { return DK == DataKind::Recorded; }
134-
bool isDeferredLayout() const { return DK == DataKind::DeferredLayout; }
135-
bool isDeferredToken() const { return DK == DataKind::DeferredToken; }
135+
bool isRecorded() const { return getDataKind() == DataKind::Recorded; }
136+
bool isDeferredLayout() const {
137+
return getDataKind() == DataKind::DeferredLayout;
138+
}
139+
bool isDeferredToken() const {
140+
return getDataKind() == DataKind::DeferredToken;
141+
}
136142

137143
/// Primary used for a deferred missing token.
138144
bool isMissing() const { return IsMissing; }
139145

140146
void reset() {
141-
Data = nullptr;
147+
Data = RecordedOrDeferredNode(nullptr, DataKind::Null);
142148
SynKind = uint16_t(syntax::SyntaxKind::Unknown);
143149
TokKind = uint16_t(tok::unknown);
144-
DK = DataKind::Null;
145150
IsMissing = false;
146151
}
147152

@@ -151,7 +156,6 @@ class ParsedRawSyntaxNode {
151156
copy.Range = Range;
152157
copy.SynKind = SynKind;
153158
copy.TokKind = TokKind;
154-
copy.DK = DK;
155159
copy.IsMissing = IsMissing;
156160
return copy;
157161
}
@@ -161,13 +165,13 @@ class ParsedRawSyntaxNode {
161165

162166
// Recorded Data ===========================================================//
163167

164-
const OpaqueSyntaxNode &getOpaqueNode() const {
168+
OpaqueSyntaxNode getOpaqueNode() const {
165169
assert(isRecorded());
166-
return Data;
170+
return Data.getOpaque();
167171
}
168172
OpaqueSyntaxNode takeOpaqueNode() {
169173
assert(isRecorded());
170-
auto opaque = Data;
174+
auto opaque = Data.getOpaque();
171175
reset();
172176
return opaque;
173177
}
@@ -184,14 +188,12 @@ class ParsedRawSyntaxNode {
184188
const SyntaxParsingContext *SyntaxContext) const;
185189

186190
ParsedRawSyntaxNode copyDeferred() const {
187-
assert(DK == DataKind::DeferredLayout ||
188-
DK == DataKind::DeferredToken && "node not deferred");
191+
assert(isDeferredLayout() || isDeferredToken() && "node not deferred");
189192
ParsedRawSyntaxNode copy;
190193
copy.Data = Data;
191194
copy.Range = Range;
192195
copy.SynKind = SynKind;
193196
copy.TokKind = TokKind;
194-
copy.DK = DK;
195197
copy.IsMissing = IsMissing;
196198
return copy;
197199
}

lib/Parse/ParsedRawSyntaxNode.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void ParsedRawSyntaxNode::dump(llvm::raw_ostream &OS, unsigned Indent) const {
3333
OS << ' ';
3434
OS << '(';
3535

36-
switch (DK) {
36+
switch (getDataKind()) {
3737
case DataKind::Null:
3838
OS << "<NULL>";
3939
break;

lib/Parse/ParsedRawSyntaxRecorder.cpp

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -142,8 +142,9 @@ ParsedRawSyntaxNode ParsedRawSyntaxRecorder::makeDeferred(
142142
RecordedOrDeferredNode *newPtr =
143143
ctx.getScratchAlloc().Allocate<RecordedOrDeferredNode>(
144144
deferredNodes.size());
145-
auto ptr = newPtr;
146-
for (auto &node : deferredNodes) {
145+
auto children = llvm::makeMutableArrayRef(newPtr, deferredNodes.size());
146+
for (size_t i = 0; i < deferredNodes.size(); ++i) {
147+
auto &node = deferredNodes[i];
147148
assert(!node.isRecorded() &&
148149
"Cannot create a deferred layout node that has recorded children");
149150
// Cached range.
@@ -157,11 +158,8 @@ ParsedRawSyntaxNode ParsedRawSyntaxRecorder::makeDeferred(
157158
}
158159
}
159160

160-
auto kind = node.getDataKind();
161-
new (ptr) RecordedOrDeferredNode(node.takeData(), kind);
162-
ptr++;
161+
children[i] = node.getRecordedOrDeferredNode();
163162
}
164-
auto children = llvm::makeMutableArrayRef(newPtr, deferredNodes.size());
165163
auto data = SPActions->makeDeferredLayout(k, /*IsMissing=*/false, children);
166164
return ParsedRawSyntaxNode(data, range, k, tok::NUM_TOKENS,
167165
ParsedRawSyntaxNode::DataKind::DeferredLayout,

0 commit comments

Comments
 (0)