Skip to content

Commit 2c9965b

Browse files
support init generate
1 parent a92f021 commit 2c9965b

File tree

9 files changed

+127
-45
lines changed

9 files changed

+127
-45
lines changed

CodeGenerator.xcodeproj/project.pbxproj

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@
2828
A031BD3E1E8D187C003235D5 /* GeneratedInit.txt in Resources */ = {isa = PBXBuildFile; fileRef = A031BD3D1E8D187C003235D5 /* GeneratedInit.txt */; };
2929
A031BD401E8D191E003235D5 /* InitGeneratorTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = A031BD3F1E8D191E003235D5 /* InitGeneratorTests.swift */; };
3030
A031BD411E8D19E9003235D5 /* InitGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A031BD3A1E8D11D6003235D5 /* InitGenerator.swift */; };
31+
A031BD431E8D1DA6003235D5 /* GenerateAsExtensionCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A031BD421E8D1DA6003235D5 /* GenerateAsExtensionCommand.swift */; };
32+
A031BD451E8D2B19003235D5 /* GenerateAfterVarCommand.swift in Sources */ = {isa = PBXBuildFile; fileRef = A031BD441E8D2B19003235D5 /* GenerateAfterVarCommand.swift */; };
3133
A039205D1E0F3A7B005A6E89 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A039205C1E0F3A7B005A6E89 /* AppDelegate.swift */; };
3234
A039205F1E0F3A7B005A6E89 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A039205E1E0F3A7B005A6E89 /* ViewController.swift */; };
3335
A03920611E0F3A7B005A6E89 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A03920601E0F3A7B005A6E89 /* Assets.xcassets */; };
@@ -126,6 +128,8 @@
126128
A031BD3A1E8D11D6003235D5 /* InitGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InitGenerator.swift; sourceTree = "<group>"; };
127129
A031BD3D1E8D187C003235D5 /* GeneratedInit.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = GeneratedInit.txt; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
128130
A031BD3F1E8D191E003235D5 /* InitGeneratorTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InitGeneratorTests.swift; sourceTree = "<group>"; };
131+
A031BD421E8D1DA6003235D5 /* GenerateAsExtensionCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenerateAsExtensionCommand.swift; sourceTree = "<group>"; };
132+
A031BD441E8D2B19003235D5 /* GenerateAfterVarCommand.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GenerateAfterVarCommand.swift; sourceTree = "<group>"; };
129133
A03920591E0F3A7B005A6E89 /* CodeGenerator.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = CodeGenerator.app; sourceTree = BUILT_PRODUCTS_DIR; };
130134
A039205C1E0F3A7B005A6E89 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
131135
A039205E1E0F3A7B005A6E89 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = "<group>"; };
@@ -301,10 +305,12 @@
301305
A01E469E1E105EB400395AED /* Mocker */,
302306
A01E46881E0FF95900395AED /* Source */,
303307
A03920841E0F3A8B005A6E89 /* SourceEditorExtension.swift */,
304-
A0A02CD11E1A7236001900DC /* GenerateEquatableCommand.swift */,
308+
A031BD441E8D2B19003235D5 /* GenerateAfterVarCommand.swift */,
305309
A031BD381E8D1126003235D5 /* GenerateInitCommand.swift */,
306-
A0A02CD41E1A739A001900DC /* GenerateHashableCommand.swift */,
307310
A0A02CCE1E1A6DE3001900DC /* SelectableGeneratorCommand.swift */,
311+
A031BD421E8D1DA6003235D5 /* GenerateAsExtensionCommand.swift */,
312+
A0A02CD11E1A7236001900DC /* GenerateEquatableCommand.swift */,
313+
A0A02CD41E1A739A001900DC /* GenerateHashableCommand.swift */,
308314
A03920861E0F3A8B005A6E89 /* GenerateMockCommand.swift */,
309315
A03920901E0F3AEF005A6E89 /* String+regexr.swift */,
310316
A03920881E0F3A8B005A6E89 /* Info.plist */,
@@ -536,10 +542,12 @@
536542
A08C585C1E13C5AA00034B76 /* ClosureType.swift in Sources */,
537543
A031BD3B1E8D11D6003235D5 /* InitGenerator.swift in Sources */,
538544
A0A82B1A1E127BEE00F27EA3 /* AccessLevel.swift in Sources */,
545+
A031BD451E8D2B19003235D5 /* GenerateAfterVarCommand.swift in Sources */,
539546
A01E46871E0FF94C00395AED /* FuncSignature.swift in Sources */,
540547
A0E276591E141ED8003CC557 /* SwiftParamMocker.swift in Sources */,
541548
A0E276531E13F1F6003CC557 /* TypeParser.swift in Sources */,
542549
A0E276651E152F17003CC557 /* ParamMockerFactory.swift in Sources */,
550+
A031BD431E8D1DA6003235D5 /* GenerateAsExtensionCommand.swift in Sources */,
543551
A0636FD41E1294650008CE98 /* EquatableGenerator.swift in Sources */,
544552
A01E46781E0FE21500395AED /* InterfaceSignature.swift in Sources */,
545553
A01E46831E0FF78300395AED /* InterfaceMocker.swift in Sources */,
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
//
2+
// GenerateAfterVarCommand.swift
3+
// CodeGenerator
4+
//
5+
// Created by WANG Jie on 30/03/2017.
6+
// Copyright © 2017 wangjie. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import XcodeKit
11+
12+
protocol GenerateAfterVarCommand: SelectableGeneratorCommand {
13+
14+
}
15+
16+
extension GenerateAfterVarCommand {
17+
func generateForAllVariables(with invocation: XCSourceEditorCommandInvocation) {
18+
addLinesAfterVariables(invocation: invocation, lines: generator(with: invocation).lines)
19+
}
20+
21+
func generateForSelectedVariables(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) {
22+
addLinesAfterVariables(invocation: invocation, lines: generator(with: invocation, selections: selections).lines)
23+
}
24+
25+
private func addLinesAfterVariables(invocation: XCSourceEditorCommandInvocation, lines: [String]) {
26+
var lastVarIndex = 0
27+
var varStarted = false
28+
for l in invocation.buffer.lines {
29+
let line = l as! String
30+
if line.isVar {
31+
varStarted = true
32+
}
33+
if varStarted && !line.isVar {
34+
break
35+
}
36+
lastVarIndex += 1
37+
}
38+
invocation.buffer.lines.insert(lines, at: IndexSet(integersIn: lastVarIndex ..< lastVarIndex+lines.count))
39+
}
40+
}
41+
42+
private extension String {
43+
var isVar: Bool {
44+
return self.contains("var") || self.contains("let")
45+
}
46+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//
2+
// GenerateAsExtensionCommand.swift
3+
// CodeGenerator
4+
//
5+
// Created by WANG Jie on 30/03/2017.
6+
// Copyright © 2017 wangjie. All rights reserved.
7+
//
8+
9+
import Foundation
10+
import XcodeKit
11+
12+
protocol GenerateAsExtensionCommand: SelectableGeneratorCommand {
13+
14+
}
15+
16+
extension GenerateAsExtensionCommand {
17+
func generateForAllVariables(with invocation: XCSourceEditorCommandInvocation) {
18+
invocation.buffer.lines.addObjects(from: generator(with: invocation).lines)
19+
}
20+
21+
func generateForSelectedVariables(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) {
22+
invocation.buffer.lines.addObjects(from: generator(with: invocation, selections: selections).lines)
23+
}
24+
}

Generate.../GenerateEquatableCommand.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,13 @@
99
import Foundation
1010
import XcodeKit
1111

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

14+
var generatorType: Generator.Type {
15+
return EquatableGenerator.self
16+
}
17+
1418
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
1519
swiftPerform(with: invocation, completionHandler: completionHandler)
1620
}
17-
18-
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))
22-
}
23-
24-
func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator {
25-
return EquatableGenerator(interfaceSignature: interfaceSignature(of: invocation), indentation: " ".repeating(invocation.buffer.indentationWidth))
26-
}
2721
}

