This presentation seeks to acquaint users of the Swift language tooling. Parsing, generating and manipulating Swift source code in order to build useful devtool for Swift, in Swift.
public class Conference { public var name: String public let venue: String internal typealias Line = String private var attendees: Set private var sponsors: Set private var costs: Array internal func add(attendee: String) internal func add(sponsor: String) deinit internal func add(cost: Decimal) private init() public func totalCosts() -> Decimal private func statement() -> Array internal func printStatement() public init(name: String, venue: String) } API
public class Conference { public var name: String public let venue: String internal typealias Line = String private var attendees: Set private var sponsors: Set private var costs: Array public init(name: String, venue: String) private init() deinit public func totalCosts() -> Decimal internal func add(attendee: String) internal func add(sponsor: String) internal func add(cost: Decimal) internal func printStatement() private func statement() -> Array } API Initializer Public Internal Private
public class Conference { public var name: String public let venue: String internal typealias Line = String private var attendees: Set private var sponsors: Set private var costs: Array internal func add(attendee: String) internal func add(sponsor: String) deinit internal func add(cost: Decimal) private init() public func totalCosts() -> Decimal private func statement() -> Array internal func printStatement() public init(name: String, venue: String) } public class Conference { public var name: String public let venue: String internal typealias Line = String private var attendees: Set private var sponsors: Set private var costs: Array public init(name: String, venue: String) private init() deinit public func totalCosts() -> Decimal internal func add(attendee: String) internal func add(sponsor: String) internal func add(cost: Decimal) internal func printStatement() private func statement() -> Array } →
HOW? move lines by hand use editor plugin use existing command line tool write a tool by my own nicklockwood/SwiftFormat google/swift (format) inamiy/SwiftRewriter
SwiftSyntax Syntax Syntax Syntax Syntax Syntax Syntax Visitor Design Pattern The visitor design pattern is a way of separating an algorithm from an object structure on which it operates
import Foundation public class Conference { public var name: String public let venue: String internal typealias Line = String private var attendees: Set private var sponsors: Set private var costs: Array public init(name: String, venue: String) { self.name = name self.venue = venue self.attendees = [] self.sponsors = [] self.costs = [] } private init() { self.name = "FrenchKit" self.venue = "Bâtiment" self.attendees = [] $ ./reorder -file Conference.swift
IndexStoreDB IndexStoreDB is a source code indexing library. It provides a composable and efficient query API for looking up source code symbols, symbol occurrences, and relations. github.com/apple/indexstore-db
IndexStoreDB IndexStoreDB is a source code indexing library. It provides a composable and efficient query API for looking up source code symbols, symbol occurrences, and relations. github.com/apple/indexstore-db swift build --enable-index-store .build/x86_64-apple-macosx/debug/index/store
StoreIndexer public struct StoreIndexer { public typealias Path = String public struct Function { public let symbol: Symbol public let location: SymbolLocation } private let indexURL: URL
ONE MISSING THING //===-------------------------------------------------------===// // SourceKit README //===-------------------------------------------------------===// Welcome to SourceKit! SourceKit is a framework for supporting IDE features like indexing, syntax-coloring, code-completion, etc. In general it provides the infrastructure that an IDE needs for excellent language support. SourceKit currently only supports the Swift language.