Skip to content

Commit c5d7611

Browse files
authored
Merge pull request swiftlang#32292 from compnerd/syntax-hashing
gyb: use a stable hash for Syntax
2 parents a7f9d99 + ea8c9b8 commit c5d7611

File tree

1 file changed

+19
-18
lines changed

1 file changed

+19
-18
lines changed

utils/gyb_syntax_support/__init__.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import hashlib
12
import textwrap
23
from . import Classification # noqa: I201
34
from . import Token
@@ -143,34 +144,34 @@ def dedented_lines(description):
143144
return textwrap.dedent(description).split('\n')
144145

145146

146-
def hash_syntax_node(node):
147+
def digest_syntax_node(digest, node):
147148
# Hash into the syntax name and serialization code
148-
result = hash((node.name, get_serialization_code(node.syntax_kind)))
149+
digest.update(node.name)
150+
digest.update(str(get_serialization_code(node.syntax_kind)))
149151
for child in node.children:
150152
# Hash into the expected child syntax
151-
result = hash((result, child.syntax_kind))
153+
digest.update(child.syntax_kind)
152154
# Hash into the child name
153-
result = hash((result, child.name))
155+
digest.update(child.name)
154156
# Hash into whether the child is optional
155-
result = hash((result, child.is_optional))
156-
return result
157+
digest.update(str(child.is_optional))
157158

158159

159-
def hash_token_syntax(token):
160+
def digest_syntax_token(digest, token):
160161
# Hash into the token name and serialization code
161-
return hash((token.name, token.serialization_code))
162+
digest.update(token.name)
163+
digest.update(str(token.serialization_code))
162164

163165

164-
def hash_trivia(trivia):
165-
return hash((trivia.name, trivia.serialization_code, trivia.characters))
166+
def digest_trivia(digest, trivia):
167+
digest.update(trivia.name)
168+
digest.update(str(trivia.serialization_code))
169+
digest.update(str(trivia.characters))
166170

167171

168172
def calculate_node_hash():
169-
result = 0
170-
for node in SYNTAX_NODES:
171-
result = hash((result, hash_syntax_node(node)))
172-
for token in SYNTAX_TOKENS:
173-
result = hash((result, hash_token_syntax(token)))
174-
for trivia in TRIVIAS:
175-
result = hash((result, hash_trivia(trivia)))
176-
return result
173+
digest = hashlib.sha1()
174+
map(lambda node: digest_syntax_node(digest, node), SYNTAX_NODES)
175+
map(lambda token: digest_syntax_token(digest, token), SYNTAX_TOKENS)
176+
map(lambda trivia: digest_trivia(digest, trivia), TRIVIAS)
177+
return digest.hexdigest()

0 commit comments

Comments
 (0)