mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Replace with an ASTScope lookup. This also lets us simplify UsableFilteringDeclConsumer, and fixes a couple of completion bugs.
97 lines
4.2 KiB
Swift
97 lines
4.2 KiB
Swift
// REQUIRES: swift_swift_parser
|
|
|
|
// RUN: %empty-directory(%t)
|
|
// RUN: mkdir -p %t/plugins
|
|
|
|
//##-- Prepare the macro plugin.
|
|
// RUN: %host-build-swift -swift-version 5 -emit-library -o %t/plugins/%target-library-name(MacroDefinition) -module-name=MacroDefinition %S/../Macros/Inputs/syntax_macro_definitions.swift -g -no-toolchain-stdlib-rpath
|
|
|
|
// RUN: %target-swift-ide-test -batch-code-completion -source-filename %s -filecheck %raw-FileCheck -completion-output-dir %t -plugin-path %t/plugins -parse-as-library
|
|
|
|
@freestanding(declaration, names: named(A), named(B), named(foo), named(addOne))
|
|
macro defineDeclsWithKnownNames() = #externalMacro(module: "MacroDefinition", type: "DefineDeclsWithKnownNamesMacro")
|
|
|
|
@attached(peer, names: suffixed(_peer))
|
|
macro PeerWithSuffix() = #externalMacro(module: "MacroDefinition", type: "PeerValueWithSuffixNameMacro")
|
|
|
|
@attached(peer, names: arbitrary)
|
|
macro PeerWithSuffixAsArbitrary() = #externalMacro(module: "MacroDefinition", type: "PeerValueWithSuffixNameMacro")
|
|
|
|
@freestanding(declaration, names: arbitrary)
|
|
macro VarValueDecl() = #externalMacro(module: "MacroDefinition", type: "VarValueMacro")
|
|
|
|
|
|
#defineDeclsWithKnownNames
|
|
|
|
@PeerWithSuffix
|
|
func globalFunc() {}
|
|
|
|
func test() {
|
|
#^GLOBAL^#
|
|
// GLOBAL-DAG: Decl[Struct]/CurrModule: A[#A#]; name=A
|
|
// GLOBAL-DAG: Decl[Struct]/CurrModule: B[#B#]; name=B
|
|
// GLOBAL-DAG: Decl[GlobalVar]/CurrModule: foo[#Int#]; name=foo
|
|
// GLOBAL-DAG: Decl[GlobalVar]/CurrModule: addOne[#(Int) -> Int#]; name=addOne
|
|
// GLOBAL-DAG: Decl[FreeFunction]/CurrModule: globalFunc()[#Void#]; name=globalFunc()
|
|
// GLOBAL-DAG: Decl[GlobalVar]/CurrModule: globalFunc_peer[#Int#]; name=globalFunc_peer
|
|
}
|
|
|
|
struct MyStruct {
|
|
@PeerWithSuffix
|
|
func instanceMethod() {}
|
|
|
|
@PeerWithSuffix
|
|
static func staticMethod() {}
|
|
|
|
@PeerWithSuffixAsArbitrary
|
|
func forArbitrary() {}
|
|
|
|
#defineDeclsWithKnownNames
|
|
|
|
#VarValueDecl
|
|
}
|
|
|
|
func testMemberInstance(value: MyStruct) {
|
|
value.#^MEMBER_INSTANCE^#
|
|
// MEMBER_INSTANCE-DAG: Keyword[self]/CurrNominal: self[#MyStruct#]; name=self
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceMethod]/CurrNominal: instanceMethod()[#Void#]; name=instanceMethod()
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceVar]/CurrNominal: instanceMethod_peer[#Int#]; name=instanceMethod_peer
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceVar]/CurrNominal: staticMethod_peer[#Int#]; name=staticMethod_peer
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceMethod]/CurrNominal: forArbitrary()[#Void#]; name=forArbitrary()
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceVar]/CurrNominal: forArbitrary_peer[#Int#]; name=forArbitrary_peer
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceVar]/CurrNominal: foo[#Int#]; name=foo
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceVar]/CurrNominal: addOne[#(Int) -> Int#]; name=addOne
|
|
// MEMBER_INSTANCE-DAG: Decl[InstanceVar]/CurrNominal: value[#Int#]; name=value
|
|
// NOTE: 'staticMethod_peer' is a instance var because the macro emits the decl without 'static'
|
|
}
|
|
|
|
func testMemberStatic() {
|
|
MyStruct.#^MEMBER_STATIC^#
|
|
// MEMBER_STATIC-NOT: _peer
|
|
// MEMBER_STATIC-DAG: Keyword[self]/CurrNominal: self[#MyStruct.Type#]; name=self
|
|
// MEMBER_STATIC-DAG: Keyword/CurrNominal: Type[#MyStruct.Type#]; name=Type
|
|
// MEMBER_STATIC-DAG: Decl[Struct]/CurrNominal: A[#MyStruct.A#]; name=A
|
|
// MEMBER_STATIC-DAG: Decl[Struct]/CurrNominal: B[#MyStruct.B#]; name=B
|
|
// MEMBER_STATIC-DAG: Decl[InstanceMethod]/CurrNominal: instanceMethod({#(self): MyStruct#})[#() -> Void#]; name=instanceMethod(:)
|
|
// MEMBER_STATIC-DAG: Decl[StaticMethod]/CurrNominal: staticMethod()[#Void#]; name=staticMethod()
|
|
// MEMBER_STATIC-NOT: _peer
|
|
}
|
|
|
|
func testLocal() {
|
|
#defineDeclsWithKnownNames
|
|
|
|
@PeerWithSuffix func localFunc() {}
|
|
|
|
do {
|
|
#^LOCAL?check=LOCAL;check=LOCAL_MACRO^#
|
|
// LOCAL-DAG: Decl[FreeFunction]/Local: localFunc()[#Void#]; name=localFunc()
|
|
|
|
// Local macros cannot introduce peer decls, so make sure they don't show up.
|
|
// LOCAL_MACRO-NOT: Decl[LocalVar]/Local: localFunc_peer[#Int#]; name=localFunc_peer
|
|
// LOCAL_MACRO-NOT: Decl[Struct]/Local: A[#A#]; name=A
|
|
// LOCAL_MACRO-NOT: Decl[Struct]/Local: B[#B#]; name=B
|
|
// LOCAL_MACRO-NOT: Decl[LocalVar]/Local: foo[#Int#]; name=foo
|
|
// LOCAL_MACRO-NOT: Decl[LocalVar]/Local: addOne[#(Int) -> Int#]; name=addOne
|
|
}
|
|
}
|