Skip to content

Commit a137e0d

Browse files
committed
[libSyntax] Omit unknown nodes if they do not have any children
1 parent 2fbb875 commit a137e0d

File tree

3 files changed

+22
-17
lines changed

3 files changed

+22
-17
lines changed

include/swift/Syntax/SyntaxKind.h.gyb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,11 +71,11 @@ bool isTokenKind(SyntaxKind Kind);
7171

7272
bool isUnknownKind(SyntaxKind Kind);
7373

74-
bool shallBeOmittedWhenNoChildren(SyntaxKind Kind);
75-
7674
SyntaxKind getUnknownKind(SyntaxKind Kind);
7775
} // end namespace syntax
7876

77+
bool parserShallOmitWhenNoChildren(syntax::SyntaxKind Kind);
78+
7979
namespace json {
8080

8181
/// Serialization traits for SyntaxKind.

lib/Parse/SyntaxParsingContext.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ RC<RawSyntax> SyntaxParsingContext::bridgeAs(SyntaxContextKind Kind,
113113
break;
114114
}
115115
return RawNode;
116+
} else if (Parts.empty()) {
117+
// Just omit the unknown node if it does not have any children
118+
return nullptr;
116119
} else {
117120
SyntaxKind UnknownKind;
118121
switch (Kind) {
@@ -171,7 +174,7 @@ void SyntaxParsingContext::addSyntax(Syntax Node) {
171174

172175
void SyntaxParsingContext::createNodeInPlace(SyntaxKind Kind, size_t N) {
173176
if (N == 0) {
174-
if (!shallBeOmittedWhenNoChildren(Kind))
177+
if (!parserShallOmitWhenNoChildren(Kind))
175178
Storage.push_back(createSyntaxAs(Kind, {}));
176179
return;
177180
}
@@ -387,7 +390,9 @@ SyntaxParsingContext::~SyntaxParsingContext() {
387390
case AccumulationMode::CoerceKind: {
388391
assert(!isRoot());
389392
if (Storage.size() == Offset) {
390-
Storage.push_back(bridgeAs(CtxtKind, {}));
393+
if (auto BridgedNode = bridgeAs(CtxtKind, {})) {
394+
Storage.push_back(BridgedNode);
395+
}
391396
} else {
392397
auto I = Storage.begin() + Offset;
393398
*I = bridgeAs(CtxtKind, getParts());

lib/Syntax/SyntaxKind.cpp.gyb

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ StringRef getTokenText(tok kind) {
4444
return text;
4545
}
4646

47+
bool parserShallOmitWhenNoChildren(syntax::SyntaxKind Kind) {
48+
switch(Kind) {
49+
% for node in SYNTAX_NODES:
50+
% if node.shall_be_omitted_when_empty():
51+
case syntax::SyntaxKind::${node.syntax_kind}:
52+
% end
53+
% end
54+
return true;
55+
default:
56+
return false;
57+
}
58+
}
59+
4760
namespace syntax {
4861

4962
void dumpSyntaxKind(llvm::raw_ostream &os, const SyntaxKind kind) {
@@ -109,19 +122,6 @@ bool isUnknownKind(SyntaxKind Kind) {
109122
Kind == SyntaxKind::UnknownPattern;
110123
}
111124

112-
bool shallBeOmittedWhenNoChildren(SyntaxKind Kind) {
113-
switch(Kind) {
114-
% for node in SYNTAX_NODES:
115-
% if node.shall_be_omitted_when_empty():
116-
case SyntaxKind::${node.syntax_kind}:
117-
% end
118-
% end
119-
return true;
120-
default:
121-
return false;
122-
}
123-
}
124-
125125
SyntaxKind getUnknownKind(SyntaxKind Kind) {
126126
if (isExprKind(Kind))
127127
return SyntaxKind::UnknownExpr;

0 commit comments

Comments
 (0)