Generate.../GenerateHashableCommand.swift

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,13 @@
99
import Foundation
1010
import XcodeKit
1111

12-
class GenerateHashableCommand: NSObject, SelectableGeneratorCommand {
12+
class GenerateHashableCommand: NSObject, GenerateAsExtensionCommand {
1313

14+
var generatorType: Generator.Type {
15+
return HashableGenerator.self
16+
}
17+
1418
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
1519
swiftPerform(with: invocation, completionHandler: completionHandler)
1620
}
17-
18-
19-
func generator(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> Generator {
20-
let selectedVars = selectedLines(with: invocation, selections: selections).flatMap { VarSignature(string: $0) }
21-
return HashableGenerator(interfaceDefinition: interfaceSignature(of: invocation).definition, varSignatures: selectedVars, indentation: " ".repeating(invocation.buffer.indentationWidth))
22-
}
23-
24-
func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator {
25-
return HashableGenerator(interfaceSignature: interfaceSignature(of: invocation), indentation: " ".repeating(invocation.buffer.indentationWidth))
26-
}
2721
}

Generate.../GenerateInitCommand.swift

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,13 @@
99
import Foundation
1010
import XcodeKit
1111

12-
//class GenerateInitCommand: NSObject, SelectableGeneratorCommand {
13-
// func generator(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> Generator {
14-
//
15-
// }
16-
//
17-
// func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator {
18-
//
19-
// }
20-
//
21-
// func swiftPerform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
22-
//
23-
// }
24-
//}
12+
class GenerateInitCommand: NSObject, GenerateAfterVarCommand {
13+
14+
var generatorType: Generator.Type {
15+
return InitGenerator.self
16+
}
17+
18+
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void) {
19+
swiftPerform(with: invocation, completionHandler: completionHandler)
20+
}
21+
}

