Skip to content

Commit 6ff3933

Browse files
author
Tao Wen
committed
handle embed struct
1 parent c5dd2ab commit 6ff3933

File tree

6 files changed

+57
-0
lines changed

6 files changed

+57
-0
lines changed

generator/encoder.go

+36
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ func encodeStructEmbedField(fieldType ast.Expr) {
225225
_f(" %s_json_marshal_field(stream, val.%s)", x.Name, x.Name)
226226
}
227227
case *ast.StarExpr:
228+
// TODO: handle nil pointer
228229
switch y := x.X.(type) {
229230
case *ast.Ident:
230231
isNotExported := unicode.IsLower(rune(y.Name[0]))
@@ -234,11 +235,46 @@ func encodeStructEmbedField(fieldType ast.Expr) {
234235
_f(" if val.%s != nil {", y.Name)
235236
_f(" %s_json_marshal_field(stream, *val.%s)", y.Name, y.Name)
236237
_l(" }")
238+
case *ast.SelectorExpr:
239+
if y.Sel.Name == "Number" {
240+
_l(` stream.WriteObjectField("Number")`)
241+
_l(` stream.WriteRawOrNull((string)(*val.Number))`)
242+
_l(` stream.WriteMore()`)
243+
} else if y.Sel.Name == "RawMessage" {
244+
reportError(fmt.Errorf("embed json.RawMessage is not supported"))
245+
return
246+
} else {
247+
alias := nodeToString(y.X)
248+
if path, ok := allImports[alias]; ok {
249+
referencedImports[alias] = path
250+
} else {
251+
reportError(fmt.Errorf("unknown import: %s", alias))
252+
return
253+
}
254+
_f(" %s_json_marshal_field(stream, *val.%s)", nodeToString(y), y.Sel.Name)
255+
}
237256
default:
238257
reportError(fmt.Errorf("unknown embed field type: %s", nodeToString(fieldType)))
239258
return
240259
}
241260
case *ast.SelectorExpr:
261+
if x.Sel.Name == "Number" {
262+
_l(` stream.WriteObjectField("Number")`)
263+
_l(` stream.WriteRawOrNull((string)(val.Number))`)
264+
_l(` stream.WriteMore()`)
265+
} else if x.Sel.Name == "RawMessage" {
266+
reportError(fmt.Errorf("embed json.RawMessage is not supported"))
267+
return
268+
} else {
269+
alias := nodeToString(x.X)
270+
if path, ok := allImports[alias]; ok {
271+
referencedImports[alias] = path
272+
} else {
273+
reportError(fmt.Errorf("unknown import: %s", alias))
274+
return
275+
}
276+
_f(" %s_json_marshal_field(stream, val.%s)", nodeToString(x), x.Sel.Name)
277+
}
242278
default:
243279
reportError(fmt.Errorf("unknown embed field type: %s", nodeToString(fieldType)))
244280
return

value_tests/EmbedNumberStruct_json.go

+3
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,7 @@ func EmbedNumberStruct_json_marshal(stream *jsoniter.Stream, val EmbedNumberStru
3434
stream.WriteObjectTail()
3535
}
3636
func EmbedNumberStruct_json_marshal_field(stream *jsoniter.Stream, val EmbedNumberStruct) {
37+
stream.WriteObjectField("Number")
38+
stream.WriteRawOrNull((string)(val.Number))
39+
stream.WriteMore()
3740
}

value_tests/struct_test.go

+5
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ func Test_struct7(t *testing.T) {
6565
if val1.Number != json.Number("100") {
6666
t.Fatal(val1.Number)
6767
}
68+
jsonAdapter := jsoniter.CreateJsonAdapter(EmbedNumberStruct_json{})
69+
bytes, _ := jsonAdapter.MarshalIndent(val1, "", " ")
70+
if !strings.Contains(string(bytes), "Number") {
71+
t.Fatal(string(bytes))
72+
}
6873
}
6974

7075
func Test_struct8(t *testing.T) {

value_tests/sub/EmbedOtherPkgNamedArray_json.go

+1
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,5 @@ func EmbedOtherPkgNamedArray_json_marshal(stream *jsoniter.Stream, val EmbedOthe
3535
stream.WriteObjectTail()
3636
}
3737
func EmbedOtherPkgNamedArray_json_marshal_field(stream *jsoniter.Stream, val EmbedOtherPkgNamedArray) {
38+
value_tests.NamedArray_json_marshal_field(stream, val.NamedArray)
3839
}

value_tests/sub/EmbedViaPtr_json.go

+1
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ func EmbedViaPtr_json_marshal(stream *jsoniter.Stream, val EmbedViaPtr) {
4040
stream.WriteObjectTail()
4141
}
4242
func EmbedViaPtr_json_marshal_field(stream *jsoniter.Stream, val EmbedViaPtr) {
43+
value_tests.NamedArray_json_marshal_field(stream, *val.NamedArray)
4344
}

value_tests/sub/array_test.go

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sub
33
import (
44
"encoding/json"
55
"fmt"
6+
"strings"
67
"testing"
78

89
jsoniter "github.com/json-iterator/tinygo"
@@ -42,11 +43,21 @@ func Test_EmbedOtherPkgNamedArray(t *testing.T) {
4243
var val1 EmbedOtherPkgNamedArray
4344
var val2 EmbedOtherPkgNamedArray
4445
compareWithStdlib(input, jsoniter.CreateJsonAdapter(EmbedOtherPkgNamedArray_json{}), &val1, &val2)
46+
jsonAdapter := jsoniter.CreateJsonAdapter(EmbedOtherPkgNamedArray_json{})
47+
bytes, _ := jsonAdapter.MarshalIndent(val1, "", " ")
48+
if !strings.Contains(string(bytes), "NamedArray") {
49+
t.Fatal(string(bytes))
50+
}
4551
}
4652

4753
func Test_EmbedViaPtr(t *testing.T) {
4854
input := `{ "NamedArray": ["hello","world"] }`
4955
var val1 EmbedViaPtr
5056
var val2 EmbedViaPtr
5157
compareWithStdlib(input, jsoniter.CreateJsonAdapter(EmbedViaPtr_json{}), &val1, &val2)
58+
jsonAdapter := jsoniter.CreateJsonAdapter(EmbedViaPtr_json{})
59+
bytes, _ := jsonAdapter.MarshalIndent(val1, "", " ")
60+
if !strings.Contains(string(bytes), "NamedArray") {
61+
t.Fatal(string(bytes))
62+
}
5263
}

0 commit comments

Comments
 (0)