@@ -44,12 +44,14 @@ class ParsedRawSyntaxNode {
44
44
friend class ParsedRawSyntaxRecorder ;
45
45
using DataKind = RecordedOrDeferredNode::Kind;
46
46
47
- OpaqueSyntaxNode Data;
47
+ // / The opaque data of this node. Needs to be interpreted by the \c
48
+ // / SyntaxParseActions, which created it.
49
+ RecordedOrDeferredNode Data;
50
+
48
51
// / The range of this node, including trivia.
49
52
CharSourceRange Range;
50
53
uint16_t SynKind;
51
54
uint16_t TokKind;
52
- DataKind DK;
53
55
// / Primary used for capturing a deferred missing token.
54
56
bool IsMissing = false ;
55
57
@@ -58,21 +60,22 @@ class ParsedRawSyntaxNode {
58
60
59
61
public:
60
62
ParsedRawSyntaxNode ()
61
- : Data(nullptr ), Range(), SynKind(uint16_t (syntax::SyntaxKind::Unknown)),
62
- TokKind (uint16_t (tok::unknown)), DK(DataKind::Null) {}
63
+ : Data(nullptr , DataKind::Null), Range(),
64
+ SynKind (uint16_t (syntax::SyntaxKind::Unknown)),
65
+ TokKind(uint16_t (tok::unknown)) {}
63
66
64
67
ParsedRawSyntaxNode (OpaqueSyntaxNode Opaque, CharSourceRange Range,
65
68
syntax::SyntaxKind SynKind, tok TokKind, DataKind DK,
66
69
bool IsMissing)
67
- : Data(Opaque), Range(Range), SynKind(uint16_t (SynKind)),
68
- TokKind(uint16_t (TokKind)), DK(DK), IsMissing(IsMissing) {
70
+ : Data(Opaque, DK ), Range(Range), SynKind(uint16_t (SynKind)),
71
+ TokKind(uint16_t (TokKind)), IsMissing(IsMissing) {
69
72
assert (getKind () == SynKind && " Syntax kind with too large value!" );
70
73
assert (getTokenKind () == TokKind && " Token kind with too large value!" );
71
74
}
72
75
73
76
#ifndef NDEBUG
74
77
bool ensureDataIsNotRecorded () {
75
- if (DK != DataKind::Recorded)
78
+ if (getDataKind () != DataKind::Recorded)
76
79
return true ;
77
80
llvm::dbgs () << " Leaking node: " ;
78
81
dump (llvm::dbgs ());
@@ -88,7 +91,6 @@ class ParsedRawSyntaxNode {
88
91
Range = std::move (other.Range );
89
92
SynKind = std::move (other.SynKind );
90
93
TokKind = std::move (other.TokKind );
91
- DK = std::move (other.DK );
92
94
IsMissing = std::move (other.IsMissing );
93
95
other.reset ();
94
96
return *this ;
@@ -102,12 +104,14 @@ class ParsedRawSyntaxNode {
102
104
103
105
// / Returns the type of this node (recorded, deferred layout, deferred token,
104
106
// / null).
105
- DataKind getDataKind () const { return DK ; }
107
+ DataKind getDataKind () const { return Data. getKind () ; }
106
108
107
109
// / Returns the opaque data of this node. This must be interpreted by the
108
110
// / \c SyntaxParseAction, which likely also needs the node type to know
109
111
// / what type of node the data represents.
110
- OpaqueSyntaxNode getData () const { return Data; }
112
+ OpaqueSyntaxNode getData () const { return Data.getOpaque (); }
113
+
114
+ RecordedOrDeferredNode getRecordedOrDeferredNode () const { return Data; }
111
115
112
116
// / Return the opaque data of this node and reset it.
113
117
OpaqueSyntaxNode takeData () {
@@ -126,22 +130,23 @@ class ParsedRawSyntaxNode {
126
130
return getTokenKind () == tokKind;
127
131
}
128
132
129
- bool isNull () const {
130
- return DK == DataKind::Null;
131
- }
133
+ bool isNull () const { return getDataKind () == DataKind::Null; }
132
134
133
- bool isRecorded () const { return DK == DataKind::Recorded; }
134
- bool isDeferredLayout () const { return DK == DataKind::DeferredLayout; }
135
- bool isDeferredToken () const { return DK == DataKind::DeferredToken; }
135
+ bool isRecorded () const { return getDataKind () == DataKind::Recorded; }
136
+ bool isDeferredLayout () const {
137
+ return getDataKind () == DataKind::DeferredLayout;
138
+ }
139
+ bool isDeferredToken () const {
140
+ return getDataKind () == DataKind::DeferredToken;
141
+ }
136
142
137
143
// / Primary used for a deferred missing token.
138
144
bool isMissing () const { return IsMissing; }
139
145
140
146
void reset () {
141
- Data = nullptr ;
147
+ Data = RecordedOrDeferredNode ( nullptr , DataKind::Null) ;
142
148
SynKind = uint16_t (syntax::SyntaxKind::Unknown);
143
149
TokKind = uint16_t (tok::unknown);
144
- DK = DataKind::Null;
145
150
IsMissing = false ;
146
151
}
147
152
@@ -151,7 +156,6 @@ class ParsedRawSyntaxNode {
151
156
copy.Range = Range;
152
157
copy.SynKind = SynKind;
153
158
copy.TokKind = TokKind;
154
- copy.DK = DK;
155
159
copy.IsMissing = IsMissing;
156
160
return copy;
157
161
}
@@ -161,13 +165,13 @@ class ParsedRawSyntaxNode {
161
165
162
166
// Recorded Data ===========================================================//
163
167
164
- const OpaqueSyntaxNode & getOpaqueNode () const {
168
+ OpaqueSyntaxNode getOpaqueNode () const {
165
169
assert (isRecorded ());
166
- return Data;
170
+ return Data. getOpaque () ;
167
171
}
168
172
OpaqueSyntaxNode takeOpaqueNode () {
169
173
assert (isRecorded ());
170
- auto opaque = Data;
174
+ auto opaque = Data. getOpaque () ;
171
175
reset ();
172
176
return opaque;
173
177
}
@@ -184,14 +188,12 @@ class ParsedRawSyntaxNode {
184
188
const SyntaxParsingContext *SyntaxContext) const ;
185
189
186
190
ParsedRawSyntaxNode copyDeferred () const {
187
- assert (DK == DataKind::DeferredLayout ||
188
- DK == DataKind::DeferredToken && " node not deferred" );
191
+ assert (isDeferredLayout () || isDeferredToken () && " node not deferred" );
189
192
ParsedRawSyntaxNode copy;
190
193
copy.Data = Data;
191
194
copy.Range = Range;
192
195
copy.SynKind = SynKind;
193
196
copy.TokKind = TokKind;
194
- copy.DK = DK;
195
197
copy.IsMissing = IsMissing;
196
198
return copy;
197
199
}
0 commit comments