Skip to content

Commit 268c2fb

Browse files
authored
fix: don't error if objc-c files are missing (#37)
1 parent 28c7e3b commit 268c2fb

5 files changed

Lines changed: 104 additions & 52 deletions

File tree

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import Foundation
2+
import SwiftSyntax
3+
import SwiftParser
4+
5+
public class IdentifierExtractor: SyntaxVisitor {
6+
var value: String? = nil
7+
public override func visit(_ node: VariableDeclSyntax) -> SyntaxVisitorContinueKind {
8+
for binding in node.bindings {
9+
if let pattern = binding.pattern.as(IdentifierPatternSyntax.self), pattern.identifier.text == "identifier" {
10+
if let initValue = binding.initializer?.value, let stringLiteral = initValue.as(StringLiteralExprSyntax.self) {
11+
let segments = stringLiteral.segments.compactMap {
12+
segment -> String? in segment.as(StringSegmentSyntax.self)?.content.text
13+
}
14+
value = segments.joined()
15+
}
16+
}
17+
}
18+
return .skipChildren
19+
}
20+
21+
public static func getIdentifier(from fileURL: URL) throws -> String? {
22+
let source = try String(contentsOf: fileURL, encoding: .utf8)
23+
let sourceFile = Parser.parse(source: source)
24+
let extractor = IdentifierExtractor(viewMode: SyntaxTreeViewMode.all)
25+
extractor.walk(sourceFile)
26+
return extractor.value
27+
}
28+
}

Sources/CapacitorPluginTools/CapacitorPluginPackage.swift

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,10 @@ import CapacitorPluginSyntaxTools
33
import JavascriptPackageTools
44

