Skip to content

Commit 1c3f362

Browse files
committed
[Code completion] For a Selector argument, provide #selector(<#objc method#>).
1 parent 634acb4 commit 1c3f362

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1985,7 +1985,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
19851985
Builder.addRightParen();
19861986
}
19871987

1988-
void addPoundSelector() {
1988+
void addPoundSelector(bool needPound) {
19891989
// #selector is only available when the Objective-C runtime is.
19901990
if (!Ctx.LangOpts.EnableObjCInterop) return;
19911991

@@ -1994,7 +1994,10 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
19941994
CodeCompletionResult::ResultKind::Keyword,
19951995
SemanticContextKind::ExpressionSpecific,
19961996
ExpectedTypes);
1997-
Builder.addTextChunk("selector");
1997+
if (needPound)
1998+
Builder.addTextChunk("#selector");
1999+
else
2000+
Builder.addTextChunk("selector");
19982001
Builder.addLeftParen();
19992002
Builder.addSimpleTypedParameter("@objc method", /*isVarArg=*/false);
20002003
Builder.addRightParen();
@@ -3152,6 +3155,19 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
31523155
}
31533156

31543157
addValueLiteralCompletions();
3158+
3159+
// If the expected type is ObjectiveC.Selector, add #selector.
3160+
if (Ctx.LangOpts.EnableObjCInterop) {
3161+
for (auto T : ExpectedTypes) {
3162+
if (auto structDecl = T->getStructOrBoundGenericStruct()) {
3163+
if (structDecl->getName() == Ctx.Id_Selector &&
3164+
structDecl->getParentModule()->getName() == Ctx.Id_ObjectiveC) {
3165+
addPoundSelector(/*needPound=*/true);
3166+
break;
3167+
}
3168+
}
3169+
}
3170+
}
31553171
}
31563172

31573173
struct LookupByName : public swift::VisibleDeclConsumer {
@@ -4584,7 +4600,7 @@ void CodeCompletionCallbacksImpl::doneParsing() {
45844600

45854601
case CompletionKind::AfterPound: {
45864602
Lookup.addPoundAvailable(ParentStmtKind);
4587-
Lookup.addPoundSelector();
4603+
Lookup.addPoundSelector(/*needPound=*/false);
45884604
break;
45894605
}
45904606
}
Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,26 @@
1-
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=AFTER_POUND | FileCheck %s
1+
// RUN: %target-swift-ide-test(mock-sdk: %clang-importer-sdk) -code-completion -source-filename %s -code-completion-token=AFTER_POUND | FileCheck -check-prefix=CHECK-AFTER_POUND %s
2+
3+
// RUN: %target-swift-ide-test(mock-sdk: %clang-importer-sdk) -code-completion -source-filename %s -code-completion-token=SELECTOR_ARG1 | FileCheck -check-prefix=CHECK-SELECTOR_ARG %s
4+
5+
// RUN: %target-swift-ide-test(mock-sdk: %clang-importer-sdk) -code-completion -source-filename %s -code-completion-token=SELECTOR_ARG2 | FileCheck -check-prefix=CHECK-SELECTOR_ARG %s
26

37
// REQUIRES: objc_interop
48

9+
import Foundation
10+
511
{
612
if ##^AFTER_POUND^#
713
}
814

9-
// CHECK: Keyword/ExprSpecific: available({#Platform...#}, *); name=available(Platform..., *)
10-
// CHECK: Keyword/ExprSpecific: selector({#@objc method#}); name=selector(@objc method)
15+
func selectorArg1(obj: NSObject) {
16+
obj.doSelector(#^SELECTOR_ARG1^#
17+
}
18+
19+
func selectorArg2(obj: NSObject) {
20+
obj.messageSomeObject(obj, selector:#^SELECTOR_ARG2^#
21+
}
22+
23+
// CHECK-AFTER_POUND: Keyword/ExprSpecific: available({#Platform...#}, *); name=available(Platform..., *)
24+
// CHECK-AFTER_POUND: Keyword/ExprSpecific: selector({#@objc method#}); name=selector(@objc method)
25+
26+
// CHECK-SELECTOR_ARG: Keyword/ExprSpecific: #selector({#@objc method#}); name=#selector(@objc method)

test/Inputs/clang-importer-sdk/usr/include/Foundation.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,3 +992,7 @@ int variadicFunc2(int A, ...);
992992

993993
extern NSString *NSGlobalConstant;
994994
extern void NSGlobalFunction(void);
995+
996+
@interface NSObject (Selectors)
997+
-(void)messageSomeObject:(nonnull id)object selector:(SEL)selector;
998+
@end

0 commit comments

Comments
 (0)