Skip to content

Commit ddf4a2e

Browse files
committed
[SourceKit] Return the old name from the related identifiers response
1 parent 143dccb commit ddf4a2e

File tree

6 files changed

+111
-83
lines changed

6 files changed

+111
-83
lines changed

test/SourceKit/RelatedIdents/related_idents.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ func ifLet(test: Int?) {
114114
// CHECK1-NEXT: 6:16 - 2 - source.syntacticrename.reference
115115
// CHECK1-NEXT: 9:11 - 2 - source.syntacticrename.reference
116116
// CHECK1-NEXT: END RANGES
117+
// CHECK1: NAME: C1
117118

118119
// RUN: %sourcekitd-test -req=related-idents -pos=5:9 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK2 %s
119120
// CHECK2: START RANGES
@@ -196,6 +197,7 @@ func ifLet(test: Int?) {
196197
// CHECK11-NEXT: 74:1 - 13
197198
// CHECK11-NEXT: 75:1 - 11
198199
// CHECK11-NEXT: 76:1 - 11
200+
// CHECK11: NAME: escapedName(x:)
199201

200202

201203
// RUN: %sourcekitd-test -req=related-idents -pos=79:7 %s -- -module-name related_idents %s | %FileCheck -check-prefix=CHECK12 %s

tools/SourceKit/include/SourceKit/Core/LangSupport.h

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,6 +789,18 @@ struct RelatedIdentInfo {
789789
swift::ide::RenameLocUsage Usage;
790790
};
791791

792+
/// Result of `findRelatedIdentifiersInFile`.
793+
struct RelatedIdentsResult {
794+
SmallVector<RelatedIdentInfo, 8> RelatedIdents;
795+
std::string OldName;
796+
797+
RelatedIdentsResult(SmallVector<RelatedIdentInfo, 8> RelatedIdents,
798+
std::string OldName)
799+
: RelatedIdents(RelatedIdents), OldName(OldName) {}
800+
801+
static RelatedIdentsResult empty() { return RelatedIdentsResult({}, ""); }
802+
};
803+
792804
/// Represent one branch of an if config.
793805
/// Either `#if`, `#else` or `#elseif`.
794806
struct IfConfigInfo {
@@ -1154,7 +1166,7 @@ class LangSupport {
11541166
StringRef PrimaryFilePath, StringRef InputBufferName, unsigned Offset,
11551167
bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
11561168
SourceKitCancellationToken CancellationToken,
1157-
std::function<void(const RequestResult<ArrayRef<RelatedIdentInfo>> &)>
1169+
std::function<void(const RequestResult<RelatedIdentsResult> &)>
11581170
Receiver) = 0;
11591171

11601172
virtual void findActiveRegionsInFile(

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -684,8 +684,8 @@ class SwiftLangSupport : public LangSupport {
684684
StringRef PrimaryFilePath, StringRef InputBufferName, unsigned Offset,
685685
bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
686686
SourceKitCancellationToken CancellationToken,
687-
std::function<void(const RequestResult<ArrayRef<RelatedIdentInfo>> &)>
688-
Receiver) override;
687+
std::function<void(const RequestResult<RelatedIdentsResult> &)> Receiver)
688+
override;
689689

690690
void findActiveRegionsInFile(
691691
StringRef PrimaryFilePath, StringRef InputBufferName,

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 89 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -2493,125 +2493,137 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
24932493
StringRef PrimaryFilePath, StringRef InputBufferName, unsigned Offset,
24942494
bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
24952495
SourceKitCancellationToken CancellationToken,
2496-
std::function<void(const RequestResult<ArrayRef<RelatedIdentInfo>> &)>
2497-
Receiver) {
2496+
std::function<void(const RequestResult<RelatedIdentsResult> &)> Receiver) {
24982497

24992498
std::string Error;
25002499
SwiftInvocationRef Invok =
25012500
ASTMgr->getTypecheckInvocation(Args, PrimaryFilePath, Error);
25022501
if (!Invok) {
25032502
LOG_WARN_FUNC("failed to create an ASTInvocation: " << Error);
2504-
Receiver(RequestResult<ArrayRef<RelatedIdentInfo>>::fromError(Error));
2503+
Receiver(RequestResult<RelatedIdentsResult>::fromError(Error));
25052504
return;
25062505
}
25072506

25082507
class RelatedIdConsumer : public SwiftASTConsumer {
25092508
std::string InputFile;
25102509
unsigned Offset;
2511-
std::function<void(const RequestResult<ArrayRef<RelatedIdentInfo>> &)>
2512-
Receiver;
2510+
std::function<void(const RequestResult<RelatedIdentsResult> &)> Receiver;
25132511
SwiftInvocationRef Invok;
25142512

2513+
#if SWIFT_BUILD_SWIFT_SYNTAX
2514+
// FIXME: Don't silently eat errors here.
2515+
RelatedIdentsResult getRelatedIdents(SourceFile *SrcFile,
2516+
CompilerInstance &CompInst) {
2517+
unsigned BufferID = SrcFile->getBufferID().value();
2518+
SourceLoc Loc = Lexer::getLocForStartOfToken(CompInst.getSourceMgr(),
2519+
BufferID, Offset);
2520+
if (Loc.isInvalid())
2521+
return RelatedIdentsResult::empty();
2522+
2523+
SourceManager &SrcMgr = CompInst.getASTContext().SourceMgr;
2524+
2525+
ResolvedCursorInfoPtr CursorInfo =
2526+
evaluateOrDefault(CompInst.getASTContext().evaluator,
2527+
CursorInfoRequest{CursorInfoOwner(SrcFile, Loc)},
2528+
new ResolvedCursorInfo());
2529+
auto ValueRefCursorInfo =
2530+
dyn_cast<ResolvedValueRefCursorInfo>(CursorInfo);
2531+
if (!ValueRefCursorInfo)
2532+
return RelatedIdentsResult::empty();
2533+
if (ValueRefCursorInfo->isKeywordArgument())
2534+
return RelatedIdentsResult::empty();
2535+
2536+
ValueDecl *VD = ValueRefCursorInfo->typeOrValue();
2537+
if (!VD)
2538+
return RelatedIdentsResult::empty(); // This was a module reference.
2539+
2540+
// Only accept pointing to an identifier.
2541+
if (!ValueRefCursorInfo->isRef() &&
2542+
(isa<ConstructorDecl>(VD) || isa<DestructorDecl>(VD) ||
2543+
isa<SubscriptDecl>(VD)))
2544+
return RelatedIdentsResult::empty();
2545+
if (VD->isOperator())
2546+
return RelatedIdentsResult::empty();
2547+
2548+
llvm::Optional<RenameInfo> Info = getRenameInfo(CursorInfo);
2549+
2550+
if (!Info) {
2551+
return RelatedIdentsResult::empty();
2552+
}
2553+
2554+
RenameLocs Locs = localRenameLocs(SrcFile, Info->VD);
2555+
2556+
std::string OldName = Locs.getLocations().front().OldName.str();
2557+
#ifndef NDEBUG
2558+
for (auto loc : Locs.getLocations()) {
2559+
assert(loc.OldName == OldName &&
2560+
"Found related identfiers with different names?");
2561+
}
2562+
#endif
2563+
2564+
// Ignore any errors produced by `resolveRenameLocations` since, if some
2565+
// symbol failed to resolve, we still want to return all the other
2566+
// symbols. This makes related idents more fault-tolerant.
2567+
DiagnosticEngine Diags(SrcMgr);
2568+
2569+
std::vector<ResolvedLoc> ResolvedLocs = resolveRenameLocations(
2570+
Locs.getLocations(), /*NewName=*/StringRef(), *SrcFile, Diags);
2571+
2572+
SmallVector<RelatedIdentInfo, 8> Ranges;
2573+
assert(ResolvedLocs.size() == Locs.getLocations().size());
2574+
for (auto [RenameLoc, ResolvedLoc] :
2575+
llvm::zip_equal(Locs.getLocations(), ResolvedLocs)) {
2576+
if (ResolvedLoc.range.isInvalid()) {
2577+
continue;
2578+
}
2579+
unsigned Offset =
2580+
SrcMgr.getLocOffsetInBuffer(ResolvedLoc.range.getStart(), BufferID);
2581+
Ranges.push_back(
2582+
{Offset, ResolvedLoc.range.getByteLength(), RenameLoc.Usage});
2583+
}
2584+
2585+
return RelatedIdentsResult(Ranges, OldName);
2586+
}
2587+
#endif
2588+
25152589
public:
25162590
RelatedIdConsumer(
25172591
StringRef InputFile, unsigned Offset,
2518-
std::function<void(const RequestResult<ArrayRef<RelatedIdentInfo>> &)>
2592+
std::function<void(const RequestResult<RelatedIdentsResult> &)>
25192593
Receiver,
25202594
SwiftInvocationRef Invok)
25212595
: InputFile(InputFile.str()), Offset(Offset),
25222596
Receiver(std::move(Receiver)), Invok(Invok) {}
25232597

2524-
// FIXME: Don't silently eat errors here.
25252598
void handlePrimaryAST(ASTUnitRef AstUnit) override {
2526-
using ResultType = RequestResult<ArrayRef<RelatedIdentInfo>>;
2599+
using ResultType = RequestResult<RelatedIdentsResult>;
25272600
#if !SWIFT_BUILD_SWIFT_SYNTAX
2528-
Receiver(
2529-
ResultType::fromError("relatedidents is not supported because "
2530-
"sourcekitd was built without swift-syntax"));
2601+
ResultType::fromError(
2602+
"relatedidents is not supported because sourcekitd was built without "
2603+
"swift-syntax");
25312604
return;
25322605
#else
25332606
auto &CompInst = AstUnit->getCompilerInstance();
25342607

25352608
auto *SrcFile = retrieveInputFile(InputFile, CompInst);
25362609
if (!SrcFile) {
2537-
Receiver(RequestResult<ArrayRef<RelatedIdentInfo>>::fromError(
2610+
Receiver(RequestResult<RelatedIdentsResult>::fromError(
25382611
"Unable to find input file"));
25392612
return;
25402613
}
25412614

2542-
SmallVector<RelatedIdentInfo, 8> Ranges;
2543-
2544-
auto Action = [&]() {
2545-
unsigned BufferID = SrcFile->getBufferID().value();
2546-
SourceLoc Loc =
2547-
Lexer::getLocForStartOfToken(CompInst.getSourceMgr(), BufferID, Offset);
2548-
if (Loc.isInvalid())
2549-
return;
2550-
2551-
SourceManager &SrcMgr = CompInst.getASTContext().SourceMgr;
2552-
2553-
ResolvedCursorInfoPtr CursorInfo =
2554-
evaluateOrDefault(CompInst.getASTContext().evaluator,
2555-
CursorInfoRequest{CursorInfoOwner(SrcFile, Loc)},
2556-
new ResolvedCursorInfo());
2557-
auto ValueRefCursorInfo =
2558-
dyn_cast<ResolvedValueRefCursorInfo>(CursorInfo);
2559-
if (!ValueRefCursorInfo)
2560-
return;
2561-
if (ValueRefCursorInfo->isKeywordArgument())
2562-
return;
2563-
2564-
ValueDecl *VD = ValueRefCursorInfo->typeOrValue();
2565-
if (!VD)
2566-
return; // This was a module reference.
2567-
2568-
// Only accept pointing to an identifier.
2569-
if (!ValueRefCursorInfo->isRef() &&
2570-
(isa<ConstructorDecl>(VD) || isa<DestructorDecl>(VD) ||
2571-
isa<SubscriptDecl>(VD)))
2572-
return;
2573-
if (VD->isOperator())
2574-
return;
2575-
2576-
llvm::Optional<RenameInfo> Info = getRenameInfo(CursorInfo);
2577-
2578-
if (!Info) {
2579-
return;
2580-
}
2581-
2582-
RenameLocs Locs = localRenameLocs(SrcFile, Info->VD);
2583-
2584-
// Ignore any errors produced by `resolveRenameLocations` since, if some
2585-
// symbol failed to resolve, we still want to return all the other
2586-
// symbols. This makes related idents more fault-tolerant.
2587-
DiagnosticEngine Diags(SrcMgr);
2588-
2589-
std::vector<ResolvedLoc> ResolvedLocs = resolveRenameLocations(
2590-
Locs.getLocations(), /*NewName=*/StringRef(), *SrcFile, Diags);
2591-
2592-
assert(ResolvedLocs.size() == Locs.getLocations().size());
2593-
for (auto ResolvedLoc : ResolvedLocs) {
2594-
if (ResolvedLoc.range.isInvalid()) {
2595-
continue;
2596-
}
2597-
unsigned Offset = SrcMgr.getLocOffsetInBuffer(
2598-
ResolvedLoc.range.getStart(), BufferID);
2599-
Ranges.push_back(
2600-
{Offset, ResolvedLoc.range.getByteLength(), RenameLoc.Usage});
2601-
}
2602-
};
2603-
Action();
2604-
Receiver(ResultType::fromResult(Ranges));
2615+
RelatedIdentsResult Result = getRelatedIdents(SrcFile, CompInst);
2616+
Receiver(ResultType::fromResult(Result));
26052617
#endif
26062618
}
26072619

26082620
void cancelled() override {
2609-
Receiver(RequestResult<ArrayRef<RelatedIdentInfo>>::cancelled());
2621+
Receiver(RequestResult<RelatedIdentsResult>::cancelled());
26102622
}
26112623

26122624
void failed(StringRef Error) override {
26132625
LOG_WARN_FUNC("related idents failed: " << Error);
2614-
Receiver(RequestResult<ArrayRef<RelatedIdentInfo>>::fromError(Error));
2626+
Receiver(RequestResult<RelatedIdentsResult>::fromError(Error));
26152627
}
26162628

26172629
static CaseStmt *getCaseStmtOfCanonicalVar(Decl *D) {

tools/SourceKit/tools/sourcekitd-test/sourcekitd-test.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2462,6 +2462,7 @@ static void printRelatedIdents(sourcekitd_variant_t Info, StringRef Filename,
24622462
<< sourcekitd_uid_get_string_ptr(Usage) << '\n';
24632463
}
24642464
OS << "END RANGES\n";
2465+
OS << "NAME: " << sourcekitd_variant_dictionary_get_string(Info, KeyName);
24652466
}
24662467

24672468
static void printActiveRegions(sourcekitd_variant_t Info, StringRef Filename,

tools/SourceKit/tools/sourcekitd/lib/Service/Requests.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2881,22 +2881,23 @@ static void findRelatedIdents(StringRef PrimaryFilePath,
28812881
Lang.findRelatedIdentifiersInFile(
28822882
PrimaryFilePath, InputBufferName, Offset, CancelOnSubsequentRequest, Args,
28832883
CancellationToken,
2884-
[Rec](const RequestResult<ArrayRef<RelatedIdentInfo>> &Result) {
2884+
[Rec](const RequestResult<RelatedIdentsResult> &Result) {
28852885
if (Result.isCancelled())
28862886
return Rec(createErrorRequestCancelled());
28872887
if (Result.isError())
28882888
return Rec(createErrorRequestFailed(Result.getError()));
28892889

2890-
const ArrayRef<RelatedIdentInfo> &Info = Result.value();
2890+
const RelatedIdentsResult &Info = Result.value();
28912891

28922892
ResponseBuilder RespBuilder;
28932893
auto Arr = RespBuilder.getDictionary().setArray(KeyResults);
2894-
for (auto R : Info) {
2894+
for (auto R : Info.RelatedIdents) {
28952895
auto Elem = Arr.appendDictionary();
28962896
Elem.set(KeyOffset, R.Offset);
28972897
Elem.set(KeyLength, R.Length);
28982898
Elem.set(KeyNameType, renameLocUsageUID(R.Usage));
28992899
}
2900+
RespBuilder.getDictionary().set(KeyName, Info.OldName);
29002901

29012902
Rec(RespBuilder.createResponse());
29022903
});

0 commit comments

Comments
 (0)