Skip to content

Commit b206832

Browse files
committed
[libSyntax] Eliminate loop and memory allocation translating ParsedRawSyntaxNode to RecordedOrDeferredNode
1 parent a770356 commit b206832

File tree

6 files changed

+42
-40
lines changed

6 files changed

+42
-40
lines changed

include/swift/Parse/ParsedRawSyntaxRecorder.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,21 @@ class ParsedRawSyntaxRecorder final {
173173
ParsedRawSyntaxNode
174174
makeDeferred(syntax::SyntaxKind k,
175175
MutableArrayRef<ParsedRawSyntaxNode> deferredNodes,
176-
SyntaxParsingContext &ctx);
176+
SyntaxParsingContext &ctx) {
177+
#ifdef PARSEDRAWSYNTAXNODE_VERIFY_RANGES
178+
auto range = ParsedRawSyntaxRecorder::verifyElementRanges(deferredNodes);
179+
#endif
180+
181+
assert(llvm::none_of(deferredNodes, [](const ParsedRawSyntaxNode &node) {
182+
return node.isRecorded();
183+
}) && "Cannot create a deferred layout node that has recorded children");
184+
185+
auto data =
186+
SPActions->makeDeferredLayout(k, /*IsMissing=*/false, deferredNodes);
187+
return makeParsedRawSyntaxNode(
188+
data, k, tok::NUM_TOKENS, ParsedRawSyntaxNode::DataKind::DeferredLayout,
189+
/*IsMissing=*/false, range);
190+
}
177191

