Skip to content

Commit 1ac899d

Browse files
committed
Extract SwiftLanguageVersion into separate file
Reimplement SwiftLanguageVersion and ToolsVersion comparison using public properties
1 parent bbed892 commit 1ac899d

File tree

3 files changed

+127
-97
lines changed

3 files changed

+127
-97
lines changed

Sources/PackageModel/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ add_library(PackageModel
1616
Resource.swift
1717
Sources.swift
1818
Target.swift
19+
SwiftLanguageVersion.swift
1920
ToolsVersion.swift)
2021
target_link_libraries(PackageModel PUBLIC
2122
TSCBasic
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/*
2+
This source file is part of the Swift.org open source project
3+
4+
Copyright (c) 2014 - 2020 Apple Inc. and the Swift project authors
5+
Licensed under Apache License v2.0 with Runtime Library Exception
6+
7+
See http://swift.org/LICENSE.txt for license information
8+
See http://swift.org/CONTRIBUTORS.txt for Swift project authors
9+
*/
10+
11+
import TSCBasic
12+
13+
import Foundation
14+
import TSCUtility
15+
16+
/// Represents a Swift language version.
17+
public struct SwiftLanguageVersion: CustomStringConvertible, Comparable {
18+
19+
/// Swift language version 3.
20+
public static let v3 = SwiftLanguageVersion(uncheckedString: "3")
21+
22+
/// Swift language version 4.
23+
public static let v4 = SwiftLanguageVersion(uncheckedString: "4")
24+
25+
/// Swift language version 4.2.
26+
public static let v4_2 = SwiftLanguageVersion(uncheckedString: "4.2")
27+
28+
/// Swift language version 5.
29+
public static let v5 = SwiftLanguageVersion(uncheckedString: "5")
30+
31+
/// The list of known Swift language versions.
32+
public static let knownSwiftLanguageVersions = [
33+
v3, v4, v4_2, v5,
34+
]
35+
36+
/// The raw value of the language version.
37+
//
38+
// This should be passed as a value to Swift compiler's -swift-version flag.
39+
public let rawValue: String
40+
41+
/// The underlying backing store.
42+
private let _version: Version
43+
44+
/// The major version number.
45+
public var major: Int {
46+
return _version.major
47+
}
48+
49+
/// The minor version number.
50+
public var minor: Int {
51+
return _version.minor
52+
}
53+
54+
/// The patch version number.
55+
public var patch: Int {
56+
return _version.patch
57+
}
58+
59+
/// Regex for parsing the Swift language version.
60+
private static let regex = try! RegEx(pattern: "^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?$")
61+
62+
/// Create an instance of Swift language version from the given string.
63+
///
64+
// The Swift language version is not officially fixed but we require it to
65+
// be a valid SemVer-like string.
66+
public init?(string: String) {
67+
let parsedVersion = SwiftLanguageVersion.regex.matchGroups(in: string)
68+
guard parsedVersion.count == 1, parsedVersion[0].count == 3 else {
69+
return nil
70+
}
71+
let major = Int(parsedVersion[0][0])!
72+
let minor = parsedVersion[0][1].isEmpty ? 0 : Int(parsedVersion[0][1])!
73+
let patch = parsedVersion[0][2].isEmpty ? 0 : Int(parsedVersion[0][2])!
74+
75+
self.rawValue = string
76+
self._version = Version(major, minor, patch)
77+
}
78+
79+
/// Create an instance assuming the string is valid.
80+
private init(uncheckedString string: String) {
81+
self.init(string: string)!
82+
}
83+
84+
// MARK: - CustomStringConvertible
85+
86+
public var description: String {
87+
return rawValue
88+
}
89+
90+
// MARK: - Comparable
91+
92+
public static func == (lhs: SwiftLanguageVersion, rhs: SwiftLanguageVersion) -> Bool {
93+
return lhs._version == rhs._version
94+
}
95+
96+
public static func < (lhs: SwiftLanguageVersion, rhs: SwiftLanguageVersion) -> Bool {
97+
return lhs._version < rhs._version
98+
}
99+
100+
// MARK: - Compare with ToolsVersion
101+
102+
public static func == (lhs: SwiftLanguageVersion, rhs: ToolsVersion) -> Bool {
103+
return (lhs.major, lhs.minor, lhs.patch) == (rhs.major, rhs.minor, rhs.patch)
104+
}
105+
106+
public static func < (lhs: SwiftLanguageVersion, rhs: ToolsVersion) -> Bool {
107+
return (lhs.major, lhs.minor, lhs.patch) < (rhs.major, rhs.minor, rhs.patch)
108+
}
109+
110+
public static func <= (lhs: SwiftLanguageVersion, rhs: ToolsVersion) -> Bool {
111+
return (lhs < rhs) || (lhs == rhs)
112+
}
113+
}
114+
115+
extension SwiftLanguageVersion: Codable {
116+
public func encode(to encoder: Encoder) throws {
117+
var container = encoder.singleValueContainer()
118+
try container.encode(rawValue)
119+
}
120+
121+
public init(from decoder: Decoder) throws {
122+
let container = try decoder.singleValueContainer()
123+
let rawValue = try container.decode(String.self)
124+
self.init(uncheckedString: rawValue)
125+
}
126+
}

Sources/PackageModel/ToolsVersion.swift

Lines changed: 0 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -163,103 +163,6 @@ public struct ToolsVersion: CustomStringConvertible, Comparable, Hashable, Codab
163163
}
164164
}
165165

