@@ -24,6 +24,17 @@ namespace swift {
24
24
25
25
typedef const void *OpaqueSyntaxNode;
26
26
class SyntaxParsingContext ;
27
+ class ParsedRawSyntaxNode ;
28
+
29
+ struct DeferredLayoutNode {
30
+ MutableArrayRef<ParsedRawSyntaxNode> Children;
31
+ };
32
+ struct DeferredTokenNode {
33
+ SourceLoc TokLoc;
34
+ unsigned TokLength;
35
+ StringRef LeadingTrivia;
36
+ StringRef TrailingTrivia;
37
+ };
27
38
28
39
// / Represents a raw syntax node formed by the parser.
29
40
// /
@@ -48,24 +59,7 @@ class ParsedRawSyntaxNode {
48
59
DeferredToken,
49
60
};
50
61
51
- struct RecordedSyntaxNode {
52
- OpaqueSyntaxNode OpaqueNode;
53
- };
54
- struct DeferredLayoutNode {
55
- MutableArrayRef<ParsedRawSyntaxNode> Children;
56
- };
57
- struct DeferredTokenNode {
58
- SourceLoc TokLoc;
59
- unsigned TokLength;
60
- StringRef LeadingTrivia;
61
- StringRef TrailingTrivia;
62
- };
63
-
64
- union {
65
- RecordedSyntaxNode RecordedData;
66
- DeferredLayoutNode DeferredLayout;
67
- DeferredTokenNode DeferredToken;
68
- };
62
+ OpaqueSyntaxNode Data;
69
63
// / The range of this node, including trivia.
70
64
CharSourceRange Range;
71
65
uint16_t SynKind;
@@ -74,38 +68,43 @@ class ParsedRawSyntaxNode {
74
68
// / Primary used for capturing a deferred missing token.
75
69
bool IsMissing = false ;
76
70
77
- ParsedRawSyntaxNode (syntax::SyntaxKind k, CharSourceRange r,
78
- MutableArrayRef<ParsedRawSyntaxNode> deferredNodes)
79
- : DeferredLayout({deferredNodes}), Range(r), SynKind(uint16_t (k)),
80
- TokKind (uint16_t (tok::unknown)), DK(DataKind::DeferredLayout) {
81
- assert (getKind () == k && " Syntax kind with too large value!" );
82
- }
83
-
84
- ParsedRawSyntaxNode (tok tokKind, SourceLoc tokLoc, unsigned tokLength,
85
- StringRef leadingTrivia, StringRef trailingTrivia)
86
- : DeferredToken{tokLoc, tokLength, leadingTrivia, trailingTrivia},
87
- Range{tokLoc.getAdvancedLoc (-leadingTrivia.size ()),
88
- (unsigned )leadingTrivia.size () + tokLength +
89
- (unsigned )trailingTrivia.size ()},
90
- SynKind (uint16_t (syntax::SyntaxKind::Token)),
91
- TokKind (uint16_t (tokKind)), DK(DataKind::DeferredToken) {
92
- assert (getTokenKind () == tokKind && " Token kind is too large value!" );
93
- }
94
71
ParsedRawSyntaxNode (const ParsedRawSyntaxNode &other) = delete ;
95
72
ParsedRawSyntaxNode &operator =(const ParsedRawSyntaxNode &other) = delete ;
96
73
97
74
public:
98
75
ParsedRawSyntaxNode ()
99
- : RecordedData{} , Range(), SynKind(uint16_t (syntax::SyntaxKind::Unknown)),
76
+ : Data( nullptr ) , Range(), SynKind(uint16_t (syntax::SyntaxKind::Unknown)),
100
77
TokKind (uint16_t (tok::unknown)), DK(DataKind::Null) {}
101
78
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) {
107
- assert (getKind () == k && " Syntax kind with too large value!" );
108
- assert (getTokenKind () == tokKind && " Token kind with too large value!" );
79
+ ParsedRawSyntaxNode (OpaqueSyntaxNode Opaque, CharSourceRange Range,
80
+ syntax::SyntaxKind SynKind, tok TokKind, DataKind DK,
81
+ bool IsMissing)
82
+ : Data(Opaque), Range(Range), SynKind(uint16_t (SynKind)),
83
+ TokKind(uint16_t (TokKind)), DK(DK), IsMissing(IsMissing) {
84
+ assert (getKind () == SynKind && " Syntax kind with too large value!" );
85
+ assert (getTokenKind () == TokKind && " Token kind with too large value!" );
86
+ assert (DK == DataKind::Recorded);
87
+ }
88
+
89
+ ParsedRawSyntaxNode (const DeferredLayoutNode *Layout, CharSourceRange Range,
90
+ syntax::SyntaxKind SynKind, tok TokKind, DataKind DK,
91
+ bool IsMissing)
92
+ : Data(Layout), Range(Range), SynKind(uint16_t (SynKind)),
93
+ TokKind(uint16_t (TokKind)), DK(DK), IsMissing(IsMissing) {
94
+ assert (getKind () == SynKind && " Syntax kind with too large value!" );
95
+ assert (getTokenKind () == TokKind && " Token kind with too large value!" );
96
+ assert (DK == DataKind::DeferredLayout);
97
+ }
98
+
99
+ ParsedRawSyntaxNode (const DeferredTokenNode *Token, CharSourceRange Range,
100
+ syntax::SyntaxKind SynKind, tok TokKind, DataKind DK,
101
+ bool IsMissing)
102
+ : Data(Token), Range(Range), SynKind(uint16_t (SynKind)),
103
+ TokKind(uint16_t (TokKind)), DK(DK), IsMissing(IsMissing) {
104
+ assert (getKind () == SynKind && " Syntax kind with too large value!" );
105
+ assert (getTokenKind () == TokKind && " Token kind with too large value!" );
106
+ assert (getKind () == syntax::SyntaxKind::Token);
107
+ assert (DK == DataKind::DeferredToken);
109
108
}
110
109
111
110
#ifndef NDEBUG
@@ -122,19 +121,7 @@ class ParsedRawSyntaxNode {
122
121
ParsedRawSyntaxNode &operator =(ParsedRawSyntaxNode &&other) {
123
122
assert (ensureDataIsNotRecorded () &&
124
123
" recorded data is being destroyed by assignment" );
125
- switch (other.DK ) {
126
- case DataKind::Null:
127
- break ;
128
- case DataKind::Recorded:
129
- RecordedData = std::move (other.RecordedData );
130
- break ;
131
- case DataKind::DeferredLayout:
132
- DeferredLayout = std::move (other.DeferredLayout );
133
- break ;
134
- case DataKind::DeferredToken:
135
- DeferredToken = std::move (other.DeferredToken );
136
- break ;
137
- }
124
+ Data = std::move (other.Data );
138
125
Range = std::move (other.Range );
139
126
SynKind = std::move (other.SynKind );
140
127
TokKind = std::move (other.TokKind );
@@ -172,7 +159,7 @@ class ParsedRawSyntaxNode {
172
159
bool isMissing () const { return IsMissing; }
173
160
174
161
void reset () {
175
- RecordedData = {} ;
162
+ Data = nullptr ;
176
163
SynKind = uint16_t (syntax::SyntaxKind::Unknown);
177
164
TokKind = uint16_t (tok::unknown);
178
165
DK = DataKind::Null;
@@ -181,19 +168,7 @@ class ParsedRawSyntaxNode {
181
168
182
169
ParsedRawSyntaxNode unsafeCopy () const {
183
170
ParsedRawSyntaxNode copy;
184
- switch (DK) {
185
- case DataKind::DeferredLayout:
186
- copy.DeferredLayout = DeferredLayout;
187
- break ;
188
- case DataKind::DeferredToken:
189
- copy.DeferredToken = DeferredToken;
190
- break ;
191
- case DataKind::Recorded:
192
- copy.RecordedData = RecordedData;
193
- break ;
194
- case DataKind::Null:
195
- break ;
196
- }
171
+ copy.Data = Data;
197
172
copy.Range = Range;
198
173
copy.SynKind = SynKind;
199
174
copy.TokKind = TokKind;
@@ -209,11 +184,11 @@ class ParsedRawSyntaxNode {
209
184
210
185
const OpaqueSyntaxNode &getOpaqueNode () const {
211
186
assert (isRecorded ());
212
- return RecordedData. OpaqueNode ;
187
+ return Data ;
213
188
}
214
189
OpaqueSyntaxNode takeOpaqueNode () {
215
190
assert (isRecorded ());
216
- auto opaque = RecordedData. OpaqueNode ;
191
+ auto opaque = Data ;
217
192
reset ();
218
193
return opaque;
219
194
}
@@ -222,26 +197,19 @@ class ParsedRawSyntaxNode {
222
197
223
198
ArrayRef<ParsedRawSyntaxNode> getDeferredChildren () const {
224
199
assert (DK == DataKind::DeferredLayout);
225
- return DeferredLayout. Children ;
200
+ return static_cast < const DeferredLayoutNode *>(Data)-> Children ;
226
201
}
227
202
228
203
MutableArrayRef<ParsedRawSyntaxNode> getDeferredChildren () {
229
204
assert (DK == DataKind::DeferredLayout);
230
- return DeferredLayout. Children ;
205
+ return static_cast < const DeferredLayoutNode *>(Data)-> Children ;
231
206
}
232
207
233
208
ParsedRawSyntaxNode copyDeferred () const {
209
+ assert (DK == DataKind::DeferredLayout ||
210
+ DK == DataKind::DeferredToken && " node not deferred" );
234
211
ParsedRawSyntaxNode copy;
235
- switch (DK) {
236
- case DataKind::DeferredLayout:
237
- copy.DeferredLayout = DeferredLayout;
238
- break ;
239
- case DataKind::DeferredToken:
240
- copy.DeferredToken = DeferredToken;
241
- break ;
242
- default :
243
- llvm_unreachable (" node not deferred" );
244
- }
212
+ copy.Data = Data;
245
213
copy.Range = Range;
246
214
copy.SynKind = SynKind;
247
215
copy.TokKind = TokKind;
@@ -254,15 +222,18 @@ class ParsedRawSyntaxNode {
254
222
255
223
CharSourceRange getDeferredTokenRange () const {
256
224
assert (DK == DataKind::DeferredToken);
257
- return CharSourceRange{DeferredToken.TokLoc , DeferredToken.TokLength };
225
+ auto DeferredToken = static_cast <const DeferredTokenNode *>(Data);
226
+ return CharSourceRange{DeferredToken->TokLoc , DeferredToken->TokLength };
258
227
}
259
228
StringRef getDeferredLeadingTrivia () const {
260
229
assert (DK == DataKind::DeferredToken);
261
- return DeferredToken.LeadingTrivia ;
230
+ auto DeferredToken = static_cast <const DeferredTokenNode *>(Data);
231
+ return DeferredToken->LeadingTrivia ;
262
232
}
263
233
StringRef getDeferredTrailingTrivia () const {
264
234
assert (DK == DataKind::DeferredToken);
265
- return DeferredToken.TrailingTrivia ;
235
+ auto DeferredToken = static_cast <const DeferredTokenNode *>(Data);
236
+ return DeferredToken->TrailingTrivia ;
266
237
}
267
238
268
239
// ==========================================================================//
0 commit comments