@@ -87,119 +87,9 @@ Trivia lexTrivia(StringRef TriviaStr) {
8787 return SyntaxTrivia;
8888}
8989
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-
10790// FIXME: If we want thread-safety for tree creation, this needs to be atomic.
10891unsigned RawSyntax::NextFreeNodeId = 1 ;
10992
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-
20393Trivia RawSyntax::getLeadingTriviaPieces () const {
20494 return lexTrivia (getLeadingTrivia ());
20595}
0 commit comments