Skip to content

Commit 99f1f6d

Browse files
refactor equatable command class
1 parent 5d69d2a commit 99f1f6d

File tree

3 files changed

+77
-37
lines changed

3 files changed

+77
-37
lines changed

CodeGenerator.xcodeproj/project.pbxproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,12 @@
5454
A0A02CC91E1A68D8001900DC /* GeneratedHash.txt in Resources */ = {isa = PBXBuildFile; fileRef = A0A02CC81E1A68D8001900DC /* GeneratedHash.txt */; };
5555
A0A02CCA1E1A6A16001900DC /* HashableGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A02CC41E1A616C001900DC /* HashableGenerator.swift */; };
5656
A0A02CCB1E1A6A3F001900DC /* Generator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A02CC21E1A60EA001900DC /* Generator.swift */; };
57+
A0A02CD01E1A6DE3001900DC /* SelectableGeneratorCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A02CCE1E1A6DE3001900DC /* SelectableGeneratorCommand.swift */; };
58+
A0A02CD31E1A7236001900DC /* GenerateEquatableCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A02CD11E1A7236001900DC /* GenerateEquatableCommand.swift */; };
5759
A0A82AE71E11571200F27EA3 /* interface1.txt in Resources */ = {isa = PBXBuildFile; fileRef = A0A82AE61E11571200F27EA3 /* interface1.txt */; };
5860
A0A82AE91E11593800F27EA3 /* interface1Mock.txt in Resources */ = {isa = PBXBuildFile; fileRef = A0A82AE81E11593800F27EA3 /* interface1Mock.txt */; };
5961
A0A82AEB1E1159C200F27EA3 /* NSObject+file.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A82AEA1E1159C200F27EA3 /* NSObject+file.swift */; };
6062
A0A82AEF1E11676B00F27EA3 /* SwiftTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A82AEE1E11676B00F27EA3 /* SwiftTypeTests.swift */; };
61-
A0A82B181E1276F000F27EA3 /* GenerateEquatableCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A82B171E1276F000F27EA3 /* GenerateEquatableCommand.swift */; };
6263
A0A82B1A1E127BEE00F27EA3 /* AccessLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A82B191E127BEE00F27EA3 /* AccessLevel.swift */; };
6364
A0A82B1C1E127E9F00F27EA3 /* AccessLevelTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A82B1B1E127E9F00F27EA3 /* AccessLevelTests.swift */; };
6465
A0A82B1D1E127F1000F27EA3 /* AccessLevel.swift in Sources */ = {isa = PBXBuildFile; fileRef = A0A82B191E127BEE00F27EA3 /* AccessLevel.swift */; };
@@ -144,11 +145,12 @@
144145
A0A02CC41E1A616C001900DC /* HashableGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashableGenerator.swift; sourceTree = "<group>"; };
145146
A0A02CC61E1A6868001900DC /* HashableGeneratorTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashableGeneratorTest.swift; sourceTree = "<group>"; };
146147
A0A02CC81E1A68D8001900DC /* GeneratedHash.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GeneratedHash.txt; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
148+
A0A02CCE1E1A6DE3001900DC /* SelectableGeneratorCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SelectableGeneratorCommand.swift; sourceTree = "<group>"; };
149+
A0A02CD11E1A7236001900DC /* GenerateEquatableCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenerateEquatableCommand.swift; sourceTree = "<group>"; };
147150
A0A82AE61E11571200F27EA3 /* interface1.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = interface1.txt; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
148151
A0A82AE81E11593800F27EA3 /* interface1Mock.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = interface1Mock.txt; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
149152
A0A82AEA1E1159C200F27EA3 /* NSObject+file.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NSObject+file.swift"; sourceTree = "<group>"; };
150153
A0A82AEE1E11676B00F27EA3 /* SwiftTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftTypeTests.swift; sourceTree = "<group>"; };
151-
A0A82B171E1276F000F27EA3 /* GenerateEquatableCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenerateEquatableCommand.swift; sourceTree = "<group>"; };
152154
A0A82B191E127BEE00F27EA3 /* AccessLevel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessLevel.swift; sourceTree = "<group>"; };
153155
A0A82B1B1E127E9F00F27EA3 /* AccessLevelTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccessLevelTests.swift; sourceTree = "<group>"; };
154156
A0E276521E13F1F6003CC557 /* TypeParser.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TypeParser.swift; sourceTree = "<group>"; };
@@ -286,8 +288,9 @@
286288
A01E469E1E105EB400395AED /* Mocker */,
287289
A01E46881E0FF95900395AED /* Source */,
288290
A03920841E0F3A8B005A6E89 /* SourceEditorExtension.swift */,
291+
A0A02CD11E1A7236001900DC /* GenerateEquatableCommand.swift */,
292+
A0A02CCE1E1A6DE3001900DC /* SelectableGeneratorCommand.swift */,
289293
A03920861E0F3A8B005A6E89 /* GenerateMockCommand.swift */,
290-
A0A82B171E1276F000F27EA3 /* GenerateEquatableCommand.swift */,
291294
A03920901E0F3AEF005A6E89 /* String+regexr.swift */,
292295
A03920881E0F3A8B005A6E89 /* Info.plist */,
293296
A03920821E0F3A8B005A6E89 /* Supporting Files */,
@@ -504,9 +507,10 @@
504507
A01E46931E102CBB00395AED /* VarSignature.swift in Sources */,
505508
A03920851E0F3A8B005A6E89 /* SourceEditorExtension.swift in Sources */,
506509
A0E2766B1E156738003CC557 /* ClosureParamMocker.swift in Sources */,
510+
A0A02CD31E1A7236001900DC /* GenerateEquatableCommand.swift in Sources */,
511+
A0A02CD01E1A6DE3001900DC /* SelectableGeneratorCommand.swift in Sources */,
507512
A08C585F1E13CB8300034B76 /* SwiftType.swift in Sources */,
508513
A01E46851E0FF94100395AED /* InterfaceDefinition.swift in Sources */,
509-
A0A82B181E1276F000F27EA3 /* GenerateEquatableCommand.swift in Sources */,
510514
A01E46A01E105EE900395AED /* FuncMocker.swift in Sources */,
511515
A03920911E0F3AEF005A6E89 /* String+regexr.swift in Sources */,
512516
A08C585C1E13C5AA00034B76 /* ClosureType.swift in Sources */,