178192
/// Form a deferred token node.
179193
ParsedRawSyntaxNode makeDeferred(Token tok, StringRef leadingTrivia,

include/swift/Parse/SyntaxParseActions.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class ParsedTriviaPiece;
2828
class SourceFile;
2929
class SourceLoc;
3030
enum class tok : uint8_t;
31+
class ParsedRawSyntaxNode;
3132

3233
namespace syntax {
3334
class SourceFileSyntax;
@@ -113,9 +114,11 @@ class SyntaxParseActions {
113114
/// Create a deferred layout node that may or may not be recorded later using
114115
/// \c recordDeferredLayout. The \c SyntaxParseAction is responsible for
115116
/// keeping the deferred token alive until it is destructed.
117+
/// From all nodes in \p children, the underlying opaque data will be *taken*
118+
/// which resets the nodes.
116119
virtual OpaqueSyntaxNode
117120
makeDeferredLayout(syntax::SyntaxKind k, bool isMissing,
118-
const ArrayRef<RecordedOrDeferredNode> &children) = 0;
121+
const MutableArrayRef<ParsedRawSyntaxNode> &children) = 0;
119122

120123
/// Record a deferred token node that was previously created using \c
121124
/// makeDeferredToken. The deferred data will never be used again, so it can

include/swift/SyntaxParse/SyntaxTreeCreator.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ class SyntaxTreeCreator final : public SyntaxParseActions {
7676
CharSourceRange range,
7777
bool isMissing) override;
7878

79-
OpaqueSyntaxNode
80-
makeDeferredLayout(syntax::SyntaxKind k, bool IsMissing,
81-
const ArrayRef<RecordedOrDeferredNode> &children) override;
79+
OpaqueSyntaxNode makeDeferredLayout(
80+
syntax::SyntaxKind k, bool IsMissing,
81+
const MutableArrayRef<ParsedRawSyntaxNode> &children) override;
8282

8383
OpaqueSyntaxNode recordDeferredToken(OpaqueSyntaxNode deferred) override;
8484
OpaqueSyntaxNode recordDeferredLayout(OpaqueSyntaxNode deferred) override;

lib/Parse/ParsedRawSyntaxRecorder.cpp

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,6 @@ ParsedRawSyntaxRecorder::recordEmptyRawSyntaxCollection(SyntaxKind kind,
4444
/*IsMissing=*/false, CharSourceRange(loc, 0));
4545
}
4646

47-
/// Create a deferred layout node.
48-
ParsedRawSyntaxNode ParsedRawSyntaxRecorder::makeDeferred(
49-
syntax::SyntaxKind k, MutableArrayRef<ParsedRawSyntaxNode> deferredNodes,
50-
SyntaxParsingContext &ctx) {
51-
#ifdef PARSEDRAWSYNTAXNODE_VERIFY_RANGES
52-
auto range = ParsedRawSyntaxRecorder::verifyElementRanges(deferredNodes);
53-
#endif
54-
55-
RecordedOrDeferredNode *newPtr =
56-
ctx.getScratchAlloc().Allocate<RecordedOrDeferredNode>(
57-
deferredNodes.size());
58-
auto children = llvm::makeMutableArrayRef(newPtr, deferredNodes.size());
59-
for (size_t i = 0; i < deferredNodes.size(); ++i) {
60-
auto &node = deferredNodes[i];
61-
assert(!node.isRecorded() &&
62-
"Cannot create a deferred layout node that has recorded children");
63-
64-
children[i] = node.takeRecordedOrDeferredNode();
65-
}
66-
auto data = SPActions->makeDeferredLayout(k, /*IsMissing=*/false, children);
67-
return makeParsedRawSyntaxNode(data, k, tok::NUM_TOKENS,
68-
ParsedRawSyntaxNode::DataKind::DeferredLayout,
69-
/*IsMissing=*/false, range);
70-
}
71-
7247
ParsedRawSyntaxNode
7348
ParsedRawSyntaxRecorder::makeDeferredMissing(tok tokKind, SourceLoc loc) {
7449
auto Data = SPActions->makeDeferredToken(

lib/SyntaxParse/SyntaxTreeCreator.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,18 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "swift/SyntaxParse/SyntaxTreeCreator.h"
14-
#include "swift/Syntax/RawSyntax.h"
15-
#include "swift/Syntax/SyntaxVisitor.h"
16-
#include "swift/Syntax/Trivia.h"
17-
#include "swift/Parse/ParsedTrivia.h"
18-
#include "swift/Parse/SyntaxParsingCache.h"
19-
#include "swift/Parse/Token.h"
2014
#include "swift/AST/ASTContext.h"
2115
#include "swift/AST/DiagnosticsParse.h"
2216
#include "swift/AST/Module.h"
2317
#include "swift/AST/SourceFile.h"
2418
#include "swift/Basic/OwnedString.h"
19+
#include "swift/Parse/ParsedRawSyntaxNode.h"
20+
#include "swift/Parse/ParsedTrivia.h"
21+
#include "swift/Parse/SyntaxParsingCache.h"
22+
#include "swift/Parse/Token.h"
23+
#include "swift/Syntax/RawSyntax.h"
24+
#include "swift/Syntax/SyntaxVisitor.h"
25+
#include "swift/Syntax/Trivia.h"
2526

2627
using namespace swift;
2728
using namespace swift::syntax;
@@ -188,12 +189,12 @@ OpaqueSyntaxNode SyntaxTreeCreator::makeDeferredToken(tok tokenKind,
188189

189190
OpaqueSyntaxNode SyntaxTreeCreator::makeDeferredLayout(
190191
syntax::SyntaxKind k, bool IsMissing,
191-
const ArrayRef<RecordedOrDeferredNode> &children) {
192+
const MutableArrayRef<ParsedRawSyntaxNode> &children) {
192193
SmallVector<OpaqueSyntaxNode, 16> opaqueChildren;
193194
opaqueChildren.reserve(children.size());
194195

195196
for (size_t i = 0; i < children.size(); ++i) {
196-
opaqueChildren.push_back(children[i].getOpaque());
197+
opaqueChildren.push_back(children[i].takeData());
197198
}
198199

199200
// Also see comment in makeDeferredToken

tools/libSwiftSyntaxParser/libSwiftSyntaxParser.cpp

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -245,12 +245,21 @@ class CLibParseActions final : public SyntaxParseActions {
245245

246246
OpaqueSyntaxNode makeDeferredLayout(
247247
syntax::SyntaxKind k, bool isMissing,
248-
const ArrayRef<RecordedOrDeferredNode> &children) override {
248+
const MutableArrayRef<ParsedRawSyntaxNode> &parsedChildren) override {
249249
assert(!isMissing && "Missing layout nodes not implemented yet");
250250

251+
auto childrenMem = DeferredNodeAllocator.Allocate<RecordedOrDeferredNode>(
252+
parsedChildren.size());
253+
auto children =
254+
llvm::makeMutableArrayRef(childrenMem, parsedChildren.size());
255+
251256
// Compute the length of this node.
252257
unsigned length = 0;
253-
for (auto &child : children) {
258+
size_t index = 0;
259+
for (auto &parsedChild : parsedChildren) {
260+
auto child = parsedChild.takeRecordedOrDeferredNode();
261+
children[index++] = child;
262+
254263
switch (child.getKind()) {
255264
case RecordedOrDeferredNode::Kind::Null:
256265
break;

0 commit comments

Comments
 (0)