diff --git a/autoload/go/highlight_test.vim b/autoload/go/highlight_test.vim index 81f6098833..1330b0b8a4 100644 --- a/autoload/go/highlight_test.vim +++ b/autoload/go/highlight_test.vim @@ -104,18 +104,37 @@ function! Test_numeric_literal_highlight() abort let tests = { \ 'lone zero': {'group': 'goDecimalInt', 'value': '0'}, \ 'integer': {'group': 'goDecimalInt', 'value': '1234567890'}, + \ 'integerGrouped': {'group': 'goDecimalInt', 'value': '1_234_567_890'}, + \ 'integerErrorLeadingUnderscore': {'group': 'goDecimalError', 'value': '_1234_567_890'}, + \ 'integerErrorTrailingUnderscore': {'group': 'goDecimalError', 'value': '1_234_567890_'}, + \ 'integerErrorDoubleUnderscore': {'group': 'goDecimalError', 'value': '1_234__567_890'}, \ 'hexadecimal': {'group': 'goHexadecimalInt', 'value': '0x0123456789abdef'}, + \ 'hexadecimalGrouped': {'group': 'goHexadecimalInt', 'value': '0x012_345_678_9ab_def'}, \ 'hexadecimalErrorLeading': {'group': 'goHexadecimalError', 'value': '0xg0123456789abdef'}, \ 'hexadecimalErrorTrailing': {'group': 'goHexadecimalError', 'value': '0x0123456789abdefg'}, + \ 'hexadecimalErrorDoubleUnderscore': {'group': 'goHexadecimalError', 'value': '0x__0123456789abdef'}, + \ 'hexadecimalErrorTrailingUnderscore': {'group': 'goHexadecimalError', 'value': '0x0123456789abdef_'}, \ 'heXadecimal': {'group': 'goHexadecimalInt', 'value': '0X0123456789abdef'}, \ 'heXadecimalErrorLeading': {'group': 'goHexadecimalError', 'value': '0Xg0123456789abdef'}, \ 'heXadecimalErrorTrailing': {'group': 'goHexadecimalError', 'value': '0X0123456789abdefg'}, \ 'octal': {'group': 'goOctalInt', 'value': '01234567'}, + \ 'octalPrefix': {'group': 'goOctalInt', 'value': '0o1234567'}, + \ 'octalGrouped': {'group': 'goOctalInt', 'value': '0o1_234_567'}, \ 'octalErrorLeading': {'group': 'goOctalError', 'value': '081234567'}, \ 'octalErrorTrailing': {'group': 'goOctalError', 'value': '012345678'}, + \ 'octalErrorDoubleUnderscore': {'group': 'goOctalError', 'value': '0o__1234567'}, + \ 'octalErrorTrailingUnderscore': {'group': 'goOctalError', 'value': '0o_123456_7_'}, + \ 'octalErrorTrailingO': {'group': 'goOctalError', 'value': '0o_123456_7o'}, + \ 'octalErrorTrailingX': {'group': 'goOctalError', 'value': '0o_123456_7x'}, + \ 'octalErrorTrailingB': {'group': 'goOctalError', 'value': '0o_123456_7b'}, + \ 'OctalPrefix': {'group': 'goOctalInt', 'value': '0O1234567'}, \ 'binaryInt': {'group': 'goBinaryInt', 'value': '0b0101'}, + \ 'binaryIntGrouped': {'group': 'goBinaryInt', 'value': '0b_01_01'}, \ 'binaryErrorLeading': {'group': 'goBinaryError', 'value': '0b20101'}, \ 'binaryErrorTrailing': {'group': 'goBinaryError', 'value': '0b01012'}, + \ 'binaryErrorDoubleUnderscore': {'group': 'goBinaryError', 'value': '0b_01__01'}, + \ 'binaryOverrideOctal': {'group': 'goBinaryError', 'value': '0b1234567'}, + \ 'binaryErrorTrailingUnderscore': {'group': 'goBinaryError', 'value': '0b_01_01_'}, \ 'BinaryInt': {'group': 'goBinaryInt', 'value': '0B0101'}, \ 'BinaryErrorLeading': {'group': 'goBinaryError', 'value': '0B20101'}, \ 'BinaryErrorTrailing': {'group': 'goBinaryError', 'value': '0B01012'}, diff --git a/syntax/go.vim b/syntax/go.vim index c39e044a45..60824dcec7 100644 --- a/syntax/go.vim +++ b/syntax/go.vim @@ -162,15 +162,17 @@ endif syn match goSingleDecl /\%(import\|var\|const\) [^(]\@=/ contains=goImport,goVar,goConst " Integers -syn match goDecimalInt "\<-\=\(0\|[1-9]\d*\)\%([Ee][-+]\=\d\+\)\=\>" -syn match goHexadecimalInt "\<-\=0[xX]\x\+\>" -syn match goHexadecimalError "\<-\=0[xX]\x*[^ \t0-9A-Fa-f]\S*\>" -syn match goOctalInt "\<-\=0\o\+\>" -syn match goOctalError "\<-\=0[XxBb\]]\@!\o*[^ \t0-7]\S*\>" -syn match goBinaryInt "\<-\=0[bB][01]\+\>" -syn match goBinaryError "\<-\=0[bB][01]*[^ \t01]\S*\>" +syn match goDecimalInt "\<-\=\(0\|[1-9]_\?\(\d\|\d\+_\?\d\+\)*\)\%([Ee][-+]\=\d\+\)\=\>" +syn match goDecimalError "\<-\=\(_\(\d\+_*\)\+\|\([1-9]\d*_*\)\+__\(\d\+_*\)\+\|\([1-9]\d*_*\)\+_\+\)\%([Ee][-+]\=\d\+\)\=\>" +syn match goHexadecimalInt "\<-\=0[xX]_\?\(\x\+_\?\)\+\>" +syn match goHexadecimalError "\<-\=0[xX]_\?\(\x\+_\?\)*\(\([^ \t0-9A-Fa-f_]\|__\)\S*\|_\)\>" +syn match goOctalInt "\<-\=0[oO]\?_\?\(\o\+_\?\)\+\>" +syn match goOctalError "\<-\=0[0-7oO_]*\(\([^ \t0-7oOxX_/\]\}]\|[oO]\{2,\}\|__\)\S*\|_\|[oOxX]\)\>" +syn match goBinaryInt "\<-\=0[bB]_\?\([01]\+_\?\)\+\>" +syn match goBinaryError "\<-\=0[bB]_\?[01_]*\([^ \t01_]\S*\|__\S*\|_\)\>" hi def link goDecimalInt Integer +hi def link goDecimalError Error hi def link goHexadecimalInt Integer hi def link goHexadecimalError Error hi def link goOctalInt Integer