diff --git a/lib/IDE/CodeCompletion.cpp b/lib/IDE/CodeCompletion.cpp index 1aa63d2753848..136848638cc91 100644 --- a/lib/IDE/CodeCompletion.cpp +++ b/lib/IDE/CodeCompletion.cpp @@ -2196,11 +2196,15 @@ class CompletionLookup final : public swift::VisibleDeclConsumer { // #keyPath is only available when the Objective-C runtime is. if (!Ctx.LangOpts.EnableObjCInterop) return; + // After #, this is a very likely result. When just in a String context, + // it's not. + auto semanticContext = needPound ? SemanticContextKind::None + : SemanticContextKind::ExpressionSpecific; + CodeCompletionResultBuilder Builder( Sink, CodeCompletionResult::ResultKind::Keyword, - SemanticContextKind::ExpressionSpecific, - ExpectedTypes); + semanticContext, ExpectedTypes); if (needPound) Builder.addTextChunk("#keyPath"); else diff --git a/test/IDE/complete_pound_keypath.swift b/test/IDE/complete_pound_keypath.swift index 45cafb7732d26..bdda3736b38d3 100644 --- a/test/IDE/complete_pound_keypath.swift +++ b/test/IDE/complete_pound_keypath.swift @@ -36,7 +36,7 @@ func completeInKeyPath2() { // CHECK-AFTER_POUND: Keyword/ExprSpecific: keyPath({#@objc property sequence#}); name=keyPath(@objc property sequence) -// CHECK-KEYPATH_ARG: Keyword/ExprSpecific: #keyPath({#@objc property sequence#}); name=#keyPath(@objc property sequence) +// CHECK-KEYPATH_ARG: Keyword/None: #keyPath({#@objc property sequence#}); name=#keyPath(@objc property sequence) // CHECK-IN_KEYPATH: Decl[InstanceVar]/CurrNominal: prop1[#String#]; name=prop1 // CHECK-IN_KEYPATH: Decl[InstanceVar]/CurrNominal: prop2[#ObjCClass?#]; name=prop2