| // Copyright 2020 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 main |
| |
| import ( |
| "go/ast" |
| "go/version" |
| "strings" |
| ) |
| |
| func init() { |
| register(buildtagFix) |
| } |
| |
| const buildtagGoVersionCutoff = "go1.18" |
| |
| var buildtagFix = fix{ |
| name: "buildtag", |
| date: "2021-08-25", |
| f: buildtag, |
| desc: `Remove +build comments from modules using Go 1.18 or later`, |
| } |
| |
| func buildtag(f *ast.File) bool { |
| if version.Compare(*goVersion, buildtagGoVersionCutoff) < 0 { |
| return false |
| } |
| |
| // File is already gofmt-ed, so we know that if there are +build lines, |
| // they are in a comment group that starts with a //go:build line followed |
| // by a blank line. While we cannot delete comments from an AST and |
| // expect consistent output in general, this specific case - deleting only |
| // some lines from a comment block - does format correctly. |
| fixed := false |
| for _, g := range f.Comments { |
| sawGoBuild := false |
| for i, c := range g.List { |
| if strings.HasPrefix(c.Text, "//go:build ") { |
| sawGoBuild = true |
| } |
| if sawGoBuild && strings.HasPrefix(c.Text, "// +build ") { |
| g.List = g.List[:i] |
| fixed = true |
| break |
| } |
| } |
| } |
| |
| return fixed |
| } |