Generate.../GenerateEquatableCommand.swift

Lines changed: 8 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,44 +9,19 @@
99
import Foundation
1010
import XcodeKit
1111

12-
class GenerateEquatableCommand: NSObject, XCSourceEditorCommand {
12+
class GenerateEquatableCommand: NSObject, SelectableGeneratorCommand {
1313

14-
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) {
15-
var selections = invocation.buffer.selections.map { $0 as! XCSourceTextRange }
16-
selections = selections.filter { $0.start != $0.end }
17-
if selections.isEmpty {
18-
generateForAllVariables(with: invocation)
19-
} else {
20-
generateForSelectedVariables(with: invocation, selections: selections)
21-
}
22-
completionHandler(nil)
14+
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
15+
swiftPerform(with: invocation, completionHandler: completionHandler)
2316
}
2417

25-
private func generateForAllVariables(with invocation: XCSourceEditorCommandInvocation) {
26-
let equatableGenerator = EquatableGenerator(interfaceSignature: interfaceSignature(of: invocation), indentation: " ".repeating(invocation.buffer.indentationWidth))
27-
invocation.buffer.lines.addObjects(from: equatableGenerator.lines)
28-
}
2918

30-
private func generateForSelectedVariables(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) {
31-
let selectedColumns = selections.map { $0.start.line...$0.end.line }.flatMap { $0 }
32-
var selectedLines: [String] = []
33-
invocation.buffer.lines.enumerated().forEach { index, line in
34-
if selectedColumns.contains(index) {
35-
selectedLines.append(line as! String)
36-
}
37-
}
38-
let selectedVars = selectedLines.flatMap { VarSignature(string: $0) }
39-
let equatableGenerator = EquatableGenerator(interfaceDefinition: interfaceSignature(of: invocation).definition, varSignatures: selectedVars, indentation: " ".repeating(invocation.buffer.indentationWidth))
40-
invocation.buffer.lines.addObjects(from: equatableGenerator.lines)
19+
func generator(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> Generator {
20+
let selectedVars = selectedLines(with: invocation, selections: selections).flatMap { VarSignature(string: $0) }
21+
return EquatableGenerator(interfaceDefinition: interfaceSignature(of: invocation).definition, varSignatures: selectedVars, indentation: " ".repeating(invocation.buffer.indentationWidth))
4122
}
42-
}
4323

44-
extension XCSourceTextPosition: Equatable {
45-
public static func==(l: XCSourceTextPosition, r: XCSourceTextPosition) -> Bool {
46-
return l.column == r.column && r.line == l.line
24+
func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator {
25+
return EquatableGenerator(interfaceSignature: interfaceSignature(of: invocation), indentation: " ".repeating(invocation.buffer.indentationWidth))
4726
}
4827
}
49-
50-
private func interfaceSignature(of invocation: XCSourceEditorCommandInvocation) -> InterfaceSignature {
51-
return InterfaceSignature(interfaceSource: invocation.buffer.completeBuffer, lines: invocation.buffer.lines.map { $0 as! String })
52-
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
//
2+
// SelectableGeneratorCommand.swift
3+
// CodeGenerator
4+
//
5+
// Created by WANG Jie on 02/01/2017.
6+
// Copyright © 2017 wangjie. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import XcodeKit
11+
12+
protocol SelectableGeneratorCommand: XCSourceEditorCommand {
13+
14+
func generator(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> Generator
15+
16+
func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator
17+
18+
func swiftPerform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void)
19+
}
20+
21+
extension SelectableGeneratorCommand where Self: NSObject {
22+
func swiftPerform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
23+
var selections = invocation.buffer.selections.map { $0 as! XCSourceTextRange }
24+
selections = selections.filter { $0.start != $0.end }
25+
if selections.isEmpty {
26+
generateForAllVariables(with: invocation)
27+
} else {
28+
generateForSelectedVariables(with: invocation, selections: selections)
29+
}
30+
completionHandler(nil)
31+
}
32+
33+
fileprivate func generateForAllVariables(with invocation: XCSourceEditorCommandInvocation) {
34+
invocation.buffer.lines.addObjects(from: generator(with: invocation).lines)
35+
}
36+
37+
fileprivate func generateForSelectedVariables(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) {
38+
invocation.buffer.lines.addObjects(from: generator(with: invocation, selections: selections).lines)
39+
}
40+
41+
func selectedLines(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> [String] {
42+
let selectedColumns = selections.map { $0.start.line...$0.end.line }.flatMap { $0 }
43+
var selectedLines: [String] = []
44+
invocation.buffer.lines.enumerated().forEach { index, line in
45+
if selectedColumns.contains(index) {
46+
selectedLines.append(line as! String)
47+
}
48+
}
49+
return selectedLines
50+
}
51+
}
52+
53+
extension XCSourceTextPosition: Equatable {
54+
public static func==(l: XCSourceTextPosition, r: XCSourceTextPosition) -> Bool {
55+
return l.column == r.column && r.line == l.line
56+
}
57+
}
58+
59+
func interfaceSignature(of invocation: XCSourceEditorCommandInvocation) -> InterfaceSignature {
60+
return InterfaceSignature(interfaceSource: invocation.buffer.completeBuffer, lines: invocation.buffer.lines.map { $0 as! String })
61+
}

0 commit comments

Comments
 (0)