summaryrefslogtreecommitdiffstats
path: root/syntax/gowork.vim
diff options
context:
space:
mode:
Diffstat (limited to 'syntax/gowork.vim')
-rw-r--r--syntax/gowork.vim100
1 files changed, 100 insertions, 0 deletions
diff --git a/syntax/gowork.vim b/syntax/gowork.vim
new file mode 100644
index 00000000..eb641df2
--- /dev/null
+++ b/syntax/gowork.vim
@@ -0,0 +1,100 @@
+if polyglot#init#is_disabled(expand('<sfile>:p'), 'go', 'syntax/gowork.vim')
+ finish
+endif
+
+" gowork.vim: Vim syntax file for go.work file
+"
+" Quit when a (custom) syntax file was already loaded
+if exists("b:current_syntax")
+ finish
+endif
+
+syntax case match
+
+" Reference documentation:
+" https://go.dev/ref/mod#workspaces
+
+" match keywords
+syntax keyword goworkGo go contained
+syntax keyword goworkUse use
+syntax keyword goworkExclude exclude
+syntax keyword goworkReplace replace
+syntax keyword goworkRetract retract
+
+" require, exclude, replace, and go can be also grouped into block
+syntax region goworkUse start='require (' end=')' transparent contains=goworkUse,goworkPath
+syntax region goworkReplace start='replace (' end=')' transparent contains=goworkReplace,goworkVersion
+syntax match goworkGo '^go .*$' transparent contains=goworkGo,goworkGoVersion
+
+" set highlights
+highlight default link goworkGo Keyword
+highlight default link goworkUse Keyword
+highlight default link goworkReplace Keyword
+
+" comments are always in form of // ...
+syntax region goworkComment start="//" end="$" contains=@Spell
+highlight default link goworkComment Comment
+
+" make sure quoted import paths are higlighted
+syntax region goworkString start=+"+ skip=+\\\\\|\\"+ end=+"+
+highlight default link goworkString String
+
+" replace operator is in the form of '=>'
+syntax match goworkReplaceOperator "\v\=\>"
+highlight default link goworkReplaceOperator Operator
+
+" match go versions
+syntax match goworkGoVersion "1\.\d\+" contained
+highlight default link goworkGoVersion Identifier
+
+
+" match paths in use directives
+syntax match goworkPath "\f\+"
+
+highlight default link goworkPath Identifier
+" highlight versions:
+" * vX.Y.Z-pre
+" * vX.Y.Z
+" * vX.0.0-yyyyymmddhhmmss-abcdefabcdef
+" * vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef
+" * vX.Y.(Z+1)-0.yyyymmddhhss-abcdefabcdef
+" see https://godoc.org/golang.org/x/tools/internal/semver for more
+" information about how semantic versions are parsed and
+" https://golang.org/cmd/go/ for how pseudo-versions and +incompatible
+" are applied.
+
+
+" match vX.Y.Z and their prereleases
+syntax match goworkVersion "v\d\+\.\d\+\.\d\+\%(-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?"
+" ^--- version ---^^------------ pre-release ---------------------^^--------------- metadata ---------------------^
+" ^--------------------------------------- semantic version -------------------------------------------------------^
+
+" match pseudo versions
+" without a major version before the commit (e.g. vX.0.0-yyyymmddhhmmss-abcdefabcdef)
+syntax match goworkVersion "v\d\+\.0\.0-\d\{14\}-\x\+"
+" when most recent version before target is a pre-release
+syntax match goworkVersion "v\d\+\.\d\+\.\d\+-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?\.0\.\d\{14}-\x\+"
+" ^--- version ---^^--- ------ pre-release -----------------^^--------------- metadata ---------------------^
+" ^------------------------------------- semantic version --------------------------------------------------^
+" most recent version before the target is X.Y.Z
+syntax match goworkVersion "v\d\+\.\d\+\.\d\+\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?-0\.\d\{14}-\x\+"
+" ^--- version ---^^--------------- metadata ---------------------^
+
+" match incompatible vX.Y.Z and their prereleases
+syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+\%(-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?+incompatible"
+" ^------- version -------^^------------- pre-release ---------------------^^--------------- metadata ---------------------^
+" ^------------------------------------------- semantic version -----------------------------------------------------------^
+
+" match incompatible pseudo versions
+" incompatible without a major version before the commit (e.g. vX.0.0-yyyymmddhhmmss-abcdefabcdef)
+syntax match goworkVersion "v[2-9]\{1}\d*\.0\.0-\d\{14\}-\x\++incompatible"
+" when most recent version before target is a pre-release
+syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+-\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\%(+\%([0-9A-Za-z-]\+\)\(\.[0-9A-Za-z-]\+\)*\)\?\.0\.\d\{14}-\x\++incompatible"
+" ^------- version -------^^---------- pre-release -----------------^^--------------- metadata ---------------------^
+" ^---------------------------------------- semantic version ------------------------------------------------------^
+" most recent version before the target is X.Y.Z
+syntax match goworkVersion "v[2-9]\{1}\d*\.\d\+\.\d\+\%(+\%([0-9A-Za-z-]\+\)\%(\.[0-9A-Za-z-]\+\)*\)\?-0\.\d\{14}-\x\++incompatible"
+" ^------- version -------^^---------------- metadata ---------------------^
+highlight default link goworkVersion Identifier
+
+let b:current_syntax = "gowork"