struct Tagged { let tag: Tag let entity: Entity } protocol Taggable { } extension Taggable { func tag(_ tag: Tag) -> Tagged { return Tagged(tag: tag, entity: self) } } extension Int: Taggable { } extension String: Taggable { } @resultBuilder struct TaggedBuilder { static func buildBlock() -> () { } static func buildBlock(_ t1: Tagged) -> Tagged { return t1 } static func buildBlock(_ t1: Tagged, _ t2: Tagged) -> (Tagged, Tagged) { return (t1, t2) } } enum Color { case red, green, blue } func acceptColorTagged(@TaggedBuilder body: (Color) -> Result) { print(body(.blue)) } func testAcceptColorTagged(i: Int, s: String) { acceptColorTagged { color in i.tag(color) s.tag(Color.green) } } // Custom attribute name. // RUN: %sourcekitd-test -req=cursor -pos=35:33 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=ATTR_NAME // ATTR_NAME: source.lang.swift.ref.struct (19:8-19:21) // ATTR_NAME-NEXT: TaggedBuilder // ATTR_NAME-NEXT: s:11BuilderTest06TaggedA0V // ATTR_NAME-NEXT: source.lang.swift // ATTR_NAME-NEXT: TaggedBuilder.Type // ATTR_NAME-NEXT: $s11BuilderTest06TaggedA0VyxGmD // ATTR_NAME-NEXT: BuilderTest{{$}} // ATTR_NAME-NEXT: @resultBuilder struct TaggedBuilder<Tag> // ATTR_NAME-NEXT: @resultBuilder struct TaggedBuilder<Tag> // Generic argument in attribute name. // RUN: %sourcekitd-test -req=cursor -pos=35:47 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=ATTR_GENERICARG // ATTR_GENERICARG: source.lang.swift.ref.enum (31:6-31:11) // ATTR_GENERICARG-NEXT: Color // ATTR_GENERICARG-NEXT: s:11BuilderTest5ColorO // ATTR_GENERICARG-NEXT: source.lang.swift // ATTR_GENERICARG-NEXT: Color.Type // ATTR_GENERICARG-NEXT: $s11BuilderTest5ColorOmD // ATTR_GENERICARG-NEXT: BuilderTest{{$}} // ATTR_GENERICARG-NEXT: enum Color // ATTR_GENERICARG-NEXT: enum Color // Call for function with builder. // RUN: %sourcekitd-test -req=cursor -pos=40:3 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=CALL_BUILDERFUNC // CALL_BUILDERFUNC: source.lang.swift.ref.function.free (35:6-35:78) // CALL_BUILDERFUNC-NEXT: acceptColorTagged(body:) // CALL_BUILDERFUNC-NEXT: s:11BuilderTest17acceptColorTagged4bodyyxAA0D0OXE_tlF // CALL_BUILDERFUNC-NEXT: source.lang.swift // CALL_BUILDERFUNC-NEXT: (body: (Color) -> Result) -> () // CALL_BUILDERFUNC-NEXT: $s4bodyyx11BuilderTest5ColorOXE_tcluD // CALL_BUILDERFUNC-NEXT: BuilderTest{{$}} // CALL_BUILDERFUNC-NEXT: func acceptColorTagged<Result>(@TaggedBuilder<Color> body: (Color) -> Result) // CALL_BUILDERFUNC-NEXT: func acceptColorTagged<Result>(@TaggedBuilder<Color> body: (Color) -> Result) // Closure parameter - decl-site. // RUN: %sourcekitd-test -req=cursor -pos=40:23 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=CLOSUREPARAM_DECL // CLOSUREPARAM_DECL: source.lang.swift.decl.var.parameter (40:23-40:28) // CLOSUREPARAM_DECL-NEXT: color // CLOSUREPARAM_DECL-NEXT: s:11BuilderTest21testAcceptColorTagged1i1sySi_SStFAA0F0VyAA0E0OSiG_AFyAHSSGtAHXEfU_5colorL_AHvp // CLOSUREPARAM_DECL-NEXT: source.lang.swift // CLOSUREPARAM_DECL-NEXT: Color // CLOSUREPARAM_DECL-NEXT: $s11BuilderTest5ColorOD // CLOSUREPARAM_DECL-NEXT: BuilderTest{{$}} // CLOSUREPARAM_DECL-NEXT: let color: Color // CLOSUREPARAM_DECL-NEXT: let color: Color // Closure parameter - use-site. // RUN: %sourcekitd-test -req=cursor -pos=41:11 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=CLOSUREPARAM_USER // CLOSUREPARAM_USER: source.lang.swift.ref.var.local (40:23-40:28) // CLOSUREPARAM_USER-NEXT: color // CLOSUREPARAM_USER-NEXT: s:11BuilderTest21testAcceptColorTagged1i1sySi_SStFAA0F0VyAA0E0OSiG_AFyAHSSGtAHXEfU_5colorL_AHvp // CLOSUREPARAM_USER-NEXT: source.lang.swift // CLOSUREPARAM_USER-NEXT: Color // CLOSUREPARAM_USER-NEXT: $s11BuilderTest5ColorOD // CLOSUREPARAM_USER-NEXT: BuilderTest{{$}} // CLOSUREPARAM_USER-NEXT: let color: Color // CLOSUREPARAM_USER-NEXT: let color: Color // Captured variable. // RUN: %sourcekitd-test -req=cursor -pos=41:5 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=CAPTURED_VALUE // CAPTURED_VALUE: source.lang.swift.ref.var.local (39:28-39:29) // CAPTURED_VALUE-NEXT: i // CAPTURED_VALUE-NEXT: s:11BuilderTest21testAcceptColorTagged1i1sySi_SStFACL_Sivp // CAPTURED_VALUE-NEXT: source.lang.swift // CAPTURED_VALUE-NEXT: Int // CAPTURED_VALUE-NEXT: $sSiD // CAPTURED_VALUE-NEXT: BuilderTest{{$}} // CAPTURED_VALUE-NEXT: let i: Int // CAPTURED_VALUE-NEXT: let i: Int // Method call to captured variable. // RUN: %sourcekitd-test -req=cursor -pos=41:7 %s -- %s -module-name BuilderTest | %FileCheck %s --check-prefix=CAPTURED_VALUE_METHOD // CAPTURED_VALUE_METHOD: source.lang.swift.ref.function.method.instance (10:8-10:28) // CAPTURED_VALUE_METHOD: tag(_:) // CAPTURED_VALUE_METHOD: s:11BuilderTest8TaggablePAAE3tagyAA6TaggedVyqd__xGqd__lF // CAPTURED_VALUE_METHOD: source.lang.swift // CAPTURED_VALUE_METHOD: (Self) -> (Tag) -> Tagged // CAPTURED_VALUE_METHOD: $sy11BuilderTest6TaggedVyqd__xGqd__cluD // CAPTURED_VALUE_METHOD: $sSiD // CAPTURED_VALUE_METHOD: func tag<Tag>(_ tag: Tag) -> Tagged<Tag, Int> // CAPTURED_VALUE_METHOD: func tag<Tag>(_ tag: Tag) -> Tagged<Tag, Int>