| // Copyright 2021 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package fidlgen_cpp |
| |
| import ( |
| "go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen" |
| ) |
| |
| type Enum struct { |
| Attributes |
| fidlgen.Strictness |
| nameVariants |
| CodingTableType name |
| Enum fidlgen.Enum |
| Type nameVariants |
| Members []EnumMember |
| } |
| |
| func (*Enum) Kind() declKind { |
| return Kinds.Enum |
| } |
| |
| var _ Kinded = (*Enum)(nil) |
| var _ namespaced = (*Enum)(nil) |
| |
| func (e Enum) UnknownValueForTmpl() interface{} { |
| return e.Enum.UnknownValueForTmpl() |
| } |
| |
| func (e Enum) IsCompatibleWithError() bool { |
| return e.Enum.Type == fidlgen.Int32 || e.Enum.Type == fidlgen.Uint32 |
| } |
| |
| type EnumMember struct { |
| Attributes |
| nameVariants |
| Value ConstantValue |
| EnumMember fidlgen.EnumMember |
| } |
| |
| func (m EnumMember) IsUnknown() bool { |
| return m.EnumMember.IsUnknown() |
| } |
| |
| func (c *compiler) compileEnum(val fidlgen.Enum) *Enum { |
| name := c.compileNameVariants(val.Name) |
| r := Enum{ |
| Attributes: Attributes{val.Attributes}, |
| Strictness: val.Strictness, |
| nameVariants: name, |
| CodingTableType: name.Unified.ns.member(c.compileCodingTableType(val.Name)), |
| Enum: val, |
| Type: NameVariantsForPrimitive(val.Type), |
| } |
| for _, v := range val.Members { |
| r.Members = append(r.Members, EnumMember{ |
| Attributes: Attributes{v.Attributes}, |
| nameVariants: enumMemberContext.transform(v.Name), |
| // TODO(fxbug.dev/7660): When we expose types consistently in the IR, we |
| // will not need to plug this here. |
| Value: c.compileConstant(v.Value, nil, fidlgen.Type{ |
| Kind: fidlgen.PrimitiveType, |
| PrimitiveSubtype: val.Type, |
| }), |
| EnumMember: v, |
| }) |
| } |
| return &r |
| } |