Slide 1

Slide 1 text

SwiftSyntaxBuilder = SwiftSyntax × Function Builders 2019/09/26 CA.swift #10 Akio Yasui

Slide 2

Slide 2 text

ࣗݾ঺հ ҆Ҫ ӯஉ / Akio Yasui @akkyie 2019 ೥ 4 ݄ AbemaTV ৽ଔೖࣾ . 2 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 3

Slide 3 text

എܠ • SwiftUI ͕ WWDC 19 Ͱൃද͞Εͨ • એݴతʹϏϡʔ͕ఆٛͰ͖Δ struct LandmarkList: View { var landmarks: [Landmark] var body: some View { List(landmarks) { landmark in HStack { Image(landmark.thumbnail) Text(landmark.name) } } // ... 3 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 4

Slide 4 text

എܠ ! SwiftUI ͷΑ͏ʹ Swift ͷίʔυΛهड़Ͱ͖ͨΒ໘ന͍ͷͰ͸…ʁ // هड़ྫ // ੜ੒͞ΕΔ Import("SwiftSyntax") import SwiftSyntax Struct("ExampleStruct") { struct ExampleStruct { Let("syntax", of: "Syntax") let syntax: Syntax } } 4 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 5

Slide 5 text

SwiftSyntax ͱ͍͏΋ͷ Λ࢖ͬͯ࡞ͬͯΈͨ 5 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 6

Slide 6 text

ద౰ͳπΠʔτΛͨ͠ 6 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 7

Slide 7 text

ಥવ SwiftSyntax ͷ Author ͔ΒϦϓϥΠ͕ དྷͨ 7 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 8

Slide 8 text

PR Λग़ͯ͠ Ϛʔδ͞Εͨ ! 8 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 9

Slide 9 text

ࠓճ͓࿩͢͠Δ͜ͱ • SwiftSyntax Ͱ Swift ίʔυΛੜ੒͢Δ • Function Builders Ͱએݴతͳه๏Λ࣮ݱ͢Δ • Function Builders ͷϋϚΓͲ͜Ζ • SwiftSyntaxBuilder ͰͰ͖Δ͜ͱ 9 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 10

Slide 10 text

SwiftSyntax ͱ͸ 10 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 11

Slide 11 text

SwiftSyntax ͱ͸ • Swift ίϯύΠϥͷҰ෦Ͱ͋Δ lib/Syntax ͷ Swift όΠϯσΟϯά • ߏจ (syntax) ʹ͍ͭͯͷߏ଄Λఆٛ͢Δ • ҙຯ࿦ (semantics) ʹ͍ͭͯ͸ؔ஌͠ͳ͍ • lib/Syntax ΍ SwiftSyntax Λ௨ͯ͡ߏจղੳΛߦ͏͜ͱͰɺ • ίϯύΠϥ͕ੜ੒͢Δ AST ͱ ਖ਼֬ʹಉ͡৘ใ ͕ಘΒΕΔ • ߏจతͳਖ਼͠͞Λอͪͭͭ AST Λฤू͢Δ͜ͱ͕Ͱ͖Δ → apple/swift-format ͷΑ͏ͳ Linter/Formatter ͕࡞ΕΔ 11 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 12

Slide 12 text

SwiftSyntax ͱ͸ ίϯύΠϥ͕ੜ੒͢Δ AST Λ֬ೝ͢Δʹ͸ $ swift -frontend -emit-syntax test.swift \ | python -m json.tool 12 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 13

Slide 13 text

SwiftSyntax ͰͰ͖Δ͜ͱ SyntaxRewriter Λ࣮૷͢Δ͜ͱͰ AST ͷ֤ϊʔυΛฤूͰ͖Δ let sourceFile: SourceFileSyntax = try SyntaxParser.parse(source: "let number = 1000") class AddOneToIntegerLiterals: SyntaxRewriter { override func visit(_ token: TokenSyntax) -> Syntax { guard case .integerLiteral(let text) = token.tokenKind else { return token } let integerText = String(text.filter { ("0"..."9").contains($0) }) let int = Int(integerText)! return token.withKind(.integerLiteral("\(int + 1)")) } } let incremented = AddOneToIntegerLiterals().visit(sourceFile) print(incremented) // => "let number = 1001" 13 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 14

Slide 14 text

SwiftSyntax ͰͰ͖Δ͜ͱ ๚Εͨ AST ͷϊʔυʢ͜͜Ͱ͸ TokenSyntaxʣͷ kind ͷΈมߋ let sourceFile: SourceFileSyntax = try SyntaxParser.parse(source: "let number = 1000") class AddOneToIntegerLiterals: SyntaxRewriter { override func visit(_ token: TokenSyntax) -> Syntax { guard case .integerLiteral(let text) = token.tokenKind else { return token } let integerText = String(text.filter { ("0"..."9").contains($0) }) let int = Int(integerText)! return token.withKind(.integerLiteral("\(int + 1)")) } } let incremented = AddOneToIntegerLiterals().visit(sourceFile) print(incremented) // => "let number = 1001" 14 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 15

Slide 15 text

SwiftSyntax ͰͰ͖Δ͜ͱ let sourceFile: SourceFileSyntax = try SyntaxParser.parse(source: "...") SourceFileSyntax ͸ Syntax ϓϩτίϧʹ४ڌ͢Δ struct • ܕ΍ม਺ͷఆٛʢDeclarationʣ͸ DeclSyntax • ࣜʢExpressionʣ͸ ExprSyntaxɺจʢStatementʣ͸ StmtSyntax → AST ͷਖ਼͕͠͞ܕͰอޢ͞ΕΔ • ྫ: ࣜʢExprSyntaxʣΛจʢStmtSyntaxʣʹ͸ஔ͖׵͑ΒΕͳ͍ 15 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 16

Slide 16 text

SwiftSyntax ͰͰ͖Δ͜ͱ • AST Λฤू͢Δ͜ͱ͕Ͱ͖Δ → θϩ͔Βੜ੒͢Δ ͜ͱ΋Ͱ͖Δ • ͨͩ͠ AST ͷߏ଄Λਖ਼֬ʹҰͭҰͭ૊ΈཱͯΔඞཁ͕͋Δ • ݁ՌͱͳΔίʔυʹରͯ͠৑௕ʹͳΓ͕ͪ • ͨͱ͑͹ɺԼͷίʔυΛੜ੒͢ΔͨΊʹ… struct Foo { let bar: String } 16 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 17

Slide 17 text

SwiftSyntax ʹΑΔ AST ͷఆٛ • ͜Ε͚ͩͷهड़͕ඞཁ • লུ͍ͯ͠Δ͕ɺ࣮ࡍ͸͞Βʹ Triviaʢۭന΍ׅހͳͲʣͷࢦఆ͕ඞཁ StructDeclSyntax { builder in builder.useStructKeyword(SyntaxFactory.makeStructKeyword()) // struct Ωʔϫʔυ builder.useIdentifier(SyntaxFactory.makeIdentifier("Foo")) // ߏ଄ମͷ໊લΛࢦఆ builder.useMembers(MemberDeclBlockSyntax { builder in // ߏ଄ମͷϝϯόʔΛఆٛ builder.addMember(MemberDeclListItemSyntax { builder in builder.useDecl(VariableDeclSyntax { builder in // ม਺ఆٛΛ௥Ճ builder.useLetOrVarKeyword(SyntaxFactory.makeLetKeyword()) // let Ωʔϫʔυ builder.addBinding(PatternBindingSyntax { builder in // ύλʔϯʹର͢Δม਺ଋറ builder.usePattern( SyntaxFactory.makeIdentifierPattern( // ࣝผࢠύλʔϯ identifier: SyntaxFactory.makeIdentifier("bar"))) // ࣝผࢠΛࢦఆ builder.useTypeAnnotation(TypeAnnotationSyntax { builder in // ܕΞϊςʔγϣϯΛ௥Ճ builder.useColon(SyntaxFactory.makeColonToken()) // ίϩϯ builder.useType(SyntaxFactory.makeTypeIdentifier("String")) // String ܕ // ... 17 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 18

Slide 18 text

ཧ૝ • ΑΓએݴతʹॻ͖͍ͨ Struct("Foo") { Let("bar", "String") } // ↓ struct Foo { let bar: String } → SwiftUI ͷه๏Λ࣮ݱ͍ͯ͠Δ Function Builders Λ༻͍ͯ࡞Εͦ͏ 18 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 19

Slide 19 text

Function Builders ͱ͸ 19 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 20

Slide 20 text

Function Builders ͱ͸ • Swift 5.1 Ͱࢼݧతʹ௥Ճ͞Εͨݴޠػೳ • ؔ਺΍ΫϩʔδϟͷதͰ ෳ਺ͷ஋Λฦ͢Α͏ͳ ॻ͖ํ͕Ͱ͖Δ func join(/* ... */) { /* ... */ } join { "foo" "bar" } // => "foo, bar" 20 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 21

Slide 21 text

Function Builders ͷఆٛྫ Function Builders Ͱ join ؔ਺Λఆٛͯ͠ΈΔ @_functionBuilder struct StringBuilder { static func buildBlock(_ strings: String...) -> String { return strings } } func join(@StringBuilder builder: () -> String) -> [String] { return builder().joined(separator: ", ") } join { "foo" "bar" } // => "foo, bar" 21 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 22

Slide 22 text

Function Builders ͷఆٛྫ ͜ͷଐੑΛ͚ͭΔ͜ͱͰ StringBuilder Λଐੑͱͯ͠࢖͑ΔΑ͏ʹͳΔ @_functionBuilder struct StringBuilder { static func buildBlock(_ strings: String...) -> String { return strings } } func join(@StringBuilder builder: () -> String) -> [String] { return builder().joined(separator: ", ") } join { "foo" "bar" } // => "foo, bar" 22 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 23

Slide 23 text

Function Builders ͷఆٛྫ ؔ਺ͷҾ਺ͱͳΔΫϩʔδϟʹ StringBuilder Λଐੑͱͯ͠෇༩͢Δͱɺ @_functionBuilder struct StringBuilder { static func buildBlock(_ strings: String...) -> String { return strings } } func join(@StringBuilder builder: () -> String) -> [String] { return builder().joined(separator: ", ") } join { "foo" "bar" } // => "foo, bar" 23 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 24

Slide 24 text

Function Builders ͷఆٛྫ ΫϩʔδϟͷதͰෳ਺ݸͷ஋Λฦ͢Α͏ͳॻ͖ํ͕Ͱ͖ΔΑ͏ʹͳΔ @_functionBuilder struct StringBuilder { static func buildBlock(_ strings: String...) -> String { return strings } } func join(@StringBuilder builder: () -> String) -> [String] { return builder().joined(separator: ", ") } join { "foo" "bar" } // => "foo, bar" 24 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 25

Slide 25 text

Function Builders ͷॲཧͷྲྀΕ Function Builder Λ "ల։" ͢ΔͱɺҎԼͷΑ͏ͳॲཧʹ૬౰͢Δ struct StringBuilder { static func buildBlock(_ strings: String...) -> [String] { ... } } func join(builder: () -> [String]) -> String { ... } join { let v1 = "foo" let v2 = "bar" let v = buildBlock(v1, v2) return v } // => "foo, bar" 25 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 26

Slide 26 text

Function Builders ͷॲཧͷྲྀΕ Ϋϩʔδϟ಺ͷ஋͕ buildBlock ؔ਺ʹ౉͞Εͯ [String] ʹͳΓɺ struct StringBuilder { static func buildBlock(_ strings: String...) -> [String] { ... } } func join(builder: () -> [String]) -> String { ... } join { let v1 = "foo" let v2 = "bar" let v = buildBlock(v1, v2) return v } // => "foo, bar" 26 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 27

Slide 27 text

Function Builders ͷॲཧͷྲྀΕ buildBlock ͷ݁Ռ͕ join ؔ਺ͷΫϩʔδϟͷ݁ՌͱͳΔ struct StringBuilder { static func buildBlock(_ strings: String...) -> [String] { ... } } func join(builder: () -> [String]) -> String { ... } join { let v1 = "foo" let v2 = "bar" let v = buildBlock(v1, v2) return v } // => "foo, bar" 27 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 28

Slide 28 text

Function Builders ͷॲཧͷྲྀΕ • ड͚औΔܕ͕ҟͳΔΦʔόʔϩʔυΛ༻ҙ͢Δ͜ͱ΋Մೳ extension StringBuilder { static func buildBlock(_ numbers: Int...) -> [String] { return numbers.map { String($0) } } } join { 123 456 } // => "123, 456" 28 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 29

Slide 29 text

SwiftSyntaxBuilder ͱ͸ 29 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 30

Slide 30 text

SwiftSyntaxBuilder ͱ͸ SwiftSyntax ͷ Syntax Λ SwiftUI ϥΠΫʹੜ੒Ͱ͖Δ import SwiftSyntax import SwiftSyntaxBuilder let sourceFile = SourceFile { Import("SwiftSyntax") Struct("ExampleStruct") { Let("syntax", of: "Syntax") } } let syntax: Syntax = sourceFile.buildSyntax(format: format, leadingTrivia: .zero) 30 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 31

Slide 31 text

SwiftSyntaxBuilder ͷ࣮૷ • Syntax ΍ DeclSyntax Λੜ੒Ͱ͖Δ struct ͱͯ͠ίϯϙʔωϯτԽ struct SourceFile: SyntaxBuildable { init(@SyntaxListBuilder makeBuilder: () -> SyntaxListBuildable) { func buildSyntax(format: Format, leadingTrivia: Trivia) -> Syntax } struct Struct: DeclBuildable { init(_ name: String, @DeclListBuilder buildMemberList: () -> DeclListBuildable) func buildDecl(format: Format, leadingTrivia: Trivia) -> DeclSyntax } struct Import: DeclBuildable { init(_ moduleName: String) func buildDecl(format: Format, leadingTrivia: Trivia) -> DeclSyntax } 31 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 32

Slide 32 text

SwiftSyntaxBuilder ͷ࣮૷ Θ͔Γ΍͍͢୯ҐͰίϯϙʔωϯτԽ͢Δ͜ͱͰɺSwiftSyntax ͷ API Λ௚઀࢖͏͜ͱʹΑΔ৑௕ੑΛӅṭ struct Import: DeclBuildable { let moduleName: String // ... func buildDecl(format: Format, leadingTrivia: Trivia) -> DeclSyntax { let importToken = Tokens.import.withLeadingTrivia(leadingTrivia) let moduleNameToken = SyntaxFactory.makeIdentifier(moduleName) return ImportDeclSyntax { $0.useImportTok(importToken) $0.addPathComponent(AccessPathComponentSyntax { $0.useName(moduleNameToken) }) } } } 32 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 33

Slide 33 text

SwiftSyntaxBuilder ͷ࣮૷ • ·ͩݶΒΕͨίϯϙʔωϯτ͔࣮͠૷͞Ε͍ͯͳ͍ • SourceFile • Import • Struct • Let / Var • ίϝϯτ΍վߦͷૠೖͳͲ΋ະ࣮૷ • ͨͩ͠ɺੜ੒ͨ͠ Syntax Λͦͷ·· apple/swift-format ͳͲʹ౉ͤΔ • ϑΥʔϚοτͷৄࡉͳࢦఆʹ͸ରԠ͢Δඞཁ͕ͳ͍ͱߟ͑ΒΕΔ 33 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 34

Slide 34 text

Function Builders ͷ஫ҙ఺ 34 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 35

Slide 35 text

Function Builders ͷ஫ҙ఺ • buildBlock ͱಉ༷ʹ buildIf ΍ buildDo ͳͲΛ࣮૷͢Δ͜ͱͰ if จ΍ do จʹରԠ͢Δ͜ͱ΋Ͱ͖Δ // if จ static func buildIf(_ string: Component?) -> Component // do จ static func buildDo(_ string: Component?) -> Component // if-else จ static func buildEither(first string: Component) -> Component static func buildEither(second string: Component) -> Component 35 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 36

Slide 36 text

Function Builders ͷ஫ҙ఺ • ҎԼͷΑ͏ͳ࣮૷͕Ͱ͖ͦ͏͕ͩ… @_functionBuilder extension StringBuilder { static func buildIf(_ strings: [String]?) -> [String] { return strings ?? [] } } join { "foo" "bar" if condition { "hoge" "fuga" } } 36 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 37

Slide 37 text

Function Builders ͷ஫ҙ఺ "ల։" ͞ΕͨॲཧͷΠϝʔδ extension StringBuilder { static func buildIf(_ strings: [String]?) -> [String] { ... } } join { let _v1 = "foo" let _v2 = "bar" var _vif: [String]? = nil if condition { _vif = StringBuilder.buildBlock("hoge", "fuga") } let _v3 = StringBuilder.buildIf(_vif) let result = StringBuilder.buildBlock(_v1, _v2, _v3) } 37 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 38

Slide 38 text

Function Builders ͷ஫ҙ఺ ܕ͕߹Θͳ͍ͨΊɺ͜ͷఆٛͰ͸࢖͑ͳ͍ extension StringBuilder { static func buildIf(_ strings: [String]?) -> [String] { ... } } join { let _v1 = "foo" // => String let _v2 = "bar" // => String var _vif: [String]? = nil if condition { _vif = StringBuilder.buildBlock("hoge", "fuga") } let _v3 = StringBuilder.buildIf(_vif) // => [String] let result = StringBuilder.buildBlock(_v1, _v2, _v3) } /* String, String, [String] */ 38 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 39

Slide 39 text

Function Builders ͷ஫ҙ఺ • buildBlock ΍ buildIf ͷ݁Ռ΋·ͨ buildBlock ͷҾ਺ͷͻͱͭͱͯ͠౉ͤͳ͚͹ͳΒͳ͍ • ͭ·ΓɺbuildBlock ͕ड͚औΔͻͱͭͻͱͭͷ஋ͷܕͱ buildBlock ͷ݁Ռͷܕ͕Ұக͍ͯ͠Δඞཁ͕͋Δ static func buildBlock(_ strings: Component...) -> Component { ... } ↑ ↑ ┌──┴───────────┬────┘ ↓ ↓ static func buildIf(_ strings: Component?) -> Component { ... } 39 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 40

Slide 40 text

Function Builders ͷ஫ҙ఺ • join ؔ਺ͷྫͰ͸ɺ String ͱ [String] Λಉ͡ܕͱͯ͠ѻ͍͍ͨ • [String] Λϥοϓ͢Δ StringList ܕΛ࡞Δ public struct StringList { let strings: [String] } • String ͸҉໧తʹ StringList ʹม׵Ͱ͖ΔΑ͏ʹ͓ͯ͘͠ extension StringList: ExpressibleByStringLiteral { public init(stringLiteral value: String) { self.strings = [value] } } // => "asdf" Λ StringList(strings: ["asdf"]) ͱͯ͠ѻ͑Δ 40 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 41

Slide 41 text

Function Builders ͷ஫ҙ఺ • buildBlock ͷ݁Ռ͕·ͨ buildBlock ͷҰҾ਺ʹͳΕΔ extension StringListBuilder { static func buildIf(_ strings: StringList?) -> StringList { strings ?? StringList(strings: []) } } join { "foo" // => StringList "bar" // => StringList if condition { "hoge" // => StringList──┐ "fuga" // => StringList──┴─buildBlock─→ StringList } } 41 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 42

Slide 42 text

Function Builders ͷ஫ҙ఺ • SwiftSyntaxBuilder Ͱ΋ X ϓϩτίϧʹରͯ͠ XList ϓϩτίϧΛఆٛ • ୯Ұͷ஋΋Ϧετͱͯ͠ৼΔ෣͑ΔΑ͏ʹ͍ͯ͠Δ protocol DeclListBuildable { func buildDeclList(format: Format, leadingTrivia: Trivia) -> [DeclSyntax] } protocol DeclBuildable DeclListBuildable { func buildDecl(format: Format, leadingTrivia: Trivia) -> DeclSyntax } extension DeclBuildable { func buildDeclList(format: Format, leadingTrivia: Trivia) -> [DeclSyntax] { [buildDecl(format: format, leadingTrivia: leadingTrivia)] } } 42 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 43

Slide 43 text

ͪͳΈʹ SwiftUI ͷ৔߹ 43 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 44

Slide 44 text

SwiftUI ͷ৔߹ SwiftUI ͰϏϡʔͷఆٛʹ༻͍ΒΕΔ ViewBuilder Ͱ͸ • buildBlock ͷҾ਺͸ View ϓϩτίϧͷ஋ • buildBlock ͷ݁Ռ͸ TupleView ͱ͍͏ View ϓϩτίϧͷ஋ ͱҰக͍ͯ͠Δ @_functionBuilder struct ViewBuilder { static func buildBlock(_ c0: C0, _ c1: C1) -> TupleView<(C0, C1)> where C0 : View, C1 : View } 44 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 45

Slide 45 text

SwiftUI ͷ৔߹ buildBlock ɾ TupleView ͸ 10 Ҿ਺ͷ৔߹·Ͱ༻ҙ͞Ε͍ͯΔ static func buildBlock(_ c0: C0, _ c1: C1) -> TupleView<(C0, C1)> where C0 : View, C1 : View static func buildBlock(_ c0: C0, _ c1: C1, _ c2: C2) -> TupleView<(C0, C1, C2)> where C0 : View, C1 : View, C2 : View // ... static func buildBlock(_ c0: C0, _ c1: C1, (ུ) , _ c8: C8) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View static func buildBlock(_ c0: C0, _ c1: C1, (ུ) , _ c9: C9) -> TupleView<(C0, C1, C2, C3, C4, C5, C6, C7, C8, C9)> where C0 : View, C1 : View, C2 : View, C3 : View, C4 : View, C5 : View, C6 : View, C7 : View, C8 : View, C9 : View 45 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 46

Slide 46 text

SwiftUI ͷ৔߹ 10 Ҿ਺ͷ৔߹·Ͱ͔͠ͳ͍ͨΊɺ 11 ݸҎ্஋Λฒ΂ͨ৔߹͸ରԠ͢Δ buildBlock ͕ແ͍ = ίϯύΠϧ͕௨Βͳ͍ 46 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 47

Slide 47 text

SwiftSyntaxBuilder Λࢼ͢ 47 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 48

Slide 48 text

SwiftSyntaxBuilder Λࢼ͢ • SwiftSyntaxBuilder ͸طʹ apple/swift-syntax ͷ master ʹೖ͍ͬͯΔ • ઌ೔෇༩͞Εͨλά 0.50100.0 ʹ͸ؚ·Εͯ ͍ͳ͍ • SwiftPM Ͱ master Λࢦఆͯ͠΋ɺ gyb Ͱੜ੒͞ΕΔίʔυؚ͕·Ε͍ͯͳ͍ • ͍·ͷͱ͜Ζࣗ෼Ͱੜ੒ͨ͠΋ͷΛ࢖͏ඞཁ͕͋Δ • apple/swift-syntax ͷ README ʹ͕ͨͬͯ͠ Swift ίϯύΠϥશମΛνΣοΫΞ΢τ • swift-syntax/build-script.py Λ࣮ߦ let package = Package( name: "tryswiftsyntax", dependencies: [.package(path: "~/swift-source/swift-syntax")], targets: [.target(name: "tryswiftsyntax", dependencies: ["SwiftSyntax"])] ) 48 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 49

Slide 49 text

·ͱΊ 49 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 50

Slide 50 text

·ͱΊ • SwiftSyntax ͱ Function Builders Λ૊Έ߹Θͤͨ SwiftSyntaxBuilder Λ࡞ͬͨ • SwiftSyntax ͸ AST Λऔಘɾฤूɾੜ੒͢Δ͜ͱ͕Ͱ͖Δ • Function Builders Ͱ એݴతͳهड़ํ๏Λ࣮ݱͰ͖Δ → SwiftSyntaxBuilder Ͱએݴతͳ AST ੜ੒͕ߦ͑Δ • ࣮༻తͳ Function Builder Λ࣮૷͢Δʹ͸޻෉͕ඞཁ • SwiftSyntaxBuilder ͸·ͩੜ·Εͨͯ • Ұॹʹ࣮૷͠·͠ΐ͏ ! 50 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10

Slide 51

Slide 51 text

ࢀߟจݙɾؔ࿈ࢿྉ • apple/swift https://github.com/apple/swift • lib/Syntax https://github.com/apple/swift/tree/master/lib/Syntax • apple/swift-syntax https://github.com/apple/swift-syntax • SwiftSyntaxBuilder https://github.com/apple/swift-syntax/pull/139 • apple/swift-format https://github.com/apple/swift-format • Function Builders draft proposal https://github.com/apple/swift-evolution/pull/1046 • SwiftUI Tutorials https://developer.apple.com/tutorials/swiftui/ • StringListBuilder ࣮૷ྫ https://github.com/akkyie/functionbuilderexample • AST Exploler https://swift-ast-explorer.kishikawakatsumi.com • SwiftSyntax - NSHipster https://nshipster.com/swiftsyntax/ 51 — SwiftSyntaxBuilder = SwiftSyntax × Function Builders @ CA.swift #10