| %{ |
| # -*- mode: Swift -*- |
| from gyb_syntax_support import * |
| # Ignore the following admonition it applies to the resulting .swift file only |
| }% |
| //// Automatically Generated From TokenKind.swift.gyb. |
| //// Do Not Edit Directly! |
| //===----------------- TokenKind.swift - Token Kind Enum ------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors |
| // Licensed under Apache License v2.0 with Runtime Library Exception |
| // |
| // See https://swift.org/LICENSE.txt for license information |
| // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| /// Enumerates the kinds of tokens in the Swift language. |
| public enum TokenKind: Codable { |
| case eof |
| % for token in SYNTAX_TOKENS: |
| % kind = token.swift_kind() |
| % |
| % # Tokens that don't have a set text have an associated value that |
| % # contains their text. |
| % if not token.text: |
| % kind += '(String)' |
| % end |
| case ${kind} |
| % end |
| |
| /// The textual representation of this token kind. |
| var text: String { |
| switch self { |
| case .eof: return "" |
| % for token in SYNTAX_TOKENS: |
| % if token.text: |
| case .${token.swift_kind()}: return "${token.text}" |
| % else: |
| case .${token.swift_kind()}(let text): return text |
| % end |
| % end |
| } |
| } |
| |
| /// Keys for serializing and deserializing token kinds. |
| enum CodingKeys: String, CodingKey { |
| case kind, text |
| } |
| |
| enum DecodeError: Error { |
| case unknownTokenKind(String) |
| } |
| |
| public init(from decoder: Decoder) throws { |
| let container = try decoder.container(keyedBy: CodingKeys.self) |
| let kind = try container.decode(String.self, forKey: .kind) |
| switch kind { |
| case "eof": self = .eof |
| % for token in SYNTAX_TOKENS: |
| case "${token.kind}": |
| % if token.text: |
| self = .${token.swift_kind()} |
| % else: |
| let text = try container.decode(String.self, forKey: .text) |
| self = .${token.swift_kind()}(text) |
| % end |
| % end |
| default: throw DecodeError.unknownTokenKind(kind) |
| } |
| } |
| |
| public func encode(to encoder: Encoder) throws { |
| var container = encoder.container(keyedBy: CodingKeys.self) |
| try container.encode(kind, forKey: .kind) |
| try container.encode(text, forKey: .text) |
| } |
| |
| var kind: String { |
| switch self { |
| case .eof: return "eof" |
| % for token in SYNTAX_TOKENS: |
| % kind = token.swift_kind() |
| % if not token.text: |
| % kind += '(_)' |
| % end |
| case .${kind}: return "${token.kind}" |
| % end |
| } |
| } |
| } |
| |
| extension TokenKind: Equatable { |
| public static func ==(lhs: TokenKind, rhs: TokenKind) -> Bool { |
| switch (lhs, rhs) { |
| case (.eof, .eof): return true |
| % for token in SYNTAX_TOKENS: |
| % kind = token.swift_kind() |
| % if token.text: |
| case (.${kind}, .${kind}): return true |
| % else: |
| case (.${kind}(let lhsText), .${kind}(let rhsText)): |
| return lhsText == rhsText |
| % end |
| % end |
| default: return false |
| } |
| } |
| } |