15
15
16
16
#include " llvm/ADT/PointerUnion.h"
17
17
#include " swift/Basic/SourceLoc.h"
18
+ #include " swift/Parse/HiddenLibSyntaxAction.h"
19
+ #include " swift/Parse/LibSyntaxGenerator.h"
18
20
#include " swift/Parse/ParsedRawSyntaxNode.h"
19
21
#include " swift/Parse/ParsedRawSyntaxRecorder.h"
22
+ #include " swift/Parse/ParsedSyntaxNodes.h"
20
23
21
24
namespace swift {
22
25
@@ -74,6 +77,7 @@ constexpr size_t SyntaxAlignInBits = 3;
74
77
// / // Now the context holds { '(' Expr ')' }.
75
78
// / // From these parts, it creates ParenExpr node and add it to the parent.
76
79
// / }
80
+ // todo [gsoc]: remove when/if possible
77
81
class alignas (1 << SyntaxAlignInBits) SyntaxParsingContext {
78
82
public:
79
83
// / The shared data for all syntax parsing contexts with the same root.
@@ -94,13 +98,15 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
94
98
95
99
ParsedRawSyntaxRecorder Recorder;
96
100
101
+ LibSyntaxGenerator LibSyntaxCreator;
102
+
97
103
llvm::BumpPtrAllocator ScratchAlloc;
98
104
99
105
RootContextData (SourceFile &SF, DiagnosticEngine &Diags,
100
106
SourceManager &SourceMgr, unsigned BufferID,
101
- std::shared_ptr<SyntaxParseActions> spActions )
107
+ const std::shared_ptr<HiddenLibSyntaxAction>& TwoActions )
102
108
: SF (SF), Diags (Diags), SourceMgr (SourceMgr), BufferID (BufferID),
103
- Recorder (std::move (spActions) ) {}
109
+ Recorder (TwoActions), LibSyntaxCreator (TwoActions ) {}
104
110
};
105
111
106
112
private:
@@ -162,9 +168,6 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
162
168
// / true if it's in backtracking context.
163
169
bool IsBacktracking = false ;
164
170
165
- // If false, context does nothing.
166
- bool Enabled;
167
-
168
171
// / Create a syntax node using the tail \c N elements of collected parts and
169
172
// / replace those parts with the single result.
170
173
void createNodeInPlace (SyntaxKind Kind, size_t N,
@@ -182,18 +185,19 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
182
185
Optional<ParsedRawSyntaxNode> bridgeAs (SyntaxContextKind Kind,
183
186
ArrayRef<ParsedRawSyntaxNode> Parts);
184
187
188
+ ParsedRawSyntaxNode finalizeSourceFile ();
189
+
185
190
public:
186
191
// / Construct root context.
187
192
SyntaxParsingContext (SyntaxParsingContext *&CtxtHolder, SourceFile &SF,
188
193
unsigned BufferID,
189
- std::shared_ptr<SyntaxParseActions > SPActions);
194
+ std::shared_ptr<HiddenLibSyntaxAction > SPActions);
190
195
191
196
// / Designated constructor for child context.
192
197
SyntaxParsingContext (SyntaxParsingContext *&CtxtHolder)
193
198
: RootDataOrParent (CtxtHolder), CtxtHolder (CtxtHolder),
194
199
RootData (CtxtHolder->RootData ), Offset (RootData->Storage .size ()),
195
- IsBacktracking (CtxtHolder->IsBacktracking ),
196
- Enabled (CtxtHolder->isEnabled ()) {
200
+ IsBacktracking (CtxtHolder->IsBacktracking ) {
197
201
assert (CtxtHolder->isTopOfContextStack () &&
198
202
" SyntaxParsingContext cannot have multiple children" );
199
203
assert (CtxtHolder->Mode != AccumulationMode::SkippedForIncrementalUpdate &&
@@ -221,8 +225,6 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
221
225
// / offset. If nothing is found \c 0 is returned.
222
226
size_t lookupNode (size_t LexerOffset, SourceLoc Loc);
223
227
224
- void disable () { Enabled = false ; }
225
- bool isEnabled () const { return Enabled; }
226
228
bool isRoot () const { return RootDataOrParent.is <RootContextData*>(); }
227
229
bool isTopOfContextStack () const { return this == CtxtHolder; }
228
230
@@ -240,6 +242,10 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
240
242
return getRootData ()->Storage ;
241
243
}
242
244
245
+ LibSyntaxGenerator &getSyntaxCreator () {
246
+ return getRootData ()->LibSyntaxCreator ;
247
+ }
248
+
243
249
const SyntaxParsingContext *getRoot () const ;
244
250
245
251
ParsedRawSyntaxRecorder &getRecorder () { return getRootData ()->Recorder ; }
@@ -258,6 +264,21 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
258
264
// / Add Syntax to the parts.
259
265
void addSyntax (ParsedSyntax Node);
260
266
267
+ template <SyntaxKind Kind>
268
+ bool isTopNode () {
269
+ return getStorage ().back ().getKind () == Kind;
270
+ }
271
+
272
+ // / Returns the topmost Syntax node.
273
+ template <typename SyntaxNode> SyntaxNode topNode () {
274
+ ParsedRawSyntaxNode TopNode = getStorage ().back ();
275
+
276
+ if (IsBacktracking)
277
+ return getSyntaxCreator ().createNode <SyntaxNode>(TopNode);
278
+
279
+ OpaqueSyntaxNode OpaqueNode = TopNode.getOpaqueNode ();
280
+ return getSyntaxCreator ().getLibSyntaxNodeFor <SyntaxNode>(OpaqueNode);
281
+ }
261
282
262
283
template <typename SyntaxNode>
263
284
llvm::Optional<SyntaxNode> popIf () {
@@ -300,6 +321,11 @@ class alignas(1 << SyntaxAlignInBits) SyntaxParsingContext {
300
321
SynKind = Kind;
301
322
}
302
323
324
+ // / On destruction, do not attempt to finalize the root node.
325
+ void setDiscard () {
326
+ Mode = AccumulationMode::Discard;
327
+ }
328
+
303
329
// / On destruction, if the parts size is 1 and it's kind of \c Kind, just
304
330
// / append it to the parent context. Otherwise, create Unknown{Kind} node from
305
331
// / the collected parts.
0 commit comments