blob: 0aa56f895bcf3b0a15ff3ec370158eb7a24c1274 [file] [log] [blame]
// Copyright 2023 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package goversions defines gopls's policy for which versions of Go it supports.
package goversion
import (
"fmt"
"strings"
)
// Support holds information about end-of-life Go version support.
//
// Exposed for testing.
type Support struct {
GoVersion int
DeprecatedVersion string // if unset, the version is already deprecated
InstallGoplsVersion string
}
// Supported maps Go versions to the gopls version in which support will
// be deprecated, and the final gopls version supporting them without warnings.
// Keep this in sync with gopls/README.md.
//
// Must be sorted in ascending order of Go version.
//
// Exposed (and mutable) for testing.
var Supported = []Support{
{12, "", "v0.7.5"},
{15, "", "v0.9.5"},
{16, "v0.13.0", "v0.11.0"},
{17, "v0.13.0", "v0.11.0"},
}
// OldestSupported is the last X in Go 1.X that this version of gopls
// supports.
func OldestSupported() int {
return Supported[len(Supported)-1].GoVersion + 1
}
// Message returns the message to display if the user has the given Go
// version, if any. The goVersion variable is the X in Go 1.X. If
// fromBuild is set, the Go version is the version used to build
// gopls. Otherwise, it is the go command version.
//
// The second component of the result indicates whether the message is
// an error, not a mere warning.
//
// If goVersion is invalid (< 0), it returns "", false.
func Message(goVersion int, fromBuild bool) (string, bool) {
if goVersion < 0 {
return "", false
}
for _, v := range Supported {
if goVersion <= v.GoVersion {
var msgBuilder strings.Builder
isError := true
if fromBuild {
fmt.Fprintf(&msgBuilder, "Gopls was built with Go version 1.%d", goVersion)
} else {
fmt.Fprintf(&msgBuilder, "Found Go version 1.%d", goVersion)
}
if v.DeprecatedVersion != "" {
// not deprecated yet, just a warning
fmt.Fprintf(&msgBuilder, ", which will be unsupported by gopls %s. ", v.DeprecatedVersion)
isError = false // warning
} else {
fmt.Fprint(&msgBuilder, ", which is not supported by this version of gopls. ")
}
fmt.Fprintf(&msgBuilder, "Please upgrade to Go 1.%d or later and reinstall gopls. ", OldestSupported())
fmt.Fprintf(&msgBuilder, "If you can't upgrade and want this message to go away, please install gopls %s. ", v.InstallGoplsVersion)
fmt.Fprint(&msgBuilder, "See https://go.dev/s/gopls-support-policy for more details.")
return msgBuilder.String(), isError
}
}
return "", false
}