Skip to content

Commit fa991ba

Browse files
committed
[SyntaxParse] handle stringLiteralExpr in advanceLocEnd
In AST token range, string literal token must be treated as a single token.
1 parent c6b7ad7 commit fa991ba

File tree

1 file changed

+20
-25
lines changed

1 file changed

+20
-25
lines changed

lib/Parse/ASTGen.cpp

Lines changed: 20 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -684,8 +684,8 @@ TupleTypeRepr *ASTGen::generateTuple(const TokenSyntax &LParen,
684684
const TupleTypeElementListSyntax &Elements,
685685
const TokenSyntax &RParen,
686686
const SourceLoc Loc, bool IsFunction) {
687-
auto LPLoc = generate(LParen, Loc);
688-
auto RPLoc = generate(RParen, Loc);
687+
auto LPLoc = advanceLocBegin(Loc, LParen);
688+
auto RPLoc = advanceLocEnd(Loc, RParen);
689689

690690
SmallVector<TupleTypeReprElement, 4> TupleElements;
691691

@@ -1000,14 +1000,8 @@ TypeRepr *ASTGen::generate(const DictionaryTypeSyntax &Type,
10001000
auto ColonLoc = advanceLocBegin(Loc, Type.getColon());
10011001

10021002
SourceLoc LBracketLoc, RBracketLoc;
1003-
if (Type.getLeftSquareBracket().isPresent())
1004-
LBracketLoc = advanceLocBegin(Loc, Type.getLeftSquareBracket());
1005-
else
1006-
LBracketLoc = advanceLocBegin(Loc, *Type.getFirstToken());
1007-
if (Type.getRightSquareBracket().isPresent())
1008-
RBracketLoc = advanceLocBegin(Loc, Type.getRightSquareBracket());
1009-
else
1010-
RBracketLoc = advanceLocBegin(Loc, *Type.getLastToken());
1003+
LBracketLoc = advanceLocBegin(Loc, Type);
1004+
RBracketLoc = advanceLocEnd(Loc, Type);
10111005
SourceRange Range{LBracketLoc, RBracketLoc};
10121006
return new (Context) DictionaryTypeRepr(KeyType, ValueType, ColonLoc, Range);
10131007
}
@@ -1017,14 +1011,8 @@ TypeRepr *ASTGen::generate(const ArrayTypeSyntax &Type, SourceLoc Loc) {
10171011
if (!ElementType)
10181012
return nullptr;
10191013
SourceLoc LBracketLoc, RBracketLoc;
1020-
if (Type.getLeftSquareBracket().isPresent())
1021-
LBracketLoc = advanceLocBegin(Loc, Type.getLeftSquareBracket());
1022-
else
1023-
LBracketLoc = advanceLocBegin(Loc, *Type.getFirstToken());
1024-
if (Type.getRightSquareBracket().isPresent())
1025-
RBracketLoc = advanceLocBegin(Loc, Type.getRightSquareBracket());
1026-
else
1027-
RBracketLoc = advanceLocBegin(Loc, *Type.getLastToken());
1014+
LBracketLoc = advanceLocBegin(Loc, Type);
1015+
RBracketLoc = advanceLocEnd(Loc, Type);
10281016
return new (Context) ArrayTypeRepr(ElementType, {LBracketLoc, RBracketLoc});
10291017
}
10301018

@@ -1206,8 +1194,8 @@ void
12061194
ASTGen::generate(const GenericArgumentClauseSyntax &clause, const SourceLoc Loc,
12071195
SourceLoc &lAngleLoc, SourceLoc &rAngleLoc,
12081196
SmallVectorImpl<TypeRepr *> &args) {
1209-
lAngleLoc = advanceLocBegin(Loc, clause.getLeftAngleBracket());
1210-
rAngleLoc = advanceLocBegin(Loc, clause.getRightAngleBracket());
1197+
lAngleLoc = advanceLocBegin(Loc, clause);
1198+
rAngleLoc = advanceLocEnd(Loc, clause);
12111199

12121200
assert(args.empty());
12131201
for (auto Arg : clause.getArguments()) {
@@ -1303,8 +1291,8 @@ GenericParamList *ASTGen::generate(const GenericParameterClauseSyntax &clause,
13031291
whereLoc = advanceLocBegin(Loc, whereClause->getWhereKeyword());
13041292
}
13051293

1306-
auto lAngleLoc = advanceLocBegin(Loc, clause.getLeftAngleBracket());
1307-
auto rAngleLoc = advanceLocBegin(Loc, clause.getRightAngleBracket());
1294+
auto lAngleLoc = advanceLocBegin(Loc, clause);
1295+
auto rAngleLoc = advanceLocEnd(Loc, clause);
13081296
return GenericParamList::create(Context, lAngleLoc, params, whereLoc,
13091297
requirements, rAngleLoc);
13101298
}
@@ -1395,10 +1383,17 @@ SourceLoc ASTGen::advanceLocBegin(const SourceLoc &Loc, const Syntax &Node) {
13951383
}
13961384

13971385
SourceLoc ASTGen::advanceLocEnd(const SourceLoc &Loc, const Syntax &Node) {
1398-
if (auto Tok = Node.getLastToken())
1399-
return advanceLocBegin(Loc, *Tok);
1386+
if (!Node.isMissing()) {
1387+
// NOTE: We cannot use 'getLastToken()' because it doesn't take string
1388+
// literal expressions into account.
1389+
if (Node.isToken() || Node.is<StringLiteralExprSyntax>())
1390+
return advanceLocBegin(Loc, Node);
1391+
for (size_t I = Node.getNumChildren(); I != 0; --I)
1392+
if (auto Child = Node.getChild(I - 1))
1393+
return advanceLocEnd(Loc, *Child);
1394+
}
14001395
if (auto Prev = Node.getPreviousNode())
1401-
return advanceLocBegin(Loc, *Prev->getLastToken());
1396+
return advanceLocEnd(Loc, *Prev);
14021397
assert(false && "No tokens in tree?");
14031398
return Loc;
14041399
}

0 commit comments

Comments
 (0)