Skip to content

Commit d0edff3

Browse files
committed
[SourceKit] Allow references to non-editable base names to be returned by the related identifiers request
While we don't want to return non-editable base names for Edit-All-In-Scope, we do want to return them if the related identifiers response is used as the input for find-syntactic-rename-ranges.
1 parent b8859d6 commit d0edff3

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,10 +1162,19 @@ class LangSupport {
11621162
SourceKitCancellationToken CancellationToken,
11631163
std::function<void(const RequestResult<CursorInfoData> &)> Receiver) = 0;
11641164

1165+
/// - Parameters:
1166+
/// - IncludeNonEditableBaseNames: If `true` also return results if the
1167+
/// referenced declaration is an initializer or subscript. This is
1168+
/// intended if the related identifiers response is used for rename, which
1169+
/// allows renaming parameter labels of these declaration.
1170+
/// If the function's base name should be highlighted, this should be
1171+
/// `false` because e.g. highlighting a subscript with
1172+
/// `IncludeNonEditableBaseNames = true` would return the locations of all
1173+
/// `[` that call that subscript.
11651174
virtual void findRelatedIdentifiersInFile(
11661175
StringRef PrimaryFilePath, StringRef InputBufferName, unsigned Offset,
1167-
bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
1168-
SourceKitCancellationToken CancellationToken,
1176+
bool IncludeNonEditableBaseNames, bool CancelOnSubsequentRequest,
1177+
ArrayRef<const char *> Args, SourceKitCancellationToken CancellationToken,
11691178
std::function<void(const RequestResult<RelatedIdentsResult> &)>
11701179
Receiver) = 0;
11711180

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -682,8 +682,8 @@ class SwiftLangSupport : public LangSupport {
682682

683683
void findRelatedIdentifiersInFile(
684684
StringRef PrimaryFilePath, StringRef InputBufferName, unsigned Offset,
685-
bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
686-
SourceKitCancellationToken CancellationToken,
685+
bool IncludeNonEditableBaseNames, bool CancelOnSubsequentRequest,
686+
ArrayRef<const char *> Args, SourceKitCancellationToken CancellationToken,
687687
std::function<void(const RequestResult<RelatedIdentsResult> &)> Receiver)
688688
override;
689689

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2491,8 +2491,8 @@ SwiftLangSupport::findUSRRange(StringRef DocumentName, StringRef USR) {
24912491

24922492
void SwiftLangSupport::findRelatedIdentifiersInFile(
24932493
StringRef PrimaryFilePath, StringRef InputBufferName, unsigned Offset,
2494-
bool CancelOnSubsequentRequest, ArrayRef<const char *> Args,
2495-
SourceKitCancellationToken CancellationToken,
2494+
bool IncludeNonEditableBaseNames, bool CancelOnSubsequentRequest,
2495+
ArrayRef<const char *> Args, SourceKitCancellationToken CancellationToken,
24962496
std::function<void(const RequestResult<RelatedIdentsResult> &)> Receiver) {
24972497

24982498
std::string Error;
@@ -2507,6 +2507,7 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
25072507
class RelatedIdConsumer : public SwiftASTConsumer {
25082508
std::string InputFile;
25092509
unsigned Offset;
2510+
bool IncludeNonEditableBaseNames;
25102511
std::function<void(const RequestResult<RelatedIdentsResult> &)> Receiver;
25112512
SwiftInvocationRef Invok;
25122513

@@ -2538,7 +2539,7 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
25382539
return RelatedIdentsResult::empty(); // This was a module reference.
25392540

25402541
// Only accept pointing to an identifier.
2541-
if (!ValueRefCursorInfo->isRef() &&
2542+
if (!IncludeNonEditableBaseNames && !ValueRefCursorInfo->isRef() &&
25422543
(isa<ConstructorDecl>(VD) || isa<DestructorDecl>(VD) ||
25432544
isa<SubscriptDecl>(VD)))
25442545
return RelatedIdentsResult::empty();
@@ -2589,11 +2590,12 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
25892590

25902591
public:
25912592
RelatedIdConsumer(
2592-
StringRef InputFile, unsigned Offset,
2593+
StringRef InputFile, unsigned Offset, bool IncludeNonEditableBaseNames,
25932594
std::function<void(const RequestResult<RelatedIdentsResult> &)>
25942595
Receiver,
25952596
SwiftInvocationRef Invok)
25962597
: InputFile(InputFile.str()), Offset(Offset),
2598+
IncludeNonEditableBaseNames(IncludeNonEditableBaseNames),
25972599
Receiver(std::move(Receiver)), Invok(Invok) {}
25982600

25992601
void handlePrimaryAST(ASTUnitRef AstUnit) override {
@@ -2638,8 +2640,8 @@ void SwiftLangSupport::findRelatedIdentifiersInFile(
26382640
}
26392641
};
26402642

2641-
auto Consumer = std::make_shared<RelatedIdConsumer>(InputBufferName, Offset,
2642-
Receiver, Invok);
2643+
auto Consumer = std::make_shared<RelatedIdConsumer>(
2644+
InputBufferName, Offset, IncludeNonEditableBaseNames, Receiver, Invok);
26432645
/// FIXME: When request cancellation is implemented and Xcode adopts it,
26442646
/// don't use 'OncePerASTToken'.
26452647
static const char OncePerASTToken = 0;

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ static void reportNameInfo(const RequestResult<NameTranslatingInfo> &Result, Res
212212
213213
static void findRelatedIdents(StringRef PrimaryFilePath,
214214
StringRef InputBufferName, int64_t Offset,
215+
bool IncludeNonEditableBaseNames,
215216
bool CancelOnSubsequentRequest,
216217
ArrayRef<const char *> Args,
217218
SourceKitCancellationToken CancellationToken,
@@ -1787,14 +1788,18 @@ handleRequestRelatedIdents(const RequestDict &Req,
17871788
if (Req.getInt64(KeyOffset, Offset, /*isOptional=*/false))
17881789
return Rec(createErrorRequestInvalid("missing 'key.offset'"));
17891790
1791+
int64_t IncludeNonEditableBaseNames = 0;
1792+
Req.getInt64(KeyIncludeNonEditableBaseNames, IncludeNonEditableBaseNames,
1793+
/*isOptional=*/true);
1794+
17901795
// For backwards compatibility, the default is 1.
17911796
int64_t CancelOnSubsequentRequest = 1;
17921797
Req.getInt64(KeyCancelOnSubsequentRequest, CancelOnSubsequentRequest,
17931798
/*isOptional=*/true);
17941799
1795-
return findRelatedIdents(*PrimaryFilePath, InputBufferName, Offset,
1796-
CancelOnSubsequentRequest, Args, CancellationToken,
1797-
Rec);
1800+
return findRelatedIdents(
1801+
*PrimaryFilePath, InputBufferName, Offset, IncludeNonEditableBaseNames,
1802+
CancelOnSubsequentRequest, Args, CancellationToken, Rec);
17981803
});
17991804
}
18001805
@@ -2873,14 +2878,15 @@ static sourcekitd_uid_t renameLocUsageUID(swift::ide::RenameLocUsage Usage) {
28732878

28742879
static void findRelatedIdents(StringRef PrimaryFilePath,
28752880
StringRef InputBufferName, int64_t Offset,
2881+
bool IncludeNonEditableBaseNames,
28762882
bool CancelOnSubsequentRequest,
28772883
ArrayRef<const char *> Args,
28782884
SourceKitCancellationToken CancellationToken,
28792885
ResponseReceiver Rec) {
28802886
LangSupport &Lang = getGlobalContext().getSwiftLangSupport();
28812887
Lang.findRelatedIdentifiersInFile(
2882-
PrimaryFilePath, InputBufferName, Offset, CancelOnSubsequentRequest, Args,
2883-
CancellationToken,
2888+
PrimaryFilePath, InputBufferName, Offset, IncludeNonEditableBaseNames,
2889+
CancelOnSubsequentRequest, Args, CancellationToken,
28842890
[Rec](const RequestResult<RelatedIdentsResult> &Result) {
28852891
if (Result.isCancelled())
28862892
return Rec(createErrorRequestCancelled());

utils/gyb_sourcekit_support/UIDs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def __init__(self, internal_name, external_name):
146146
KEY('Simplified', 'key.simplified'),
147147
KEY('RangeContent', 'key.rangecontent'),
148148
KEY('CancelOnSubsequentRequest', 'key.cancel_on_subsequent_request'),
149+
KEY('IncludeNonEditableBaseNames', 'key.include_non_editable_base_names'),
149150
KEY('RenameLocations', 'key.renamelocations'),
150151
KEY('Locations', 'key.locations'),
151152
KEY('NameType', 'key.nametype'),

0 commit comments

Comments
 (0)