Skip to content

Commit edabaf7

Browse files
committed
---
yaml --- r: 322287 b: refs/heads/tensorflow-next c: 1474ea2 h: refs/heads/master i: 322285: 434e77b 322283: 3007f3f 322279: 45ac5a8 322271: 3210d5b
1 parent 835440e commit edabaf7

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1461,4 +1461,4 @@ refs/heads/master-rebranch: 86e95c23aa0d37f24ec138b7853146c1cead2e40
14611461
refs/heads/rdar-53901732: 9bd06af3284e18a109cdbf9aa59d833b24eeca7b
14621462
refs/heads/revert-26776-subst-always-returns-a-type: 1b8e18fdd391903a348970a4c848995d4cdd789c
14631463
refs/heads/tensorflow-merge: 8b854f62f80d4476cb383d43c4aac2001dde3cec
1464-
refs/heads/tensorflow-next: 5a1cbd415d5112db45db051bd1f43d5f6d576fa6
1464+
refs/heads/tensorflow-next: 1474ea2d6ded88e28dc2fde82bd9243e26b10d3a

branches/tensorflow-next/include/swift/Parse/Parser.h

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,9 +425,38 @@ class Parser {
425425
llvm::Optional<SyntaxParsingContext> SynContext;
426426
bool Backtrack = true;
427427

428+
/// A token receiver used by the parser in the back tracking scope. This
429+
/// receiver will save any consumed tokens during this back tracking scope.
430+
/// After the scope ends, it either transfers the saved tokens to the old receiver
431+
/// or discard them.
432+
struct DelayedTokenReceiver: ConsumeTokenReceiver {
433+
/// Keep track of the old token receiver in the parser so that we can recover
434+
/// after the backtracking sope ends.
435+
llvm::SaveAndRestore<ConsumeTokenReceiver*> savedConsumer;
436+
437+
// Whether the tokens should be transferred to the original receiver.
438+
// When the back tracking scope will actually back track, this should be false;
439+
// otherwise true.
440+
bool shouldTransfer = false;
441+
std::vector<Token> delayedTokens;
442+
DelayedTokenReceiver(ConsumeTokenReceiver *&receiver):
443+
savedConsumer(receiver, this) {}
444+
void receive(Token tok) override {
445+
delayedTokens.push_back(tok);
446+
}
447+
~DelayedTokenReceiver() {
448+
if (!shouldTransfer)
449+
return;
450+
for (auto tok: delayedTokens) {
451+
savedConsumer.get()->receive(tok);
452+
}
453+
}
454+
} TempReceiver;
455+
428456
public:
429457
BacktrackingScope(Parser &P)
430-
: P(P), PP(P.getParserPosition()), DT(P.Diags) {
458+
: P(P), PP(P.getParserPosition()), DT(P.Diags),
459+
TempReceiver(P.TokReceiver) {
431460
SynContext.emplace(P.SyntaxContext);
432461
SynContext->setBackTracking();
433462
}
@@ -440,8 +469,8 @@ class Parser {
440469
SynContext->setTransparent();
441470
SynContext.reset();
442471
DT.commit();
472+
TempReceiver.shouldTransfer = true;
443473
}
444-
445474
};
446475

447476
/// RAII object that, when it is destructed, restores the parser and lexer to
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %target-swift-ide-test -syntax-coloring -source-filename %s | %FileCheck %s
2+
// RUN: %target-swift-ide-test -syntax-coloring -typecheck -source-filename %s | %FileCheck %s
3+
4+
// CHECK: <kw>_</kw> = <str>"</str>\<anchor>(</anchor><anchor>)</anchor><str>"</str>
5+
// CHECK: <kw>if</kw> <kw>true</kw> { <kw>_</kw> = <str>"</str>\<anchor>(</anchor><anchor>)</anchor><str>"</str> }
6+
7+
if true {
8+
_ = "\()"
9+
}
10+
11+
if true { _ = "\()" }

0 commit comments

Comments
 (0)