From 460841e3edba024e1fc8c2ce42700c106298f22f Mon Sep 17 00:00:00 2001 From: Erik Arvidsson Date: Thu, 5 Nov 2015 12:07:00 -0500 Subject: [PATCH] Clean up registration of Ref values Ref values use the TargetRef to get the internal implementation RegisterFromValFunction and ToNomsValueFromTypeRef were only used by ref values at this point so these were renamed and simplified to be more specific for ref values --- clients/common/incident.noms.go | 8 ++++--- clients/common/quad_tree.noms.go | 16 ++++++++----- clients/flickr/types.noms.go | 24 ++++++++++++-------- clients/picasa/picasa.noms.go | 24 ++++++++++++-------- clients/tagdex/types.noms.go | 8 ++++--- datas/types.noms.go | 8 ++++--- nomdl/codegen/ref.tmpl | 8 ++++--- nomdl/codegen/test/gen/ref.noms.go | 24 ++++++++++++-------- types/compound_blob_struct.noms.go | 8 ++++--- types/decode_noms_value.go | 3 +-- types/decode_noms_value_test.go | 28 +---------------------- types/encode_noms_value.go | 11 +-------- types/list.go | 6 ----- types/map.go | 6 ----- types/package_registry.go | 36 +++++++++++++++--------------- types/package_set_of_ref.go | 8 ++++--- types/ref.go | 10 ++++----- types/set.go | 6 ----- 18 files changed, 110 insertions(+), 132 deletions(-) diff --git a/clients/common/incident.noms.go b/clients/common/incident.noms.go index 1f7e70538f..ed9b4b1e6b 100644 --- a/clients/common/incident.noms.go +++ b/clients/common/incident.noms.go @@ -472,9 +472,11 @@ func (m RefOfIncident) TypeRef() types.TypeRef { func init() { __typeRefForRefOfIncident = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(__commonPackageInFile_incident_CachedRef, 0)) - types.RegisterFromValFunction(__typeRefForRefOfIncident, func(v types.Value) types.Value { - return NewRefOfIncident(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfIncident, builderForRefOfIncident) +} + +func builderForRefOfIncident(r ref.Ref) types.Value { + return NewRefOfIncident(r) } func (r RefOfIncident) TargetValue(cs chunks.ChunkSource) Incident { diff --git a/clients/common/quad_tree.noms.go b/clients/common/quad_tree.noms.go index 52b1a8f6dc..4b808fdf04 100644 --- a/clients/common/quad_tree.noms.go +++ b/clients/common/quad_tree.noms.go @@ -538,9 +538,11 @@ func (m RefOfValue) TypeRef() types.TypeRef { func init() { __typeRefForRefOfValue = types.MakeCompoundTypeRef(types.RefKind, types.MakePrimitiveTypeRef(types.ValueKind)) - types.RegisterFromValFunction(__typeRefForRefOfValue, func(v types.Value) types.Value { - return NewRefOfValue(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfValue, builderForRefOfValue) +} + +func builderForRefOfValue(r ref.Ref) types.Value { + return NewRefOfValue(r) } func (r RefOfValue) TargetValue(cs chunks.ChunkSource) types.Value { @@ -1123,9 +1125,11 @@ func (m RefOfSQuadTree) TypeRef() types.TypeRef { func init() { __typeRefForRefOfSQuadTree = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(__commonPackageInFile_quad_tree_CachedRef, 2)) - types.RegisterFromValFunction(__typeRefForRefOfSQuadTree, func(v types.Value) types.Value { - return NewRefOfSQuadTree(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfSQuadTree, builderForRefOfSQuadTree) +} + +func builderForRefOfSQuadTree(r ref.Ref) types.Value { + return NewRefOfSQuadTree(r) } func (r RefOfSQuadTree) TargetValue(cs chunks.ChunkSource) SQuadTree { diff --git a/clients/flickr/types.noms.go b/clients/flickr/types.noms.go index bcad593ba6..eeb10e228c 100644 --- a/clients/flickr/types.noms.go +++ b/clients/flickr/types.noms.go @@ -477,9 +477,11 @@ func (m RefOfUser) TypeRef() types.TypeRef { func init() { __typeRefForRefOfUser = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(__mainPackageInFile_types_CachedRef, 0)) - types.RegisterFromValFunction(__typeRefForRefOfUser, func(v types.Value) types.Value { - return NewRefOfUser(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfUser, builderForRefOfUser) +} + +func builderForRefOfUser(r ref.Ref) types.Value { + return NewRefOfUser(r) } func (r RefOfUser) TargetValue(cs chunks.ChunkSource) User { @@ -528,9 +530,11 @@ func (m RefOfSetOfRefOfRemotePhoto) TypeRef() types.TypeRef { func init() { __typeRefForRefOfSetOfRefOfRemotePhoto = types.MakeCompoundTypeRef(types.RefKind, types.MakeCompoundTypeRef(types.SetKind, types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(ref.Parse("sha1-00419ebbb418539af67238164b20341913efeb4d"), 0)))) - types.RegisterFromValFunction(__typeRefForRefOfSetOfRefOfRemotePhoto, func(v types.Value) types.Value { - return NewRefOfSetOfRefOfRemotePhoto(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfSetOfRefOfRemotePhoto, builderForRefOfSetOfRefOfRemotePhoto) +} + +func builderForRefOfSetOfRefOfRemotePhoto(r ref.Ref) types.Value { + return NewRefOfSetOfRefOfRemotePhoto(r) } func (r RefOfSetOfRefOfRemotePhoto) TargetValue(cs chunks.ChunkSource) SetOfRefOfRemotePhoto { @@ -727,9 +731,11 @@ func (m RefOfRemotePhoto) TypeRef() types.TypeRef { func init() { __typeRefForRefOfRemotePhoto = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(ref.Parse("sha1-00419ebbb418539af67238164b20341913efeb4d"), 0)) - types.RegisterFromValFunction(__typeRefForRefOfRemotePhoto, func(v types.Value) types.Value { - return NewRefOfRemotePhoto(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfRemotePhoto, builderForRefOfRemotePhoto) +} + +func builderForRefOfRemotePhoto(r ref.Ref) types.Value { + return NewRefOfRemotePhoto(r) } func (r RefOfRemotePhoto) TargetValue(cs chunks.ChunkSource) RemotePhoto { diff --git a/clients/picasa/picasa.noms.go b/clients/picasa/picasa.noms.go index 15d2f994c9..2244e722b9 100644 --- a/clients/picasa/picasa.noms.go +++ b/clients/picasa/picasa.noms.go @@ -640,9 +640,11 @@ func (m RefOfUser) TypeRef() types.TypeRef { func init() { __typeRefForRefOfUser = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(__mainPackageInFile_picasa_CachedRef, 0)) - types.RegisterFromValFunction(__typeRefForRefOfUser, func(v types.Value) types.Value { - return NewRefOfUser(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfUser, builderForRefOfUser) +} + +func builderForRefOfUser(r ref.Ref) types.Value { + return NewRefOfUser(r) } func (r RefOfUser) TargetValue(cs chunks.ChunkSource) User { @@ -691,9 +693,11 @@ func (m RefOfSetOfRefOfRemotePhoto) TypeRef() types.TypeRef { func init() { __typeRefForRefOfSetOfRefOfRemotePhoto = types.MakeCompoundTypeRef(types.RefKind, types.MakeCompoundTypeRef(types.SetKind, types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(ref.Parse("sha1-00419ebbb418539af67238164b20341913efeb4d"), 0)))) - types.RegisterFromValFunction(__typeRefForRefOfSetOfRefOfRemotePhoto, func(v types.Value) types.Value { - return NewRefOfSetOfRefOfRemotePhoto(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfSetOfRefOfRemotePhoto, builderForRefOfSetOfRefOfRemotePhoto) +} + +func builderForRefOfSetOfRefOfRemotePhoto(r ref.Ref) types.Value { + return NewRefOfSetOfRefOfRemotePhoto(r) } func (r RefOfSetOfRefOfRemotePhoto) TargetValue(cs chunks.ChunkSource) SetOfRefOfRemotePhoto { @@ -890,9 +894,11 @@ func (m RefOfRemotePhoto) TypeRef() types.TypeRef { func init() { __typeRefForRefOfRemotePhoto = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(ref.Parse("sha1-00419ebbb418539af67238164b20341913efeb4d"), 0)) - types.RegisterFromValFunction(__typeRefForRefOfRemotePhoto, func(v types.Value) types.Value { - return NewRefOfRemotePhoto(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfRemotePhoto, builderForRefOfRemotePhoto) +} + +func builderForRefOfRemotePhoto(r ref.Ref) types.Value { + return NewRefOfRemotePhoto(r) } func (r RefOfRemotePhoto) TargetValue(cs chunks.ChunkSource) RemotePhoto { diff --git a/clients/tagdex/types.noms.go b/clients/tagdex/types.noms.go index 48371db931..03f50fbe47 100644 --- a/clients/tagdex/types.noms.go +++ b/clients/tagdex/types.noms.go @@ -320,9 +320,11 @@ func (m RefOfRemotePhoto) TypeRef() types.TypeRef { func init() { __typeRefForRefOfRemotePhoto = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(ref.Parse("sha1-00419ebbb418539af67238164b20341913efeb4d"), 0)) - types.RegisterFromValFunction(__typeRefForRefOfRemotePhoto, func(v types.Value) types.Value { - return NewRefOfRemotePhoto(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfRemotePhoto, builderForRefOfRemotePhoto) +} + +func builderForRefOfRemotePhoto(r ref.Ref) types.Value { + return NewRefOfRemotePhoto(r) } func (r RefOfRemotePhoto) TargetValue(cs chunks.ChunkSource) RemotePhoto { diff --git a/datas/types.noms.go b/datas/types.noms.go index 6172b6691b..201b6bc050 100644 --- a/datas/types.noms.go +++ b/datas/types.noms.go @@ -442,9 +442,11 @@ func (m RefOfCommit) TypeRef() types.TypeRef { func init() { __typeRefForRefOfCommit = types.MakeCompoundTypeRef(types.RefKind, types.MakeTypeRef(__datasPackageInFile_types_CachedRef, 0)) - types.RegisterFromValFunction(__typeRefForRefOfCommit, func(v types.Value) types.Value { - return NewRefOfCommit(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfCommit, builderForRefOfCommit) +} + +func builderForRefOfCommit(r ref.Ref) types.Value { + return NewRefOfCommit(r) } func (r RefOfCommit) TargetValue(cs chunks.ChunkSource) Commit { diff --git a/nomdl/codegen/ref.tmpl b/nomdl/codegen/ref.tmpl index a1ede1e50d..6cfd26f375 100644 --- a/nomdl/codegen/ref.tmpl +++ b/nomdl/codegen/ref.tmpl @@ -38,9 +38,11 @@ func (m {{.Name}}) TypeRef() {{$typesPackage}}TypeRef { func init() { __typeRefFor{{.Name}} = {{toTypesTypeRef .Type .FileID .PackageName}} - {{$typesPackage}}RegisterFromValFunction(__typeRefFor{{.Name}}, func(v {{$typesPackage}}Value) {{$typesPackage}}Value { - return New{{.Name}}(v.({{$typesPackage}}Ref).TargetRef()) - }) + {{$typesPackage}}RegisterRef(__typeRefFor{{.Name}}, builderFor{{.Name}}) +} + +func builderFor{{.Name}}(r ref.Ref) {{$typesPackage}}Value { + return New{{.Name}}(r) } func (r {{.Name}}) TargetValue(cs chunks.ChunkSource) {{userType .ElemType}} { diff --git a/nomdl/codegen/test/gen/ref.noms.go b/nomdl/codegen/test/gen/ref.noms.go index 17c832c22d..b7bb0f058e 100644 --- a/nomdl/codegen/test/gen/ref.noms.go +++ b/nomdl/codegen/test/gen/ref.noms.go @@ -149,9 +149,11 @@ func (m RefOfListOfString) TypeRef() types.TypeRef { func init() { __typeRefForRefOfListOfString = types.MakeCompoundTypeRef(types.RefKind, types.MakeCompoundTypeRef(types.ListKind, types.MakePrimitiveTypeRef(types.StringKind))) - types.RegisterFromValFunction(__typeRefForRefOfListOfString, func(v types.Value) types.Value { - return NewRefOfListOfString(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfListOfString, builderForRefOfListOfString) +} + +func builderForRefOfListOfString(r ref.Ref) types.Value { + return NewRefOfListOfString(r) } func (r RefOfListOfString) TargetValue(cs chunks.ChunkSource) ListOfString { @@ -341,9 +343,11 @@ func (m RefOfSetOfFloat32) TypeRef() types.TypeRef { func init() { __typeRefForRefOfSetOfFloat32 = types.MakeCompoundTypeRef(types.RefKind, types.MakeCompoundTypeRef(types.SetKind, types.MakePrimitiveTypeRef(types.Float32Kind))) - types.RegisterFromValFunction(__typeRefForRefOfSetOfFloat32, func(v types.Value) types.Value { - return NewRefOfSetOfFloat32(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfSetOfFloat32, builderForRefOfSetOfFloat32) +} + +func builderForRefOfSetOfFloat32(r ref.Ref) types.Value { + return NewRefOfSetOfFloat32(r) } func (r RefOfSetOfFloat32) TargetValue(cs chunks.ChunkSource) SetOfFloat32 { @@ -533,9 +537,11 @@ func (m RefOfFloat32) TypeRef() types.TypeRef { func init() { __typeRefForRefOfFloat32 = types.MakeCompoundTypeRef(types.RefKind, types.MakePrimitiveTypeRef(types.Float32Kind)) - types.RegisterFromValFunction(__typeRefForRefOfFloat32, func(v types.Value) types.Value { - return NewRefOfFloat32(v.(types.Ref).TargetRef()) - }) + types.RegisterRef(__typeRefForRefOfFloat32, builderForRefOfFloat32) +} + +func builderForRefOfFloat32(r ref.Ref) types.Value { + return NewRefOfFloat32(r) } func (r RefOfFloat32) TargetValue(cs chunks.ChunkSource) float32 { diff --git a/types/compound_blob_struct.noms.go b/types/compound_blob_struct.noms.go index 752cb5328a..440a70c385 100644 --- a/types/compound_blob_struct.noms.go +++ b/types/compound_blob_struct.noms.go @@ -449,9 +449,11 @@ func (m RefOfBlob) TypeRef() TypeRef { func init() { __typeRefForRefOfBlob = MakeCompoundTypeRef(RefKind, MakePrimitiveTypeRef(BlobKind)) - RegisterFromValFunction(__typeRefForRefOfBlob, func(v Value) Value { - return NewRefOfBlob(v.(Ref).TargetRef()) - }) + RegisterRef(__typeRefForRefOfBlob, builderForRefOfBlob) +} + +func builderForRefOfBlob(r ref.Ref) Value { + return NewRefOfBlob(r) } func (r RefOfBlob) TargetValue(cs chunks.ChunkSource) Blob { diff --git a/types/decode_noms_value.go b/types/decode_noms_value.go index c387d1e8cf..3fd5c49537 100644 --- a/types/decode_noms_value.go +++ b/types/decode_noms_value.go @@ -158,9 +158,8 @@ func (r *jsonArrayReader) readPackage(t TypeRef, pkg *Package) Value { func (r *jsonArrayReader) readRefValue(t TypeRef, pkg *Package) Value { ref := r.readRef() - v := NewRef(ref) t = fixupTypeRef(t, pkg) - return ToNomsValueFromTypeRef(t, v) + return refFromTypeRef(ref, t) } func (r *jsonArrayReader) readTopLevelValue() Value { diff --git a/types/decode_noms_value_test.go b/types/decode_noms_value_test.go index c4a16504ee..cc2d703bda 100644 --- a/types/decode_noms_value_test.go +++ b/types/decode_noms_value_test.go @@ -109,14 +109,8 @@ func TestReadListOfValue(t *testing.T) { a := parseJson(`[%d, %d, [%d, 1, %d, "hi", %d, true]]`, ListKind, ValueKind, Int32Kind, StringKind, BoolKind) r := newJsonArrayReader(a, cs) - - listTr := MakeCompoundTypeRef(ListKind, MakePrimitiveTypeRef(ValueKind)) - RegisterFromValFunction(listTr, func(v Value) Value { - return v - }) - l := r.readTopLevelValue() - assert.EqualValues(NewList(Int32(1), NewString("hi"), Bool(true)), l) + assert.True(NewList(Int32(1), NewString("hi"), Bool(true)).Equals(l)) } func TestReadValueListOfInt8(t *testing.T) { @@ -390,15 +384,8 @@ func TestReadRef(t *testing.T) { cs := chunks.NewMemoryStore() r := ref.Parse("sha1-a9993e364706816aba3e25717850c26c9cd0d89d") - a := parseJson(`[%d, %d, "%s"]`, RefKind, UInt32Kind, r.String()) reader := newJsonArrayReader(a, cs) - - refTr := MakeCompoundTypeRef(RefKind, MakePrimitiveTypeRef(UInt32Kind)) - RegisterFromValFunction(refTr, func(v Value) Value { - return v - }) - v := reader.readTopLevelValue() assert.True(NewRef(r).Equals(v)) } @@ -408,15 +395,8 @@ func TestReadValueRef(t *testing.T) { cs := chunks.NewMemoryStore() r := ref.Parse("sha1-a9993e364706816aba3e25717850c26c9cd0d89d") - a := parseJson(`[%d, %d, %d, "%s"]`, ValueKind, RefKind, UInt32Kind, r.String()) reader := newJsonArrayReader(a, cs) - - refTypeRef := MakeCompoundTypeRef(RefKind, MakePrimitiveTypeRef(UInt32Kind)) - RegisterFromValFunction(refTypeRef, func(v Value) Value { - return v - }) - v := reader.readTopLevelValue() assert.True(NewRef(r).Equals(v)) } @@ -446,13 +426,7 @@ func TestReadStructWithEnum(t *testing.T) { a := parseJson(`[%d, "%s", 0, 42, 1, true]`, UnresolvedKind, pkgRef.String()) r := newJsonArrayReader(a, cs) - - structTr := MakeTypeRef(pkgRef, 0) - RegisterFromValFunction(structTr, func(v Value) Value { - return v - }) enumTr := MakeTypeRef(pkgRef, 1) - v := r.readTopLevelValue().(Struct) assert.True(v.Get("x").Equals(Int16(42))) diff --git a/types/encode_noms_value.go b/types/encode_noms_value.go index 9605a9431e..c78f933edc 100644 --- a/types/encode_noms_value.go +++ b/types/encode_noms_value.go @@ -104,7 +104,7 @@ func (w *jsonArrayWriter) writeValue(v Value, tr TypeRef, pkg *Package) { } w.write(w3.toArray()) case RefKind: - w.writeRef(getRefFromRefKind(v)) + w.writeRef(v.(RefBase).TargetRef()) case SetKind: w2 := newJsonArrayWriter(w.cs) elemType := tr.Desc.(CompoundDesc).ElemTypes[0] @@ -131,15 +131,6 @@ func (w *jsonArrayWriter) writeValue(v Value, tr TypeRef, pkg *Package) { } } -// TODO: This is ugly. BUG 452 -type refImplementation interface { - TargetRef() ref.Ref -} - -func getRefFromRefKind(v Value) ref.Ref { - return v.(refImplementation).TargetRef() -} - func (w *jsonArrayWriter) writeTypeRefAsValue(v TypeRef) { k := v.Kind() w.write(k) diff --git a/types/list.go b/types/list.go index 78493854c0..7b31ba6c62 100644 --- a/types/list.go +++ b/types/list.go @@ -20,12 +20,6 @@ type MapFunc func(v Value, index uint64) interface{} var listTypeRef = MakeCompoundTypeRef(ListKind, MakePrimitiveTypeRef(ValueKind)) -func init() { - RegisterFromValFunction(listTypeRef, func(v Value) Value { - return v.(List) - }) -} - func NewList(v ...Value) List { // Copy because Noms values are supposed to be immutable and Go allows v to be reused (thus mutable). values := make([]Value, len(v)) diff --git a/types/map.go b/types/map.go index 7f73f4137b..166e9ce2ba 100644 --- a/types/map.go +++ b/types/map.go @@ -142,12 +142,6 @@ func (m Map) elemTypes() []TypeRef { return m.t.Desc.(CompoundDesc).ElemTypes } -func init() { - RegisterFromValFunction(mapTypeRef, func(v Value) Value { - return v.(Map) - }) -} - type mapEntry struct { key Value value Value diff --git a/types/package_registry.go b/types/package_registry.go index 4004d97ff2..9cd80ae8a5 100644 --- a/types/package_registry.go +++ b/types/package_registry.go @@ -8,13 +8,12 @@ import ( type enumBuilderFunc func(v uint32) Value type enumReaderFunc func(v Value) uint32 +type refBuilderFunc func(target ref.Ref) Value type structBuilderFunc func() chan Value type structReaderFunc func(v Value) chan Value type valueBuilderFunc func(v Value) Value type valueReaderFunc func(v Value) Value -type toNomsValueFunc func(v Value) Value - type enumFuncs struct { builder enumBuilderFunc reader enumReaderFunc @@ -31,11 +30,12 @@ type valueFuncs struct { } var ( - packages map[ref.Ref]*Package = map[ref.Ref]*Package{} - toNomsValueMap map[ref.Ref]toNomsValueFunc = map[ref.Ref]toNomsValueFunc{} - enumFuncMap map[ref.Ref]enumFuncs = map[ref.Ref]enumFuncs{} - structFuncMap map[ref.Ref]structFuncs = map[ref.Ref]structFuncs{} - valueFuncMap map[ref.Ref]valueFuncs = map[ref.Ref]valueFuncs{} + packages map[ref.Ref]*Package = map[ref.Ref]*Package{} + + enumFuncMap map[ref.Ref]enumFuncs = map[ref.Ref]enumFuncs{} + refFuncMap map[ref.Ref]refBuilderFunc = map[ref.Ref]refBuilderFunc{} + structFuncMap map[ref.Ref]structFuncs = map[ref.Ref]structFuncs{} + valueFuncMap map[ref.Ref]valueFuncs = map[ref.Ref]valueFuncs{} ) // LookupPackage looks for a Package by ref.Ref in the global cache of Noms type packages. @@ -57,17 +57,6 @@ func readPackage(r ref.Ref, cs chunks.ChunkSource) *Package { return &p } -func RegisterFromValFunction(t TypeRef, f toNomsValueFunc) { - toNomsValueMap[t.Ref()] = f -} - -func ToNomsValueFromTypeRef(t TypeRef, v Value) Value { - if f, ok := toNomsValueMap[t.Ref()]; ok { - return f(v) - } - return v -} - func RegisterStruct(t TypeRef, bf structBuilderFunc, rf structReaderFunc) { structFuncMap[t.Ref()] = structFuncs{bf, rf} } @@ -121,3 +110,14 @@ func internalValueFromTypeRef(v Value, t TypeRef) Value { } return v } + +func RegisterRef(t TypeRef, bf refBuilderFunc) { + refFuncMap[t.Ref()] = bf +} + +func refFromTypeRef(target ref.Ref, t TypeRef) Value { + if f, ok := refFuncMap[t.Ref()]; ok { + return f(target) + } + return NewRef(target) +} diff --git a/types/package_set_of_ref.go b/types/package_set_of_ref.go index 16924692f4..a67fc0e4d2 100644 --- a/types/package_set_of_ref.go +++ b/types/package_set_of_ref.go @@ -188,9 +188,11 @@ func (m RefOfPackage) TypeRef() TypeRef { func init() { __typeRefForRefOfPackage = MakeCompoundTypeRef(RefKind, MakePrimitiveTypeRef(PackageKind)) - RegisterFromValFunction(__typeRefForRefOfPackage, func(v Value) Value { - return NewRefOfPackage(v.(Ref).TargetRef()) - }) + RegisterRef(__typeRefForRefOfPackage, builderForRefOfPackage) +} + +func builderForRefOfPackage(r ref.Ref) Value { + return NewRefOfPackage(r) } func (r RefOfPackage) TargetValue(cs chunks.ChunkSource) Package { diff --git a/types/ref.go b/types/ref.go index a1dd891682..e1df1f16ef 100644 --- a/types/ref.go +++ b/types/ref.go @@ -11,6 +11,10 @@ type Ref struct { ref *ref.Ref } +type RefBase interface { + TargetRef() ref.Ref +} + func NewRef(target ref.Ref) Ref { return newRef(target, refTypeRef) } @@ -41,12 +45,6 @@ func (r Ref) TypeRef() TypeRef { return r.t } -func init() { - RegisterFromValFunction(refTypeRef, func(v Value) Value { - return v.(Ref) - }) -} - func (r Ref) TargetValue(cs chunks.ChunkSource) Value { return ReadValue(r.target, cs) } diff --git a/types/set.go b/types/set.go index 7b7f3b912d..05b59dd766 100644 --- a/types/set.go +++ b/types/set.go @@ -22,12 +22,6 @@ type setFilterCallback func(v Value) (keep bool) var setTypeRef = MakeCompoundTypeRef(SetKind, MakePrimitiveTypeRef(ValueKind)) -func init() { - RegisterFromValFunction(setTypeRef, func(v Value) Value { - return v.(Set) - }) -} - func NewSet(v ...Value) Set { return newSetFromData(buildSetData(setData{}, v), setTypeRef) }