cmd/compile: handle go.mod error msg reference in noder, not type checker

Currently, for version errors, types2 adds the helpful hint

(-lang was set to go1.xx; check go.mod)

where 1.xx is the respective language version, to the error message.
This requires that the type checker knows that it was invoked by the
compiler, which is done through the Config.CompilerErrorMessages flag.

This change looks for version errors being returned by the type checker
and then adds the hint at that point, external to the type checker.
This removes a dependency on the Config.CompilerErrorMessages. Once
we have removed all dependencies on Config.CompilerErrorMessages we
can remove it.

For #55326.

Change-Id: I1f9b2e472c49fe785a2075e26c4b3d9b8fcdbf4d
Reviewed-on: https://go-review.googlesource.com/c/go/+/432559
Reviewed-by: Robert Griesemer <gri@google.com>
Run-TryBot: Robert Griesemer <gri@google.com>
Auto-Submit: Robert Griesemer <gri@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Robert Findley <rfindley@google.com>
This commit is contained in:
Robert Griesemer 2022-09-21 18:38:23 -07:00 committed by Gopher Robot
parent 2f3008386f
commit 5d213a3dc7
5 changed files with 11 additions and 25 deletions

View file

@ -6,6 +6,7 @@ package noder
import ( import (
"fmt" "fmt"
"regexp"
"sort" "sort"
"cmd/compile/internal/base" "cmd/compile/internal/base"
@ -18,6 +19,8 @@ import (
"cmd/internal/src" "cmd/internal/src"
) )
var versionErrorRx = regexp.MustCompile(`requires go[0-9]+\.[0-9]+ or later`)
// checkFiles configures and runs the types2 checker on the given // checkFiles configures and runs the types2 checker on the given
// parsed source files and then returns the result. // parsed source files and then returns the result.
func checkFiles(noders []*noder) (posMap, *types2.Package, *types2.Info) { func checkFiles(noders []*noder) (posMap, *types2.Package, *types2.Info) {
@ -46,7 +49,12 @@ func checkFiles(noders []*noder) (posMap, *types2.Package, *types2.Info) {
CompilerErrorMessages: true, // use error strings matching existing compiler errors CompilerErrorMessages: true, // use error strings matching existing compiler errors
Error: func(err error) { Error: func(err error) {
terr := err.(types2.Error) terr := err.(types2.Error)
base.ErrorfAt(m.makeXPos(terr.Pos), "%s", terr.Msg) msg := terr.Msg
// if we have a version error, hint at the -lang setting
if versionErrorRx.MatchString(msg) {
msg = fmt.Sprintf("%s (-lang was set to %s; check go.mod)", msg, base.Flag.Lang)
}
base.ErrorfAt(m.makeXPos(terr.Pos), "%s", msg)
}, },
Importer: &importer, Importer: &importer,
Sizes: &gcSizes{}, Sizes: &gcSizes{},

View file

@ -7,7 +7,6 @@
package types2 package types2
import ( import (
"fmt"
"go/constant" "go/constant"
"unicode" "unicode"
) )
@ -201,9 +200,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
if cause != nil { if cause != nil {
// TODO(gri) consider restructuring versionErrorf so we can use it here and below // TODO(gri) consider restructuring versionErrorf so we can use it here and below
*cause = "conversion of slices to arrays requires go1.20 or later" *cause = "conversion of slices to arrays requires go1.20 or later"
if check.conf.CompilerErrorMessages {
*cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
}
} }
return false return false
} }
@ -216,9 +212,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
// check != nil // check != nil
if cause != nil { if cause != nil {
*cause = "conversion of slices to array pointers requires go1.17 or later" *cause = "conversion of slices to array pointers requires go1.17 or later"
if check.conf.CompilerErrorMessages {
*cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
}
} }
return false return false
} }

View file

@ -286,11 +286,7 @@ func (check *Checker) softErrorf(at poser, code errorCode, format string, args .
func (check *Checker) versionErrorf(at poser, goVersion string, format string, args ...interface{}) { func (check *Checker) versionErrorf(at poser, goVersion string, format string, args ...interface{}) {
msg := check.sprintf(format, args...) msg := check.sprintf(format, args...)
if check.conf.CompilerErrorMessages { msg = fmt.Sprintf("%s requires %s or later", msg, goVersion)
msg = fmt.Sprintf("%s requires %s or later (-lang was set to %s; check go.mod)", msg, goVersion, check.conf.GoVersion)
} else {
msg = fmt.Sprintf("%s requires %s or later", msg, goVersion)
}
check.err(at, _UnsupportedFeature, msg, true) check.err(at, _UnsupportedFeature, msg, true)
} }

View file

@ -7,7 +7,6 @@
package types package types
import ( import (
"fmt"
"go/constant" "go/constant"
"go/token" "go/token"
"unicode" "unicode"
@ -201,9 +200,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
if cause != nil { if cause != nil {
// TODO(gri) consider restructuring versionErrorf so we can use it here and below // TODO(gri) consider restructuring versionErrorf so we can use it here and below
*cause = "conversion of slices to arrays requires go1.20 or later" *cause = "conversion of slices to arrays requires go1.20 or later"
if compilerErrorMessages {
*cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
}
} }
return false return false
} }
@ -216,9 +212,6 @@ func (x *operand) convertibleTo(check *Checker, T Type, cause *string) bool {
// check != nil // check != nil
if cause != nil { if cause != nil {
*cause = "conversion of slices to array pointers requires go1.17 or later" *cause = "conversion of slices to array pointers requires go1.17 or later"
if compilerErrorMessages {
*cause += fmt.Sprintf(" (-lang was set to %s; check go.mod)", check.conf.GoVersion)
}
} }
return false return false
} }

View file

@ -295,11 +295,7 @@ func (check *Checker) softErrorf(at positioner, code errorCode, format string, a
func (check *Checker) versionErrorf(at positioner, code errorCode, goVersion string, format string, args ...interface{}) { func (check *Checker) versionErrorf(at positioner, code errorCode, goVersion string, format string, args ...interface{}) {
msg := check.sprintf(format, args...) msg := check.sprintf(format, args...)
var err *error_ var err *error_
if compilerErrorMessages { err = newErrorf(at, code, "%s requires %s or later", msg, goVersion)
err = newErrorf(at, code, "%s requires %s or later (-lang was set to %s; check go.mod)", msg, goVersion, check.conf.GoVersion)
} else {
err = newErrorf(at, code, "%s requires %s or later", msg, goVersion)
}
check.report(err) check.report(err)
} }