Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: mojo/public/tools/bindings/pylib/mojom/generate/constant_resolver.py

Issue 2250183003: Make the fuchsia mojo/public repo the source of truth. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
4
5 """Resolves the values used for constants and enums."""
6
7 from itertools import ifilter
8 import mojom.generate.module as mojom
9
10 def ResolveConstants(module, expression_to_text):
11 in_progress = set()
12 computed = set()
13
14 def GetResolvedValue(named_value):
15 assert isinstance(named_value, (mojom.EnumValue, mojom.ConstantValue))
16 if isinstance(named_value, mojom.EnumValue):
17 field = next(ifilter(lambda field: field.name == named_value.name,
18 named_value.enum.fields), None)
19 if not field:
20 raise RuntimeError(
21 'Unable to get computed value for field %s of enum %s' %
22 (named_value.name, named_value.enum.name))
23 if field not in computed:
24 ResolveEnum(named_value.enum)
25 return field.resolved_value
26 else:
27 ResolveConstant(named_value.constant)
28 named_value.resolved_value = named_value.constant.resolved_value
29 return named_value.resolved_value
30
31 def ResolveConstant(constant):
32 if constant in computed:
33 return
34 if constant in in_progress:
35 raise RuntimeError('Circular dependency for constant: %s' % constant.name)
36 in_progress.add(constant)
37 if isinstance(constant.value, (mojom.EnumValue, mojom.ConstantValue)):
38 resolved_value = GetResolvedValue(constant.value)
39 elif isinstance(constant.value, mojom.BuiltinValue):
40 resolved_value = expression_to_text(constant.value)
41 elif constant.kind in [mojom.FLOAT, mojom.DOUBLE]:
42 # Force float constants to have a decimal point.
43 resolved_value = expression_to_text(repr(float(constant.value)))
44 else:
45 resolved_value = expression_to_text(constant.value)
46 constant.resolved_value = resolved_value
47 in_progress.remove(constant)
48 computed.add(constant)
49
50 def ResolveEnum(enum):
51 def ResolveEnumField(enum, field, default_value):
52 if field in computed:
53 return
54 if field in in_progress:
55 raise RuntimeError('Circular dependency for enum: %s' % enum.name)
56 in_progress.add(field)
57 if field.value:
58 if isinstance(field.value, mojom.EnumValue):
59 resolved_value = GetResolvedValue(field.value)
60 elif isinstance(field.value, str):
61 resolved_value = int(field.value, 0)
62 else:
63 raise RuntimeError('Unexpected value: %s' % field.value)
64 else:
65 resolved_value = default_value
66 field.resolved_value = resolved_value
67 in_progress.remove(field)
68 computed.add(field)
69
70 current_value = 0
71 for field in enum.fields:
72 ResolveEnumField(enum, field, current_value)
73 current_value = field.resolved_value + 1
74
75 for constant in module.constants:
76 ResolveConstant(constant)
77
78 for enum in module.enums:
79 ResolveEnum(enum)
80
81 for struct in module.structs:
82 for constant in struct.constants:
83 ResolveConstant(constant)
84 for enum in struct.enums:
85 ResolveEnum(enum)
86 for field in struct.fields:
87 if isinstance(field.default, (mojom.ConstantValue, mojom.EnumValue)):
88 field.default.resolved_value = GetResolvedValue(field.default)
89
90 for interface in module.interfaces:
91 for constant in interface.constants:
92 ResolveConstant(constant)
93 for enum in interface.enums:
94 ResolveEnum(enum)
95
96 return module
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698