diff --git a/bootstrap/bootstrap.go b/bootstrap/bootstrap.go index aff4fb49..2ea422c7 100644 --- a/bootstrap/bootstrap.go +++ b/bootstrap/bootstrap.go @@ -14,6 +14,8 @@ import ( "path/filepath" "regexp" "sort" + + "golang.org/x/tools/imports" ) const genPackage = "github.com/mailru/easyjson/gen" @@ -41,6 +43,8 @@ type Generator struct { LeaveTemps bool NoFormat bool SimpleBytes bool + + LocalPrefix *string } // writeStub outputs an initial stub for marshalers/unmarshalers so that the package @@ -215,5 +219,17 @@ func (g *Generator) Run() error { if err != nil { return err } - return ioutil.WriteFile(g.OutName, out, 0644) + + if g.LocalPrefix != nil { + imports.LocalPrefix = *g.LocalPrefix + } + impOuts, err := imports.Process(g.OutName, out, &imports.Options{ + FormatOnly: true, + Comments: true, + }) + if err != nil { + return err + } + + return ioutil.WriteFile(g.OutName, impOuts, 0644) } diff --git a/easyjson/main.go b/easyjson/main.go index d337c846..a004bd23 100644 --- a/easyjson/main.go +++ b/easyjson/main.go @@ -31,6 +31,7 @@ var specifiedName = flag.String("output_filename", "", "specify the filename of var processPkg = flag.Bool("pkg", false, "process the whole package instead of just the given file") var disallowUnknownFields = flag.Bool("disallow_unknown_fields", false, "return error if any unknown field in json appeared") var skipMemberNameUnescaping = flag.Bool("disable_members_unescape", false, "don't perform unescaping of member names to improve performance") +var localPrefix = flag.String("local_prefix", "", "local prefix to use for imports") func generate(fname string) (err error) { fInfo, err := os.Stat(fname) @@ -85,6 +86,7 @@ func generate(fname string) (err error) { StubsOnly: *stubs, NoFormat: *noformat, SimpleBytes: *simpleBytes, + LocalPrefix: localPrefix, } if err := g.Run(); err != nil { diff --git a/gen/decoder.go b/gen/decoder.go index 2af6aaf3..24f6761e 100644 --- a/gen/decoder.go +++ b/gen/decoder.go @@ -335,7 +335,9 @@ func (g *Generator) genTypeDecoderNoCheck(t reflect.Type, out string, tags field fmt.Fprintln(g.out, ws+"if m, ok := "+out+".(easyjson.Unmarshaler); ok {") fmt.Fprintln(g.out, ws+"m.UnmarshalEasyJSON(in)") fmt.Fprintln(g.out, ws+"} else if m, ok := "+out+".(json.Unmarshaler); ok {") - fmt.Fprintln(g.out, ws+"_ = m.UnmarshalJSON(in.Raw())") + fmt.Fprintln(g.out, ws+"if err := m.UnmarshalJSON(in.Raw()); err != nil {") + fmt.Fprintln(g.out, ws+" in.AddError(err)") + fmt.Fprintln(g.out, ws+"}") fmt.Fprintln(g.out, ws+"} else {") fmt.Fprintln(g.out, ws+" "+out+" = in.Interface()") fmt.Fprintln(g.out, ws+"}") diff --git a/go.mod b/go.mod index 5384ce61..0b4ca7a3 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,13 @@ module github.com/mailru/easyjson -go 1.20 +go 1.23.0 + +toolchain go1.23.4 require github.com/josharian/intern v1.0.0 + +require ( + golang.org/x/mod v0.24.0 // indirect + golang.org/x/sync v0.12.0 // indirect + golang.org/x/tools v0.31.0 // indirect +) diff --git a/go.sum b/go.sum index cb47297b..0880161e 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,8 @@ github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= +golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= +golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= +golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ=