[fidlgen_cpp] Privatize internal types & methods

This makes a lot of types and methods that are only used when
constructing the IR for the C++ fidlgen backends private.

Change-Id: I49d486b192bfa0cbff19408955025ea7e1e42c04
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/514783
Fuchsia-Auto-Submit: Ian McKellar <ianloic@google.com>
Commit-Queue: Auto-Submit <auto-submit@fuchsia-infra.iam.gserviceaccount.com>
Reviewed-by: Yifei Teng <yifeit@google.com>
diff --git a/tools/fidl/lib/fidlgen_cpp/bits.go b/tools/fidl/lib/fidlgen_cpp/bits.go
index 989e905..b60f20a 100644
--- a/tools/fidl/lib/fidlgen_cpp/bits.go
+++ b/tools/fidl/lib/fidlgen_cpp/bits.go
@@ -11,10 +11,10 @@
 type Bits struct {
 	Attributes
 	fidlgen.Strictness
-	NameVariants
-	Type     NameVariants
+	nameVariants
+	Type     nameVariants
 	Mask     string
-	MaskName NameVariants
+	MaskName nameVariants
 	Members  []BitsMember
 }
 
@@ -23,6 +23,7 @@
 }
 
 var _ Kinded = (*Bits)(nil)
+var _ namespaced = (*Bits)(nil)
 
 type BitsMember struct {
 	Attributes
@@ -35,10 +36,10 @@
 	r := Bits{
 		Attributes:   Attributes{val.Attributes},
 		Strictness:   val.Strictness,
-		NameVariants: name,
-		Type:         c.compileType(val.Type).NameVariants,
+		nameVariants: name,
+		Type:         c.compileType(val.Type).nameVariants,
 		Mask:         val.Mask,
-		MaskName:     name.AppendName("Mask"),
+		MaskName:     name.appendName("Mask"),
 	}
 	for _, v := range val.Members {
 		r.Members = append(r.Members, BitsMember{
diff --git a/tools/fidl/lib/fidlgen_cpp/const.go b/tools/fidl/lib/fidlgen_cpp/const.go
index 0738a16..6fc34cf 100644
--- a/tools/fidl/lib/fidlgen_cpp/const.go
+++ b/tools/fidl/lib/fidlgen_cpp/const.go
@@ -61,8 +61,8 @@
 		return ConstantValue{Natural: lit, Wire: lit}
 	case fidlgen.BinaryOperator:
 		return ConstantValue{
-			Natural: fmt.Sprintf("static_cast<%s>(%s)", t.NameVariants.Natural, val.Value),
-			Wire:    fmt.Sprintf("static_cast<%s>(%s)", t.NameVariants.Wire, val.Value),
+			Natural: fmt.Sprintf("static_cast<%s>(%s)", t.nameVariants.Natural, val.Value),
+			Wire:    fmt.Sprintf("static_cast<%s>(%s)", t.nameVariants.Wire, val.Value),
 		}
 		// return ConstantValue{Natural: naturalVal, Wire: wireVal}
 	default:
@@ -72,7 +72,7 @@
 
 type Const struct {
 	Attributes
-	NameVariants
+	nameVariants
 	Extern    bool
 	Decorator string
 	Type      Type
@@ -84,18 +84,19 @@
 }
 
 var _ Kinded = (*Const)(nil)
+var _ namespaced = (*Const)(nil)
 
 func (c *compiler) compileConst(val fidlgen.Const) Const {
 	n := c.compileNameVariants(val.Name)
 	v := Const{
 		Attributes:   Attributes{val.Attributes},
-		NameVariants: n,
+		nameVariants: n,
 	}
 	if val.Type.Kind == fidlgen.StringType {
 		v.Extern = true
 		v.Decorator = "const"
 		v.Type = Type{
-			NameVariants: PrimitiveNameVariants("char*"),
+			nameVariants: primitiveNameVariants("char*"),
 		}
 		v.Value = c.compileConstant(val.Value, nil, val.Type)
 	} else {
diff --git a/tools/fidl/lib/fidlgen_cpp/enum.go b/tools/fidl/lib/fidlgen_cpp/enum.go
index 5faa403..475a808 100644
--- a/tools/fidl/lib/fidlgen_cpp/enum.go
+++ b/tools/fidl/lib/fidlgen_cpp/enum.go
@@ -11,9 +11,9 @@
 type Enum struct {
 	Attributes
 	fidlgen.Strictness
-	NameVariants
+	nameVariants
 	Enum    fidlgen.Enum
-	Type    NameVariants
+	Type    nameVariants
 	Members []EnumMember
 }
 
@@ -22,6 +22,7 @@
 }
 
 var _ Kinded = (*Enum)(nil)
+var _ namespaced = (*Enum)(nil)
 
 func (e Enum) UnknownValueForTmpl() interface{} {
 	return e.Enum.UnknownValueForTmpl()
@@ -39,7 +40,7 @@
 	r := Enum{
 		Attributes:   Attributes{val.Attributes},
 		Strictness:   val.Strictness,
-		NameVariants: name,
+		nameVariants: name,
 		Enum:         val,
 		Type:         NameVariantsForPrimitive(val.Type),
 	}
diff --git a/tools/fidl/lib/fidlgen_cpp/ir.go b/tools/fidl/lib/fidlgen_cpp/ir.go
index 4647e87..019cec3 100644
--- a/tools/fidl/lib/fidlgen_cpp/ir.go
+++ b/tools/fidl/lib/fidlgen_cpp/ir.go
@@ -95,7 +95,7 @@
 var TypeKinds = namespacedEnum(typeKinds{}).(typeKinds)
 
 type Type struct {
-	NameVariants
+	nameVariants
 
 	WirePointer bool
 
@@ -231,11 +231,11 @@
 // Result holds information about error results on methods.
 type Result struct {
 	ValueMembers    []Parameter
-	ResultDecl      NameVariants
-	ErrorDecl       NameVariants
-	ValueDecl       Name
-	ValueStructDecl NameVariants
-	ValueTupleDecl  Name
+	ResultDecl      nameVariants
+	ErrorDecl       nameVariants
+	ValueDecl       name
+	ValueStructDecl nameVariants
+	ValueTupleDecl  name
 }
 
 func (r Result) ValueArity() int {
@@ -257,9 +257,9 @@
 }
 
 // NameVariantsForPrimitive returns the C++ name of a FIDL primitive type.
-func NameVariantsForPrimitive(val fidlgen.PrimitiveSubtype) NameVariants {
+func NameVariantsForPrimitive(val fidlgen.PrimitiveSubtype) nameVariants {
 	if t, ok := primitiveTypes[val]; ok {
-		return PrimitiveNameVariants(t)
+		return primitiveNameVariants(t)
 	}
 	panic(fmt.Sprintf("unknown primitive type: %v", val))
 }
@@ -291,8 +291,6 @@
 	return formatLibrary(library, "/", keepPartIfReserved)
 }
 
-type libraryNamespaceFunc func(fidlgen.LibraryIdentifier) Namespace
-
 func codingTableName(ident fidlgen.EncodedCompoundIdentifier) string {
 	ci := fidlgen.ParseCompoundIdentifier(ident)
 	return formatLibrary(ci.Library, "_", keepPartIfReserved) + "_" + string(ci.Name) + string(ci.Member)
@@ -319,7 +317,7 @@
 	return false
 }
 
-func (c *compiler) compileNameVariants(eci fidlgen.EncodedCompoundIdentifier) NameVariants {
+func (c *compiler) compileNameVariants(eci fidlgen.EncodedCompoundIdentifier) nameVariants {
 	ci := fidlgen.ParseCompoundIdentifier(eci)
 	if ci.Member != fidlgen.Identifier("") {
 		panic(fmt.Sprintf("unexpected compound identifier with member: %v", eci))
@@ -332,22 +330,22 @@
 	declType := declInfo.Type
 	switch declType {
 	case fidlgen.ConstDeclType, fidlgen.BitsDeclType, fidlgen.EnumDeclType, fidlgen.StructDeclType, fidlgen.TableDeclType, fidlgen.UnionDeclType:
-		return NameVariants{
-			Natural: naturalNamespace(ci.Library).Member(name),
-			Wire:    wireNamespace(ci.Library).Member(name),
-			Unified: unifiedNamespace(ci.Library).Member(name),
+		return nameVariants{
+			Natural: naturalNamespace(ci.Library).member(name),
+			Wire:    wireNamespace(ci.Library).member(name),
+			Unified: unifiedNamespace(ci.Library).member(name),
 		}
 	case fidlgen.ProtocolDeclType, fidlgen.ServiceDeclType:
 		// TODO(yifeit): Protocols and services should not have DeclName.
 		// Not all bindings generate these types.
-		return NameVariants{
-			Natural: naturalNamespace(ci.Library).Member(name),
-			Wire:    unifiedNamespace(ci.Library).Member(name),
+		return nameVariants{
+			Natural: naturalNamespace(ci.Library).member(name),
+			Wire:    unifiedNamespace(ci.Library).member(name),
 			// Intentionally using the natural namespace, since we would like the unified bindings
 			// to transparently accept natural types, which may certainly contain protocol endpoints.
 			// TODO(fxbug.dev/72980): Switch to ClientEnd/ServerEnd and underscore namespace when
 			// corresponding endpoint types can easily convert into each other.
-			Unified: naturalNamespace(ci.Library).Member(name),
+			Unified: naturalNamespace(ci.Library).member(name),
 		}
 	}
 	panic("Unknown decl type: " + string(declType))
@@ -372,10 +370,10 @@
 		// the name _transformation_ would be identical between natural and unified,
 		// here and below. We reserve the flexibility to specify different names
 		// in the future.
-		r.NameVariants = NameVariants{
-			Natural: MakeName("std::array").ArrayTemplate(t.Natural, *val.ElementCount),
-			Unified: MakeName("std::array").ArrayTemplate(t.Unified, *val.ElementCount),
-			Wire:    MakeName("fidl::Array").ArrayTemplate(t.Wire, *val.ElementCount),
+		r.nameVariants = nameVariants{
+			Natural: makeName("std::array").arrayTemplate(t.Natural, *val.ElementCount),
+			Unified: makeName("std::array").arrayTemplate(t.Unified, *val.ElementCount),
+			Wire:    makeName("fidl::Array").arrayTemplate(t.Wire, *val.ElementCount),
 		}
 		r.WirePointer = t.WirePointer
 		r.WireFamily = FamilyKinds.Reference
@@ -387,13 +385,13 @@
 	case fidlgen.VectorType:
 		t := c.compileType(*val.ElementType)
 		if val.Nullable {
-			r.NameVariants.Natural = MakeName("fidl::VectorPtr").Template(t.Natural)
-			r.NameVariants.Unified = MakeName("fidl::VectorPtr").Template(t.Unified)
+			r.nameVariants.Natural = makeName("fidl::VectorPtr").template(t.Natural)
+			r.nameVariants.Unified = makeName("fidl::VectorPtr").template(t.Unified)
 		} else {
-			r.NameVariants.Natural = MakeName("std::vector").Template(t.Natural)
-			r.NameVariants.Unified = MakeName("std::vector").Template(t.Unified)
+			r.nameVariants.Natural = makeName("std::vector").template(t.Natural)
+			r.nameVariants.Unified = makeName("std::vector").template(t.Unified)
 		}
-		r.NameVariants.Wire = MakeName("fidl::VectorView").Template(t.Wire)
+		r.nameVariants.Wire = makeName("fidl::VectorView").template(t.Wire)
 		r.WireFamily = FamilyKinds.Vector
 		r.WirePointer = t.WirePointer
 		r.NeedsDtor = true
@@ -402,35 +400,35 @@
 		r.ElementType = &t
 	case fidlgen.StringType:
 		if val.Nullable {
-			r.Natural = MakeName("fidl::StringPtr")
+			r.Natural = makeName("fidl::StringPtr")
 		} else {
-			r.Natural = MakeName("std::string")
+			r.Natural = makeName("std::string")
 		}
 		r.Unified = r.Natural
-		r.Wire = MakeName("fidl::StringView")
+		r.Wire = makeName("fidl::StringView")
 		r.WireFamily = FamilyKinds.String
 		r.NeedsDtor = true
 		r.Kind = TypeKinds.String
 	case fidlgen.HandleType:
 		c.handleTypes[val.HandleSubtype] = struct{}{}
-		r.NameVariants = NameVariantsForHandle(val.HandleSubtype)
+		r.nameVariants = nameVariantsForHandle(val.HandleSubtype)
 		r.WireFamily = FamilyKinds.Reference
 		r.NeedsDtor = true
 		r.Kind = TypeKinds.Handle
 		r.IsResource = true
 	case fidlgen.RequestType:
 		p := c.compileNameVariants(val.RequestSubtype)
-		r.NameVariants = NameVariants{
-			Natural: MakeName("fidl::InterfaceRequest").Template(p.Natural),
-			Unified: MakeName("fidl::InterfaceRequest").Template(p.Unified),
-			Wire:    MakeName("fidl::ServerEnd").Template(p.Wire),
+		r.nameVariants = nameVariants{
+			Natural: makeName("fidl::InterfaceRequest").template(p.Natural),
+			Unified: makeName("fidl::InterfaceRequest").template(p.Unified),
+			Wire:    makeName("fidl::ServerEnd").template(p.Wire),
 		}
 		r.WireFamily = FamilyKinds.Reference
 		r.NeedsDtor = true
 		r.Kind = TypeKinds.Request
 		r.IsResource = true
 	case fidlgen.PrimitiveType:
-		r.NameVariants = NameVariantsForPrimitive(val.PrimitiveSubtype)
+		r.nameVariants = NameVariantsForPrimitive(val.PrimitiveSubtype)
 		r.WireFamily = FamilyKinds.TrivialCopy
 		r.Kind = TypeKinds.Primitive
 	case fidlgen.IdentifierType:
@@ -441,10 +439,10 @@
 		}
 		declType := declInfo.Type
 		if declType == fidlgen.ProtocolDeclType {
-			r.NameVariants = NameVariants{
-				Natural: MakeName("fidl::InterfaceHandle").Template(name.Natural),
-				Unified: MakeName("fidl::InterfaceHandle").Template(name.Unified),
-				Wire:    MakeName("fidl::ClientEnd").Template(name.Wire),
+			r.nameVariants = nameVariants{
+				Natural: makeName("fidl::InterfaceHandle").template(name.Natural),
+				Unified: makeName("fidl::InterfaceHandle").template(name.Unified),
+				Wire:    makeName("fidl::ClientEnd").template(name.Wire),
 			}
 			r.WireFamily = FamilyKinds.Reference
 			r.NeedsDtor = true
@@ -483,16 +481,16 @@
 			}
 
 			if val.Nullable {
-				r.NameVariants.Natural = MakeName("std::unique_ptr").Template(name.Natural)
-				r.NameVariants.Unified = MakeName("std::unique_ptr").Template(name.Unified)
+				r.nameVariants.Natural = makeName("std::unique_ptr").template(name.Natural)
+				r.nameVariants.Unified = makeName("std::unique_ptr").template(name.Unified)
 				if declType == fidlgen.UnionDeclType {
-					r.NameVariants.Wire = name.Wire
+					r.nameVariants.Wire = name.Wire
 				} else {
-					r.NameVariants.Wire = MakeName("fidl::ObjectView").Template(name.Wire)
+					r.nameVariants.Wire = makeName("fidl::ObjectView").template(name.Wire)
 				}
 				r.NeedsDtor = true
 			} else {
-				r.NameVariants = name
+				r.nameVariants = name
 				r.NeedsDtor = true
 			}
 		}
diff --git a/tools/fidl/lib/fidlgen_cpp/names.go b/tools/fidl/lib/fidlgen_cpp/names.go
index e9df4b0..b6585d0 100644
--- a/tools/fidl/lib/fidlgen_cpp/names.go
+++ b/tools/fidl/lib/fidlgen_cpp/names.go
@@ -11,9 +11,9 @@
 	"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
 )
 
-var zxNs Namespace = NewNamespace("zx")
-var fidlNs Namespace = NewNamespace("fidl")
-var internalNs Namespace = fidlNs.Append("internal")
+var zxNs namespace = newNamespace("zx")
+var fidlNs namespace = newNamespace("fidl")
+var internalNs namespace = fidlNs.append("internal")
 
 // variant controls how we refer to domain object declarations.
 type variant string
@@ -28,19 +28,19 @@
 var currentVariant = noVariant
 
 // Namespace represents a C++ namespace.
-type Namespace []string
+type namespace []string
 
-func NewNamespace(ns string) Namespace {
-	return Namespace(strings.Split(ns, "::"))
+func newNamespace(ns string) namespace {
+	return namespace(strings.Split(ns, "::"))
 }
 
-// Namespace is implemented to satisfy the Namespaced interface.
-func (ns Namespace) Namespace() Namespace {
+// Namespace is implemented to satisfy the namespaced interface.
+func (ns namespace) Namespace() namespace {
 	return ns
 }
 
 // String returns the fully qualified namespace including leading ::.
-func (ns Namespace) String() string {
+func (ns namespace) String() string {
 	if len(ns) == 0 {
 		return ""
 	}
@@ -48,40 +48,30 @@
 }
 
 // NoLeading returns the fully qualified namespace without the leading ::.
-func (ns Namespace) NoLeading() string {
+func (ns namespace) NoLeading() string {
 	return strings.Join(ns, "::")
 }
 
-// Append returns a new namespace with an additional component.
-func (ns Namespace) Append(part string) Namespace {
+// append returns a new namespace with an additional component.
+func (ns namespace) append(part string) namespace {
 	newNs := make([]string, len(ns)+1)
 	copy(newNs, ns)
 	newNs[len(ns)] = part
-	return Namespace(newNs)
+	return namespace(newNs)
 }
 
-// DropLastComponent returns a new namespace with the final component removed.
-func (ns Namespace) DropLastComponent() Namespace {
-	if len(ns) == 0 {
-		panic("Can't drop the end of an empty namespace")
-	}
-	new := make([]string, len(ns)-1)
-	copy(new, ns)
-	return Namespace(new)
+// member creates a named declaration within the namespace
+func (ns namespace) member(n string) name {
+	return name{name: stringNamePart(n), ns: ns}
 }
 
-// Member creates a named declaration within the namespace
-func (ns Namespace) Member(name string) Name {
-	return Name{name: stringNamePart(name), ns: ns}
-}
-
-// NameVariants is the name of a type or a template used in the various C++ bindings.
+// nameVariants is the name of a type or a template used in the various C++ bindings.
 //
 // Names are more general than FIDL declarations. All declarations have a corresponding
 // type name, but some types are not declared in the generated code (e.g. zx::vmo),
 // or are non-nominal (e.g. std::vector<FooBarDecl>).
-type NameVariants struct {
-	Natural Name
+type nameVariants struct {
+	Natural name
 
 	// Unified is like Natural, except it consists of type aliases, declared in
 	// the unified bindings, to natural types. For example, the Natural name
@@ -102,24 +92,24 @@
 	//
 	// In case of client and server protocol endpoints, there is no alias,
 	// and Unified is the same as Natural.
-	Unified Name
+	Unified name
 
-	Wire Name
+	Wire name
 }
 
-// CommonNameVariants returns a NameVariants with the same Name for both Wire and Natural variants.
-func CommonNameVariants(decl Name) NameVariants {
-	return NameVariants{
+// commonNameVariants returns a nameVariants with the same Name for both Wire and Natural variants.
+func commonNameVariants(decl name) nameVariants {
+	return nameVariants{
 		Natural: decl,
 		Unified: decl,
 		Wire:    decl,
 	}
 }
 
-func (dn NameVariants) String() string {
+func (dn nameVariants) String() string {
 	switch currentVariant {
 	case noVariant:
-		fidlgen.TemplateFatalf("Called NameVariants.String() on %s/%s when currentVariant isn't set.\n",
+		fidlgen.TemplateFatalf("Called nameVariants.String() on %s/%s when currentVariant isn't set.\n",
 			dn.Natural, dn.Wire)
 	case naturalVariant:
 		return dn.Natural.String()
@@ -131,10 +121,10 @@
 	panic("not reached")
 }
 
-func (dn NameVariants) Name() string {
+func (dn nameVariants) Name() string {
 	switch currentVariant {
 	case noVariant:
-		fidlgen.TemplateFatalf("Called NameVariants.Name() on %s/%s when currentVariant isn't set.\n",
+		fidlgen.TemplateFatalf("Called nameVariants.Name() on %s/%s when currentVariant isn't set.\n",
 			dn.Natural, dn.Wire)
 	case naturalVariant:
 		return dn.Natural.Name()
@@ -146,10 +136,10 @@
 	panic("not reached")
 }
 
-func (dn NameVariants) Self() string {
+func (dn nameVariants) Self() string {
 	switch currentVariant {
 	case noVariant:
-		fidlgen.TemplateFatalf("Called NameVariants.Self() on %s/%s when currentVariant isn't set.\n", dn.Natural, dn.Wire)
+		fidlgen.TemplateFatalf("Called nameVariants.Self() on %s/%s when currentVariant isn't set.\n", dn.Natural, dn.Wire)
 	case naturalVariant:
 		return dn.Natural.Self()
 	case unifiedVariant:
@@ -160,10 +150,10 @@
 	panic("not reached")
 }
 
-func (dn NameVariants) NoLeading() string {
+func (dn nameVariants) NoLeading() string {
 	switch currentVariant {
 	case noVariant:
-		fidlgen.TemplateFatalf("Called NameVariants.NoLeading() on %s/%s when currentVariant isn't set.\n", dn.Natural, dn.Wire)
+		fidlgen.TemplateFatalf("Called nameVariants.NoLeading() on %s/%s when currentVariant isn't set.\n", dn.Natural, dn.Wire)
 	case naturalVariant:
 		return dn.Natural.NoLeading()
 	case unifiedVariant:
@@ -174,10 +164,10 @@
 	panic("not reached")
 }
 
-func (dn NameVariants) Namespace() Namespace {
+func (dn nameVariants) Namespace() namespace {
 	switch currentVariant {
 	case noVariant:
-		fidlgen.TemplateFatalf("Called NameVariants.Namespace() on %s/%s when currentVariant isn't set.\n",
+		fidlgen.TemplateFatalf("Called nameVariants.Namespace() on %s/%s when currentVariant isn't set.\n",
 			dn.Natural, dn.Wire)
 	case naturalVariant:
 		return dn.Natural.Namespace()
@@ -189,49 +179,49 @@
 	panic("not reached")
 }
 
-// AppendName returns a new NameVariants with an suffix appended to the name portions.
-func (dn NameVariants) AppendName(suffix string) NameVariants {
-	return NameVariants{
-		Natural: dn.Natural.AppendName(suffix),
-		Unified: dn.Unified.AppendName(suffix),
-		Wire:    dn.Wire.AppendName(suffix),
+// appendName returns a new nameVariants with an suffix appended to the name portions.
+func (dn nameVariants) appendName(suffix string) nameVariants {
+	return nameVariants{
+		Natural: dn.Natural.appendName(suffix),
+		Unified: dn.Unified.appendName(suffix),
+		Wire:    dn.Wire.appendName(suffix),
 	}
 }
 
-// PrependName returns a new NameVariants with an prefix prepended to the name portions.
-func (dn NameVariants) PrependName(prefix string) NameVariants {
-	return NameVariants{
-		Natural: dn.Natural.PrependName(prefix),
-		Unified: dn.Unified.PrependName(prefix),
-		Wire:    dn.Wire.PrependName(prefix),
+// prependName returns a new nameVariants with an prefix prepended to the name portions.
+func (dn nameVariants) prependName(prefix string) nameVariants {
+	return nameVariants{
+		Natural: dn.Natural.prependName(prefix),
+		Unified: dn.Unified.prependName(prefix),
+		Wire:    dn.Wire.prependName(prefix),
 	}
 }
 
-// AppendNamespace returns a new NameVariants with additional C++ namespace components appended.
-func (dn NameVariants) AppendNamespace(c string) NameVariants {
-	return NameVariants{
-		Natural: dn.Natural.AppendNamespace(c),
-		Unified: dn.Unified.AppendNamespace(c),
-		Wire:    dn.Wire.AppendNamespace(c),
+// appendNamespace returns a new nameVariants with additional C++ namespace components appended.
+func (dn nameVariants) appendNamespace(c string) nameVariants {
+	return nameVariants{
+		Natural: dn.Natural.appendNamespace(c),
+		Unified: dn.Unified.appendNamespace(c),
+		Wire:    dn.Wire.appendNamespace(c),
 	}
 }
 
-// Nest returns a new name for a class nested inside the existing name.
-func (dn NameVariants) Nest(c string) NameVariants {
-	return NameVariants{
-		Natural: dn.Natural.Nest(c),
-		Wire:    dn.Wire.Nest(c),
+// nest returns a new name for a class nested inside the existing name.
+func (dn nameVariants) nest(c string) nameVariants {
+	return nameVariants{
+		Natural: dn.Natural.nest(c),
+		Wire:    dn.Wire.nest(c),
 	}
 }
 
-// NameVariantsForHandle returns the C++ name for a handle type
-func NameVariantsForHandle(t fidlgen.HandleSubtype) NameVariants {
-	return CommonNameVariants(zxNs.Member(string(t)))
+// nameVariantsForHandle returns the C++ name for a handle type
+func nameVariantsForHandle(t fidlgen.HandleSubtype) nameVariants {
+	return commonNameVariants(zxNs.member(string(t)))
 }
 
-// PrimitiveNameVariants returns a NameVariants for a primitive type, common across all bindings.
-func PrimitiveNameVariants(primitive string) NameVariants {
-	return CommonNameVariants(MakeName(primitive))
+// primitiveNameVariants returns a nameVariants for a primitive type, common across all bindings.
+func primitiveNameVariants(primitive string) nameVariants {
+	return commonNameVariants(makeName(primitive))
 }
 
 // namePart represents part of non-namespace part of a name.
@@ -251,14 +241,14 @@
 	// For a template name like "Foo::Bar<Baz>" this would be "Bar".
 	Self() string
 
-	// Nest returns a new name for a class nested inside the existing name.
-	Nest(name string) namePart
+	// nest returns a new name for a class nested inside the existing name.
+	nest(name string) namePart
 	// Template returns a new name with this name being an template applied to the |args|.
-	Template(args string) namePart
-	// PrependName returns a new name with a prefix prepended.
-	PrependName(prefix string) namePart
-	// AppendName returns a new name with a suffix appended.
-	AppendName(suffix string) namePart
+	template(args string) namePart
+	// prependName returns a new name with a prefix prepended.
+	prependName(prefix string) namePart
+	// appendName returns a new name with a suffix appended.
+	appendName(suffix string) namePart
 }
 
 type stringNamePart string
@@ -273,19 +263,19 @@
 	return string(n)
 }
 
-func (n stringNamePart) Nest(name string) namePart {
+func (n stringNamePart) nest(name string) namePart {
 	return newNestedNamePart(n, stringNamePart(name))
 }
 
-func (n stringNamePart) Template(args string) namePart {
+func (n stringNamePart) template(args string) namePart {
 	return newTemplateNamePart(n, args)
 }
 
-func (n stringNamePart) PrependName(prefix string) namePart {
+func (n stringNamePart) prependName(prefix string) namePart {
 	return stringNamePart(prefix + string(n))
 }
 
-func (n stringNamePart) AppendName(suffix string) namePart {
+func (n stringNamePart) appendName(suffix string) namePart {
 	return stringNamePart(string(n) + suffix)
 }
 
@@ -308,85 +298,85 @@
 	return n.right.Self()
 }
 
-func (n nestedNamePart) Nest(name string) namePart {
-	return nestedNamePart{n.left, n.right.Nest(name)}
+func (n nestedNamePart) nest(name string) namePart {
+	return nestedNamePart{n.left, n.right.nest(name)}
 }
 
-func (n nestedNamePart) Template(args string) namePart {
+func (n nestedNamePart) template(args string) namePart {
 	return newTemplateNamePart(n, args)
 }
 
-func (n nestedNamePart) PrependName(prefix string) namePart {
-	return nestedNamePart{n.left, n.right.PrependName(prefix)}
+func (n nestedNamePart) prependName(prefix string) namePart {
+	return nestedNamePart{n.left, n.right.prependName(prefix)}
 }
 
-func (n nestedNamePart) AppendName(suffix string) namePart {
-	return nestedNamePart{n.left, n.right.AppendName(suffix)}
+func (n nestedNamePart) appendName(suffix string) namePart {
+	return nestedNamePart{n.left, n.right.appendName(suffix)}
 }
 
 type templateNamePart struct {
-	template namePart
-	args     string
+	tmpl namePart
+	args string
 }
 
 var _ namePart = (*templateNamePart)(nil)
 
-func newTemplateNamePart(template namePart, args string) namePart {
-	return templateNamePart{template, args}
+func newTemplateNamePart(tmpl namePart, args string) namePart {
+	return templateNamePart{tmpl, args}
 }
 
 func (n templateNamePart) String() string {
-	return fmt.Sprintf("%s<%s>", n.template, n.args)
+	return fmt.Sprintf("%s<%s>", n.tmpl, n.args)
 }
 
 func (n templateNamePart) Self() string {
-	return n.template.Self()
+	return n.tmpl.Self()
 }
 
-func (n templateNamePart) Nest(name string) namePart {
+func (n templateNamePart) nest(name string) namePart {
 	return nestedNamePart{n, stringNamePart(name)}
 }
 
-func (n templateNamePart) Template(args string) namePart {
+func (n templateNamePart) template(args string) namePart {
 	panic(fmt.Sprintf("Can't make a template of a template: %s", n))
 }
 
-func (n templateNamePart) PrependName(prefix string) namePart {
+func (n templateNamePart) prependName(prefix string) namePart {
 	panic(fmt.Sprintf("Can't prepend to the name of a template: %s", n))
 }
 
-func (n templateNamePart) AppendName(suffix string) namePart {
+func (n templateNamePart) appendName(suffix string) namePart {
 	panic(fmt.Sprintf("Can't append to the name of a template: %s", n))
 }
 
-// Name holds a C++ qualified identifier.
+// name holds a C++ qualified identifier.
 // See: https://en.cppreference.com/w/cpp/language/identifiers#Qualified_identifiers
 // It consists of a Namespace and a namePart.
 // TODO(ianloic): move this to the top of the file since it's the most important type.
-type Name struct {
+type name struct {
 	name namePart
-	ns   Namespace
+	ns   namespace
 }
 
 // MakeName takes a string with a :: separated name and makes a Name treating the last component
 // as the local name and the preceding components as the namespace.
 // This should only be used with string literals for creating well-known, simple names.
-func MakeName(name string) Name {
-	i := strings.LastIndex(name, "::")
+func makeName(n string) name {
+	i := strings.LastIndex(n, "::")
 	if i == -1 {
-		return Name{name: stringNamePart(name)}
+		return name{name: stringNamePart(n)}
 	}
 	if i == 0 {
-		panic(fmt.Sprintf("Don't call MakeName with leading double-colons: %v", name))
+		panic(fmt.Sprintf("Don't call MakeName with leading double-colons: %v", n))
 	}
-	return Name{
-		name: stringNamePart(name[i+2:]),
-		ns:   NewNamespace(name[0:i]),
+	return name{
+		name: stringNamePart(n[i+2:]),
+		ns:   newNamespace(n[0:i]),
 	}
 }
 
 // String returns the full name with a leading :: if the name has a namespace.
-func (n Name) String() string {
+func (n name) String() string {
 	ns := n.ns.String()
 	if len(ns) > 0 {
 		ns = ns + "::"
@@ -395,19 +385,19 @@
 }
 
 // Name returns the portion of the name that comes after the namespace.
-func (n Name) Name() string {
+func (n name) Name() string {
 	return n.name.String()
 }
 
 // Self returns how the type refers to itself, like in constructor & destructor names.
 // For a nested name like "Foo::Bar::Baz" this would be "Baz".
 // For a template name like "Foo::Bar<Baz>" this would be "Bar".
-func (n Name) Self() string {
+func (n name) Self() string {
 	return n.name.Self()
 }
 
 // TODO(ianloic): probably make this the default
-func (n Name) NoLeading() string {
+func (n name) NoLeading() string {
 	ns := n.ns.NoLeading()
 	if len(ns) > 0 {
 		ns = ns + "::"
@@ -415,47 +405,47 @@
 	return ns + n.name.String()
 }
 
-// Namespace returns the namespace portion of the name.
-func (n Name) Namespace() Namespace {
+// namespace returns the namespace portion of the name.
+func (n name) Namespace() namespace {
 	return n.ns
 }
 
-// Nest returns a new name for a class nested inside the existing name.
-func (n Name) Nest(name string) Name {
-	return Name{name: n.name.Nest(name), ns: n.ns}
+// nest returns a new name for a class nested inside the existing name.
+func (n name) nest(nested string) name {
+	return name{name: n.name.nest(nested), ns: n.ns}
 }
 
 // Template returns a new name with this name being an template applied to the |arg|.
-func (n Name) Template(arg Name) Name {
-	return Name{name: n.name.Template(arg.String()), ns: n.ns}
+func (n name) template(arg name) name {
+	return name{name: n.name.template(arg.String()), ns: n.ns}
 }
 
-// ArrayTemplate returns a new name with this name being an template applied to the |arg| with a |count|.
-func (n Name) ArrayTemplate(arg Name, count int) Name {
-	return Name{name: n.name.Template(fmt.Sprintf("%s, %d", arg.String(), count)), ns: n.ns}
+// arrayTemplate returns a new name with this name being an template applied to the |arg| with a |count|.
+func (n name) arrayTemplate(arg name, count int) name {
+	return name{name: n.name.template(fmt.Sprintf("%s, %d", arg.String(), count)), ns: n.ns}
 }
 
-// PrependName returns a new name with a prefix prepended to the last part of the name.
-func (n Name) PrependName(prefix string) Name {
-	return Name{name: n.name.PrependName(prefix), ns: n.ns}
+// prependName returns a new name with a prefix prepended to the last part of the name.
+func (n name) prependName(prefix string) name {
+	return name{name: n.name.prependName(prefix), ns: n.ns}
 }
 
-// AppendName returns a new name with a suffix appended to the last part of the name.
-func (n Name) AppendName(suffix string) Name {
-	return Name{name: n.name.AppendName(suffix), ns: n.ns}
+// appendName returns a new name with a suffix appended to the last part of the name.
+func (n name) appendName(suffix string) name {
+	return name{name: n.name.appendName(suffix), ns: n.ns}
 }
 
-// AppendNamespace returns a new name with an additional namespace component added.
-func (n Name) AppendNamespace(part string) Name {
-	return Name{name: n.name, ns: n.ns.Append(part)}
+// appendNamespace returns a new name with an additional namespace component added.
+func (n name) appendNamespace(part string) name {
+	return name{name: n.name, ns: n.ns.append(part)}
 }
 
-// MakeTupleName returns a Name for a std::tuple of the supplied names.
-func MakeTupleName(members []Name) Name {
-	t := MakeName("std::tuple")
+// makeTupleName returns a Name for a std::tuple of the supplied names.
+func makeTupleName(members []name) name {
+	t := makeName("std::tuple")
 	a := []string{}
 	for _, m := range members {
 		a = append(a, m.String())
 	}
-	return Name{name: t.name.Template(strings.Join(a, ", ")), ns: t.ns}
+	return name{name: t.name.template(strings.Join(a, ", ")), ns: t.ns}
 }
diff --git a/tools/fidl/lib/fidlgen_cpp/names_test.go b/tools/fidl/lib/fidlgen_cpp/names_test.go
index 0334a24..a3574f6 100644
--- a/tools/fidl/lib/fidlgen_cpp/names_test.go
+++ b/tools/fidl/lib/fidlgen_cpp/names_test.go
@@ -9,25 +9,25 @@
 )
 
 func TestName(t *testing.T) {
-	ns := Namespace([]string{"foo", "bar"})
-	v := ns.Member("Baz")
+	ns := namespace([]string{"foo", "bar"})
+	v := ns.member("Baz")
 	assertEqual(t, v.String(), "::foo::bar::Baz")
 
-	p := v.PrependName("Prefix")
+	p := v.prependName("Prefix")
 	assertEqual(t, p.String(), "::foo::bar::PrefixBaz")
 
-	s := v.AppendName("Suffix")
+	s := v.appendName("Suffix")
 	assertEqual(t, s.String(), "::foo::bar::BazSuffix")
 
-	n := v.Nest("Quux")
+	n := v.nest("Quux")
 	assertEqual(t, n.String(), "::foo::bar::Baz::Quux")
 	assertEqual(t, n.Self(), "Quux")
 
-	tmpl := v.Template(Namespace([]string{"hello"}).Member("World"))
+	tmpl := v.template(namespace([]string{"hello"}).member("World"))
 	assertEqual(t, tmpl.String(), "::foo::bar::Baz<::hello::World>")
 	assertEqual(t, tmpl.Self(), "Baz")
 
-	tmpl_nest := tmpl.Nest("Inner")
+	tmpl_nest := tmpl.nest("Inner")
 	assertEqual(t, tmpl_nest.String(), "::foo::bar::Baz<::hello::World>::Inner")
 
 }
diff --git a/tools/fidl/lib/fidlgen_cpp/namespace.go b/tools/fidl/lib/fidlgen_cpp/namespace.go
index 386d73e..ab92948 100644
--- a/tools/fidl/lib/fidlgen_cpp/namespace.go
+++ b/tools/fidl/lib/fidlgen_cpp/namespace.go
@@ -10,25 +10,25 @@
 	"go.fuchsia.dev/fuchsia/tools/fidl/lib/fidlgen"
 )
 
-// Namespaced is implemented by types that have a C++ namespace.
-type Namespaced interface {
-	Namespace() Namespace
+// namespaced is implemented by types that have a C++ namespace.
+type namespaced interface {
+	Namespace() namespace
 }
 
 // During template processing this holds the current namespace.
-var currentNamespace Namespace
+var currentNamespace namespace
 
 //
 // Predefined namespaces
 //
 
-func wireNamespace(library fidlgen.LibraryIdentifier) Namespace {
-	return unifiedNamespace(library).Append("wire")
+func wireNamespace(library fidlgen.LibraryIdentifier) namespace {
+	return unifiedNamespace(library).append("wire")
 }
 
-func naturalNamespace(library fidlgen.LibraryIdentifier) Namespace {
+func naturalNamespace(library fidlgen.LibraryIdentifier) namespace {
 	parts := libraryParts(library, changePartIfReserved)
-	return Namespace(parts)
+	return namespace(parts)
 }
 
 func formatLibrary(library fidlgen.LibraryIdentifier, sep string, identifierTransform identifierTransform) string {
@@ -36,6 +36,6 @@
 	return changeIfReserved(fidlgen.Identifier(name))
 }
 
-func unifiedNamespace(library fidlgen.LibraryIdentifier) Namespace {
-	return Namespace([]string{formatLibrary(library, "_", keepPartIfReserved)})
+func unifiedNamespace(library fidlgen.LibraryIdentifier) namespace {
+	return namespace([]string{formatLibrary(library, "_", keepPartIfReserved)})
 }
diff --git a/tools/fidl/lib/fidlgen_cpp/protocol.go b/tools/fidl/lib/fidlgen_cpp/protocol.go
index 596ce88..ac6d360 100644
--- a/tools/fidl/lib/fidlgen_cpp/protocol.go
+++ b/tools/fidl/lib/fidlgen_cpp/protocol.go
@@ -23,50 +23,50 @@
 	// ProtocolMarker is a pure-virtual interface corresponding to methods in
 	// the protocol. Notably, HLCPP shares the same interface type between
 	// the server and client bindings API.
-	ProtocolMarker Name
+	ProtocolMarker name
 
 	// InterfaceAliasForStub is the type alias generated within the
 	// "Stub" class, that refers to the pure-virtual interface corresponding to
 	// the protocol.
-	InterfaceAliasForStub Name
+	InterfaceAliasForStub name
 
 	// Proxy implements the interface by encoding and making method calls.
-	Proxy Name
+	Proxy name
 
 	// Stub calls into the interface after decoding an incoming message.
 	// It also implements the EventSender interface.
-	Stub Name
+	Stub name
 
 	// EventSender is a pure-virtual interface for sending events.
-	EventSender Name
+	EventSender name
 
 	// SyncInterface is a pure-virtual interface for making synchronous calls.
-	SyncInterface Name
+	SyncInterface name
 
 	// SyncProxy implements the SyncInterface.
-	SyncProxy Name
+	SyncProxy name
 
-	RequestEncoder  Name
-	RequestDecoder  Name
-	ResponseEncoder Name
-	ResponseDecoder Name
+	RequestEncoder  name
+	RequestDecoder  name
+	ResponseEncoder name
+	ResponseDecoder name
 }
 
-func compileHlMessagingDetails(protocol NameVariants) hlMessagingDetails {
+func compileHlMessagingDetails(protocol nameVariants) hlMessagingDetails {
 	p := protocol.Natural
-	stub := p.AppendName("_Stub")
+	stub := p.appendName("_Stub")
 	return hlMessagingDetails{
 		ProtocolMarker:        p,
-		InterfaceAliasForStub: stub.Nest(p.AppendName("_clazz").Name()),
-		Proxy:                 p.AppendName("_Proxy"),
+		InterfaceAliasForStub: stub.nest(p.appendName("_clazz").Name()),
+		Proxy:                 p.appendName("_Proxy"),
 		Stub:                  stub,
-		EventSender:           p.AppendName("_EventSender"),
-		SyncInterface:         p.AppendName("_Sync"),
-		SyncProxy:             p.AppendName("_SyncProxy"),
-		RequestEncoder:        p.AppendName("_RequestEncoder"),
-		RequestDecoder:        p.AppendName("_RequestDecoder"),
-		ResponseEncoder:       p.AppendName("_ResponseEncoder"),
-		ResponseDecoder:       p.AppendName("_ResponseDecoder"),
+		EventSender:           p.appendName("_EventSender"),
+		SyncInterface:         p.appendName("_Sync"),
+		SyncProxy:             p.appendName("_SyncProxy"),
+		RequestEncoder:        p.appendName("_RequestEncoder"),
+		RequestDecoder:        p.appendName("_RequestDecoder"),
+		ResponseEncoder:       p.appendName("_ResponseEncoder"),
+		ResponseDecoder:       p.appendName("_ResponseDecoder"),
 	}
 }
 
@@ -88,77 +88,77 @@
 // TODO(fxbug.dev/60240): Start implementing unified bindings messaging layer
 // based on this skeleton.
 type unifiedMessagingDetails struct {
-	ClientImpl      Name
-	EventHandlers   Name
-	Interface       Name
-	EventSender     Name
-	RequestEncoder  Name
-	RequestDecoder  Name
-	ResponseEncoder Name
-	ResponseDecoder Name
+	ClientImpl      name
+	EventHandlers   name
+	Interface       name
+	EventSender     name
+	RequestEncoder  name
+	RequestDecoder  name
+	ResponseEncoder name
+	ResponseDecoder name
 }
 
 // These correspond to templated classes forward-declared in
 // //zircon/system/ulib/fidl/include/lib/fidl/llcpp/wire_messaging.h
 var (
 	// Protocol related
-	WireSyncClient            = fidlNs.Member("WireSyncClient")
-	WireClient                = fidlNs.Member("WireClient")
-	WireEventHandlerInterface = internalNs.Member("WireEventHandlerInterface")
-	WireSyncEventHandler      = fidlNs.Member("WireSyncEventHandler")
-	WireAsyncEventHandler     = fidlNs.Member("WireAsyncEventHandler")
-	WireInterface             = fidlNs.Member("WireInterface")
-	WireRawChannelInterface   = fidlNs.Member("WireRawChannelInterface")
-	WireEventSender           = fidlNs.Member("WireEventSender")
-	WireWeakEventSender       = internalNs.Member("WireWeakEventSender")
-	WireClientImpl            = internalNs.Member("WireClientImpl")
-	WireCaller                = internalNs.Member("WireCaller")
-	WireDispatcher            = internalNs.Member("WireDispatcher")
+	WireSyncClient            = fidlNs.member("WireSyncClient")
+	WireClient                = fidlNs.member("WireClient")
+	WireEventHandlerInterface = internalNs.member("WireEventHandlerInterface")
+	WireSyncEventHandler      = fidlNs.member("WireSyncEventHandler")
+	WireAsyncEventHandler     = fidlNs.member("WireAsyncEventHandler")
+	WireInterface             = fidlNs.member("WireInterface")
+	WireRawChannelInterface   = fidlNs.member("WireRawChannelInterface")
+	WireEventSender           = fidlNs.member("WireEventSender")
+	WireWeakEventSender       = internalNs.member("WireWeakEventSender")
+	WireClientImpl            = internalNs.member("WireClientImpl")
+	WireCaller                = internalNs.member("WireCaller")
+	WireDispatcher            = internalNs.member("WireDispatcher")
 
 	// MethodRelated
-	WireRequest         = fidlNs.Member("WireRequest")
-	WireResponse        = fidlNs.Member("WireResponse")
-	WireResult          = fidlNs.Member("WireResult")
-	WireUnownedResult   = fidlNs.Member("WireUnownedResult")
-	WireResponseContext = fidlNs.Member("WireResponseContext")
+	WireRequest         = fidlNs.member("WireRequest")
+	WireResponse        = fidlNs.member("WireResponse")
+	WireResult          = fidlNs.member("WireResult")
+	WireUnownedResult   = fidlNs.member("WireUnownedResult")
+	WireResponseContext = fidlNs.member("WireResponseContext")
 )
 
 type wireTypeNames struct {
 	// WireProtocolMarker is a class only used for containing other definitions
 	// related to this protocol.
 	// TODO(fxbug.dev/72798): Golang template should use this instead of the
-	// NameVariants embedded in Protocol.
-	WireProtocolMarker        Name
-	WireSyncClient            Name
-	WireClient                Name
-	WireEventHandlerInterface Name
-	WireSyncEventHandler      Name
-	WireAsyncEventHandler     Name
-	WireInterface             Name
-	WireRawChannelInterface   Name
-	WireEventSender           Name
-	WireWeakEventSender       Name
-	WireClientImpl            Name
-	WireCaller                Name
-	WireDispatcher            Name
+	// nameVariants embedded in Protocol.
+	WireProtocolMarker        name
+	WireSyncClient            name
+	WireClient                name
+	WireEventHandlerInterface name
+	WireSyncEventHandler      name
+	WireAsyncEventHandler     name
+	WireInterface             name
+	WireRawChannelInterface   name
+	WireEventSender           name
+	WireWeakEventSender       name
+	WireClientImpl            name
+	WireCaller                name
+	WireDispatcher            name
 }
 
-func newWireTypeNames(protocolVariants NameVariants) wireTypeNames {
+func newWireTypeNames(protocolVariants nameVariants) wireTypeNames {
 	p := protocolVariants.Wire
 	return wireTypeNames{
 		WireProtocolMarker:        p,
-		WireSyncClient:            WireSyncClient.Template(p),
-		WireClient:                WireClient.Template(p),
-		WireEventHandlerInterface: WireEventHandlerInterface.Template(p),
-		WireSyncEventHandler:      WireSyncEventHandler.Template(p),
-		WireAsyncEventHandler:     WireAsyncEventHandler.Template(p),
-		WireInterface:             WireInterface.Template(p),
-		WireRawChannelInterface:   WireRawChannelInterface.Template(p),
-		WireEventSender:           WireEventSender.Template(p),
-		WireWeakEventSender:       WireWeakEventSender.Template(p),
-		WireClientImpl:            WireClientImpl.Template(p),
-		WireCaller:                WireCaller.Template(p),
-		WireDispatcher:            WireDispatcher.Template(p),
+		WireSyncClient:            WireSyncClient.template(p),
+		WireClient:                WireClient.template(p),
+		WireEventHandlerInterface: WireEventHandlerInterface.template(p),
+		WireSyncEventHandler:      WireSyncEventHandler.template(p),
+		WireAsyncEventHandler:     WireAsyncEventHandler.template(p),
+		WireInterface:             WireInterface.template(p),
+		WireRawChannelInterface:   WireRawChannelInterface.template(p),
+		WireEventSender:           WireEventSender.template(p),
+		WireWeakEventSender:       WireWeakEventSender.template(p),
+		WireClientImpl:            WireClientImpl.template(p),
+		WireCaller:                WireCaller.template(p),
+		WireDispatcher:            WireDispatcher.template(p),
 	}
 }
 
@@ -169,7 +169,7 @@
 	// TODO(fxbug.dev/72798): This should be replaced by ProtocolMarker in hlMessagingDetails
 	// and wireMessagingDetails. In particular, the unified bindings do not declare
 	// protocol marker classes.
-	NameVariants
+	nameVariants
 
 	// [Discoverable] protocols are exported to the outgoing namespace under this
 	// name. This is deprecated by FTP-041 unified services.
@@ -184,7 +184,7 @@
 	SyncEventAllocation allocation
 	Methods             []Method
 	FuzzingName         string
-	TestBase            NameVariants
+	TestBase            nameVariants
 }
 
 // Protocol should be created using newProtocol.
@@ -209,7 +209,7 @@
 	Events []*Method
 
 	// Generated struct holding variant-agnostic details about protocol.
-	ProtocolDetails Name
+	ProtocolDetails name
 }
 
 func (Protocol) Kind() declKind {
@@ -217,6 +217,7 @@
 }
 
 var _ Kinded = (*Protocol)(nil)
+var _ namespaced = (*Protocol)(nil)
 
 func (p Protocol) Name() string {
 	return p.Wire.Name() // TODO: not the wire name, maybe?
@@ -253,7 +254,7 @@
 		TwoWayMethods:   filterBy(kinds{twoWayMethod}),
 		ClientMethods:   filterBy(kinds{oneWayMethod, twoWayMethod}),
 		Events:          filterBy(kinds{eventMethod}),
-		ProtocolDetails: MakeName("fidl::internal::ProtocolDetails").Template(inner.Wire),
+		ProtocolDetails: makeName("fidl::internal::ProtocolDetails").template(inner.Wire),
 	}
 }
 
@@ -272,8 +273,8 @@
 
 type messageInner struct {
 	fidlgen.TypeShape
-	HlCodingTable   Name
-	WireCodingTable Name
+	HlCodingTable   name
+	WireCodingTable name
 }
 
 // message contains lower level wire-format information about a request/response
@@ -323,33 +324,33 @@
 }
 
 type wireMethod struct {
-	WireCompleter       Name
-	WireCompleterBase   Name
-	WireRequest         Name
-	WireResponse        Name
-	WireResponseContext Name
-	WireResult          Name
-	WireUnownedResult   Name
+	WireCompleter       name
+	WireCompleterBase   name
+	WireRequest         name
+	WireResponse        name
+	WireResponseContext name
+	WireResult          name
+	WireUnownedResult   name
 }
 
-func newWireMethod(name string, wireTypes wireTypeNames, protocolMarker Name, methodMarker Name) wireMethod {
-	i := wireTypes.WireInterface.Nest(name)
+func newWireMethod(name string, wireTypes wireTypeNames, protocolMarker name, methodMarker name) wireMethod {
+	i := wireTypes.WireInterface.nest(name)
 	return wireMethod{
-		WireCompleter:       i.AppendName("Completer"),
-		WireCompleterBase:   i.AppendName("CompleterBase"),
-		WireRequest:         WireRequest.Template(methodMarker),
-		WireResponse:        WireResponse.Template(methodMarker),
-		WireResponseContext: WireResponseContext.Template(methodMarker),
-		WireResult:          WireResult.Template(methodMarker),
-		WireUnownedResult:   WireUnownedResult.Template(methodMarker),
+		WireCompleter:       i.appendName("Completer"),
+		WireCompleterBase:   i.appendName("CompleterBase"),
+		WireRequest:         WireRequest.template(methodMarker),
+		WireResponse:        WireResponse.template(methodMarker),
+		WireResponseContext: WireResponseContext.template(methodMarker),
+		WireResult:          WireResult.template(methodMarker),
+		WireUnownedResult:   WireUnownedResult.template(methodMarker),
 	}
 }
 
 // methodInner contains information about a Method that should be filled out by
 // the compiler.
 type methodInner struct {
-	protocolName NameVariants
-	Marker       NameVariants
+	protocolName nameVariants
+	Marker       nameVariants
 	wireMethod
 	baseCodingTableName string
 	requestTypeShape    fidlgen.TypeShape
@@ -370,7 +371,7 @@
 type Method struct {
 	methodInner
 	NameInLowerSnakeCase string
-	OrdinalName          NameVariants
+	OrdinalName          nameVariants
 	Request              message
 	Response             message
 	CallbackType         string
@@ -411,16 +412,16 @@
 }
 
 func newMethod(inner methodInner, hl hlMessagingDetails, wire wireTypeNames) Method {
-	hlCodingTableBase := hl.ProtocolMarker.Namespace().Append("_internal").Member(inner.baseCodingTableName)
-	wireCodingTableBase := wire.WireProtocolMarker.Namespace().Member(inner.baseCodingTableName)
+	hlCodingTableBase := hl.ProtocolMarker.Namespace().append("_internal").member(inner.baseCodingTableName)
+	wireCodingTableBase := wire.WireProtocolMarker.Namespace().member(inner.baseCodingTableName)
 
-	hlRequestCodingTable := hlCodingTableBase.AppendName("RequestTable")
-	wireRequestCodingTable := wireCodingTableBase.AppendName("RequestTable")
-	hlResponseCodingTable := hlCodingTableBase.AppendName("ResponseTable")
-	wireResponseCodingTable := wireCodingTableBase.AppendName("ResponseTable")
+	hlRequestCodingTable := hlCodingTableBase.appendName("RequestTable")
+	wireRequestCodingTable := wireCodingTableBase.appendName("RequestTable")
+	hlResponseCodingTable := hlCodingTableBase.appendName("ResponseTable")
+	wireResponseCodingTable := wireCodingTableBase.appendName("ResponseTable")
 	if !inner.HasRequest {
-		hlResponseCodingTable = hlCodingTableBase.AppendName("EventTable")
-		wireResponseCodingTable = wireCodingTableBase.AppendName("EventTable")
+		hlResponseCodingTable = hlCodingTableBase.appendName("EventTable")
+		wireResponseCodingTable = wireCodingTableBase.appendName("EventTable")
 	}
 
 	callbackType := ""
@@ -432,9 +433,9 @@
 	m := Method{
 		methodInner:          inner,
 		NameInLowerSnakeCase: fidlgen.ToSnakeCase(inner.Name),
-		OrdinalName: NameVariants{
-			Natural: inner.protocolName.Natural.Namespace().Append("internal").Member(ordinalName),
-			Wire:    inner.protocolName.Wire.Namespace().Member(ordinalName),
+		OrdinalName: nameVariants{
+			Natural: inner.protocolName.Natural.Namespace().append("internal").member(ordinalName),
+			Wire:    inner.protocolName.Wire.Namespace().member(ordinalName),
 		},
 		Request: newMessage(messageInner{
 			TypeShape:       inner.requestTypeShape,
@@ -518,7 +519,7 @@
 			result = c.resultForUnion[v.Response[0].Type.Identifier]
 		}
 
-		methodMarker := protocolName.Nest(name)
+		methodMarker := protocolName.nest(name)
 
 		method := newMethod(methodInner{
 			protocolName: protocolName,
@@ -552,7 +553,7 @@
 	fuzzingName := strings.ReplaceAll(strings.ReplaceAll(string(p.Name), ".", "_"), "/", "_")
 	r := newProtocol(protocolInner{
 		Attributes:       Attributes{p.Attributes},
-		NameVariants:     protocolName,
+		nameVariants:     protocolName,
 		hlMessaging:      hlMessaging,
 		wireTypeNames:    wireTypeNames,
 		DiscoverableName: p.GetServiceName(),
@@ -561,7 +562,7 @@
 				clientContext, allEventsStrict(methods))),
 		Methods:     methods,
 		FuzzingName: fuzzingName,
-		TestBase:    protocolName.AppendName("_TestBase").AppendNamespace("testing"),
+		TestBase:    protocolName.appendName("_TestBase").appendNamespace("testing"),
 	})
 	for i := 0; i < len(methods); i++ {
 		methods[i].Protocol = &r
diff --git a/tools/fidl/lib/fidlgen_cpp/service.go b/tools/fidl/lib/fidlgen_cpp/service.go
index d49cd902..8773abf 100644
--- a/tools/fidl/lib/fidlgen_cpp/service.go
+++ b/tools/fidl/lib/fidlgen_cpp/service.go
@@ -15,7 +15,7 @@
 
 type Service struct {
 	Attributes
-	NameVariants
+	nameVariants
 	ServiceName string
 	Members     []ServiceMember
 }
@@ -25,10 +25,11 @@
 }
 
 var _ Kinded = (*Service)(nil)
+var _ namespaced = (*Service)(nil)
 
 type ServiceMember struct {
 	Attributes
-	ProtocolType NameVariants
+	ProtocolType nameVariants
 	Name         string
 	MethodName   string
 }
@@ -36,7 +37,7 @@
 func (c *compiler) compileService(val fidlgen.Service) Service {
 	s := Service{
 		Attributes:   Attributes{val.Attributes},
-		NameVariants: c.compileNameVariants(val.Name),
+		nameVariants: c.compileNameVariants(val.Name),
 		ServiceName:  val.GetServiceName(),
 	}
 
diff --git a/tools/fidl/lib/fidlgen_cpp/struct.go b/tools/fidl/lib/fidlgen_cpp/struct.go
index 6a3e955..f63f67b 100644
--- a/tools/fidl/lib/fidlgen_cpp/struct.go
+++ b/tools/fidl/lib/fidlgen_cpp/struct.go
@@ -14,7 +14,7 @@
 type Struct struct {
 	Attributes
 	fidlgen.Resourceness
-	NameVariants
+	nameVariants
 	CodingTableType string
 	Members         []StructMember
 	InlineSize      int
@@ -37,6 +37,7 @@
 }
 
 var _ Kinded = (*Struct)(nil)
+var _ namespaced = (*Struct)(nil)
 
 type StructMember struct {
 	Attributes
@@ -79,12 +80,12 @@
 }
 
 func (c *compiler) compileStruct(val fidlgen.Struct) Struct {
-	name := c.compileNameVariants(val.Name)
+	n := c.compileNameVariants(val.Name)
 	codingTableType := c.compileCodingTableType(val.Name)
 	r := Struct{
 		Attributes:      Attributes{val.Attributes},
 		Resourceness:    val.Resourceness,
-		NameVariants:    name,
+		nameVariants:    n,
 		CodingTableType: codingTableType,
 		Members:         []StructMember{},
 		InlineSize:      val.TypeShapeV1.InlineSize,
@@ -103,15 +104,15 @@
 
 	result := c.resultForStruct[val.Name]
 	if result != nil {
-		memberTypeNames := []Name{}
+		memberTypeNames := []name{}
 		for _, m := range r.Members {
 			memberTypeNames = append(memberTypeNames, m.Type.Natural)
 			result.ValueMembers = append(result.ValueMembers, m.AsParameter())
 		}
-		result.ValueTupleDecl = MakeTupleName(memberTypeNames)
+		result.ValueTupleDecl = makeTupleName(memberTypeNames)
 
 		if len(r.Members) == 0 {
-			result.ValueDecl = MakeName("void")
+			result.ValueDecl = makeName("void")
 		} else if len(r.Members) == 1 {
 			result.ValueDecl = r.Members[0].Type.Natural
 		} else {
diff --git a/tools/fidl/lib/fidlgen_cpp/table.go b/tools/fidl/lib/fidlgen_cpp/table.go
index 1b30b9f..785d083 100644
--- a/tools/fidl/lib/fidlgen_cpp/table.go
+++ b/tools/fidl/lib/fidlgen_cpp/table.go
@@ -15,7 +15,7 @@
 type Table struct {
 	Attributes
 	fidlgen.Resourceness
-	NameVariants
+	nameVariants
 	CodingTableType string
 	Members         []TableMember
 	InlineSize      int
@@ -34,6 +34,7 @@
 }
 
 var _ Kinded = (*Table)(nil)
+var _ namespaced = (*Table)(nil)
 
 type TableMember struct {
 	Attributes
@@ -86,7 +87,7 @@
 	r := Table{
 		Attributes:      Attributes{val.Attributes},
 		Resourceness:    val.Resourceness,
-		NameVariants:    name,
+		nameVariants:    name,
 		CodingTableType: codingTableType,
 		Members:         nil,
 		InlineSize:      val.TypeShapeV1.InlineSize,
diff --git a/tools/fidl/lib/fidlgen_cpp/template_funcs.go b/tools/fidl/lib/fidlgen_cpp/template_funcs.go
index 8e8a3a1..282ecec 100644
--- a/tools/fidl/lib/fidlgen_cpp/template_funcs.go
+++ b/tools/fidl/lib/fidlgen_cpp/template_funcs.go
@@ -19,7 +19,7 @@
 
 	newNamespace := []string{}
 	switch v := arg.(type) {
-	case Namespaced:
+	case namespaced:
 		newNamespace = []string(v.Namespace())
 	case string:
 		newNamespace = strings.Split(v, "::")
@@ -53,7 +53,7 @@
 	}
 
 	// Update the current namespace variable
-	currentNamespace = Namespace(newNamespace)
+	currentNamespace = namespace(newNamespace)
 
 	return strings.Join(lines, "\n")
 }
@@ -65,7 +65,7 @@
 // namespace is generated.
 // This allows templates to maintain a consistent C++ namespace as they enter
 // and leave #ifdef __Fuchsia__ blocks.
-var namespaceStack = []Namespace{}
+var namespaceStack = []namespace{}
 
 func ifdefFuchsia() string {
 	namespaceStack = append(namespaceStack, currentNamespace)
@@ -109,7 +109,7 @@
 	"EndOfFile":       endOfFile,
 
 	// UseNatural sets the template engine to default to the "natural" domain object
-	// namespace, when printing NameVariants.
+	// namespace, when printing nameVariants.
 	//
 	// Example of Natural type name: "fuchsia::library::MyType".
 	"UseNatural": func() string {
@@ -118,7 +118,7 @@
 	},
 
 	// UseUnified sets the template engine to default to the "unified" domain object
-	// namespace, when printing NameVariants.
+	// namespace, when printing nameVariants.
 	//
 	// Example of Unified type name: "fuchsia_library::MyType".
 	"UseUnified": func() string {
@@ -127,7 +127,7 @@
 	},
 
 	// UseWire sets the template engine to default to the "wire" domain object
-	// namespace, when printing NameVariants.
+	// namespace, when printing nameVariants.
 	//
 	// Example of Wire type name: "fuchsia_library::wire::MyType".
 	"UseWire": func() string {
diff --git a/tools/fidl/lib/fidlgen_cpp/typed_channel_migration.go b/tools/fidl/lib/fidlgen_cpp/typed_channel_migration.go
index f83f6e8..234a3b6 100644
--- a/tools/fidl/lib/fidlgen_cpp/typed_channel_migration.go
+++ b/tools/fidl/lib/fidlgen_cpp/typed_channel_migration.go
@@ -9,9 +9,9 @@
 // WireNoTypedChannels returns the LLCPP declaration when the relevant
 // API would like to opt out of typed channels.
 // TODO(fxbug.dev/65212): Uses of this method should be be replaced by WireDecl.
-func (t *Type) WireNoTypedChannels() Name {
+func (t *Type) WireNoTypedChannels() name {
 	if t.Kind == TypeKinds.Protocol || t.Kind == TypeKinds.Request {
-		return MakeName("zx::channel")
+		return makeName("zx::channel")
 	}
 	return t.Wire
 }
@@ -40,7 +40,7 @@
 func (p Protocol) ShouldEmitTypedChannelCascadingInheritance() bool {
 	// Note: using the "natural" domain object name, so the migration
 	// to the wire namespace would not interfere with this check.
-	if !rawChannelInterfaceAllowed[p.NameVariants.Wire.String()] {
+	if !rawChannelInterfaceAllowed[p.nameVariants.Wire.String()] {
 		return false
 	}
 	for _, m := range p.Methods {
diff --git a/tools/fidl/lib/fidlgen_cpp/union.go b/tools/fidl/lib/fidlgen_cpp/union.go
index e8016f3..f39742c 100644
--- a/tools/fidl/lib/fidlgen_cpp/union.go
+++ b/tools/fidl/lib/fidlgen_cpp/union.go
@@ -14,13 +14,13 @@
 	Attributes
 	fidlgen.Strictness
 	fidlgen.Resourceness
-	NameVariants
+	nameVariants
 	CodingTableType    string
-	TagEnum            NameVariants
-	TagUnknown         NameVariants
-	TagInvalid         NameVariants
-	WireOrdinalEnum    Name
-	WireInvalidOrdinal Name
+	TagEnum            nameVariants
+	TagUnknown         nameVariants
+	TagInvalid         nameVariants
+	WireOrdinalEnum    name
+	WireInvalidOrdinal name
 	Members            []UnionMember
 	InlineSize         int
 	MaxHandles         int
@@ -34,6 +34,7 @@
 }
 
 var _ Kinded = (*Union)(nil)
+var _ namespaced = (*Union)(nil)
 
 type UnionMember struct {
 	Attributes
@@ -41,8 +42,8 @@
 	Type              Type
 	Name              string
 	StorageName       string
-	TagName           NameVariants
-	WireOrdinalName   Name
+	TagName           nameVariants
+	WireOrdinalName   name
 	Offset            int
 	HandleInformation *HandleInformation
 }
@@ -57,19 +58,19 @@
 func (c *compiler) compileUnion(val fidlgen.Union) Union {
 	name := c.compileNameVariants(val.Name)
 	codingTableType := c.compileCodingTableType(val.Name)
-	tagEnum := name.Nest("Tag")
-	wireOrdinalEnum := name.Wire.Nest("Ordinal")
+	tagEnum := name.nest("Tag")
+	wireOrdinalEnum := name.Wire.nest("Ordinal")
 	u := Union{
 		Attributes:         Attributes{val.Attributes},
 		Strictness:         val.Strictness,
 		Resourceness:       val.Resourceness,
-		NameVariants:       name,
+		nameVariants:       name,
 		CodingTableType:    codingTableType,
 		TagEnum:            tagEnum,
-		TagUnknown:         tagEnum.Nest("kUnknown"),
-		TagInvalid:         tagEnum.Nest("Invalid"),
+		TagUnknown:         tagEnum.nest("kUnknown"),
+		TagInvalid:         tagEnum.nest("Invalid"),
 		WireOrdinalEnum:    wireOrdinalEnum,
-		WireInvalidOrdinal: wireOrdinalEnum.Nest("Invalid"),
+		WireInvalidOrdinal: wireOrdinalEnum.nest("Invalid"),
 		InlineSize:         val.TypeShapeV1.InlineSize,
 		MaxHandles:         val.TypeShapeV1.MaxHandles,
 		MaxOutOfLine:       val.TypeShapeV1.MaxOutOfLine,
@@ -88,8 +89,8 @@
 			Type:              c.compileType(mem.Type),
 			Name:              n,
 			StorageName:       changeIfReserved(mem.Name + "_"),
-			TagName:           u.TagEnum.Nest(t),
-			WireOrdinalName:   u.WireOrdinalEnum.Nest(t),
+			TagName:           u.TagEnum.nest(t),
+			WireOrdinalName:   u.WireOrdinalEnum.nest(t),
 			Offset:            mem.Offset,
 			HandleInformation: c.fieldHandleInformation(&mem.Type),
 		})
@@ -97,9 +98,9 @@
 
 	if val.MethodResult != nil {
 		result := Result{
-			ResultDecl:      u.NameVariants,
-			ValueStructDecl: u.Members[0].Type.NameVariants,
-			ErrorDecl:       u.Members[1].Type.NameVariants,
+			ResultDecl:      u.nameVariants,
+			ValueStructDecl: u.Members[0].Type.nameVariants,
+			ErrorDecl:       u.Members[1].Type.nameVariants,
 		}
 		c.resultForStruct[val.MethodResult.ValueType.Identifier] = &result
 		c.resultForUnion[val.Name] = &result