blob: 5b849b22b856e80427f859272b74c05a4ccd1fdb [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 is the Go version to which these settings relate.
GoVersion int
// DeprecatedVersion is the first version of gopls that no longer supports
// this Go version.
//
// If unset, the version is already deprecated.
DeprecatedVersion string
// InstallGoplsVersion is the latest gopls version that supports this Go
// version without warnings.
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.11.0"},
{17, "", "v0.11.0"},
{18, "v0.16.0", "v0.14.2"},
}
// OldestSupported is the last X in Go 1.X that this version of gopls
// supports without warnings.
//
// Exported for testing.
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
}