Avatar
Kishikawa Katsumi 11/11/2022 11:39 AM
@main struct Main { static func main() { testPowerAssert() } static func testPowerAssert() { let a = 4 let b = 7 let c = 12 #powerAssert(max(a, b) == c) #powerAssert(a + b > c) struct Person { let name: String let age: Int var isTeenager: Bool { return age <= 12 && age >= 20 } } let john = Person(name: "John", age: 42) let mike = Person(name: "Mike", age: 13) #powerAssert(john.isTeenager) #powerAssert(mike.isTeenager && john.age < mike.age) } } ^ こんなマクロを書くと (edited)
11:40 AM
@main struct Main { static func main() { testPowerAssert() } static func testPowerAssert() { let a = 4 let b = 7 let c = 12 PowerAssert.Assertion("#powerAssert(max(a, b) == c)", line: 12, verbose: true).assert(max(a, b) == c).record(expression: max(a, b), column: 13).record(expression: a, column: 17).record(expression: b, column: 20).record(expression: max(a, b) == c, column: 23).record(expression: c, column: 26).render() PowerAssert.Assertion("#powerAssert(a + b > c)", line: 13, verbose: true).assert(a + b > c).record(expression: a, column: 13).record(expression: b, column: 17).record(expression: a + b > c, column: 19).record(expression: c, column: 21).render() struct Person { let name: String let age: Int var isTeenager: Bool { return age <= 12 && age >= 20 } } let john = Person(name: "John", age: 42) let mike = Person(name: "Mike", age: 13) PowerAssert.Assertion("#powerAssert(john.isTeenager)", line: 27, verbose: true).assert(john.isTeenager).record(expression: john.isTeenager, column: 18).record(expression: john, column: 13).render() PowerAssert.Assertion("#powerAssert(mike.isTeenager && john.age < mike.age)", line: 28, verbose: true).assert(mike.isTeenager && john.age < mike.age).record(expression: mike.isTeenager, column: 18).record(expression: mike, column: 13).record(expression: john.age, column: 37).record(expression: john, column: 32).record(expression: mike.isTeenager && john.age < mike.age, column: 41).record(expression: mike.age, column: 48).record(expression: mike, column: 43).render() } } ^ こういうコードに展開されて、
11:41 AM
#powerAssert(max(a, b) == c) | | | | | 7 4 7 | 12 false #powerAssert(a + b > c) | | | | 4 7 | 12 false #powerAssert(john.isTeenager) | | | false Person(name: "John", age: 42) #powerAssert(mike.isTeenager && john.age < mike.age) | | | | | | | | false | 42 | | 13 | | | Person(name: "Mike", age: 13) | | false | Person(name: "John", age: 42) Person(name: "Mike", age: 13) ^ このような結果が得られる。