@@ -102,7 +102,7 @@ std::vector<ResolvedLoc> NameMatcher::resolve(ArrayRef<UnresolvedLoc> Locs, Arra
102
102
103
103
// handle any unresolved locs past the end of the last AST node or comment
104
104
std::vector<ResolvedLoc> Remaining (Locs.size () - ResolvedLocs.size (), {
105
- ASTWalker::ParentTy (), CharSourceRange (), {}, LabelRangeType::None,
105
+ ASTWalker::ParentTy (), CharSourceRange (), {}, None, LabelRangeType::None,
106
106
/* isActice*/ true , /* isInSelector*/ false });
107
107
ResolvedLocs.insert (ResolvedLocs.end (), Remaining.begin (), Remaining.end ());
108
108
@@ -238,15 +238,15 @@ bool NameMatcher::walkToDeclPre(Decl *D) {
238
238
LabelRanges = getLabelRanges (ParamList, getSourceMgr ());
239
239
}
240
240
tryResolve (ASTWalker::ParentTy (D), D->getLoc (), LabelRangeType::Param,
241
- LabelRanges);
241
+ LabelRanges, None );
242
242
} else if (SubscriptDecl *SD = dyn_cast<SubscriptDecl>(D)) {
243
243
tryResolve (ASTWalker::ParentTy (D), D->getLoc (), LabelRangeType::NoncollapsibleParam,
244
- getLabelRanges (SD->getIndices (), getSourceMgr ()));
244
+ getLabelRanges (SD->getIndices (), getSourceMgr ()), None );
245
245
} else if (EnumElementDecl *EED = dyn_cast<EnumElementDecl>(D)) {
246
246
if (auto *ParamList = EED->getParameterList ()) {
247
247
auto LabelRanges = getEnumParamListInfo (getSourceMgr (), ParamList);
248
248
tryResolve (ASTWalker::ParentTy (D), D->getLoc (), LabelRangeType::CallArg,
249
- LabelRanges);
249
+ LabelRanges, None );
250
250
} else {
251
251
tryResolve (ASTWalker::ParentTy (D), D->getLoc ());
252
252
}
@@ -362,7 +362,8 @@ std::pair<bool, Expr*> NameMatcher::walkToExprPre(Expr *E) {
362
362
363
363
auto Labels = getCallArgLabelRanges (getSourceMgr (), SubExpr->getIndex (),
364
364
LabelRangeEndAt::BeforeElemStart);
365
- tryResolve (ASTWalker::ParentTy (E), E->getLoc (), LabelRangeType::CallArg, Labels);
365
+ tryResolve (ASTWalker::ParentTy (E), E->getLoc (), LabelRangeType::CallArg,
366
+ Labels.first , Labels.second );
366
367
if (isDone ())
367
368
break ;
368
369
if (!SubExpr->getIndex ()->walk (*this ))
@@ -379,7 +380,7 @@ std::pair<bool, Expr*> NameMatcher::walkToExprPre(Expr *E) {
379
380
auto Labels = getCallArgLabelRanges (getSourceMgr (), P,
380
381
LabelRangeEndAt::BeforeElemStart);
381
382
tryResolve (ASTWalker::ParentTy (E), P->getLParenLoc (),
382
- LabelRangeType::CallArg, Labels);
383
+ LabelRangeType::CallArg, Labels. first , Labels. second );
383
384
break ;
384
385
}
385
386
case ExprKind::Tuple: {
@@ -388,7 +389,7 @@ std::pair<bool, Expr*> NameMatcher::walkToExprPre(Expr *E) {
388
389
auto Labels = getCallArgLabelRanges (getSourceMgr (), T,
389
390
LabelRangeEndAt::BeforeElemStart);
390
391
tryResolve (ASTWalker::ParentTy (E), T->getLParenLoc (),
391
- LabelRangeType::CallArg, Labels);
392
+ LabelRangeType::CallArg, Labels. first , Labels. second );
392
393
if (isDone ())
393
394
break ;
394
395
@@ -485,8 +486,10 @@ bool NameMatcher::walkToTypeReprPre(TypeRepr *T) {
485
486
// If we're walking a CustomAttr's type we may have an associated call
486
487
// argument to resolve with from its semantic initializer.
487
488
if (CustomAttrArg.hasValue () && CustomAttrArg->Loc == T->getLoc ()) {
489
+ auto Labels = getCallArgLabelRanges (getSourceMgr (), CustomAttrArg->Item ,
490
+ LabelRangeEndAt::BeforeElemStart);
488
491
tryResolve (ASTWalker::ParentTy (T), T->getLoc (), LabelRangeType::CallArg,
489
- getCallArgLabelRanges ( getSourceMgr (), CustomAttrArg-> Item , LabelRangeEndAt::BeforeElemStart) );
492
+ Labels. first , Labels. second );
490
493
} else {
491
494
tryResolve (ASTWalker::ParentTy (T), T->getLoc ());
492
495
}
@@ -527,7 +530,7 @@ void NameMatcher::skipLocsBefore(SourceLoc Start) {
527
530
if (!checkComments ()) {
528
531
LocsToResolve.pop_back ();
529
532
ResolvedLocs.push_back ({ASTWalker::ParentTy (), CharSourceRange (), {},
530
- LabelRangeType::None, isActive (), isInSelector ()});
533
+ None, LabelRangeType::None, isActive (), isInSelector ()});
531
534
}
532
535
}
533
536
}
@@ -592,7 +595,7 @@ bool NameMatcher::tryResolve(ASTWalker::ParentTy Node, DeclNameLoc NameLoc,
592
595
if (NameLoc.isCompound ()) {
593
596
auto Labels = getSelectorLabelRanges (getSourceMgr (), NameLoc);
594
597
bool Resolved = tryResolve (Node, NameLoc.getBaseNameLoc (),
595
- LabelRangeType::Selector, Labels);
598
+ LabelRangeType::Selector, Labels, None );
596
599
if (!isDone ()) {
597
600
for (auto Label: Labels) {
598
601
if (tryResolve (Node, Label.getStart ())) {
@@ -606,23 +609,26 @@ bool NameMatcher::tryResolve(ASTWalker::ParentTy Node, DeclNameLoc NameLoc,
606
609
}
607
610
608
611
if (LocsToResolve.back ().ResolveArgLocs ) {
609
- if (Arg)
612
+ if (Arg) {
613
+ auto Labels = getCallArgLabelRanges (getSourceMgr (), Arg,
614
+ LabelRangeEndAt::BeforeElemStart);
610
615
return tryResolve (Node, NameLoc.getBaseNameLoc (), LabelRangeType::CallArg,
611
- getCallArgLabelRanges ( getSourceMgr (), Arg,
612
- LabelRangeEndAt::BeforeElemStart));
616
+ Labels. first , Labels. second );
617
+ }
613
618
}
614
619
615
620
return tryResolve (Node, NameLoc.getBaseNameLoc ());
616
621
}
617
622
618
623
bool NameMatcher::tryResolve (ASTWalker::ParentTy Node, SourceLoc NameLoc) {
619
624
assert (!isDone ());
620
- return tryResolve (Node, NameLoc, LabelRangeType::None, None);
625
+ return tryResolve (Node, NameLoc, LabelRangeType::None, None, None );
621
626
}
622
627
623
628
bool NameMatcher::tryResolve (ASTWalker::ParentTy Node, SourceLoc NameLoc,
624
629
LabelRangeType RangeType,
625
- ArrayRef<CharSourceRange> LabelRanges) {
630
+ ArrayRef<CharSourceRange> LabelRanges,
631
+ Optional<unsigned > FirstTrailingLabel) {
626
632
skipLocsBefore (NameLoc);
627
633
if (isDone ())
628
634
return false ;
@@ -634,8 +640,8 @@ bool NameMatcher::tryResolve(ASTWalker::ParentTy Node, SourceLoc NameLoc,
634
640
if (Range.isValid ()) {
635
641
if (NameLoc == Next.Loc ) {
636
642
LocsToResolve.pop_back ();
637
- ResolvedLocs.push_back ({Node, Range, LabelRanges, RangeType ,
638
- isActive (), isInSelector ()});
643
+ ResolvedLocs.push_back ({Node, Range, LabelRanges, FirstTrailingLabel ,
644
+ RangeType, isActive (), isInSelector ()});
639
645
if (isDone ())
640
646
return true ;
641
647
WasResolved = true ;
@@ -649,7 +655,7 @@ bool NameMatcher::tryResolve(ASTWalker::ParentTy Node, SourceLoc NameLoc,
649
655
Range.getByteLength () - 1 );
650
656
if (NewRange.getStart () == Next.Loc ) {
651
657
LocsToResolve.pop_back ();
652
- ResolvedLocs.push_back ({Node, NewRange, {}, LabelRangeType::None,
658
+ ResolvedLocs.push_back ({Node, NewRange, {}, None, LabelRangeType::None,
653
659
isActive (), isInSelector ()});
654
660
WasResolved = true ;
655
661
}
@@ -881,6 +887,7 @@ std::vector<CallArgInfo> swift::ide::
881
887
getCallArgInfo (SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
882
888
std::vector<CallArgInfo> InfoVec;
883
889
if (auto *TE = dyn_cast<TupleExpr>(Arg)) {
890
+ auto FirstTrailing = TE->getUnlabeledTrailingClosureIndexOfPackedArgument ();
884
891
for (size_t ElemIndex: range (TE->getNumElements ())) {
885
892
Expr *Elem = TE->getElement (ElemIndex);
886
893
if (isa<DefaultArgumentExpr>(Elem))
@@ -889,14 +896,14 @@ getCallArgInfo(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
889
896
SourceLoc LabelStart (Elem->getStartLoc ());
890
897
SourceLoc LabelEnd (LabelStart);
891
898
892
- auto NameIdentifier = TE->getElementName (ElemIndex);
893
- if (!NameIdentifier.empty ()) {
894
- LabelStart = TE->getElementNameLoc (ElemIndex);
895
- if (EndKind == LabelRangeEndAt::LabelNameOnly)
896
- LabelEnd = LabelStart.getAdvancedLoc (NameIdentifier.getLength ());
899
+ bool IsTrailingClosure = FirstTrailing && ElemIndex >= *FirstTrailing;
900
+ SourceLoc NameLoc = TE->getElementNameLoc (ElemIndex);
901
+ if (NameLoc.isValid ()) {
902
+ LabelStart = NameLoc;
903
+ if (EndKind == LabelRangeEndAt::LabelNameOnly || IsTrailingClosure) {
904
+ LabelEnd = Lexer::getLocForEndOfToken (SM, NameLoc);
905
+ }
897
906
}
898
- bool IsTrailingClosure = TE->hasTrailingClosure () &&
899
- ElemIndex == TE->getNumElements () - 1 ;
900
907
InfoVec.push_back ({getSingleNonImplicitChild (Elem),
901
908
CharSourceRange (SM, LabelStart, LabelEnd), IsTrailingClosure});
902
909
}
@@ -911,17 +918,19 @@ getCallArgInfo(SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
911
918
return InfoVec;
912
919
}
913
920
914
- std::vector<CharSourceRange> swift::ide::
921
+ std::pair<std:: vector<CharSourceRange>, Optional< unsigned > > swift::ide::
915
922
getCallArgLabelRanges (SourceManager &SM, Expr *Arg, LabelRangeEndAt EndKind) {
916
923
std::vector<CharSourceRange> Ranges;
917
924
auto InfoVec = getCallArgInfo (SM, Arg, EndKind);
918
925
919
- auto EndWithoutTrailing = std::remove_if (InfoVec.begin (), InfoVec.end (),
920
- [](CallArgInfo &Info) {
921
- return Info.IsTrailingClosure ;
922
- });
923
- std::transform (InfoVec.begin (), EndWithoutTrailing,
924
- std::back_inserter (Ranges),
926
+ Optional<unsigned > FirstTrailing;
927
+ auto I = std::find_if (InfoVec.begin (), InfoVec.end (), [](CallArgInfo &Info) {
928
+ return Info.IsTrailingClosure ;
929
+ });
930
+ if (I != InfoVec.end ())
931
+ FirstTrailing = std::distance (InfoVec.begin (), I);
932
+
933
+ std::transform (InfoVec.begin (), InfoVec.end (), std::back_inserter (Ranges),
925
934
[](CallArgInfo &Info) { return Info.LabelRange ; });
926
- return Ranges;
935
+ return { Ranges, FirstTrailing} ;
927
936
}
0 commit comments