55
public enum CapacitorPluginError: Error {
6-
case objcFileCount(Int)
7-
case objcHeaderCount(Int)
8-
case oldPluginMissing
96
case cantFindPluginSwift(String)
107

118
public var message: String {
129
switch self {
13-
case .objcFileCount(let numberOfFiles):
14-
return "Found \(numberOfFiles) Objective-C *.m files, expected \(numberOfFiles)"
15-
case .oldPluginMissing:
16-
return "Can't find OldPlugin"
17-
case .objcHeaderCount(let numberOfFiles):
18-
return "Found \(numberOfFiles) Objective-C Header files, expected \(numberOfFiles)"
1910
case .cantFindPluginSwift(let name):
2011
return "Can't find \(name) or Plugin.swift in directory"
2112
}
@@ -41,6 +32,7 @@ public class CapacitorPluginPackage {
4132
private var oldPlugin: OldPlugin?
4233
private var packageJSONParser: PackageJSONParser
4334

35+
public var identifier: String?
4436
public var plugin: CapacitorPlugin? {
4537
oldPlugin?.capacitorPlugin
4638
}
@@ -63,56 +55,62 @@ public class CapacitorPluginPackage {
6355
files = try fileManager.contentsOfDirectory(at: pluginSrcDirectoryURL, includingPropertiesForKeys: nil)
6456
}
6557

66-
public func findObjCPluginFile() throws -> URL {
58+
public func findObjCPluginFile() -> URL? {
6759
let mfiles = files.filter { $0.absoluteString.hasSuffix(".m") }
6860

69-
guard mfiles.count == 1, let url = mfiles.first else { throw CapacitorPluginError.objcFileCount(mfiles.count) }
70-
71-
oldPlugin = try OldPlugin(at: url)
72-
73-
return url
61+
if mfiles.count == 1, let url = mfiles.first {
62+
return url
63+
}
64+
return nil
7465
}
7566

7667
public func parseObjCPluginFile(at url: URL) throws {
7768
oldPlugin = try OldPlugin(at: url)
69+
identifier = oldPlugin?.capacitorPlugin.identifier
7870
}
7971

80-
public func findObjCHeaderFile() throws -> URL {
72+
public func findObjCHeaderFile() -> URL? {
8173
let headerFiles = files.filter { $0.absoluteString.hasSuffix(".h") }
82-
guard headerFiles.count == 1, let url = headerFiles.first else { throw CapacitorPluginError.objcFileCount(headerFiles.count) }
83-
84-
return url
74+
if headerFiles.count == 1, let url = headerFiles.first {
75+
return url
76+
}
77+
return nil
8578
}
8679

8780
public func findSwiftPluginFile() throws(CapacitorPluginError) -> URL {
88-
guard let oldPlugin else { throw .oldPluginMissing }
81+
var fileName = ""
82+
if let identifier {
83+
fileName = "\(identifier).swift"
84+
let fileURL = URL(filePath: fileName,
85+
directoryHint: .notDirectory,
86+
relativeTo: pluginSrcDirectoryURL)
8987

90-
let fileName = "\(oldPlugin.capacitorPlugin.identifier).swift"
88+
if (try? fileURL.checkResourceIsReachable()) == true {
89+
return fileURL
90+
} else {
91+
print("Warning: file \(fileURL.path()) not found, trying Plugin.swift")
92+
}
9193

92-
let fileURL = URL(filePath: fileName,
93-
directoryHint: .notDirectory,
94-
relativeTo: pluginSrcDirectoryURL)
94+
let backupFileURL = URL(filePath: "Plugin.swift",
95+
directoryHint: .notDirectory,
96+
relativeTo: pluginSrcDirectoryURL)
9597

96-
if (try? fileURL.checkResourceIsReachable()) == true {
97-
return fileURL
98+
if (try? backupFileURL.checkResourceIsReachable()) == true {
99+
return backupFileURL
100+
}
98101
} else {
99-
print("Warning: file \(fileURL.path()) not found, trying Plugin.swift")
100-
}
101-
102-
let backupFileURL = URL(filePath: "Plugin.swift",
103-
directoryHint: .notDirectory,
104-
relativeTo: pluginSrcDirectoryURL)
105-
106-
if (try? backupFileURL.checkResourceIsReachable()) == true {
107-
return backupFileURL
102+
let swiftFiles = files.filter { $0.absoluteString.hasSuffix("Plugin.swift") }
103+
if swiftFiles.count == 1, let url = swiftFiles.first {
104+
return url
105+
}
108106
}
109107

110108
throw .cantFindPluginSwift(fileName)
111109
}
112110

113111
public func findSwiftTestsPluginFile() -> URL? {
114-
if let oldPlugin {
115-
let fileName = "\(oldPlugin.capacitorPlugin.identifier)Tests.swift"
112+
if let identifier {
113+
let fileName = "\(identifier)Tests.swift"
116114
let fileURL = iosSrcDirectoryURL.appending(path: "PluginTests").appending(path: fileName)
117115
if (try? fileURL.checkResourceIsReachable()) == true {
118116
return fileURL
@@ -154,4 +152,8 @@ public class CapacitorPluginPackage {
154152

155153
try packageJSONParser.writePackageJSON()
156154
}
155+
156+
public func setIdentifier(from fileURL: URL) throws {
157+
identifier = try IdentifierExtractor.getIdentifier(from: fileURL)
158+
}
157159
}

Sources/CommandLineTool/CLIArguments.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,24 +6,27 @@ extension Cap2SPM {
66
objcHeader: String?,
77
objcFile: String?,
88
swiftFile: String?,
9-
swiftTestsFile: String?) throws -> (URL, URL, URL, URL?) {
9+
swiftTestsFile: String?) throws -> (URL?, URL, URL?, URL?) {
1010

11-
let mFileURL: URL
11+
let mFileURL: URL?
1212
let swiftFileURL: URL
1313
let swiftTestsFileURL: URL?
14-
let hFileURL: URL
14+
let hFileURL: URL?
1515

1616
if let objcHeader {
1717
hFileURL = URL(filePath: objcHeader, directoryHint: .notDirectory)
1818
} else {
19-
hFileURL = try package.findObjCHeaderFile()
19+
hFileURL = package.findObjCHeaderFile()
2020
}
2121

2222
if let objcFile {
2323
mFileURL = URL(filePath: objcFile, directoryHint: .notDirectory)
24-
try package.parseObjCPluginFile(at: mFileURL)
2524
} else {
26-
mFileURL = try package.findObjCPluginFile()
25+
mFileURL = package.findObjCPluginFile()
26+
}
27+
28+
if let mFileURL {
29+
try package.parseObjCPluginFile(at: mFileURL)
2730
}
2831

2932
if let swiftFile {
@@ -32,6 +35,10 @@ extension Cap2SPM {
3235
swiftFileURL = try package.findSwiftPluginFile()
3336
}
3437

38+
if mFileURL == nil && isSwiftFileUpdated(at: swiftFileURL) {
39+
try? package.setIdentifier(from: swiftFileURL)
40+
}
41+
3542
if let swiftTestsFile {
3643
swiftTestsFileURL = URL(filePath: swiftTestsFile, directoryHint: .notDirectory)
3744
} else {

Sources/CommandLineTool/CLIFileOperations.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ extension Cap2SPM {
1111
}
1212

1313
func moveSourceDirectories(for package: CapacitorPluginPackage) throws {
14-
guard let identifer = package.plugin?.identifier else { return }
14+
guard let identifer = package.identifier else { return }
1515

1616
try moveItemCreatingIntermediaryDirectories(at: package.iosSrcDirectoryURL.appending(path: "Plugin"),
1717
to: package.iosSrcDirectoryURL.appending(path: "Sources").appending(path: identifer))
@@ -95,4 +95,11 @@ extension Cap2SPM {
9595
testsText.replace("@testable import Plugin\n", with: "@testable import \(target)\n")
9696
try testsText.write(to: fileURL, atomically: true, encoding: .utf8)
9797
}
98+
99+
func isSwiftFileUpdated(at fileURL: URL) -> Bool {
100+
if let swiftText = try? String(contentsOf: fileURL, encoding: .utf8) {
101+
return swiftText.contains("CAPBridgedPlugin")
102+
}
103+
return false
104+
}
98105
}

Sources/CommandLineTool/cap2spm.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ struct Cap2SPM: ParsableCommand {
2525
var pluginDirectory: String
2626

2727
mutating func run() throws {
28-
let mFileURL: URL
28+
let mFileURL: URL?
2929
let swiftFileURL: URL
3030
let swiftTestsFileURL: URL?
31-
let hFileURL: URL
31+
let hFileURL: URL?
3232

3333
let capacitorPluginPackage = try CapacitorPluginPackage(directoryName: pluginDirectory)
3434

@@ -42,21 +42,29 @@ struct Cap2SPM: ParsableCommand {
4242
let podspecFileURL = try capacitorPluginPackage.findPodspecFile()
4343
let podspec = try PodspecParser(at: podspecFileURL)
4444

45-
guard let capPlugin = capacitorPluginPackage.plugin else { return }
45+
guard let identifier = capacitorPluginPackage.identifier else { return }
4646

47-
try capPlugin.modifySwiftFile(at: swiftFileURL)
47+
if let capPlugin = capacitorPluginPackage.plugin {
48+
try capPlugin.modifySwiftFile(at: swiftFileURL)
49+
}
4850

4951
if let swiftTestsFileURL {
50-
try? modifyTestsFile(at: swiftTestsFileURL, with: capPlugin.identifier)
52+
try? modifyTestsFile(at: swiftTestsFileURL, with: identifier)
5153
}
5254

53-
let packageGenerator = PackageFileGenerator(packageName: podspec.podName, targetName: capPlugin.identifier, hasTests: swiftTestsFileURL != nil)
54-
55+
let packageGenerator = PackageFileGenerator(packageName: podspec.podName, targetName: identifier, hasTests: swiftTestsFileURL != nil)
56+
5557
try packageGenerator.generateFile(at: podspecFileURL)
5658

5759
try podspec.modifyPodspecFile(at: podspecFileURL)
5860

59-
var unneededFiles = [hFileURL, mFileURL]
61+
var unneededFiles: [URL] = []
62+
if let hFileURL {
63+
unneededFiles.append(hFileURL)
64+
}
65+
if let mFileURL {
66+
unneededFiles.append(mFileURL)
67+
}
6068
let oldFiles = ["Plugin/Info.plist",
6169
"PluginTests/Info.plist",
6270
"Plugin.xcodeproj",

0 commit comments

Comments
 (0)