blob: 174e4afc80c9f8190081f3c085c23c8a5c023ad0 [file] [log] [blame]
// 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
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()
}
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,
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
}