golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
121.22k stars 17.37k forks source link

x/tools/gopls: supress analysis/simplifycompositelit on a generated code #67733

Open ohir opened 1 month ago

ohir commented 1 month ago

gopls version

Build info
----------
golang.org/x/tools/gopls v0.15.3
    golang.org/x/tools/gopls@v0.15.3 h1:zbdOidFrPTc8Bx0YrN5QKgJ0zCjyGi0L27sKQ/bDG5o=
    github.com/BurntSushi/toml@v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak=
    github.com/google/go-cmp@v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
    golang.org/x/exp/typeparams@v0.0.0-20221212164502-fae10dda9338 h1:2O2DON6y3XMJiQRAS1UWU+54aec2uopH3x7MAiqGW6Y=
    golang.org/x/mod@v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8=
    golang.org/x/sync@v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
    golang.org/x/telemetry@v0.0.0-20240209200032-7b892fcb8a78 h1:vcVnuftN4J4UKLRcgetjzfU9FjjgXUUYUc3JhFplgV4=
    golang.org/x/text@v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
    golang.org/x/tools@v0.18.1-0.20240412183611-d92ae0781217 h1:uH9jJYgeLCvblH0S+03kFO0qUDxRkbLRLFiKVVDl7ak=
    golang.org/x/vuln@v1.0.1 h1:KUas02EjQK5LTuIx1OylBQdKKZ9jeugs+HiqO5HormU=
    honnef.co/go/tools@v0.4.6 h1:oFEHCKeID7to/3autwsWfnuv69j3NsfcXbvJKuIcep8=
    mvdan.cc/gofumpt@v0.6.0 h1:G3QvahNDmpD+Aek/bNOLrFR2XC6ZAdo62dZu65gmwGo=
    mvdan.cc/xurls/v2@v2.5.0 h1:lyBNOm8Wo71UknhUs4QTFUNNMyxy2JEIaKKo0RWOh+8=
go: go1.22.1

go env

# empty items skipped
GOARCH='amd64'
GOBIN='/Path/To/bin'
GOCACHE='/Volumes/TEMP/gocache'
GOENV='/Path/To/go/env'
GOHOSTARCH='amd64'
GOHOSTOS='darwin'
GOMODCACHE='/Path/To/src/pkg/mod'
GONOPROXY='example.com'
GONOSUMDB='example.com'
GOOS='darwin'
GOPATH='/Path/To/src'
GOPRIVATE='example.com'
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/Path/To/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR='/Path/To/TEMP/go'
GOTOOLCHAIN='auto'
GOTOOLDIR='/Path/To/go/pkg/tool/darwin_amd64'
GOVCS='public:git'
GOVERSION='go1.22.3'
GCCGO='gccgo'
GOAMD64='v1'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Path/To/project/module/go.mod'
GOWORK='/Path/To/project/go.work'
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/Path/To/TEMP/go/go-build1959820345=/tmp/go-build -gno-record-gcc-switches -fno-common'

What did you do?

I have code that has been generated with fmt.Printf("%#v",somestruct) in files that are being properly marked as such with // Code generated with somegen DO NOT EDIT. header in the first line.
Gopls errornously suggests to simplify Printf produced literals polluting the "Problems" pane in the IDE (while properly refusing to format file on save).

Repr:

// Code generated with somegen DO NOT EDIT.
package main

import "fmt"

type ProofOB struct{
    A [][]string
}
func main(){
    // x := ProofOB{A: [][]string{{"some value"}}}
    x := ProofOB{A: [][]string{[]string{"some value"}}}
    fmt.Printf("%#v\n",x)
}
// Result: main.ProofOB{A:[][]string{[]string{"some value"}}}

What did you see happen?

hundreds of:

[{
    "resource": "[...cut...]/generated_test.go",
    "owner": "_generated_diagnostic_collection_name_#4",
    "code": {
        "value": "default",
        "target": {
            "$mid": 1,
            "path": "/golang.org/x/tools/gopls/internal/analysis/simplifycompositelit",
            "scheme": "https",
            "authority": "pkg.go.dev"
        }
    },
    "severity": 4,
    "message": "redundant type from array, slice, or map composite literal",
    "source": "simplifycompositelit",
    "startLineNumber": 2997,
    "startColumn": 104,
    "endLineNumber": 2997,
    "endColumn": 212,
    "tags": [
        1
    ]
}]

What did you expect to see?

I expected Gopls to know from the "Code generated" header that code here CAN NOT be simplified.

Editor and settings

"gopls": {  
        "ui.diagnostic.analyses": {
            "simplifycompositelit": true,
        },
        "formatting.gofumpt": true,
    },

Note: simplifycompositelit is by default true, but I had to have set it to false as a workaround now.

Logs

No response

findleyr commented 1 month ago

Agreed, we should disable all "simplifiers" on generated code.