Generate.../Generator.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,8 @@ import Foundation
1010

1111
protocol Generator {
1212
var lines: [String] { get }
13+
14+
init(interfaceSignature: InterfaceSignature, indentation: String)
15+
16+
init(interfaceDefinition: InterfaceDefinition, varSignatures: [VarSignature], indentation: String)
1317
}

Generate.../Info.plist

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@
5252
<key>XCSourceEditorCommandName</key>
5353
<string>Hashable</string>
5454
</dict>
55+
<dict>
56+
<key>XCSourceEditorCommandClassName</key>
57+
<string>$(PRODUCT_MODULE_NAME).GenerateInitCommand</string>
58+
<key>XCSourceEditorCommandIdentifier</key>
59+
<string>$(PRODUCT_BUNDLE_IDENTIFIER).GenerateInitCommand</string>
60+
<key>XCSourceEditorCommandName</key>
61+
<string>Init</string>
62+
</dict>
5563
</array>
5664
<key>XCSourceEditorExtensionPrincipalClass</key>
5765
<string>$(PRODUCT_MODULE_NAME).SourceEditorExtension</string>

Generate.../SelectableGeneratorCommand.swift

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,17 @@ import XcodeKit
1111

1212
protocol SelectableGeneratorCommand: XCSourceEditorCommand {
1313

14+
var generatorType: Generator.Type { get }
15+
1416
func generator(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> Generator
1517

1618
func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator
1719

1820
func swiftPerform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void)
21+
22+
func generateForAllVariables(with invocation: XCSourceEditorCommandInvocation)
23+
24+
func generateForSelectedVariables(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange])
1925
}
2026

2127
extension SelectableGeneratorCommand where Self: NSObject {
@@ -30,14 +36,6 @@ extension SelectableGeneratorCommand where Self: NSObject {
3036
completionHandler(nil)
3137
}
3238

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-
4139
func selectedLines(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> [String] {
4240
let selectedColumns = selections.map { $0.start.line...$0.end.line }.flatMap { $0 }
4341
var selectedLines: [String] = []
@@ -48,6 +46,15 @@ extension SelectableGeneratorCommand where Self: NSObject {
4846
}
4947
return selectedLines
5048
}
49+
50+
func generator(with invocation: XCSourceEditorCommandInvocation, selections: [XCSourceTextRange]) -> Generator {
51+
let selectedVars = selectedLines(with: invocation, selections: selections).flatMap { VarSignature(string: $0) }
52+
return generatorType.init(interfaceDefinition: interfaceSignature(of: invocation).definition, varSignatures: selectedVars, indentation: " ".repeating(invocation.buffer.indentationWidth))
53+
}
54+
55+
func generator(with invocation: XCSourceEditorCommandInvocation) -> Generator {
56+
return generatorType.init(interfaceSignature: interfaceSignature(of: invocation), indentation: " ".repeating(invocation.buffer.indentationWidth))
57+
}
5158
}
5259

5360
extension XCSourceTextPosition: Equatable {

0 commit comments

Comments
 (0)