14
14
#define SWIFT_PARSE_PARSEDRAWSYNTAXNODE_H
15
15
16
16
#include " swift/Basic/SourceLoc.h"
17
+ #include " swift/Parse/ParsedTrivia.h"
17
18
#include " swift/Parse/Token.h"
18
19
#include " swift/Syntax/SyntaxKind.h"
19
- #include " swift/Syntax/Trivia.h"
20
20
#include < vector>
21
21
22
22
namespace swift {
23
23
24
24
typedef void *OpaqueSyntaxNode;
25
+ class SyntaxParsingContext ;
25
26
26
27
// / Represents a raw syntax node formed by the parser.
27
28
// /
@@ -50,12 +51,14 @@ class ParsedRawSyntaxNode {
50
51
CharSourceRange Range;
51
52
};
52
53
struct DeferredLayoutNode {
53
- std::vector <ParsedRawSyntaxNode> Children;
54
+ ArrayRef <ParsedRawSyntaxNode> Children;
54
55
};
55
56
struct DeferredTokenNode {
56
- Token Tok;
57
- syntax::Trivia LeadingTrivia;
58
- syntax::Trivia TrailingTrivia;
57
+ const ParsedTriviaPiece *TriviaPieces;
58
+ SourceLoc TokLoc;
59
+ unsigned TokLength;
60
+ uint16_t NumLeadingTrivia;
61
+ uint16_t NumTrailingTrivia;
59
62
};
60
63
61
64
union {
@@ -77,16 +80,22 @@ class ParsedRawSyntaxNode {
77
80
assert (getKind () == k && " Syntax kind with too large value!" );
78
81
}
79
82
80
- ParsedRawSyntaxNode (Token tok,
81
- syntax::Trivia leadingTrivia,
82
- syntax::Trivia trailingTrivia)
83
- : DeferredToken{std::move (tok),
84
- std::move (leadingTrivia),
85
- std::move (trailingTrivia)},
83
+ ParsedRawSyntaxNode (tok tokKind, SourceLoc tokLoc, unsigned tokLength,
84
+ const ParsedTriviaPiece *triviaPieces,
85
+ unsigned numLeadingTrivia,
86
+ unsigned numTrailingTrivia)
87
+ : DeferredToken{triviaPieces,
88
+ tokLoc, tokLength,
89
+ uint16_t (numLeadingTrivia),
90
+ uint16_t (numTrailingTrivia)},
86
91
SynKind (uint16_t (syntax::SyntaxKind::Token)),
87
- TokKind (uint16_t (tok.getKind() )),
92
+ TokKind (uint16_t (tokKind )),
88
93
DK (DataKind::DeferredToken) {
89
- assert (getTokenKind () == tok.getKind () && " Token kind is too large value!" );
94
+ assert (getTokenKind () == tokKind && " Token kind is too large value!" );
95
+ assert (DeferredToken.NumLeadingTrivia == numLeadingTrivia &&
96
+ " numLeadingTrivia is too large value!" );
97
+ assert (DeferredToken.NumTrailingTrivia == numTrailingTrivia &&
98
+ " numLeadingTrivia is too large value!" );
90
99
}
91
100
92
101
public:
@@ -106,63 +115,6 @@ class ParsedRawSyntaxNode {
106
115
assert (getTokenKind () == tokKind && " Token kind with too large value!" );
107
116
}
108
117
109
- ParsedRawSyntaxNode (const ParsedRawSyntaxNode &other) {
110
- switch (other.DK ) {
111
- case DataKind::Null:
112
- break ;
113
- case DataKind::Recorded:
114
- new (&this ->RecordedData )RecordedSyntaxNode (other.RecordedData );
115
- break ;
116
- case DataKind::DeferredLayout:
117
- new (&this ->DeferredLayout )DeferredLayoutNode (other.DeferredLayout );
118
- break ;
119
- case DataKind::DeferredToken:
120
- new (&this ->DeferredToken )DeferredTokenNode (other.DeferredToken );
121
- break ;
122
- }
123
- this ->SynKind = other.SynKind ;
124
- this ->TokKind = other.TokKind ;
125
- this ->DK = other.DK ;
126
- }
127
-
128
- ParsedRawSyntaxNode (ParsedRawSyntaxNode &&other) {
129
- switch (other.DK ) {
130
- case DataKind::Null:
131
- break ;
132
- case DataKind::Recorded:
133
- new (&this ->RecordedData )RecordedSyntaxNode (
134
- std::move (other.RecordedData ));
135
- break ;
136
- case DataKind::DeferredLayout:
137
- new (&this ->DeferredLayout )DeferredLayoutNode (
138
- std::move (other.DeferredLayout ));
139
- break ;
140
- case DataKind::DeferredToken:
141
- new (&this ->DeferredToken )DeferredTokenNode (
142
- std::move (other.DeferredToken ));
143
- break ;
144
- }
145
- this ->SynKind = other.SynKind ;
146
- this ->TokKind = other.TokKind ;
147
- this ->DK = other.DK ;
148
- }
149
-
150
- ~ParsedRawSyntaxNode () {
151
- releaseMemory ();
152
- }
153
-
154
- ParsedRawSyntaxNode &operator =(const ParsedRawSyntaxNode &other) {
155
- releaseMemory ();
156
- new (this )ParsedRawSyntaxNode (other);
157
- return *this ;
158
- }
159
-
160
- ParsedRawSyntaxNode &operator =(ParsedRawSyntaxNode &&other) {
161
- releaseMemory ();
162
- new (this )ParsedRawSyntaxNode (std::move (other));
163
- return *this ;
164
- }
165
-
166
118
syntax::SyntaxKind getKind () const { return syntax::SyntaxKind (SynKind); }
167
119
tok getTokenKind () const { return tok (TokKind); }
168
120
@@ -201,44 +153,44 @@ class ParsedRawSyntaxNode {
201
153
assert (DK == DataKind::DeferredLayout);
202
154
return DeferredLayout.Children ;
203
155
}
204
- void addDeferredChild (ParsedRawSyntaxNode subnode) {
205
- assert (DK == DataKind::DeferredLayout);
206
- DeferredLayout.Children .push_back (std::move (subnode));
207
- }
208
156
209
157
// Deferred Token Data =====================================================//
210
158
211
- const Token & getToken () const {
159
+ CharSourceRange getDeferredTokenRangeWithoutBackticks () const {
212
160
assert (DK == DataKind::DeferredToken);
213
- return DeferredToken.Tok ;
161
+ return CharSourceRange{ DeferredToken.TokLoc , DeferredToken. TokLength } ;
214
162
}
215
- const syntax::Trivia & getLeadingTrivia () const {
163
+ ArrayRef<ParsedTriviaPiece> getDeferredLeadingTriviaPieces () const {
216
164
assert (DK == DataKind::DeferredToken);
217
- return DeferredToken.LeadingTrivia ;
165
+ return ArrayRef<ParsedTriviaPiece>(DeferredToken.TriviaPieces ,
166
+ DeferredToken.NumLeadingTrivia );
218
167
}
219
- const syntax::Trivia & getTrailingTrivia () const {
168
+ ArrayRef<ParsedTriviaPiece> getDeferredTrailingTriviaPieces () const {
220
169
assert (DK == DataKind::DeferredToken);
221
- return DeferredToken.TrailingTrivia ;
170
+ return ArrayRef<ParsedTriviaPiece>(
171
+ DeferredToken.TriviaPieces + DeferredToken.NumLeadingTrivia ,
172
+ DeferredToken.NumTrailingTrivia );
222
173
}
223
174
224
175
// ==========================================================================//
225
176
226
177
// / Form a deferred syntax layout node.
227
178
static ParsedRawSyntaxNode makeDeferred (syntax::SyntaxKind k,
228
- ArrayRef<ParsedRawSyntaxNode> deferredNodes) {
229
- return ParsedRawSyntaxNode{k, deferredNodes};
230
- }
179
+ ArrayRef<ParsedRawSyntaxNode> deferredNodes,
180
+ SyntaxParsingContext &ctx);
231
181
232
182
// / Form a deferred token node.
233
183
static ParsedRawSyntaxNode makeDeferred (Token tok,
234
- syntax::Trivia leadingTrivia,
235
- syntax::Trivia trailingTrivia) {
236
- return ParsedRawSyntaxNode{std::move (tok), std::move (leadingTrivia),
237
- std::move (trailingTrivia)};
238
- }
184
+ const ParsedTrivia &leadingTrivia,
185
+ const ParsedTrivia &trailingTrivia,
186
+ SyntaxParsingContext &ctx);
239
187
240
188
// / Form a deferred missing token node.
241
- static ParsedRawSyntaxNode makeDeferredMissing (tok tokKind, SourceLoc loc);
189
+ static ParsedRawSyntaxNode makeDeferredMissing (tok tokKind, SourceLoc loc) {
190
+ auto raw = ParsedRawSyntaxNode (tokKind, loc, 0 , nullptr , 0 , 0 );
191
+ raw.IsMissing = true ;
192
+ return raw;
193
+ }
242
194
243
195
// / Dump this piece of syntax recursively for debugging or testing.
244
196
LLVM_ATTRIBUTE_DEPRECATED (
@@ -251,20 +203,6 @@ class ParsedRawSyntaxNode {
251
203
static ParsedRawSyntaxNode null () {
252
204
return ParsedRawSyntaxNode{};
253
205
}
254
-
255
- private:
256
- void releaseMemory () {
257
- switch (DK) {
258
- case DataKind::Null:
259
- break ;
260
- case DataKind::Recorded:
261
- RecordedData.~RecordedSyntaxNode (); break ;
262
- case DataKind::DeferredLayout:
263
- DeferredLayout.~DeferredLayoutNode (); break ;
264
- case DataKind::DeferredToken:
265
- DeferredToken.~DeferredTokenNode (); break ;
266
- }
267
- }
268
206
};
269
207
270
208
} // end namespace swift
0 commit comments