@@ -87,119 +87,9 @@ Trivia lexTrivia(StringRef TriviaStr) {
87
87
return SyntaxTrivia;
88
88
}
89
89
90
- // / If the \p Str is not allocated in \p Arena, copy it to \p Arena and adjust
91
- // / \p Str to point to the string's copy in \p Arena.
92
- void copyToArenaIfNecessary (StringRef &Str, const RC<SyntaxArena> &Arena) {
93
- if (Str.empty ()) {
94
- // Empty strings can live wherever they want. Nothing to do.
95
- return ;
96
- }
97
- if (Arena->containsPointer (Str.data ())) {
98
- // String already in arena. Nothing to do.
99
- return ;
100
- }
101
- // Copy string to arena
102
- char *Data = (char *)Arena->Allocate (Str.size (), alignof (char *));
103
- std::uninitialized_copy (Str.begin (), Str.end (), Data);
104
- Str = StringRef (Data, Str.size ());
105
- }
106
-
107
90
// FIXME: If we want thread-safety for tree creation, this needs to be atomic.
108
91
unsigned RawSyntax::NextFreeNodeId = 1 ;
109
92
110
- RawSyntax::RawSyntax (SyntaxKind Kind, ArrayRef<const RawSyntax *> Layout,
111
- size_t TextLength, SourcePresence Presence,
112
- const RC<SyntaxArena> &Arena,
113
- llvm::Optional<unsigned > NodeId)
114
- : Arena(Arena.get()),
115
- Bits({{unsigned (TextLength), unsigned (Presence), false }}) {
116
- assert (Arena && " RawSyntax nodes must always be allocated in an arena" );
117
- assert (Kind != SyntaxKind::Token &&
118
- " 'token' syntax node must be constructed with dedicated constructor" );
119
-
120
- size_t TotalSubNodeCount = 0 ;
121
- for (auto Child : Layout) {
122
- if (Child) {
123
- TotalSubNodeCount += Child->getTotalSubNodeCount () + 1 ;
124
- // If the child is stored in a different arena, it needs to stay alive
125
- // as long as this node's arena is alive.
126
- Arena->addChildArena (Child->Arena );
127
- }
128
- }
129
-
130
- if (NodeId.hasValue ()) {
131
- this ->NodeId = NodeId.getValue ();
132
- NextFreeNodeId = std::max (this ->NodeId + 1 , NextFreeNodeId);
133
- } else {
134
- this ->NodeId = NextFreeNodeId++;
135
- }
136
- Bits.Layout .NumChildren = Layout.size ();
137
- Bits.Layout .TotalSubNodeCount = TotalSubNodeCount;
138
- Bits.Layout .Kind = unsigned (Kind);
139
-
140
- // Initialize layout data.
141
- std::uninitialized_copy (Layout.begin (), Layout.end (),
142
- getTrailingObjects<const RawSyntax *>());
143
- }
144
-
145
- RawSyntax::RawSyntax (tok TokKind, StringRef Text, size_t TextLength,
146
- StringRef LeadingTrivia, StringRef TrailingTrivia,
147
- SourcePresence Presence, const RC<SyntaxArena> &Arena,
148
- llvm::Optional<unsigned > NodeId)
149
- : Arena(Arena.get()),
150
- Bits({{unsigned (TextLength), unsigned (Presence), true }}) {
151
- assert (Arena && " RawSyntax nodes must always be allocated in an arena" );
152
- copyToArenaIfNecessary (LeadingTrivia, Arena);
153
- copyToArenaIfNecessary (Text, Arena);
154
- copyToArenaIfNecessary (TrailingTrivia, Arena);
155
-
156
- if (Presence == SourcePresence::Missing) {
157
- assert (TextLength == 0 );
158
- } else {
159
- assert (TextLength ==
160
- LeadingTrivia.size () + Text.size () + TrailingTrivia.size ());
161
- }
162
-
163
- if (NodeId.hasValue ()) {
164
- this ->NodeId = NodeId.getValue ();
165
- NextFreeNodeId = std::max (this ->NodeId + 1 , NextFreeNodeId);
166
- } else {
167
- this ->NodeId = NextFreeNodeId++;
168
- }
169
- Bits.Token .LeadingTrivia = LeadingTrivia.data ();
170
- Bits.Token .TokenText = Text.data ();
171
- Bits.Token .TrailingTrivia = TrailingTrivia.data ();
172
- Bits.Token .LeadingTriviaLength = LeadingTrivia.size ();
173
- Bits.Token .TokenLength = Text.size ();
174
- Bits.Token .TrailingTriviaLength = TrailingTrivia.size ();
175
- Bits.Token .TokenKind = unsigned (TokKind);
176
- }
177
-
178
- const RawSyntax *RawSyntax::make (SyntaxKind Kind,
179
- ArrayRef<const RawSyntax *> Layout,
180
- size_t TextLength, SourcePresence Presence,
181
- const RC<SyntaxArena> &Arena,
182
- llvm::Optional<unsigned > NodeId) {
183
- assert (Arena && " RawSyntax nodes must always be allocated in an arena" );
184
- auto size = totalSizeToAlloc<const RawSyntax *>(Layout.size ());
185
- void *data = Arena->Allocate (size, alignof (RawSyntax));
186
- return new (data)
187
- RawSyntax (Kind, Layout, TextLength, Presence, Arena, NodeId);
188
- }
189
-
190
- const RawSyntax *RawSyntax::make (tok TokKind, StringRef Text, size_t TextLength,
191
- StringRef LeadingTrivia,
192
- StringRef TrailingTrivia,
193
- SourcePresence Presence,
194
- const RC<SyntaxArena> &Arena,
195
- llvm::Optional<unsigned > NodeId) {
196
- assert (Arena && " RawSyntax nodes must always be allocated in an arena" );
197
- auto size = totalSizeToAlloc<const RawSyntax *>(0 );
198
- void *data = Arena->Allocate (size, alignof (RawSyntax));
199
- return new (data) RawSyntax (TokKind, Text, TextLength, LeadingTrivia,
200
- TrailingTrivia, Presence, Arena, NodeId);
201
- }
202
-
203
93
Trivia RawSyntax::getLeadingTriviaPieces () const {
204
94
return lexTrivia (getLeadingTrivia ());
205
95
}
0 commit comments