| Index: mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py | 
| diff --git a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py | 
| index 4660ff0a7493dfee0974a20882a4dbbe19c80d54..e2d58182201ca21fc0dec193591bb0a0a7570d31 100755 | 
| --- a/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py | 
| +++ b/mojo/public/tools/bindings/pylib/mojom/generate/mojom_translator.py | 
| @@ -65,7 +65,8 @@ class FileTranslator(object): | 
| if mojom_file.declared_mojom_objects: | 
| if mojom_file.declared_mojom_objects.top_level_constants: | 
| mod.constants = [ | 
| -            self.ConstFromMojom(self._graph.resolved_constants[key], None) | 
| +            self.ConstFromMojom( | 
| +                self._graph.resolved_values[key].declared_constant, None) | 
| for key in mojom_file.declared_mojom_objects.top_level_constants] | 
|  | 
| user_defined_types = ['interfaces', 'structs', 'unions'] | 
| @@ -170,7 +171,12 @@ class FileTranslator(object): | 
| self.PopulateCommonFieldValues(struct_field, mojom_field) | 
| struct_field.ordinal = self.OrdinalFromMojom(mojom_field) | 
| if mojom_field.default_value: | 
| -      struct_field.default = self.EvalConst(mojom_field.default_value) | 
| +      if (mojom_field.default_value.tag == | 
| +          mojom_types_mojom.DefaultFieldValue.Tags.default_keyword): | 
| +        struct_field.default = 'default' | 
| +      else: | 
| +        struct_field.default = self.EvalValue( | 
| +            mojom_field.default_value.value) | 
|  | 
| return struct_field | 
|  | 
| @@ -188,8 +194,6 @@ class FileTranslator(object): | 
| """ | 
| param = module.Parameter() | 
| param.ordinal = self.OrdinalFromMojom(mojom) | 
| -    if mojom.default_value: | 
| -      param.default = self.EvalConst(mojom.default_value) | 
| self.PopulateCommonFieldValues(param, mojom) | 
| return param | 
|  | 
| @@ -231,8 +235,8 @@ class FileTranslator(object): | 
| field = module.EnumField() | 
| field.name = mojom_field.decl_data.short_name | 
| field.attributes = self.AttributesFromMojom(mojom_field) | 
| -    field.value = self.EvalConst(mojom_field.value) | 
| -    field.numeric_value = self.EvalConst(mojom_field.value) | 
| +    field.value = mojom_field.int_value | 
| +    field.numeric_value = mojom_field.int_value | 
| return field | 
|  | 
| def AttributesFromMojom(self, mojom): | 
| @@ -342,21 +346,26 @@ class FileTranslator(object): | 
| const = module.Constant() | 
| const.name = mojom_const.decl_data.short_name | 
| const.kind = self.KindFromMojom(mojom_const.type) | 
| -    const.value = self.EvalConst(mojom_const.value) | 
| +    const.value = self.EvalValue(mojom_const.value) | 
| const.parent_kind = parent_kind | 
| return const | 
|  | 
| -  def EvalConst(self, const): | 
| -    """Evaluates a mojom_types_mojom.ConstantValue. | 
| +  def EvalValue(self, value): | 
| +    """Evaluates a mojom_types_mojom.Value. | 
|  | 
| Args: | 
| -      const: {mojom_types_mojom.ConstantValue} to be evaluated. | 
| +      value: {mojom_types_mojom.Value} to be evaluated. | 
|  | 
| Returns: | 
| -      {int|float|str|bool} either the value of the constant or a string | 
| -      referencing a built-in constant value. | 
| +      {int|float|str|bool|None} the literal value if value is a LiteralValue, | 
| +      the string name of the built-in constant if value is a | 
| +      BuiltinConstantValue, the result of invoking EvalValue() on the | 
| +      resolved concrete value of the user value reference if value is a | 
| +      UserValueReference and its concrete value is not None, or else None | 
| """ | 
| -    if const.value.tag == mojom_types_mojom.ConstantValue.Tags.builtin_value: | 
| +    if value.tag == mojom_types_mojom.Value.Tags.literal_value: | 
| +      return value.literal_value.data | 
| +    elif value.tag == mojom_types_mojom.Value.Tags.builtin_value: | 
| mojom_to_builtin = { | 
| mojom_types_mojom.BuiltinConstantValue.DOUBLE_INFINITY: | 
| 'double.INFINITY', | 
| @@ -370,9 +379,15 @@ class FileTranslator(object): | 
| 'float.NEGATIVE_INFINITY', | 
| mojom_types_mojom.BuiltinConstantValue.FLOAT_NAN: 'float.NAN', | 
| } | 
| -      return module.BuiltinValue(mojom_to_builtin[const.value.builtin_value]) | 
| +      return module.BuiltinValue(mojom_to_builtin[value.builtin_value]) | 
|  | 
| -    return const.value.data | 
| +    assert value.tag == mojom_types_mojom.Value.Tags.user_value_reference | 
| +    concrete_value = value.user_value_reference.resolved_concrete_value | 
| +    if concrete_value == None: | 
| +      return None | 
| +    assert (concrete_value.tag != | 
| +        mojom_types_mojom.Value.Tags.user_value_reference) | 
| +    return self.EvalValue(concrete_value) | 
|  | 
| def KindFromMojom(self, mojom_type): | 
| """Translates a mojom_types_mojom.Type to its equivalent module type. | 
|  |