166-
/// Represents a Swift language version.
167-
public struct SwiftLanguageVersion: CustomStringConvertible, Comparable {
168-
169-
/// Swift language version 3.
170-
public static let v3 = SwiftLanguageVersion(uncheckedString: "3")
171-
172-
/// Swift language version 4.
173-
public static let v4 = SwiftLanguageVersion(uncheckedString: "4")
174-
175-
/// Swift language version 4.2.
176-
public static let v4_2 = SwiftLanguageVersion(uncheckedString: "4.2")
177-
178-
/// Swift language version 5.
179-
public static let v5 = SwiftLanguageVersion(uncheckedString: "5")
180-
181-
/// The list of known Swift language versions.
182-
public static let knownSwiftLanguageVersions = [
183-
v3, v4, v4_2, v5,
184-
]
185-
186-
/// The raw value of the language version.
187-
//
188-
// This should be passed as a value to Swift compiler's -swift-version flag.
189-
public let rawValue: String
190-
191-
/// The underlying backing store.
192-
private let _version: Version
193-
194-
/// Regex for parsing the Swift language version.
195-
private static let regex = try! RegEx(pattern: "^(\\d+)(?:\\.(\\d+))?(?:\\.(\\d+))?$")
196-
197-
/// Create an instance of Swift language version from the given string.
198-
///
199-
// The Swift language version is not officially fixed but we require it to
200-
// be a valid SemVer-like string.
201-
public init?(string: String) {
202-
let parsedVersion = SwiftLanguageVersion.regex.matchGroups(in: string)
203-
guard parsedVersion.count == 1, parsedVersion[0].count == 3 else {
204-
return nil
205-
}
206-
let major = Int(parsedVersion[0][0])!
207-
let minor = parsedVersion[0][1].isEmpty ? 0 : Int(parsedVersion[0][1])!
208-
let patch = parsedVersion[0][2].isEmpty ? 0 : Int(parsedVersion[0][2])!
209-
210-
self.rawValue = string
211-
self._version = Version(major, minor, patch)
212-
}
213-
214-
/// Create an instance assuming the string is valid.
215-
private init(uncheckedString string: String) {
216-
self.init(string: string)!
217-
}
218-
219-
// MARK: - CustomStringConvertible
220-
221-
public var description: String {
222-
return rawValue
223-
}
224-
225-
// MARK: - Comparable
226-
227-
public static func == (lhs: SwiftLanguageVersion, rhs: SwiftLanguageVersion) -> Bool {
228-
return lhs._version == rhs._version
229-
}
230-
231-
public static func < (lhs: SwiftLanguageVersion, rhs: SwiftLanguageVersion) -> Bool {
232-
return lhs._version < rhs._version
233-
}
234-
235-
// MAKR: - Compare with ToolsVersion
236-
237-
public static func == (lhs: SwiftLanguageVersion, rhs: ToolsVersion) -> Bool {
238-
return lhs._version == rhs._version
239-
}
240-
241-
public static func < (lhs: SwiftLanguageVersion, rhs: ToolsVersion) -> Bool {
242-
return lhs._version < rhs._version
243-
}
244-
245-
public static func <= (lhs: SwiftLanguageVersion, rhs: ToolsVersion) -> Bool {
246-
return (lhs < rhs) || (lhs == rhs)
247-
}
248-
}
249-
250-
extension SwiftLanguageVersion: Codable {
251-
public func encode(to encoder: Encoder) throws {
252-
var container = encoder.singleValueContainer()
253-
try container.encode(rawValue)
254-
}
255-
256-
public init(from decoder: Decoder) throws {
257-
let container = try decoder.singleValueContainer()
258-
let rawValue = try container.decode(String.self)
259-
self.init(uncheckedString: rawValue)
260-
}
261-
}
262-
263166
// MARK:- Diagnostics
264167

265168
/// The diagnostic triggered when the package has a newer tools version than the installed tools.

0 commit comments

Comments
 (0)