Codebase list golang-golang-x-mod / 1846133
modfile: add parsing support for toolchain Add new toolchain directive to go.mod and go.work parser. Also fix error checking in parsing tests. For golang/go#57001. Change-Id: Ib7603f82cbd667f2152ed6b0c5989f08c28ceb1c Reviewed-on: https://go-review.googlesource.com/c/mod/+/497399 Run-TryBot: Russ Cox <rsc@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Russ Cox 11 months ago
7 changed file(s) with 63 addition(s) and 10 deletion(s). Raw diff Collapse all Expand all
180180 pf1, err := Parse(base, data, nil)
181181 if err != nil {
182182 switch base {
183 case "testdata/replace2.in", "testdata/gopkg.in.golden":
183 case "testdata/block.golden",
184 "testdata/block.in",
185 "testdata/comment.golden",
186 "testdata/comment.in",
187 "testdata/rule1.golden":
188 // ignore
189 default:
184190 t.Errorf("should parse %v: %v", base, err)
185191 }
186192 }
424430 }
425431 }
426432
427 func TestGoVersion(t *testing.T) {
433 func TestParseVersions(t *testing.T) {
428434 tests := []struct {
429435 desc, input string
430436 ok bool
431437 laxOK bool // ok=true implies laxOK=true; only set if ok=false
432438 }{
439 // go lines
433440 {desc: "empty", input: "module m\ngo \n", ok: false},
434441 {desc: "one", input: "module m\ngo 1\n", ok: false},
435442 {desc: "two", input: "module m\ngo 1.22\n", ok: true},
437444 {desc: "before", input: "module m\ngo v1.2\n", ok: false},
438445 {desc: "after", input: "module m\ngo 1.2rc1\n", ok: true},
439446 {desc: "space", input: "module m\ngo 1.2 3.4\n", ok: false},
440 {desc: "alt1", input: "module m\ngo 1.2.3\n", ok: true, laxOK: true},
441 {desc: "alt2", input: "module m\ngo 1.2rc1\n", ok: true, laxOK: true},
442 {desc: "alt3", input: "module m\ngo 1.2beta1\n", ok: true, laxOK: true},
447 {desc: "alt1", input: "module m\ngo 1.2.3\n", ok: true},
448 {desc: "alt2", input: "module m\ngo 1.2rc1\n", ok: true},
449 {desc: "alt3", input: "module m\ngo 1.2beta1\n", ok: true},
443450 {desc: "alt4", input: "module m\ngo 1.2.beta1\n", ok: false, laxOK: true},
444451 {desc: "alt1", input: "module m\ngo v1.2.3\n", ok: false, laxOK: true},
445452 {desc: "alt2", input: "module m\ngo v1.2rc1\n", ok: false, laxOK: true},
446453 {desc: "alt3", input: "module m\ngo v1.2beta1\n", ok: false, laxOK: true},
447454 {desc: "alt4", input: "module m\ngo v1.2.beta1\n", ok: false, laxOK: true},
448455 {desc: "alt1", input: "module m\ngo v1.2\n", ok: false, laxOK: true},
456
457 // toolchain lines
458 {desc: "tool", input: "module m\ntoolchain go1.2\n", ok: true},
459 {desc: "tool1", input: "module m\ntoolchain go1.2.3\n", ok: true},
460 {desc: "tool2", input: "module m\ntoolchain go1.2rc1\n", ok: true},
461 {desc: "tool3", input: "module m\ntoolchain gccgo-go1.2rc1\n", ok: true},
462 {desc: "tool4", input: "module m\ntoolchain local\n", ok: true},
463 {desc: "tool5", input: "module m\ntoolchain inconceivable!\n", ok: false, laxOK: true},
449464 }
450465 t.Run("Strict", func(t *testing.T) {
451466 for _, test := range tests {
461476 t.Run("Lax", func(t *testing.T) {
462477 for _, test := range tests {
463478 t.Run(test.desc, func(t *testing.T) {
464 if _, err := Parse("go.mod", []byte(test.input), nil); err == nil && !(test.ok || test.laxOK) {
479 if _, err := ParseLax("go.mod", []byte(test.input), nil); err == nil && !(test.ok || test.laxOK) {
465480 t.Error("unexpected success")
466481 } else if err != nil && test.ok {
467482 t.Errorf("unexpected error: %v", err)
374374 f.Go = &Go{Syntax: line}
375375 f.Go.Version = args[0]
376376
377 case "toolchain":
378 if f.Toolchain != nil {
379 errorf("repeated toolchain statement")
380 return
381 }
382 if len(args) != 1 {
383 errorf("toolchain directive expects exactly one argument")
384 return
385 } else if strict && !ToolchainRE.MatchString(args[0]) {
386 errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0])
387 return
388 }
389 f.Toolchain = &Toolchain{Syntax: line}
390 f.Toolchain.Name = args[0]
391
377392 case "module":
378393 if f.Module != nil {
379394 errorf("repeated module statement")
621636
622637 f.Go = &Go{Syntax: line}
623638 f.Go.Version = args[0]
639
640 case "toolchain":
641 if f.Toolchain != nil {
642 errorf("repeated toolchain statement")
643 return
644 }
645 if len(args) != 1 {
646 errorf("toolchain directive expects exactly one argument")
647 return
648 } else if !ToolchainRE.MatchString(args[0]) {
649 errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0])
650 return
651 }
652
653 f.Toolchain = &Toolchain{Syntax: line}
654 f.Toolchain.Name = args[0]
624655
625656 case "use":
626657 if len(args) != 1 {
0 go 1.2.3
1
2 toolchain local
0 go 1.2.3
1 toolchain local
0 go 1.2.3
1
2 toolchain local
0 go 1.2.3
1 toolchain local
331331
332332 pf1, err := ParseWork(base, data, nil)
333333 if err != nil {
334 switch base {
335 case "testdata/replace2.in", "testdata/gopkg.in.golden":
336 t.Errorf("should parse %v: %v", base, err)
337 }
334 t.Errorf("should parse %v: %v", base, err)
338335 }
339336 if err == nil {
340337 pf2, err := ParseWork(base, ndata, nil)