Skip to content

Commit a77206c

Browse files
authored
Merge pull request #36362 from ahoppen/pr/parsedrawsyntax-cleanup
[libSyntax] Minor cleanup in ParsedRawSyntaxNode
2 parents 0fb2739 + c13cf2c commit a77206c

File tree

4 files changed

+55
-62
lines changed

4 files changed

+55
-62
lines changed

include/swift/Parse/ParsedRawSyntaxNode.h

Lines changed: 52 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ class ParsedRawSyntaxNode {
5959
ParsedRawSyntaxNode &operator=(const ParsedRawSyntaxNode &other) = delete;
6060

6161
public:
62+
// MARK: - Constructors
63+
6264
ParsedRawSyntaxNode()
6365
: Data(nullptr, DataKind::Null), Range(),
6466
SynKind(uint16_t(syntax::SyntaxKind::Unknown)),
@@ -73,17 +75,6 @@ class ParsedRawSyntaxNode {
7375
assert(getTokenKind() == TokKind && "Token kind with too large value!");
7476
}
7577

76-
#ifndef NDEBUG
77-
bool ensureDataIsNotRecorded() {
78-
if (getDataKind() != DataKind::Recorded)
79-
return true;
80-
llvm::dbgs() << "Leaking node: ";
81-
dump(llvm::dbgs());
82-
llvm::dbgs() << "\n";
83-
return false;
84-
}
85-
#endif
86-
8778
ParsedRawSyntaxNode &operator=(ParsedRawSyntaxNode &&other) {
8879
assert(ensureDataIsNotRecorded() &&
8980
"recorded data is being destroyed by assignment");
@@ -95,17 +86,36 @@ class ParsedRawSyntaxNode {
9586
other.reset();
9687
return *this;
9788
}
89+
9890
ParsedRawSyntaxNode(ParsedRawSyntaxNode &&other) : ParsedRawSyntaxNode() {
9991
*this = std::move(other);
10092
}
93+
94+
static ParsedRawSyntaxNode null() {
95+
return ParsedRawSyntaxNode{};
96+
}
97+
10198
~ParsedRawSyntaxNode() {
10299
assert(ensureDataIsNotRecorded() && "recorded data is being destructed");
103100
}
104101

102+
// MARK: - Retrieving node kind
103+
105104
/// Returns the type of this node (recorded, deferred layout, deferred token,
106105
/// null).
107106
DataKind getDataKind() const { return Data.getKind(); }
108107

108+
bool isNull() const { return getDataKind() == DataKind::Null; }
109+
bool isRecorded() const { return getDataKind() == DataKind::Recorded; }
110+
bool isDeferredLayout() const {
111+
return getDataKind() == DataKind::DeferredLayout;
112+
}
113+
bool isDeferredToken() const {
114+
return getDataKind() == DataKind::DeferredToken;
115+
}
116+
117+
// MARK: - Retrieving opaque data
118+
109119
/// Returns the opaque data of this node, assuming that it is deferred. This
110120
/// must be interpreted by the \c SyntaxParseAction, which likely also needs
111121
/// the node type (layout or token) to interpret the data.
@@ -116,19 +126,21 @@ class ParsedRawSyntaxNode {
116126
return Data.getOpaque();
117127
}
118128

119-
RecordedOrDeferredNode takeRecordedOrDeferredNode() {
120-
RecordedOrDeferredNode Data = this->Data;
129+
/// Return the opaque data of this node and reset it.
130+
OpaqueSyntaxNode takeData() {
131+
OpaqueSyntaxNode Data = this->Data.getOpaque();
121132
reset();
122133
return Data;
123134
}
124135

125-
/// Return the opaque data of this node and reset it.
126-
OpaqueSyntaxNode takeData() {
127-
OpaqueSyntaxNode Data = this->Data.getOpaque();
136+
RecordedOrDeferredNode takeRecordedOrDeferredNode() {
137+
RecordedOrDeferredNode Data = this->Data;
128138
reset();
129139
return Data;
130140
}
131141

142+
// MARK: - Retrieving additional node info
143+
132144
syntax::SyntaxKind getKind() const { return syntax::SyntaxKind(SynKind); }
133145
tok getTokenKind() const { return tok(TokKind); }
134146

@@ -138,41 +150,13 @@ class ParsedRawSyntaxNode {
138150
bool isToken(tok tokKind) const {
139151
return getTokenKind() == tokKind;
140152
}
141-
142-
bool isNull() const { return getDataKind() == DataKind::Null; }
143-
144-
bool isRecorded() const { return getDataKind() == DataKind::Recorded; }
145-
bool isDeferredLayout() const {
146-
return getDataKind() == DataKind::DeferredLayout;
147-
}
148-
bool isDeferredToken() const {
149-
return getDataKind() == DataKind::DeferredToken;
150-
}
151-
152-
/// Primary used for a deferred missing token.
153153
bool isMissing() const { return IsMissing; }
154154

155-
void reset() {
156-
Data = RecordedOrDeferredNode(nullptr, DataKind::Null);
157-
SynKind = uint16_t(syntax::SyntaxKind::Unknown);
158-
TokKind = uint16_t(tok::unknown);
159-
IsMissing = false;
160-
}
161-
162-
ParsedRawSyntaxNode unsafeCopy() const {
163-
ParsedRawSyntaxNode copy;
164-
copy.Data = Data;
165-
copy.Range = Range;
166-
copy.SynKind = SynKind;
167-
copy.TokKind = TokKind;
168-
copy.IsMissing = IsMissing;
169-
return copy;
170-
}
171-
172155
/// Returns the range of this node including leading and trailing trivia.
173156
CharSourceRange getRange() const { return Range; }
174157

175-
// Deferred Layout Data ====================================================//
158+
size_t
159+
getDeferredNumChildren(const SyntaxParsingContext *SyntaxContext) const;
176160

177161
/// If this node is a deferred layout node, return the child at index \p
178162
/// ChildIndex.
@@ -183,11 +167,17 @@ class ParsedRawSyntaxNode {
183167
getDeferredChild(size_t ChildIndex,
184168
const SyntaxParsingContext *SyntaxContext) const;
185169

186-
size_t
187-
getDeferredNumChildren(const SyntaxParsingContext *SyntaxContext) const;
170+
// MARK: - Miscellaneous
188171

189-
ParsedRawSyntaxNode copyDeferred() const {
190-
assert(isDeferredLayout() || isDeferredToken() && "node not deferred");
172+
void reset() {
173+
Data = RecordedOrDeferredNode(nullptr, DataKind::Null);
174+
SynKind = uint16_t(syntax::SyntaxKind::Unknown);
175+
TokKind = uint16_t(tok::unknown);
176+
IsMissing = false;
177+
Range = CharSourceRange();
178+
}
179+
180+
ParsedRawSyntaxNode unsafeCopy() const {
191181
ParsedRawSyntaxNode copy;
192182
copy.Data = Data;
193183
copy.Range = Range;
@@ -197,7 +187,18 @@ class ParsedRawSyntaxNode {
197187
return copy;
198188
}
199189

200-
//==========================================================================//
190+
#ifndef NDEBUG
191+
bool ensureDataIsNotRecorded() {
192+
if (getDataKind() != DataKind::Recorded)
193+
return true;
194+
llvm::dbgs() << "Leaking node: ";
195+
dump(llvm::dbgs());
196+
llvm::dbgs() << "\n";
197+
return false;
198+
}
199+
#endif
200+
201+
// MARK: - Printing
201202

202203
/// Dump this piece of syntax recursively for debugging or testing.
203204
SWIFT_DEBUG_DUMP;
@@ -206,10 +207,6 @@ class ParsedRawSyntaxNode {
206207
/// method is also able to traverse its children and dump them.
207208
void dump(raw_ostream &OS, const SyntaxParsingContext *Context = nullptr,
208209
unsigned Indent = 0) const;
209-
210-
static ParsedRawSyntaxNode null() {
211-
return ParsedRawSyntaxNode{};
212-
}
213210
};
214211

215212
} // end namespace swift

include/swift/Parse/ParsedSyntax.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,6 @@ class ParsedSyntax {
4343
return T(std::move(RawNode));
4444
}
4545

46-
ParsedSyntax copyDeferred() const {
47-
return ParsedSyntax { RawNode.copyDeferred() };
48-
}
49-
5046
static bool kindof(syntax::SyntaxKind Kind) {
5147
return true;
5248
}

lib/Parse/ParsedRawSyntaxRecorder.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,7 +231,7 @@ size_t ParsedRawSyntaxRecorder::getDeferredNumChildren(
231231
void ParsedRawSyntaxRecorder::verifyElementRanges(ArrayRef<ParsedRawSyntaxNode> elements) {
232232
SourceLoc prevEndLoc;
233233
for (const auto &elem: elements) {
234-
if (elem.isMissing() || elem.isNull())
234+
if (elem.isNull() || elem.isMissing())
235235
continue;
236236
CharSourceRange range = elem.getRange();
237237
if (range.isValid()) {

lib/Parse/ParsedSyntaxNodes.cpp.gyb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@ Parsed${node.name}::getDeferred${child.name}(const SyntaxParsingContext *SyntaxC
3131
auto RawChild = getRaw().getDeferredChild(${node.name}::Cursor::${child.name}, SyntaxContext);
3232
if (RawChild.isNull())
3333
return None;
34-
return Parsed${child.type_name} {RawChild.copyDeferred()};
34+
return Parsed${child.type_name}(std::move(RawChild));
3535
}
3636
% else:
3737
Parsed${child.type_name} Parsed${node.name}::getDeferred${child.name}(const SyntaxParsingContext *SyntaxContext) {
38-
return Parsed${child.type_name} {getRaw().getDeferredChild(${node.name}::Cursor::${child.name}, SyntaxContext).copyDeferred()};
38+
return Parsed${child.type_name} {getRaw().getDeferredChild(${node.name}::Cursor::${child.name}, SyntaxContext)};
3939
}
4040
% end
4141

0 commit comments

Comments
 (0)