diff options
author | Christian Clason <c.clason@uni-graz.at> | 2022-08-09 10:43:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-09 10:43:28 +0200 |
commit | a5e846b9969b1dfbd7e92f437f3ac7905039b84f (patch) | |
tree | 04ea16853179df83e33bbc36a1d96168925d2bc2 /runtime/indent/systemverilog.vim | |
parent | e6680ea7c3912d38f2ef967e053be741624633ad (diff) | |
download | rneovim-a5e846b9969b1dfbd7e92f437f3ac7905039b84f.tar.gz rneovim-a5e846b9969b1dfbd7e92f437f3ac7905039b84f.tar.bz2 rneovim-a5e846b9969b1dfbd7e92f437f3ac7905039b84f.zip |
vim-patch:partial: 48c3f4e0bff7 (#19684)
vim-patch:partial:48c3f4e0bff7
Update runtime files
https://github.com/vim/vim/commit/48c3f4e0bff7efd289a7001b68c777b6f89a7057
partially skip `options.txt` (needs 9.0.0138)
Diffstat (limited to 'runtime/indent/systemverilog.vim')
-rw-r--r-- | runtime/indent/systemverilog.vim | 176 |
1 files changed, 111 insertions, 65 deletions
diff --git a/runtime/indent/systemverilog.vim b/runtime/indent/systemverilog.vim index f6114dc1fd..a5f4d5b90d 100644 --- a/runtime/indent/systemverilog.vim +++ b/runtime/indent/systemverilog.vim @@ -2,7 +2,7 @@ " Language: SystemVerilog " Maintainer: kocha <kocha.lsifrontend@gmail.com> " Last Change: 05-Feb-2017 by Bilal Wasim -" 2022 April: b:undo_indent added by Doug Kearns +" 03-Aug-2022 Improved indent " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -15,7 +15,7 @@ setlocal indentkeys=!^F,o,O,0),0},=begin,=end,=join,=endcase,=join_any,=join_non setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify setlocal indentkeys+==endclass,=endpackage,=endsequence,=endclocking setlocal indentkeys+==endinterface,=endgroup,=endprogram,=endproperty,=endchecker -setlocal indentkeys+==`else,=`endif +setlocal indentkeys+==`else,=`elsif,=`endif let b:undo_indent = "setl inde< indk<" @@ -27,6 +27,9 @@ endif let s:cpo_save = &cpo set cpo&vim +let s:multiple_comment = 0 +let s:open_statement = 0 + function SystemVerilogIndent() if exists('b:systemverilog_indent_width') @@ -40,6 +43,12 @@ function SystemVerilogIndent() let indent_modules = 0 endif + if exists('b:systemverilog_indent_ifdef_off') + let indent_ifdef = 0 + else + let indent_ifdef = 1 + endif + " Find a non-blank line above the current line. let lnum = prevnonblank(v:lnum - 1) @@ -54,48 +63,55 @@ function SystemVerilogIndent() let last_line2 = getline(lnum2) let ind = indent(lnum) let ind2 = indent(lnum - 1) - let offset_comment1 = 1 " Define the condition of an open statement " Exclude the match of //, /* or */ let sv_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)' " Define the condition when the statement ends with a one-line comment let sv_comment = '\(//.*\|/\*.*\*/\s*\)' - if exists('b:verilog_indent_verbose') - let vverb_str = 'INDENT VERBOSE:' + if exists('b:systemverilog_indent_verbose') + let vverb_str = 'INDENT VERBOSE: '. v:lnum .":" let vverb = 1 else let vverb = 0 endif - " Indent according to last line - " End of multiple-line comment - if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/' - let ind = ind - offset_comment1 - if vverb - echo vverb_str "De-indent after a multiple-line comment." - endif + " Multiple-line comment count + if curr_line =~ '^\s*/\*' && curr_line !~ '/\*.\{-}\*/' + let s:multiple_comment += 1 + if vverb | echom vverb_str "Start of multiple-line commnt" | endif + elseif curr_line =~ '\*/\s*$' && curr_line !~ '/\*.\{-}\*/' + let s:multiple_comment -= 1 + if vverb | echom vverb_str "End of multiple-line commnt" | endif + return ind + endif + " Maintain indentation during commenting. + if s:multiple_comment > 0 + return ind + endif " Indent after if/else/for/case/always/initial/specify/fork blocks - elseif last_line =~ '`\@<!\<\(if\|else\)\>' || - \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\|do\|foreach\|forever\|randcase\)\>' || + if last_line =~ '^\s*\(end\)\=\s*`\@<!\<\(if\|else\)\>' || + \ last_line =~ '^\s*\<\(for\|while\|repeat\|case\%[[zx]]\|do\|foreach\|forever\|randcase\)\>' || \ last_line =~ '^\s*\<\(always\|always_comb\|always_ff\|always_latch\)\>' || \ last_line =~ '^\s*\<\(initial\|specify\|fork\|final\)\>' - if last_line !~ '\(;\|\<end\>\)\s*' . sv_comment . '*$' || + if last_line !~ '\(;\|\<end\>\|\*/\)\s*' . sv_comment . '*$' || \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$' let ind = ind + offset - if vverb | echo vverb_str "Indent after a block statement." | endif + if vverb | echom vverb_str "Indent after a block statement." | endif endif " Indent after function/task/class/package/sequence/clocking/ " interface/covergroup/property/checkerprogram blocks elseif last_line =~ '^\s*\<\(function\|task\|class\|package\)\>' || \ last_line =~ '^\s*\<\(sequence\|clocking\|interface\)\>' || \ last_line =~ '^\s*\(\w\+\s*:\)\=\s*\<covergroup\>' || - \ last_line =~ '^\s*\<\(property\|checker\|program\)\>' + \ last_line =~ '^\s*\<\(property\|checker\|program\)\>' || + \ ( last_line =~ '^\s*\<virtual\>' && last_line =~ '\<\(function\|task\|class\|interface\)\>' ) || + \ ( last_line =~ '^\s*\<pure\>' && last_line =~ '\<virtual\>' && last_line =~ '\<\(function\|task\)\>' ) if last_line !~ '\<end\>\s*' . sv_comment . '*$' || \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . sv_comment . '*$' let ind = ind + offset if vverb - echo vverb_str "Indent after function/task/class block statement." + echom vverb_str "Indent after function/task/class block statement." endif endif @@ -103,13 +119,13 @@ function SystemVerilogIndent() elseif last_line =~ '^\s*\(\<extern\>\s*\)\=\<module\>' let ind = ind + indent_modules if vverb && indent_modules - echo vverb_str "Indent after module statement." + echom vverb_str "Indent after module statement." endif if last_line =~ '[(,]\s*' . sv_comment . '*$' && \ last_line !~ '\(//\|/\*\).*[(,]\s*' . sv_comment . '*$' let ind = ind + offset if vverb - echo vverb_str "Indent after a multiple-line module statement." + echom vverb_str "Indent after a multiple-line module statement." endif endif @@ -119,7 +135,7 @@ function SystemVerilogIndent() \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' || \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' ) let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif + if vverb | echom vverb_str "Indent after begin statement." | endif " Indent after a '{' or a '(' elseif last_line =~ '[{(]' . sv_comment . '*$' && @@ -127,7 +143,21 @@ function SystemVerilogIndent() \ ( last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' || \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . sv_comment . '*$' ) let ind = ind + offset - if vverb | echo vverb_str "Indent after begin statement." | endif + if vverb | echom vverb_str "Indent after begin statement." | endif + + " Ignore de-indent for the end of one-line block + elseif ( last_line !~ '\<begin\>' || + \ last_line =~ '\(//\|/\*\).*\<begin\>' ) && + \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>.*' . + \ sv_comment . '*$' && + \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>' && + \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' && + \ ( last_line2 !~ '\<begin\>' || + \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) && + \ last_line2 =~ ')*\s*;\s*' . sv_comment . '*$' + if vverb + echom vverb_str "Ignore de-indent after the end of one-line statement." + endif " De-indent for the end of one-line block elseif ( last_line !~ '\<begin\>' || @@ -136,39 +166,29 @@ function SystemVerilogIndent() \ sv_comment . '*$' && \ last_line2 !~ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\|do\|foreach\|forever\|final\)\>' && \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' && + \ last_line2 !~ '\(;\|\<end\>\|\*/\)\s*' . sv_comment . '*$' && \ ( last_line2 !~ '\<begin\>' || \ last_line2 =~ '\(//\|/\*\).*\<begin\>' ) let ind = ind - offset if vverb - echo vverb_str "De-indent after the end of one-line statement." + echom vverb_str "De-indent after the end of one-line statement." endif - " Multiple-line statement (including case statement) - " Open statement - " Ident the first open line - elseif last_line =~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*' . sv_openstat . '\s*$' && - \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' - let ind = ind + offset - if vverb | echo vverb_str "Indent after an open statement." | endif - - " Close statement - " De-indent for an optional close parenthesis and a semicolon, and only - " if there exists precedent non-whitespace char - elseif last_line =~ ')*\s*;\s*' . sv_comment . '*$' && - \ last_line !~ '^\s*)*\s*;\s*' . sv_comment . '*$' && - \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . sv_comment . '*$' && - \ ( last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line2 !~ ';\s*//.*$') && - \ last_line2 !~ '^\s*' . sv_comment . '$' - let ind = ind - offset - if vverb | echo vverb_str "De-indent after a close statement." | endif + " Multiple-line statement (including case statement) + " Open statement + " Ident the first open line + elseif last_line =~ sv_openstat . '\s*' . sv_comment . '*$' && + \ last_line !~ '\(//\|/\*\).*' . sv_openstat . '\s*$' && + \ last_line2 !~ sv_openstat . '\s*' . sv_comment . '*$' + let ind = ind + offset + let s:open_statement = 1 + if vverb | echom vverb_str "Indent after an open statement." | endif - " `ifdef and `else - elseif last_line =~ '^\s*`\<\(ifdef\|else\)\>' + " `ifdef or `ifndef or `elsif or `else + elseif last_line =~ '^\s*`\<\(ifn\?def\|elsif\|else\)\>' && indent_ifdef let ind = ind + offset if vverb - echo vverb_str "Indent after a `ifdef or `else statement." + echom vverb_str "Indent after a `ifdef or `ifndef or `elsif or `else statement." endif endif @@ -177,17 +197,21 @@ function SystemVerilogIndent() " De-indent on the end of the block " join/end/endcase/endfunction/endtask/endspecify - if curr_line =~ '^\s*\<\(join\|join_any\|join_none\|\|end\|endcase\|while\)\>' || + if curr_line =~ '^\s*\<\(join\|join_any\|join_none\|\|end\|endcase\)\>' || \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\|endclass\)\>' || \ curr_line =~ '^\s*\<\(endpackage\|endsequence\|endclocking\|endinterface\)\>' || - \ curr_line =~ '^\s*\<\(endgroup\|endproperty\|endchecker\|endprogram\)\>' || - \ curr_line =~ '^\s*}' + \ curr_line =~ '^\s*\<\(endgroup\|endproperty\|endchecker\|endprogram\)\>' let ind = ind - offset - if vverb | echo vverb_str "De-indent the end of a block." | endif + if vverb | echom vverb_str "De-indent the end of a block." | endif + if s:open_statement == 1 + let ind = ind - offset + let s:open_statement = 0 + if vverb | echom vverb_str "De-indent the close statement." | endif + endif elseif curr_line =~ '^\s*\<endmodule\>' let ind = ind - indent_modules if vverb && indent_modules - echo vverb_str "De-indent the end of a module." + echom vverb_str "De-indent the end of a module." endif " De-indent on a stand-alone 'begin' @@ -202,25 +226,46 @@ function SystemVerilogIndent() \ last_line =~ sv_openstat . '\s*' . sv_comment . '*$' ) let ind = ind - offset if vverb - echo vverb_str "De-indent a stand alone begin statement." + echom vverb_str "De-indent a stand alone begin statement." + endif + if s:open_statement == 1 + let ind = ind - offset + let s:open_statement = 0 + if vverb | echom vverb_str "De-indent the close statement." | endif endif endif - " De-indent after the end of multiple-line statement - elseif curr_line =~ '^\s*)' && - \ ( last_line =~ sv_openstat . '\s*' . sv_comment . '*$' || - \ last_line !~ sv_openstat . '\s*' . sv_comment . '*$' && - \ last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' ) - let ind = ind - offset - if vverb - echo vverb_str "De-indent the end of a multiple statement." - endif + " " Close statement + " " De-indent for an optional close parenthesis and a semicolon, and only + " " if there exists precedent non-whitespace char + " elseif last_line =~ ')*\s*;\s*' . sv_comment . '*$' && + " \ last_line !~ '^\s*)*\s*;\s*' . sv_comment . '*$' && + " \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . sv_comment . '*$' && + " \ ( last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' && + " \ last_line2 !~ ';\s*//.*$') && + " \ last_line2 !~ '^\s*' . sv_comment . '$' + " let ind = ind - offset + " if vverb | echom vverb_str "De-indent after a close statement." | endif - " De-indent `else and `endif - elseif curr_line =~ '^\s*`\<\(else\|endif\)\>' - let ind = ind - offset - if vverb | echo vverb_str "De-indent `else and `endif statement." | endif + " " De-indent after the end of multiple-line statement + " elseif curr_line =~ '^\s*)' && + " \ ( last_line =~ sv_openstat . '\s*' . sv_comment . '*$' || + " \ last_line !~ sv_openstat . '\s*' . sv_comment . '*$' && + " \ last_line2 =~ sv_openstat . '\s*' . sv_comment . '*$' ) + " let ind = ind - offset + " if vverb + " echom vverb_str "De-indent the end of a multiple statement." + " endif + " De-indent `elsif or `else or `endif + elseif curr_line =~ '^\s*`\<\(elsif\|else\|endif\)\>' && indent_ifdef + let ind = ind - offset + if vverb | echom vverb_str "De-indent `elsif or `else or `endif statement." | endif + if b:systemverilog_open_statement == 1 + let ind = ind - offset + let b:systemverilog_open_statement = 0 + if vverb | echom vverb_str "De-indent the open statement." | endif + endif endif " Return the indentation @@ -231,3 +276,4 @@ let &cpo = s:cpo_save unlet s:cpo_save " vim:sw=2 + |