| Index: mojom/mojom_tool/serialization/serialization.go
|
| diff --git a/mojom/mojom_tool/serialization/serialization.go b/mojom/mojom_tool/serialization/serialization.go
|
| index d330de6ec7a46dcda4d8ebf93672e4dbb1f4de62..2c479714032722de4640b5a4e1785b035a2da3be 100644
|
| --- a/mojom/mojom_tool/serialization/serialization.go
|
| +++ b/mojom/mojom_tool/serialization/serialization.go
|
| @@ -87,10 +87,20 @@ func translateDescriptor(d *mojom.MojomDescriptor) *mojom_files.MojomFileGraph {
|
| fileGraph.ResolvedTypes[key] = translateUserDefinedType(userDefinedType)
|
| }
|
|
|
| - // Add |resolved_values| field.
|
| - fileGraph.ResolvedValues = make(map[string]mojom_types.UserDefinedValue)
|
| + // Add |resolved_constants| field.
|
| + fileGraph.ResolvedConstants = make(map[string]mojom_types.DeclaredConstant)
|
| for key, userDefinedValue := range d.ValuesByKey {
|
| - fileGraph.ResolvedValues[key] = translateUserDefinedValue(userDefinedValue)
|
| + switch c := userDefinedValue.(type) {
|
| + // Note that our representation of values in mojom_types.mojom is a little different than our
|
| + // pure Go representation. In the latter we use value keys to refer to both constants and
|
| + // enum values but in the former we only use value keys to refer to constants. Enum values
|
| + // are stored as part of their enum types and they are are referred to not directly using
|
| + // value keyes but rather via the type key of their enum and an index into the |values| array
|
| + // of that enum. For this reason we are only looking for the constants here and ignoring the
|
| + // enum values. Thos will get translated when the
|
| + case *mojom.UserDefinedConstant:
|
| + fileGraph.ResolvedConstants[key] = translateUserDefinedConstant(c)
|
| + }
|
| }
|
|
|
| // Add |files| field.
|
| @@ -407,45 +417,23 @@ func translateUnionField(unionField *mojom.UnionField) mojom_types.UnionField {
|
| return outUnionField
|
| }
|
|
|
| -// WARNING: Do not invoke this function on a UserDefinedValue of type BuiltInConstantValue because
|
| -// objects of those types do not have a type_key and do not correspond to a mojom_types.UserDefinedValue.
|
| -func translateUserDefinedValue(v mojom.UserDefinedValue) mojom_types.UserDefinedValue {
|
| - switch t := v.(type) {
|
| - case *mojom.UserDefinedConstant:
|
| - return translateUserDefinedConstant(t)
|
| - case *mojom.EnumValue:
|
| - return &mojom_types.UserDefinedValueEnumValue{translateEnumValue(t)}
|
| - case *mojom.BuiltInConstantValue:
|
| - panic("Do not invoke translateUserDefinedValue on BuiltInConstantValue.")
|
| - default:
|
| - panic(fmt.Sprintf("Unexpected UserDefinedValue type %T", v))
|
| -
|
| +func translateUserDefinedConstant(t *mojom.UserDefinedConstant) mojom_types.DeclaredConstant {
|
| + declaredConstant := mojom_types.DeclaredConstant{}
|
| + declaredConstant.Type = translateTypeRef(t.DeclaredType())
|
| + declaredConstant.DeclData = *translateDeclarationData(&t.DeclarationData)
|
| + declaredConstant.Value = translateValueRef(t.ValueRef())
|
| + // We set the |resolved_concrete_value| field only in the case that the |value| field is a ConstantReference.
|
| + // See the comments for this field in mojom_types.mojom.
|
| + if _, ok := declaredConstant.Value.(*mojom_types.ValueConstantReference); ok {
|
| + declaredConstant.ResolvedConcreteValue = translateConcreteValue(t.ValueRef().ResolvedConcreteValue())
|
| }
|
| -}
|
|
|
| -func translateUserDefinedConstant(t *mojom.UserDefinedConstant) *mojom_types.UserDefinedValueDeclaredConstant {
|
| - declaredConstant := mojom_types.UserDefinedValueDeclaredConstant{}
|
| - declaredConstant.Value.Type = translateTypeRef(t.DeclaredType())
|
| - declaredConstant.Value.DeclData = *translateDeclarationData(&t.DeclarationData)
|
| - declaredConstant.Value.Value = translateValueRef(t.ValueRef())
|
| - // We set the |resolved_concrete_value| field only in the following situation.
|
| - // See the comments in mojom_types.mojom.
|
| - if _, ok := declaredConstant.Value.Value.(*mojom_types.ValueUserValueReference); ok {
|
| - // If the type of the |value| field is a UserValueReference...
|
| - userValueRef := t.ValueRef().(*mojom.UserValueRef)
|
| - if _, ok := userValueRef.ResolvedDeclaredValue().(*mojom.UserDefinedConstant); ok {
|
| - // and if that reference resolves to a user-defined constant.
|
| - declaredConstant.Value.ResolvedConcreteValue = translateConcreteValue(t.ValueRef().ResolvedConcreteValue())
|
| - }
|
| - }
|
| -
|
| - return &declaredConstant
|
| + return declaredConstant
|
| }
|
|
|
| func translateEnumValue(v *mojom.EnumValue) mojom_types.EnumValue {
|
| enumValue := mojom_types.EnumValue{}
|
| enumValue.DeclData = translateDeclarationData(&v.DeclarationData)
|
| - enumValue.EnumTypeKey = v.EnumType().TypeKey()
|
| if v.ValueRef() != nil {
|
| enumValue.InitializerValue = translateValueRef(v.ValueRef())
|
| }
|
| @@ -573,13 +561,13 @@ func translateConcreteValue(cv mojom.ConcreteValue) mojom_types.Value {
|
| // value, not a value reference. In the case of a LiteralValue or a
|
| // BuiltInConstantValue the distinction is immaterial. But in the case of an
|
| // enum value the distinction is important. Here we are building and returning
|
| - // a synthetic mojom_types.UserValueReference to represent the enum value.
|
| - // It is only the |value_key| field that needs to be populated. It does not
|
| - // make sense to populate the |identifier| field for example because we
|
| + // a synthetic mojom_types.EnumValueReference to represent the enum value.
|
| + // It does not make sense to populate the |identifier| field for because we
|
| // aren't representing any actual occrence in the .mojom file.
|
| case *mojom.EnumValue:
|
| - return &mojom_types.ValueUserValueReference{mojom_types.UserValueReference{
|
| - ValueKey: stringPointer(cv.ValueKey())}}
|
| + return &mojom_types.ValueEnumValueReference{mojom_types.EnumValueReference{
|
| + EnumTypeKey: cv.EnumType().TypeKey(),
|
| + EnumValueIndex: cv.ValueIndex()}}
|
| case mojom.BuiltInConstantValue:
|
| return translateBuiltInConstantValue(cv)
|
| default:
|
| @@ -642,14 +630,20 @@ func translateBuiltInConstantValue(t mojom.BuiltInConstantValue) *mojom_types.Va
|
| }
|
|
|
| func translateUserValueRef(r *mojom.UserValueRef) mojom_types.Value {
|
| - switch t := r.ResolvedConcreteValue().(type) {
|
| + switch t := r.ResolvedDeclaredValue().(type) {
|
| case mojom.BuiltInConstantValue:
|
| return translateBuiltInConstantValue(t)
|
| + case *mojom.UserDefinedConstant:
|
| + return &mojom_types.ValueConstantReference{mojom_types.ConstantReference{
|
| + Identifier: r.Identifier(),
|
| + ConstantKey: t.ValueKey()}}
|
| + case *mojom.EnumValue:
|
| + return &mojom_types.ValueEnumValueReference{mojom_types.EnumValueReference{
|
| + Identifier: r.Identifier(),
|
| + EnumTypeKey: t.EnumType().TypeKey(),
|
| + EnumValueIndex: t.ValueIndex()}}
|
| default:
|
| - valueKey := stringPointer(r.ResolvedDeclaredValue().ValueKey())
|
| - return &mojom_types.ValueUserValueReference{mojom_types.UserValueReference{
|
| - Identifier: r.Identifier(),
|
| - ValueKey: valueKey}}
|
| + panic(fmt.Sprintf("Unrecognized UserDefinedValueType %T", r.ResolvedDeclaredValue()))
|
| }
|
| }
|
|
|
|
|