| from Node import error |
| from kinds import lowercase_first_word # noqa: I201 |
| |
| |
| class Trivia(object): |
| def __init__(self, name, comment, serialization_code, characters=[], |
| swift_characters=[], is_new_line=False, is_comment=False): |
| self.name = name |
| self.comment = comment |
| self.serialization_code = serialization_code |
| self.characters = characters |
| self.lower_name = lowercase_first_word(name) |
| self.is_new_line = is_new_line |
| self.is_comment = is_comment |
| |
| # Swift sometimes doesn't support escaped characters like \f or \v; |
| # we should allow specifying alternatives explicitly. |
| self.swift_characters = swift_characters if swift_characters else\ |
| characters |
| assert len(self.swift_characters) == len(self.characters) |
| |
| def characters_len(self): |
| return len(self.characters) |
| |
| def is_collection(self): |
| return self.characters_len() > 0 |
| |
| |
| TRIVIAS = [ |
| Trivia('Space', 'A space \' \' character.', characters=[' '], |
| serialization_code=0), |
| Trivia('Tab', 'A tab \'\\t\' character.', characters=['\\t'], |
| serialization_code=1), |
| Trivia('VerticalTab', 'A vertical tab \'\\v\' character.', |
| characters=['\\v'], swift_characters=['\\u{2B7F}'], |
| serialization_code=2), |
| Trivia('Formfeed', 'A form-feed \'f\' character.', characters=['\\f'], |
| swift_characters=['\\u{240C}'], serialization_code=3), |
| Trivia('Newline', 'A newline \'\\n\' character.', characters=['\\n'], |
| is_new_line=True, serialization_code=4), |
| Trivia('CarriageReturn', 'A newline \'\\r\' character.', |
| characters=['\\r'], is_new_line=True, serialization_code=5), |
| Trivia('CarriageReturnLineFeed', |
| 'A newline consists of contiguous \'\\r\' and \'\\n\' characters.', |
| characters=['\\r', '\\n'], is_new_line=True, serialization_code=6), |
| Trivia('Backtick', |
| 'A backtick \'`\' character, used to escape identifiers.', |
| characters=['`'], serialization_code=7), |
| Trivia('LineComment', 'A developer line comment, starting with \'//\'', |
| is_comment=True, serialization_code=8), |
| Trivia('BlockComment', |
| 'A developer block comment, starting with \'/*\' and ending with' |
| ' \'*/\'.', |
| is_comment=True, serialization_code=9), |
| Trivia('DocLineComment', |
| 'A documentation line comment, starting with \'///\'.', |
| is_comment=True, serialization_code=10), |
| Trivia('DocBlockComment', |
| 'A documentation block comment, starting with \'/**\' and ending ' |
| 'with \'*/\'.', |
| is_comment=True, serialization_code=11), |
| Trivia('GarbageText', 'Any skipped garbage text.', serialization_code=12), |
| ] |
| |
| |
| def verify_no_duplicate_serialization_codes(trivias): |
| used_codes = set() |
| for trivia in trivias: |
| if trivia.serialization_code in used_codes: |
| error("Serialization code %d used twice for trivia" % |
| trivia.serialization_code) |
| used_codes.add(trivia.serialization_code) |
| |
| |
| verify_no_duplicate_serialization_codes(TRIVIAS) |