@@ -40,6 +40,8 @@ namespace clang {
40
40
namespace clangd {
41
41
namespace {
42
42
43
+ using tooling::SymbolName;
44
+
43
45
std::optional<std::string> filePath (const SymbolLocation &Loc,
44
46
llvm::StringRef HintFilePath) {
45
47
if (!Loc)
@@ -591,11 +593,11 @@ bool isMatchingSelectorName(const syntax::Token &Cur, const syntax::Token &Next,
591
593
// The search will terminate upon seeing Terminator or a ; at the top level.
592
594
std::optional<SymbolRange>
593
595
findAllSelectorPieces (llvm::ArrayRef<syntax::Token> Tokens,
594
- const SourceManager &SM, Selector Sel ,
596
+ const SourceManager &SM, const SymbolName &Name ,
595
597
tok::TokenKind Terminator) {
596
598
assert (!Tokens.empty ());
597
599
598
- unsigned NumArgs = Sel. getNumArgs ();
600
+ unsigned NumArgs = Name. getNamePieces (). size ();
599
601
llvm::SmallVector<tok::TokenKind, 8 > Closes;
600
602
std::vector<Range> SelectorPieces;
601
603
for (unsigned Index = 0 , Last = Tokens.size (); Index < Last - 1 ; ++Index) {
@@ -605,12 +607,12 @@ findAllSelectorPieces(llvm::ArrayRef<syntax::Token> Tokens,
605
607
auto PieceCount = SelectorPieces.size ();
606
608
if (PieceCount < NumArgs &&
607
609
isMatchingSelectorName (Tok, Tokens[Index + 1 ], SM,
608
- Sel. getNameForSlot (PieceCount) )) {
610
+ Name. getNamePieces ()[PieceCount] )) {
609
611
// If 'foo:' instead of ':' (empty selector), we need to skip the ':'
610
612
// token after the name. We don't currently properly support empty
611
613
// selectors since we may lex them improperly due to ternary statements
612
614
// as well as don't properly support storing their ranges for edits.
613
- if (!Sel. getNameForSlot (PieceCount) .empty ())
615
+ if (!Name. getNamePieces ()[PieceCount] .empty ())
614
616
++Index;
615
617
SelectorPieces.push_back (
616
618
halfOpenToRange (SM, Tok.range (SM).toCharRange (SM)));
@@ -662,16 +664,17 @@ findAllSelectorPieces(llvm::ArrayRef<syntax::Token> Tokens,
662
664
663
665
// / Collects all ranges of the given identifier/selector in the source code.
664
666
// /
665
- // / If a selector is given, this does a full lex of the given source code in
666
- // / order to identify all selector fragments (e.g. in method exprs/decls) since
667
- // / they are non-contiguous.
668
- std::vector<SymbolRange> collectRenameIdentifierRanges (
669
- llvm::StringRef Identifier, llvm::StringRef Content,
670
- const LangOptions &LangOpts, std::optional<Selector> Selector) {
667
+ // / If `Name` is an Objective-C symbol name, this does a full lex of the given
668
+ // / source code in order to identify all selector fragments (e.g. in method
669
+ // / exprs/decls) since they are non-contiguous.
670
+ std::vector<SymbolRange>
671
+ collectRenameIdentifierRanges (const tooling::SymbolName &Name,
672
+ llvm::StringRef Content,
673
+ const LangOptions &LangOpts) {
671
674
std::vector<SymbolRange> Ranges;
672
- if (!Selector ) {
675
+ if (auto SinglePiece = Name. getSinglePiece () ) {
673
676
auto IdentifierRanges =
674
- collectIdentifierRanges (Identifier , Content, LangOpts);
677
+ collectIdentifierRanges (*SinglePiece , Content, LangOpts);
675
678
for (const auto &R : IdentifierRanges)
676
679
Ranges.emplace_back (R);
677
680
return Ranges;
@@ -685,7 +688,7 @@ std::vector<SymbolRange> collectRenameIdentifierRanges(
685
688
// parsing a method declaration or definition which isn't at the top level or
686
689
// similar looking expressions (e.g. an @selector() expression).
687
690
llvm::SmallVector<tok::TokenKind, 8 > Closes;
688
- llvm::StringRef FirstSelPiece = Selector-> getNameForSlot ( 0 ) ;
691
+ llvm::StringRef FirstSelPiece = Name. getNamePieces ()[ 0 ] ;
689
692
690
693
auto Tokens = syntax::tokenize (SM.getMainFileID (), SM, LangOpts);
691
694
unsigned Last = Tokens.size () - 1 ;
@@ -717,7 +720,7 @@ std::vector<SymbolRange> collectRenameIdentifierRanges(
717
720
// Check if we can find all the relevant selector peices starting from
718
721
// this token
719
722
auto SelectorRanges =
720
- findAllSelectorPieces (ArrayRef (Tokens).slice (Index), SM, *Selector ,
723
+ findAllSelectorPieces (ArrayRef (Tokens).slice (Index), SM, Name ,
721
724
Closes.empty () ? tok::l_brace : Closes.back ());
722
725
if (SelectorRanges)
723
726
Ranges.emplace_back (std::move (*SelectorRanges));
@@ -764,7 +767,6 @@ renameObjCMethodWithinFile(ParsedAST &AST, const ObjCMethodDecl *MD,
764
767
std::vector<SourceLocation> SelectorOccurences) {
765
768
const SourceManager &SM = AST.getSourceManager ();
766
769
auto Code = SM.getBufferData (SM.getMainFileID ());
767
- auto RenameIdentifier = MD->getSelector ().getNameForSlot (0 ).str ();
768
770
llvm::SmallVector<llvm::StringRef, 8 > NewNames;
769
771
NewName.split (NewNames, " :" );
770
772
@@ -774,7 +776,7 @@ renameObjCMethodWithinFile(ParsedAST &AST, const ObjCMethodDecl *MD,
774
776
Ranges.push_back (tokenRangeForLoc (AST, Loc, SM, LangOpts));
775
777
auto FilePath = AST.tuPath ();
776
778
auto RenameRanges = collectRenameIdentifierRanges (
777
- RenameIdentifier , Code, LangOpts, MD-> getSelector () );
779
+ SymbolName (MD-> getDeclName ()) , Code, LangOpts);
778
780
auto RenameEdit = buildRenameEdit (FilePath, Code, RenameRanges, NewNames);
779
781
if (!RenameEdit)
780
782
return error (" failed to rename in file {0}: {1}" , FilePath,
@@ -926,22 +928,14 @@ renameOutsideFile(const NamedDecl &RenameDecl, llvm::StringRef MainFilePath,
926
928
ExpBuffer.getError ().message ());
927
929
continue ;
928
930
}
929
- std::string RenameIdentifier = RenameDecl.getNameAsString ();
930
- std::optional<Selector> Selector = std::nullopt;
931
+ SymbolName RenameName (RenameDecl.getDeclName ());
931
932
llvm::SmallVector<llvm::StringRef, 8 > NewNames;
932
- if (const auto *MD = dyn_cast<ObjCMethodDecl>(&RenameDecl)) {
933
- if (MD->getSelector ().getNumArgs () > 1 ) {
934
- RenameIdentifier = MD->getSelector ().getNameForSlot (0 ).str ();
935
- Selector = MD->getSelector ();
936
- }
937
- }
938
933
NewName.split (NewNames, " :" );
939
934
940
935
auto AffectedFileCode = (*ExpBuffer)->getBuffer ();
941
- auto RenameRanges =
942
- adjustRenameRanges (AffectedFileCode, RenameIdentifier,
943
- std::move (FileAndOccurrences.second ),
944
- RenameDecl.getASTContext ().getLangOpts (), Selector);
936
+ auto RenameRanges = adjustRenameRanges (
937
+ AffectedFileCode, RenameName, std::move (FileAndOccurrences.second ),
938
+ RenameDecl.getASTContext ().getLangOpts ());
945
939
if (!RenameRanges) {
946
940
// Our heuristics fails to adjust rename ranges to the current state of
947
941
// the file, it is most likely the index is stale, so we give up the
@@ -1226,14 +1220,13 @@ llvm::Expected<Edit> buildRenameEdit(llvm::StringRef AbsFilePath,
1226
1220
// were inserted). If such a "near miss" is found, the rename is still
1227
1221
// possible
1228
1222
std::optional<std::vector<SymbolRange>>
1229
- adjustRenameRanges (llvm::StringRef DraftCode, llvm::StringRef Identifier,
1230
- std::vector<Range> Indexed, const LangOptions &LangOpts,
1231
- std::optional<Selector> Selector) {
1223
+ adjustRenameRanges (llvm::StringRef DraftCode, const tooling::SymbolName &Name,
1224
+ std::vector<Range> Indexed, const LangOptions &LangOpts) {
1232
1225
trace::Span Tracer (" AdjustRenameRanges" );
1233
1226
assert (!Indexed.empty ());
1234
1227
assert (llvm::is_sorted (Indexed));
1235
1228
std::vector<SymbolRange> Lexed =
1236
- collectRenameIdentifierRanges (Identifier , DraftCode, LangOpts, Selector );
1229
+ collectRenameIdentifierRanges (Name , DraftCode, LangOpts);
1237
1230
llvm::sort (Lexed);
1238
1231
return getMappedRanges (Indexed, Lexed);
1239
1232
}
0 commit comments