-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathTrivia.py
79 lines (68 loc) · 3.29 KB
/
Trivia.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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,
deprecated=None):
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
self.deprecated = deprecated
# 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),
# TODO: Romove 'Backtick' when all known clients are migrated.
Trivia('Backtick',
'A backtick \'`\' character, used to escape identifiers.',
characters=['`'], serialization_code=7,
deprecated="backticks are now part of the token text"),
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)