@@ -684,8 +684,8 @@ TupleTypeRepr *ASTGen::generateTuple(const TokenSyntax &LParen,
684
684
const TupleTypeElementListSyntax &Elements,
685
685
const TokenSyntax &RParen,
686
686
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 );
689
689
690
690
SmallVector<TupleTypeReprElement, 4 > TupleElements;
691
691
@@ -1000,14 +1000,8 @@ TypeRepr *ASTGen::generate(const DictionaryTypeSyntax &Type,
1000
1000
auto ColonLoc = advanceLocBegin (Loc, Type.getColon ());
1001
1001
1002
1002
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);
1011
1005
SourceRange Range{LBracketLoc, RBracketLoc};
1012
1006
return new (Context) DictionaryTypeRepr (KeyType, ValueType, ColonLoc, Range);
1013
1007
}
@@ -1017,14 +1011,8 @@ TypeRepr *ASTGen::generate(const ArrayTypeSyntax &Type, SourceLoc Loc) {
1017
1011
if (!ElementType)
1018
1012
return nullptr ;
1019
1013
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);
1028
1016
return new (Context) ArrayTypeRepr (ElementType, {LBracketLoc, RBracketLoc});
1029
1017
}
1030
1018
@@ -1206,8 +1194,8 @@ void
1206
1194
ASTGen::generate (const GenericArgumentClauseSyntax &clause, const SourceLoc Loc,
1207
1195
SourceLoc &lAngleLoc, SourceLoc &rAngleLoc,
1208
1196
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);
1211
1199
1212
1200
assert (args.empty ());
1213
1201
for (auto Arg : clause.getArguments ()) {
@@ -1303,8 +1291,8 @@ GenericParamList *ASTGen::generate(const GenericParameterClauseSyntax &clause,
1303
1291
whereLoc = advanceLocBegin (Loc, whereClause->getWhereKeyword ());
1304
1292
}
1305
1293
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);
1308
1296
return GenericParamList::create (Context, lAngleLoc, params, whereLoc,
1309
1297
requirements, rAngleLoc);
1310
1298
}
@@ -1395,10 +1383,17 @@ SourceLoc ASTGen::advanceLocBegin(const SourceLoc &Loc, const Syntax &Node) {
1395
1383
}
1396
1384
1397
1385
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
+ }
1400
1395
if (auto Prev = Node.getPreviousNode ())
1401
- return advanceLocBegin (Loc, *Prev-> getLastToken () );
1396
+ return advanceLocEnd (Loc, *Prev);
1402
1397
assert (false && " No tokens in tree?" );
1403
1398
return Loc;
1404
1399
}
0 commit comments