Commit 6796504d authored by Daniel Martí's avatar Daniel Martí

schema/gen/go: please vet a bit more

In particular, this removes ~50 out of the 2.7k warnings in 'go vet
./...' in this repository. Mainly, the "unreachable code" ones.

This was caused by edge cases in some of the generated code which caused
an unconditional return or panic statement to be followed by other code.
Fix all of them with a bit more template logic.

Some of the Next methods go a bit further. If they serve no purpose as
the switch has no cases to be matched, just unconditionally return an
error. In the future we can perhaps reuse a single function for that.

Finally, I was having a hard time actually following the logic in
kindedUnionNodeAssemblerMethodTemplateMunge, so I've indented the code a
bit to follow the template logic and scoping.

These changes move us towards pleasing vet, which is nice, but also make
the code waste a bit less space.
parent 392b04e9
......@@ -1360,9 +1360,8 @@ func (ma *_Msg3__Assembler) AssembleEntry(k string) (ipld.NodeAssembler, error)
ma.ca_waga.w = &ma.w.waga
ma.ca_waga.m = &ma.cm
return &ma.ca_waga, nil
default:
return nil, ipld.ErrInvalidKey{TypeName: "gendemo.Msg3", Key: &_String{k}}
}
return nil, ipld.ErrInvalidKey{TypeName: "gendemo.Msg3", Key: &_String{k}}
}
func (ma *_Msg3__Assembler) AssembleKey() ipld.NodeAssembler {
switch ma.state {
......@@ -1843,8 +1842,8 @@ func (ma *_Msg3__ReprAssembler) AssembleEntry(k string) (ipld.NodeAssembler, err
ma.ca_waga.m = &ma.cm
return &ma.ca_waga, nil
default:
return nil, ipld.ErrInvalidKey{TypeName: "gendemo.Msg3.Repr", Key: &_String{k}}
}
return nil, ipld.ErrInvalidKey{TypeName: "gendemo.Msg3.Repr", Key: &_String{k}}
}
func (ma *_Msg3__ReprAssembler) AssembleKey() ipld.NodeAssembler {
switch ma.state {
......@@ -1966,6 +1965,7 @@ func (ka *_Msg3__ReprKeyAssembler) AssignString(k string) error {
ka.s += fieldBit__Msg3_Whee
ka.state = maState_expectValue
ka.f = 0
return nil
case "woot":
if ka.s&fieldBit__Msg3_Woot != 0 {
return ipld.ErrRepeatedMapKey{&fieldName__Msg3_Woot_serial}
......@@ -1973,6 +1973,7 @@ func (ka *_Msg3__ReprKeyAssembler) AssignString(k string) error {
ka.s += fieldBit__Msg3_Woot
ka.state = maState_expectValue
ka.f = 1
return nil
case "waga":
if ka.s&fieldBit__Msg3_Waga != 0 {
return ipld.ErrRepeatedMapKey{&fieldName__Msg3_Waga_serial}
......@@ -1980,10 +1981,9 @@ func (ka *_Msg3__ReprKeyAssembler) AssignString(k string) error {
ka.s += fieldBit__Msg3_Waga
ka.state = maState_expectValue
ka.f = 2
default:
return ipld.ErrInvalidKey{TypeName: "gendemo.Msg3.Repr", Key: &_String{k}}
return nil
}
return nil
return ipld.ErrInvalidKey{TypeName: "gendemo.Msg3.Repr", Key: &_String{k}}
}
func (_Msg3__ReprKeyAssembler) AssignBytes([]byte) error {
return mixins.StringAssembler{"gendemo.Msg3.Repr.KeyAssembler"}.AssignBytes(nil)
......
This diff is collapsed.
......@@ -148,6 +148,9 @@ func (g structGenerator) EmitNodeMethodMapIterator(w io.Writer) {
}
func (itr *_{{ .Type | TypeSymbol }}__MapItr) Next() (k ipld.Node, v ipld.Node, _ error) {
{{- if not .Type.Fields }}
return nil, nil, ipld.ErrIteratorOverread{}
{{ else -}}
if itr.idx >= {{ len .Type.Fields }} {
return nil, nil, ipld.ErrIteratorOverread{}
}
......@@ -179,6 +182,7 @@ func (g structGenerator) EmitNodeMethodMapIterator(w io.Writer) {
}
itr.idx++
return
{{- end}}
}
func (itr *_{{ .Type | TypeSymbol }}__MapItr) Done() bool {
return itr.idx >= {{ len .Type.Fields }}
......@@ -418,8 +422,9 @@ func (g structBuilderGenerator) emitMapAssemblerMethods(w io.Writer) {
case maState_finished:
panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished")
}
switch k {
{{- $type := .Type -}} {{- /* ranging modifies dot, unhelpfully */ -}}
{{- if .Type.Fields }}
switch k {
{{- range $i, $field := .Type.Fields }}
case "{{ $field.Name }}":
if ma.s & fieldBit__{{ $type | TypeSymbol }}_{{ $field | FieldSymbolUpper }} != 0 {
......@@ -440,9 +445,9 @@ func (g structBuilderGenerator) emitMapAssemblerMethods(w io.Writer) {
{{- end}}
return &ma.ca_{{ $field | FieldSymbolLower }}, nil
{{- end}}
default:
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Key:&_String{k}}
}
{{- end}}
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Key:&_String{k}}
}
func (ma *_{{ .Type | TypeSymbol }}__Assembler) AssembleKey() ipld.NodeAssembler {
switch ma.state {
......
......@@ -180,7 +180,11 @@ func (g structReprMapReprGenerator) EmitNodeMethodMapIterator(w io.Writer) {
}
func (itr *_{{ .Type | TypeSymbol }}__ReprMapItr) Next() (k ipld.Node, v ipld.Node, _ error) {
{{ if .HaveOptionals }}advance:{{end -}}
{{- if not .Type.Fields }}
{{- /* TODO: deduplicate all these methods which just error */ -}}
return nil, nil, ipld.ErrIteratorOverread{}
{{ else -}}
{{ if .HaveOptionals }}advance:{{end -}}
if itr.idx >= {{ len .Type.Fields }} {
return nil, nil, ipld.ErrIteratorOverread{}
}
......@@ -212,6 +216,7 @@ func (g structReprMapReprGenerator) EmitNodeMethodMapIterator(w io.Writer) {
}
itr.idx++
return
{{- end}}
}
{{- if .HaveTrailingOptionals }}
func (itr *_{{ .Type | TypeSymbol }}__ReprMapItr) Done() bool {
......@@ -455,8 +460,9 @@ func (g structReprMapReprBuilderGenerator) emitMapAssemblerMethods(w io.Writer)
case maState_finished:
panic("invalid state: AssembleEntry cannot be called on an assembler that's already finished")
}
switch k {
{{- $type := .Type -}} {{- /* ranging modifies dot, unhelpfully */ -}}
{{- if .Type.Fields }}
switch k {
{{- range $i, $field := .Type.Fields }}
case "{{ $field | $type.RepresentationStrategy.GetFieldKey }}":
if ma.s & fieldBit__{{ $type | TypeSymbol }}_{{ $field | FieldSymbolUpper }} != 0 {
......@@ -476,8 +482,9 @@ func (g structReprMapReprBuilderGenerator) emitMapAssemblerMethods(w io.Writer)
return &ma.ca_{{ $field | FieldSymbolLower }}, nil
{{- end}}
default:
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}}
}
{{- end}}
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}}
}
func (ma *_{{ .Type | TypeSymbol }}__ReprAssembler) AssembleKey() ipld.NodeAssembler {
switch ma.state {
......@@ -592,6 +599,7 @@ func (g structReprMapReprBuilderGenerator) emitKeyAssembler(w io.Writer) {
if ka.state != maState_midKey {
panic("misuse: KeyAssembler held beyond its valid lifetime")
}
{{- if .Type.Fields }}
switch k {
{{- $type := .Type -}} {{- /* ranging modifies dot, unhelpfully */ -}}
{{- range $i, $field := .Type.Fields }}
......@@ -602,11 +610,11 @@ func (g structReprMapReprBuilderGenerator) emitKeyAssembler(w io.Writer) {
ka.s += fieldBit__{{ $type | TypeSymbol }}_{{ $field | FieldSymbolUpper }}
ka.state = maState_expectValue
ka.f = {{ $i }}
{{- end}}
default:
return ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}}
return nil
{{- end }}
}
return nil
{{- end }}
return ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}}
}
`, w, g.AdjCfg, g)
stubs.EmitNodeAssemblerMethodAssignBytes(w)
......
......@@ -464,6 +464,7 @@ func (g unionBuilderGenerator) emitMapAssemblerMethods(w io.Writer) {
if ma.ca != 0 {
return nil, schema.ErrNotUnionStructure{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Detail: "cannot add another entry -- a union can only contain one thing!"}
}
{{- if .Type.Members }}
switch k {
{{- range $i, $member := .Type.Members }}
case "{{ $member.Name }}":
......@@ -485,9 +486,9 @@ func (g unionBuilderGenerator) emitMapAssemblerMethods(w io.Writer) {
return ma.ca{{ add $i 1 }}, nil
{{- end}}
{{- end}}
default:
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Key:&_String{k}}
{{- end}}
}
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Key:&_String{k}}
}
`, w, g.AdjCfg, g)
......@@ -639,10 +640,8 @@ func (g unionBuilderGenerator) emitKeyAssembler(w io.Writer) {
ka.state = maState_expectValue
return nil
{{- end}}
default:
return ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Key:&_String{k}} // TODO: error quality: ErrInvalidUnionDiscriminant ?
}
return nil
return ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}", Key:&_String{k}} // TODO: error quality: ErrInvalidUnionDiscriminant ?
}
`, w, g.AdjCfg, g)
stubs.EmitNodeAssemblerMethodAssignBytes(w)
......
......@@ -338,6 +338,7 @@ func (g unionReprKeyedReprBuilderGenerator) emitMapAssemblerMethods(w io.Writer)
if ma.ca != 0 {
return nil, schema.ErrNotUnionStructure{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Detail: "cannot add another entry -- a union can only contain one thing!"}
}
{{- if .Type.Members }}
switch k {
{{- range $i, $member := .Type.Members }}
case "{{ $member | dot.Type.RepresentationStrategy.GetDiscriminant }}":
......@@ -359,9 +360,9 @@ func (g unionReprKeyedReprBuilderGenerator) emitMapAssemblerMethods(w io.Writer)
return ma.ca{{ add $i 1 }}, nil
{{- end}}
{{- end}}
default:
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}}
}
{{- end}}
return nil, ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}}
}
`, w, g.AdjCfg, g)
......@@ -500,10 +501,8 @@ func (g unionReprKeyedReprBuilderGenerator) emitKeyAssembler(w io.Writer) {
ka.state = maState_expectValue
return nil
{{- end}}
default:
return ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}} // TODO: error quality: ErrInvalidUnionDiscriminant ?
}
return nil
return ipld.ErrInvalidKey{TypeName:"{{ .PkgName }}.{{ .Type.Name }}.Repr", Key:&_String{k}} // TODO: error quality: ErrInvalidUnionDiscriminant ?
}
`, w, g.AdjCfg, g)
stubs.EmitNodeAssemblerMethodAssignBytes(w)
......
......@@ -430,32 +430,36 @@ func kindedUnionNodeAssemblerMethodTemplateMunge(
case midvalue:
panic("invalid state: cannot assign into assembler that's already working on a larger structure!")
}
{{- $returned := false -}}
{{- range $i, $member := .Type.Members }}
` + condClause + `
{{- if dot.Type | MaybeUsesPtr }}
if na.w == nil {
na.w = &_{{ dot.Type | TypeSymbol }}{}
}
{{- end}}
na.ca = {{ add $i 1 }}
{{- if (eq (dot.AdjCfg.UnionMemlayout dot.Type) "embedAll") }}
na.w.tag = {{ add $i 1 }}
na.ca{{ add $i 1 }}.w = &na.w.x{{ add $i 1 }}
na.ca{{ add $i 1 }}.m = na.m
return na.ca{{ add $i 1 }}` + retClause + `
{{- else if (eq (dot.AdjCfg.UnionMemlayout dot.Type) "interface") }}
x := &_{{ $member | TypeSymbol }}{}
na.w.x = x
if na.ca{{ add $i 1 }} == nil {
na.ca{{ add $i 1 }} = &_{{ $member | TypeSymbol }}__ReprAssembler{}
}
na.ca{{ add $i 1 }}.w = x
na.ca{{ add $i 1 }}.m = na.m
return na.ca{{ add $i 1 }}` + retClause + `
{{- end}}
{{- end}}
{{- end}}
{{- if dot.Type | MaybeUsesPtr }}
if na.w == nil {
na.w = &_{{ dot.Type | TypeSymbol }}{}
}
{{- end}}
na.ca = {{ add $i 1 }}
{{- if (eq (dot.AdjCfg.UnionMemlayout dot.Type) "embedAll") }}
na.w.tag = {{ add $i 1 }}
na.ca{{ add $i 1 }}.w = &na.w.x{{ add $i 1 }}
na.ca{{ add $i 1 }}.m = na.m
return na.ca{{ add $i 1 }}` + retClause + `
{{- else if (eq (dot.AdjCfg.UnionMemlayout dot.Type) "interface") }}
x := &_{{ $member | TypeSymbol }}{}
na.w.x = x
if na.ca{{ add $i 1 }} == nil {
na.ca{{ add $i 1 }} = &_{{ $member | TypeSymbol }}__ReprAssembler{}
}
na.ca{{ add $i 1 }}.w = x
na.ca{{ add $i 1 }}.m = na.m
return na.ca{{ add $i 1 }}` + retClause + `
{{- end}}
{{- $returned = true -}}
{{- end }}
{{- end }}
{{- if not $returned }}
return ` + maybeNilComma + ` schema.ErrNotUnionStructure{TypeName: "{{ .PkgName }}.{{ .Type.Name }}.Repr", Detail: "` + methodName + ` called but is not valid for any of the kinds that are valid members of this union"}
{{- end }}
}
`
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment