vim-go
vim-go copied to clipboard
some number literals forms introduced in Go 1.13 do not highlight correctly
What did you expect to happen?
That the plugin will highlight all number literals. The full list of literals is taken from here.
What happened instead?
The plugin does not highlight some valid number literals in Go. All listed numbers below should be highlighted:
Configuration:
vim-go
version: v1.26
vimrc
you used to reproduce:
call plug#begin()
Plug 'fatih/vim-go', {'do': ':GoUpdateBinaries'}
call plug#end()
nnoremap <C-Left> :tabprevious<CR>
nnoremap <C-Right> :tabnext<CR>
Vim
version (first three lines from :version
):
VIM - Vi IMproved 8.1 (2018 May 18, compiled Feb 01 2022 09:16:32)
Included patches: 1-2269, 3612, 3625, 3669, 3741
Modified by [email protected]
Go
version (go version
):
go version go1.19beta1 linux/amd64
Go
environment
go env
Output:
GO111MODULE="" GOARCH="amd64" GOBIN="" GOCACHE="/home/sedyh/.cache/go-build" GOENV="/home/sedyh/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/sedyh/.local/share/go/path-workspace/pkg/mod" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/sedyh/.local/share/go/path-workspace" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/home/sedyh/.local/share/go/root-sdk/go1.19beta1" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/home/sedyh/.local/share/go/root-sdk/go1.19beta1/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.19beta1" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/dev/null" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3452671431=/tmp/go-build -gno-record-gcc-switches"
gopls
version
gopls version
Output:
golang.org/x/tools/gopls v0.9.1 golang.org/x/tools/[email protected] h1:SigsTL4Hpv3a6b/a7oPCLRv5QUeSM6PZNdta1oKY4B0=
The problems here are with a few specific and odd scenarios for number literals that were released in Go 1.13
- non-decimal floating point representations (e.g.
0010e-2
,0x1p
, etc.) - non-decimal imaginary number representations (e.g.
0x11i
).
Here's a useful code block to demonstrate the highlighting:
_ = 1.23
_ = 01.23 // == 1.23
_ = .23
_ = 1.
// An "e" or "E" starts the exponent part (10-based).
_ = 1.23e2 // == 123.0
_ = 123E2 // == 12300.0
_ = 123.E+2 // == 12300.0
_ = 1e-1 // == 0.1
_ = .1e0 // == 0.1
_ = 0010e-2 // == 0.1
_ = 0e+5 // == 0.0
_ = 0x1p-2 // == 1.0/4 = 0.25
_ = 0x2.p10 // == 2.0 * 1024 == 2048.0
_ = 0x1.Fp+0 // == 1+15.0/16 == 1.9375
_ = 0X.8p1 // == 8.0/16 * 2 == 1.0
_ = 0X1FFFP-16 // == 0.1249847412109375
_ = 1.23i
_ = 1.i
_ = .23i
_ = 123i
_ = 0123i // == 123i (for backward-compatibility. See below.)
_ = 1.23E2i // == 123i
_ = 1e-1i
_ = 011i // == 11i (for backward-compatibility. See below.)
_ = 00011i // == 11i (for backward-compatibility. See below.)
// The following lines only compile okay since Go 1.13.
_ = 0o11i // == 9i
_ = 0x11i // == 17i
_ = 0b11i // == 3i
_ = 0X.8p-0i // == 0.5i
_ = 1 + 2i // == 1.0 + 2.0i
_ = 1. - .1i // == 1.0 + -0.1i
_ = 1.23i - 7.89 // == -7.89 + 1.23i
_ = 1.23i // == 0.0 + 1.23i
_ = 6_9 // == 69
_ = 0_33_77_22 // == 0337722
_ = 0x_Bad_Face // == 0xBadFace
_ = 0X_1F_FFP-16 // == 0X1FFFP-16
_ = 0b1011_0111 + 0xA_B.Fp2i