override func visit(_ node: StringLiteralExprSyntax) -> SyntaxVisitorContinueKind {
let text = node.stringLiteral.withoutTrivia().text
print("\(filePath):\(node.position.line):\(node.position.column):
warning: `\(text)` is here!")
return .skipChildren
}
Slide 44
Slide 44 text
Run Script ͱͯ͠ॻ͘
Slide 45
Slide 45 text
warning ͰϋΠϥΠτ͢Δ
Slide 46
Slide 46 text
No content
Slide 47
Slide 47 text
protocol Ͱͷఆٛॱʹ
࣮ฒͼସ͑Δ
Slide 48
Slide 48 text
protocol SampleViewModeling {
var inputs: SampleViewModelInputs { get }
var outputs: SampleViewModelOutputs { get }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { get }
}
protocol SampleViewModelInputs {
var viewWillAppear: PublishRelay { get }
var okButtonDidTap: PublishRelay { get }
}
protocol SampleViewModelOutputs {
var isOkButtonEnabled: Driver { get }
var showError: Signal { get }
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs, SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
var outputs: SampleViewModelOutputs { return self }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { return self }
// MARK: - SampleViewModelInputs
let viewWillAppear: PublishRelay = PublishRelay()
let okButtonDidTap: PublishRelay = PublishRelay()
// MARK: - SampleViewModelOutputs
let isOkButtonEnabled: Driver
let showError: Signal
// MARK: - SampleViewModelCoordinatorOutputs
let show: Observable
// MARK: -
Slide 49
Slide 49 text
protocol SampleViewModeling {
var inputs: SampleViewModelInputs { get }
var outputs: SampleViewModelOutputs { get }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { get }
}
protocol SampleViewModelInputs {
var viewWillAppear: PublishRelay { get }
var okButtonDidTap: PublishRelay { get }
}
protocol SampleViewModelOutputs {
var isOkButtonEnabled: Driver { get }
var showError: Signal { get }
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs,
SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
Slide 50
Slide 50 text
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs,
SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
var outputs: SampleViewModelOutputs { return self }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { return self }
// MARK: - SampleViewModelInputs
let viewWillAppear: PublishRelay = PublishRelay()
let okButtonDidTap: PublishRelay = PublishRelay()
// MARK: - SampleViewModelOutputs
let isOkButtonEnabled: Driver
let showError: Signal
// MARK: - SampleViewModelCoordinatorOutputs
let show: Observable
// MARK: -
// ...
டংΛकΔͨΊͷ࿑ྗͷൃੜ
Slide 51
Slide 51 text
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs,
SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
var outputs: SampleViewModelOutputs { return self }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { return self }
// MARK: - SampleViewModelInputs
let viewWillAppear: PublishRelay = PublishRelay()
let okButtonDidTap: PublishRelay = PublishRelay()
// MARK: - SampleViewModelOutputs
let isOkButtonEnabled: Driver
let showError: Signal
// MARK: - SampleViewModelCoordinatorOutputs
let show: Observable
// MARK: -
// ...
Slide 52
Slide 52 text
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs,
SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
var outputs: SampleViewModelOutputs { return self }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { return self }
// MARK: - SampleViewModelInputs
let viewWillAppear: PublishRelay = PublishRelay()
let okButtonDidTap: PublishRelay = PublishRelay()
// MARK: - SampleViewModelOutputs
let isOkButtonEnabled: Driver
let showError: Signal
// MARK: - SampleViewModelCoordinatorOutputs
let show: Observable
let showError: Signal
// MARK: -
ॴͷޡΓ
Slide 53
Slide 53 text
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs,
SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
var outputs: SampleViewModelOutputs { return self }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { return self }
// MARK: - SampleViewModelInputs
let viewWillAppear: PublishRelay = PublishRelay()
let okButtonDidTap: PublishRelay = PublishRelay()
// MARK: - SampleViewModelOutputs
let isOkButtonEnabled: Driver
let showError: Signal
// MARK: - SampleViewModelCoordinatorOutputs
let show: Observable
// MARK: -
// ...
Slide 54
Slide 54 text
}
protocol SampleViewModelCoordinatorOutputs {
var show: Signal { get }
}
final class SampleViewModel: SampleViewModelInputs, SampleViewModelOutputs,
SampleViewModelCoordinatorOutputs, SampleViewModeling {
var inputs: SampleViewModelInputs { return self }
var outputs: SampleViewModelOutputs { return self }
var coordinatorOutputs: SampleViewModelCoordinatorOutputs { return self }
// MARK: - SampleViewModelInputs
let viewWillAppear: PublishRelay = PublishRelay()
let okButtonDidTap: PublishRelay = PublishRelay()
// MARK: - SampleViewModelOutputs
let showError: Signal
let isOkButtonEnabled: Driver
// MARK: - SampleViewModelCoordinatorOutputs
let show: Observable
// MARK: -
// ...
protocol ͷதͱॱ൪͕ҧ͏
(͢΄Ͳ͡Όͳ͍͚Ͳɺͪΐͬͱؾʹͳͬͯ
ἧ͑ͪΌ͏…)
Slide 55
Slide 55 text
protocol Ͱͷఆٛॱʹ
࣮ฒͼସ͑Δ
Slide 56
Slide 56 text
protocol Ͱͷఆٛॱʹ
࣮ฒͼସ͑Δ
protocol Λ୳͢
Slide 57
Slide 57 text
class ͱ protocol ͷߏΛ֬ೝ
https://swift-ast-explorer.kishikawakatsumi.com/
First step
Slide 58
Slide 58 text
struct `Protocol` {
let name: String
/// store `VariableDeclSyntax`
let memberVariables: [String]
}
class InputOutputProtocolVisitor: SyntaxVisitor {
var foundProtocols: [Protocol] = []
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
let members = node.members.members
ɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹ.compactMap { ($0.decl as? VariableDeclSyntax)?.variableName }
if node.identifier.text.hasSuffix("Inputs") || node.identifier.text.hasSuffix("Outputs") {
foundProtocols.append(Interface(name: node.identifier.text,
memberVariables: members)
}
return .skipChildren
}
}
Slide 59
Slide 59 text
struct `Protocol` {
let name: String
/// store `VariableDeclSyntax`
let memberVariables: [String]
}
class InputOutputProtocolVisitor: SyntaxVisitor {
var foundProtocols: [Protocol] = []
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
let members = node.members.members
ɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹ.compactMap { ($0.decl as? VariableDeclSyntax)?.variableName }
if node.identifier.text.hasSuffix("Inputs") || node.identifier.text.hasSuffix("Outputs") {
foundProtocols.append(Interface(name: node.identifier.text,
memberVariables: members)
}
return .skipChildren
}
}
Slide 60
Slide 60 text
struct `Protocol` {
let name: String
/// store `VariableDeclSyntax`
let memberVariables: [String]
}
class InputOutputProtocolVisitor: SyntaxVisitor {
var foundProtocols: [Protocol] = []
override func visit(_ node: ProtocolDeclSyntax) -> SyntaxVisitorContinueKind {
let members = node.members.members
ɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹɹ.compactMap { ($0.decl as? VariableDeclSyntax)?.variableName }
if node.identifier.text.hasSuffix("Inputs") || node.identifier.text.hasSuffix("Outputs") {
foundProtocols.append(Interface(name: node.identifier.text,
memberVariables: members)
}
return .skipChildren
}
}
Slide 61
Slide 61 text
let syntaxTree = try! SyntaxTreeParser.parse(fileURL)
let protocolCollector = InputOutputProtocolVisitor()
syntaxTree.walk(protocolCollector)
Slide 62
Slide 62 text
protocol Ͱͷఆٛॱʹ
࣮ฒͼସ͑Δ
AST Λฤू͢Δ
Slide 63
Slide 63 text
class SyntaxRewriter
Slide 64
Slide 64 text
open class SyntaxRewriter {
public init()
open func visit(_ node: UnknownDeclSyntax) -> DeclSyntax
open func visit(_ node: UnknownExprSyntax) -> ExprSyntax
open func visit(_ node: UnknownStmtSyntax) -> StmtSyntax
open func visit(_ node: UnknownTypeSyntax) -> TypeSyntax
open func visit(_ node: UnknownPatternSyntax) -> PatternSynt
open func visit(_ node: CodeBlockItemSyntax) -> Syntax
open func visit(_ node: CodeBlockItemListSyntax) -> Syntax
Slide 65
Slide 65 text
open func visit(_ node: DeclModifierSyntax) -> Syntax
open func visit(_ node: InheritedTypeSyntax) -> Syntax
open func visit(_ node: InheritedTypeListSyntax) -> Syntax
open func visit(_ node: TypeInheritanceClauseSyntax) -> Synt
open func visit(_ node: ClassDeclSyntax) -> DeclSyntax
open func visit(_ node: StructDeclSyntax) -> DeclSyntax
open func visit(_ node: ProtocolDeclSyntax) -> DeclSyntax
open func visit(_ node: ExtensionDeclSyntax) -> DeclSyntax
open func visit(_ node: MemberDeclBlockSyntax) -> Syntax