1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
|
struct Point {
var x: Int
var y: Int
}
struct Rectangle {
var topLeft: Point
var bottomRight: Point
}
@dynamicMemberLookup
struct Lens<T> {
var obj: T
init(_ obj: T) {
self.obj = obj
}
subscript<U>(dynamicMember member: WritableKeyPath<T, U>) -> Lens<U> {
get { return Lens<U>(obj[keyPath: member]) }
set { obj[keyPath: member] = newValue.obj }
}
}
func test(r: Lens<Rectangle>) {
_ = r.topLeft
_ = r.bottomRight.y
}
func keyPathTester<V>(keyPath: KeyPath<Lens<Rectangle>, V>) {}
func testKeyPath() {
keyPathTester(keyPath: \.topLeft)
}
// RUN: %sourcekitd-test -req=cursor -pos=18:3 -cursor-action %s -- %s | %FileCheck -check-prefix=SUBSCRIPT %s
// SUBSCRIPT: source.lang.swift.decl.function.subscript (18:3-18:12)
// SUBSCRIPT: subscript(dynamicMember:)
// SUBSCRIPT: <T, U> (dynamicMember: WritableKeyPath<T, U>) -> Lens<U>
// SUBSCRIPT: ACTIONS BEGIN
// FIXME: should not allow rename since that would break the contract.
// SUBSCRIPT: source.refactoring.kind.rename.global
// SUBSCRIPT: ACTIONS END
// RUN: %sourcekitd-test -req=cursor -pos=25:9 -cursor-action %s -- %s | %FileCheck -check-prefix=TOP_LEFT %s
// TOP_LEFT: source.lang.swift.ref.var.instance
// TOP_LEFT: topLeft
// TOP_LEFT: Point
// TOP_LEFT: <decl.var.instance><syntaxtype.keyword>var</syntaxtype.keyword> <decl.name>topLeft</decl.name>: <decl.var.type><ref.struct usr="{{s:.*}}">Point</ref.struct></decl.var.type></decl.var.instance>
// TOP_LEVEL: ACTIONS BEGIN
// TOP_LEVEL: source.refactoring.kind.rename.global
// TOP_LEVEL: ACTIONS END
// RUN: %sourcekitd-test -req=cursor -pos=26:9 -cursor-action %s -- %s | %FileCheck -check-prefix=BOTTOM_RIGHT %s
// BOTTOM_RIGHT: source.lang.swift.ref.var.instance
// BOTTOM_RIGHT: bottomRight
// BOTTOM_RIGHT: Point
// BOTTOM_RIGHT: ACTIONS BEGIN
// BOTTOM_RIGHT: source.refactoring.kind.rename.global
// BOTTOM_RIGHT: ACTIONS END
/// RUN: %sourcekitd-test -req=cursor -pos=26:21 -cursor-action %s -- %s | %FileCheck -check-prefix=YREF %s
// YREF: source.lang.swift.ref.var.instance
// YREF: y
// YREF: Int
// YREF: <decl.var.instance><syntaxtype.keyword>var</syntaxtype.keyword> <decl.name>y</decl.name>: <decl.var.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.type></decl.var.instance>
// YREF: ACTIONS BEGIN
// YREF: source.refactoring.kind.rename.global
// YREF: ACTIONS END
// RUN: %sourcekitd-test -req=cursor -pos=32:28 -cursor-action %s -- %s | %FileCheck -check-prefix=KEYPATH %s
// KEYPATH: source.lang.swift.ref.var.instance
// KEYPATH: topLeft
// KEYPATH: Point
// KEYPATH: ACTIONS BEGIN
// KEYPATH: source.refactoring.kind.rename.global
// KEYPATH: ACTIONS END
|