Skip to content

Commit ce957a7

Browse files
committed
[CodeCompletion] Provide argument label completions inside #externalMacro
rdar://108163809 rdar://108681394
1 parent 237c70e commit ce957a7

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

lib/Sema/TypeCheckMacros.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,13 @@ MacroDefinition MacroDefinitionRequest::evaluate(
193193
free(replacements);
194194
};
195195

196+
if (checkResult < 0 && ctx.CompletionCallback) {
197+
// If the macro failed to check and we are in code completion mode, pretend
198+
// it's an arbitrary macro. This allows us to get call argument completions
199+
// inside `#externalMacro`.
200+
checkResult = BridgedMacroDefinitionKind::BridgedExpandedMacro;
201+
}
202+
196203
if (checkResult < 0)
197204
return MacroDefinition::forInvalid();
198205

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,22 @@
1+
// REQUIRES: swift_swift_parser
12
// RUN: %empty-directory(%t)
23
// RUN: %target-swift-ide-test -batch-code-completion -source-filename %s -filecheck %raw-FileCheck -completion-output-dir %t
34

45
let globalVar = 1
56
macro expect(file: Int = #^DEFAULT_ARG^#) = #externalMacro(module: "MyModule", type: "MyMacro")
6-
77
// DEFAULT_ARG: Decl[GlobalVar]/CurrModule/TypeRelation[Convertible]: globalVar[#Int#]; name=globalVar
8+
9+
@freestanding(expression)
10+
macro externalMacro() = ##^EXTERNAL_MACRO^#externalMacro
11+
// EXTERNAL_MACRO: Decl[Macro]/OtherModule[Swift]/IsSystem: externalMacro({#module: String#}, {#type: String#})[#T#]; name=externalMacro(module:type:)
12+
13+
@freestanding(expression)
14+
macro externalMacroWithTrailing() = ##^EXTERNAL_MACRO_WITH_TRAILING?check=EXTERNAL_MACRO^#externalMacro
15+
16+
@freestanding(expression)
17+
macro externalMacroCallPattern() = #externalMacro(#^EXTERNAL_MACRO_CALL_PATTERN^#)
18+
// EXTERNAL_MACRO_CALL_PATTERN: Pattern/None/Flair[ArgLabels]/TypeRelation[Convertible]: ['(']{#module: String#}, {#type: String#}[')'][#Void#]; name=module:type:
19+
20+
@freestanding(expression)
21+
macro externalMacroCallPattern() = #externalMacro(module: "MyModule", #^EXTERNAL_MACRO_TYPE_ARG_LABEL^#)
22+
// EXTERNAL_MACRO_TYPE_ARG_LABEL: Pattern/Local/Flair[ArgLabels]: {#type: String#}[#String#]; name=type:

0 commit comments

Comments
 (0)