Skip to content

Commit bf6aff9

Browse files
committed
[libSyntax] Allow retrieval of a null child from deferred ParsedRawSyntaxNodes
1 parent e6da01b commit bf6aff9

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

include/swift/Parse/SyntaxParseActions.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,13 @@ class RecordedOrDeferredNode {
6767
/// \c getDeferredChild to maintain a clean dependency relationship of
6868
/// \c ParsedRawSyntaxNode being on a higher level than \c SyntaxParseActions.
6969
struct DeferredNodeInfo {
70-
OpaqueSyntaxNode Data;
70+
RecordedOrDeferredNode Data;
7171
syntax::SyntaxKind SyntaxKind;
7272
tok TokenKind;
7373
bool IsMissing;
7474
CharSourceRange Range;
7575

76-
DeferredNodeInfo(OpaqueSyntaxNode Data, syntax::SyntaxKind SyntaxKind,
76+
DeferredNodeInfo(RecordedOrDeferredNode Data, syntax::SyntaxKind SyntaxKind,
7777
tok TokenKind, bool IsMissing, CharSourceRange Range)
7878
: Data(Data), SyntaxKind(SyntaxKind), TokenKind(TokenKind),
7979
IsMissing(IsMissing), Range(Range) {}

lib/Parse/ParsedRawSyntaxRecorder.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -214,14 +214,11 @@ ParsedRawSyntaxRecorder::getDeferredChild(const ParsedRawSyntaxNode &parent,
214214
size_t childIndex) const {
215215
assert(parent.isDeferredLayout());
216216
auto childInfo = SPActions->getDeferredChild(
217-
parent.getUnsafeDeferredOpaqueData(),
218-
childIndex, parent.getRange().getStart());
219-
return ParsedRawSyntaxNode(childInfo.Data, childInfo.Range,
217+
parent.getUnsafeDeferredOpaqueData(), childIndex,
218+
parent.getRange().getStart());
219+
return ParsedRawSyntaxNode(childInfo.Data.getOpaque(), childInfo.Range,
220220
childInfo.SyntaxKind, childInfo.TokenKind,
221-
childInfo.SyntaxKind == syntax::SyntaxKind::Token
222-
? RecordedOrDeferredNode::Kind::DeferredToken
223-
: RecordedOrDeferredNode::Kind::DeferredLayout,
224-
childInfo.IsMissing);
221+
childInfo.Data.getKind(), childInfo.IsMissing);
225222
}
226223

227224
size_t ParsedRawSyntaxRecorder::getDeferredNumChildren(

lib/Parse/SyntaxParseActions.cpp

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -147,21 +147,28 @@ DeferredNodeInfo SyntaxParseActions::getDeferredChild(OpaqueSyntaxNode node,
147147
auto Child = Data->Children[ChildIndex];
148148
switch (Child.getKind()) {
149149
case RecordedOrDeferredNode::Kind::Null:
150-
llvm_unreachable("A child node should not be Null");
150+
return DeferredNodeInfo(
151+
RecordedOrDeferredNode(nullptr, RecordedOrDeferredNode::Kind::Null),
152+
syntax::SyntaxKind::Unknown, tok::NUM_TOKENS,
153+
/*IsMissing=*/false, CharSourceRange());
151154
case RecordedOrDeferredNode::Kind::Recorded:
152155
llvm_unreachable("Children of deferred nodes must also be deferred");
153156
break;
154157
case RecordedOrDeferredNode::Kind::DeferredLayout: {
155158
auto ChildData = static_cast<const DeferredLayoutNode *>(Child.getOpaque());
156-
return DeferredNodeInfo(ChildData, ChildData->Kind, tok::NUM_TOKENS,
157-
/*IsMissing=*/false,
158-
CharSourceRange(StartLoc, ChildData->Length));
159+
return DeferredNodeInfo(
160+
RecordedOrDeferredNode(ChildData,
161+
RecordedOrDeferredNode::Kind::DeferredLayout),
162+
ChildData->Kind, tok::NUM_TOKENS,
163+
/*IsMissing=*/false, CharSourceRange(StartLoc, ChildData->Length));
159164
}
160165
case RecordedOrDeferredNode::Kind::DeferredToken: {
161166
auto ChildData = static_cast<const DeferredTokenNode *>(Child.getOpaque());
162-
return DeferredNodeInfo(ChildData, syntax::SyntaxKind::Token,
163-
ChildData->TokenKind, ChildData->IsMissing,
164-
ChildData->Range);
167+
return DeferredNodeInfo(
168+
RecordedOrDeferredNode(ChildData,
169+
RecordedOrDeferredNode::Kind::DeferredToken),
170+
syntax::SyntaxKind::Token, ChildData->TokenKind, ChildData->IsMissing,
171+
ChildData->Range);
165172
}
166173
}
167174
}

0 commit comments

Comments
 (0)