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