11
11
//===----------------------------------------------------------------------===//
12
12
13
13
/// A source code language identifier, such as "swift", or "objective-c".
14
- public enum Language : String , Codable , Hashable {
15
- case c
16
- case cpp // C++, not C preprocessor
17
- case objective_c = " objective-c "
18
- case objective_cpp = " objective-cpp "
19
- case swift
14
+ public struct Language : RawRepresentable , Codable , Equatable , Hashable {
15
+ public typealias LanguageId = String
20
16
21
- case unknown
17
+ public static let c : Language = Language ( rawValue: " c " )
18
+ public static let cpp : Language = Language ( rawValue: " cpp " ) // C++, not C preprocessor
19
+ public static let objective_c : Language = Language ( rawValue: " objective-c " )
20
+ public static let objective_cpp : Language = Language ( rawValue: " objective-cpp " )
21
+ public static let swift : Language = Language ( rawValue: " swift " )
22
22
23
- public init ( from decoder: Decoder ) throws {
24
- let container = try decoder. singleValueContainer ( )
25
- let str = try container. decode ( String . self)
26
- if let value = Language ( rawValue: str) {
27
- self = value
28
- } else {
29
- self = . unknown
30
- }
23
+ public let rawValue : LanguageId
24
+ public init ( rawValue: LanguageId ) {
25
+ self . rawValue = rawValue
31
26
}
32
27
33
28
/// Clang-compatible language name suitable for use with `-x <language>`.
@@ -38,7 +33,7 @@ public enum Language: String, Codable, Hashable {
38
33
case . cpp: return " c++ "
39
34
case . objective_c: return " objective-c "
40
35
case . objective_cpp: return " objective-c++ "
41
- case . unknown : return nil
36
+ default : return nil
42
37
}
43
38
}
44
39
@@ -47,3 +42,9 @@ public enum Language: String, Codable, Hashable {
47
42
return xflag. map { " \( $0) -header " }
48
43
}
49
44
}
45
+
46
+ extension Language : CustomStringConvertible {
47
+ public var description : String {
48
+ return rawValue
49
+ }
50
+ }
0 commit comments