Skip to content

Commit 95cf4f3

Browse files
committed
[libSyntax] Eliminate unnecessary loop when making deferred layout
Both makeDeferredLayout and recordRawSyntax were looping over the children, but only one loop is necessary.
1 parent b206832 commit 95cf4f3

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

lib/SyntaxParse/SyntaxTreeCreator.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -188,17 +188,25 @@ OpaqueSyntaxNode SyntaxTreeCreator::makeDeferredToken(tok tokenKind,
188188
}
189189

190190
OpaqueSyntaxNode SyntaxTreeCreator::makeDeferredLayout(
191-
syntax::SyntaxKind k, bool IsMissing,
192-
const MutableArrayRef<ParsedRawSyntaxNode> &children) {
193-
SmallVector<OpaqueSyntaxNode, 16> opaqueChildren;
194-
opaqueChildren.reserve(children.size());
191+
syntax::SyntaxKind kind, bool IsMissing,
192+
const MutableArrayRef<ParsedRawSyntaxNode> &parsedChildren) {
193+
assert(!IsMissing && "Missing layout nodes not implemented yet");
195194

196-
for (size_t i = 0; i < children.size(); ++i) {
197-
opaqueChildren.push_back(children[i].takeData());
195+
SmallVector<const RawSyntax *, 16> children;
196+
children.reserve(parsedChildren.size());
197+
198+
size_t TextLength = 0;
199+
for (size_t i = 0; i < parsedChildren.size(); ++i) {
200+
auto Raw = static_cast<const RawSyntax *>(parsedChildren[i].takeData());
201+
if (Raw) {
202+
TextLength += Raw->getTextLength();
203+
}
204+
children.push_back(Raw);
198205
}
199206

200-
// Also see comment in makeDeferredToken
201-
return recordRawSyntax(k, opaqueChildren);
207+
auto raw = RawSyntax::make(kind, children, TextLength,
208+
SourcePresence::Present, Arena);
209+
return static_cast<OpaqueSyntaxNode>(raw);
202210
}
203211

204212
OpaqueSyntaxNode

0 commit comments

Comments
 (0)