Skip to content

Commit 7c43083

Browse files
committed
[SyntaxParse] Sink element layout check to right before node creations
ParsedRawSyntaxRecorder::recordRawSyntax() and ParsedRawSyntaxNode::makeDeferred()
1 parent 97757e4 commit 7c43083

File tree

9 files changed

+21
-15
lines changed

9 files changed

+21
-15
lines changed

include/swift/Parse/Parser.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -532,6 +532,10 @@ class Parser {
532532
return consumeToken();
533533
}
534534

535+
SourceLoc leadingTriviaLoc() {
536+
return Tok.getLoc().getAdvancedLoc(-LeadingTrivia.getLength());
537+
}
538+
535539
SourceLoc consumeIdentifier(Identifier *Result = nullptr,
536540
bool allowDollarIdentifier = false) {
537541
assert(Tok.isAny(tok::identifier, tok::kw_self, tok::kw_Self));

lib/Parse/ParseDecl.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4615,9 +4615,9 @@ ParserStatus Parser::parseGetSet(ParseDeclOptions Flags,
46154615
accessors.LBLoc = consumeToken(tok::l_brace);
46164616
// Give syntax node an empty accessor list.
46174617
if (SyntaxContext->isEnabled()) {
4618-
SourceLoc listLoc = accessors.LBLoc.getAdvancedLoc(1);
4618+
SourceLoc listLoc = leadingTriviaLoc();
46194619
SyntaxContext->addSyntax(
4620-
ParsedSyntaxRecorder::makeBlankAccessorList(listLoc, *SyntaxContext));
4620+
ParsedSyntaxRecorder::makeBlankAccessorList(listLoc, *SyntaxContext));
46214621
}
46224622
accessors.RBLoc = consumeToken(tok::r_brace);
46234623

lib/Parse/ParseExpr.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1183,7 +1183,7 @@ Parser::parseExprPostfixSuffix(ParserResult<Expr> Result, bool isExprBasic,
11831183
// Add dummy blank argument list to the call expression syntax.
11841184
SyntaxContext->addSyntax(
11851185
ParsedSyntaxRecorder::makeBlankTupleExprElementList(
1186-
Tok.getLoc(), *SyntaxContext));
1186+
leadingTriviaLoc(), *SyntaxContext));
11871187
}
11881188

11891189
ParserResult<Expr> closure =
@@ -1588,7 +1588,7 @@ ParserResult<Expr> Parser::parseExprPrimary(Diag<> ID, bool isExprBasic) {
15881588
// Add dummy blank argument list to the call expression syntax.
15891589
SyntaxContext->addSyntax(
15901590
ParsedSyntaxRecorder::makeBlankTupleExprElementList(
1591-
Tok.getLoc(), *SyntaxContext));
1591+
leadingTriviaLoc(), *SyntaxContext));
15921592
}
15931593

15941594
ParserResult<Expr> closure =
@@ -2102,7 +2102,7 @@ DeclName Parser::parseUnqualifiedDeclName(bool afterDot,
21022102
if (SyntaxContext->isEnabled())
21032103
SyntaxContext->addSyntax(
21042104
ParsedSyntaxRecorder::makeBlankDeclNameArgumentList(
2105-
Tok.getLoc(), *SyntaxContext));
2105+
leadingTriviaLoc(), *SyntaxContext));
21062106
consumeToken(tok::r_paren);
21072107
loc = DeclNameLoc(baseNameLoc);
21082108
SmallVector<Identifier, 2> argumentLabels;
@@ -3304,9 +3304,8 @@ ParserResult<Expr> Parser::parseExprCollection() {
33043304
// [] is always an array.
33053305
if (Tok.is(tok::r_square)) {
33063306
if (SyntaxContext->isEnabled())
3307-
SyntaxContext->addSyntax(
3308-
ParsedSyntaxRecorder::makeBlankArrayElementList(
3309-
Tok.getLoc(), *SyntaxContext));
3307+
SyntaxContext->addSyntax(ParsedSyntaxRecorder::makeBlankArrayElementList(
3308+
leadingTriviaLoc(), *SyntaxContext));
33103309
RSquareLoc = consumeToken(tok::r_square);
33113310
ArrayOrDictContext.setCreateSyntax(SyntaxKind::ArrayExpr);
33123311
return makeParserResult(

lib/Parse/ParsedRawSyntaxNode.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ ParsedRawSyntaxNode::makeDeferred(SyntaxKind k,
2828
ParsedRawSyntaxNode *newPtr =
2929
ctx.getScratchAlloc().Allocate<ParsedRawSyntaxNode>(deferredNodes.size());
3030

31+
#ifndef NDEBUG
32+
ParsedRawSyntaxRecorder::verifyElementRanges(deferredNodes);
33+
#endif
3134
auto ptr = newPtr;
3235
for (auto &node : deferredNodes) {
3336
// Cached range.

lib/Parse/ParsedRawSyntaxRecorder.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ getRecordedNode(ParsedRawSyntaxNode node, ParsedRawSyntaxRecorder &rec) {
7575
ParsedRawSyntaxNode
7676
ParsedRawSyntaxRecorder::recordRawSyntax(SyntaxKind kind,
7777
MutableArrayRef<ParsedRawSyntaxNode> elements) {
78+
#ifndef NDEBUG
79+
ParsedRawSyntaxRecorder::verifyElementRanges(elements);
80+
#endif
7881
CharSourceRange range;
7982
SmallVector<OpaqueSyntaxNode, 16> subnodes;
8083
if (!elements.empty()) {

lib/Parse/ParsedSyntaxBuilders.cpp.gyb

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,6 @@ void Parsed${node.name}Builder::finishLayout(bool deferred) {
120120
}
121121
% end
122122
% end
123-
124-
#ifndef NDEBUG
125-
ParsedRawSyntaxRecorder::verifyElementRanges(Layout);
126-
#endif
127123
% end
128124
}
129125

lib/Parse/ParsedSyntaxRecorder.cpp.gyb

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ ParsedSyntaxRecorder::make${node.syntax_kind}(${child_params},
114114
% end
115115
% end
116116
};
117-
#ifndef NDEBUG
118-
ParsedRawSyntaxRecorder::verifyElementRanges(layout);
119-
#endif
120117
if (SPCtx.shouldDefer())
121118
return defer${node.syntax_kind}(layout, SPCtx);
122119
return record${node.syntax_kind}(layout, SPCtx.getRecorder());

test/IDE/complete_expr_postfix_begin.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,7 @@ func testTuple(localInt: Int) {
563563
var ownInit1: Int = #^OWN_INIT_1^#
564564
// OWN_INIT_1: Begin completions
565565
// OWN_INIT_1-NOT: ownInit1
566+
func sync() {}
566567
var ownInit2: () -> Void = { #^OWN_INIT_2^# }
567568
// OWN_INIT_2: Begin completions
568569
// OWN_INIT_2-NOT: ownInit2

tools/swift-ide-test/swift-ide-test.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -870,6 +870,9 @@ static int doCodeCompletion(const CompilerInvocation &InitInvok,
870870

871871
Invocation.setCodeCompletionPoint(CleanFile.get(), CodeCompletionOffset);
872872

873+
// Disable to build syntax tree because code-completion skips some portion of
874+
// source text. That breaks an invariant of syntax tree building.
875+
Invocation.getLangOptions().BuildSyntaxTree = false;
873876

874877
std::unique_ptr<ide::OnDiskCodeCompletionCache> OnDiskCache;
875878
if (!options::CompletionCachePath.empty()) {

0 commit comments

Comments
 (0)