From: Brian Carbone Date: Wed, 31 Dec 2025 09:24:31 +0000 (+0000) Subject: runtime(rust): Update indentation after nested array literal X-Git-Tag: v9.1.2032~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=5c2b594d0e86e4484cc92bd415aedbef5749bd9e;p=thirdparty%2Fvim.git runtime(rust): Update indentation after nested array literal fixes: #18974 closes: #19042 Signed-off-by: Brian Carbone Signed-off-by: Christian Brabandt --- diff --git a/runtime/indent/rust.vim b/runtime/indent/rust.vim index 662c9e7666..30206be435 100644 --- a/runtime/indent/rust.vim +++ b/runtime/indent/rust.vim @@ -4,6 +4,7 @@ " Last Change: 2023-09-11 " 2024 Jul 04 by Vim Project: use shiftwidth() instead of hard-coding shifted values #15138 " 2025 Dec 29 by Vim Project: clean up +" 2025 Dec 31 by Vim Project: correcly indent after nested array literal #19042 " For bugs, patches and license go to https://github.com/rust-lang/rust.vim " Note: upstream seems umaintained: https://github.com/rust-lang/rust.vim/issues/502 @@ -195,6 +196,22 @@ function GetRustIndent(lnum) endif endif + " Prevent cindent from becoming confused when pairing square brackets, as + " in + " + " let arr = [[u8; 4]; 2] = [ + " [0; 4], + " [1, 3, 5, 9], + " ]; + " | ← indentation placed here + " + " for which it calculates too much indentation in the line following the + " close of the array. + if prevline =~# '^\s*\]' && l:last_prevline_character ==# ';' + \ && line !~# '^\s*}' + return indent(prevlinenum) + endif + if l:last_prevline_character ==# "," \ && s:get_line_trimmed(a:lnum) !~# '^\s*[\[\]{})]' \ && prevline !~# '^\s*fn\s' diff --git a/runtime/indent/testdir/rust.in b/runtime/indent/testdir/rust.in index 848912bfba..28a68924f6 100644 --- a/runtime/indent/testdir/rust.in +++ b/runtime/indent/testdir/rust.in @@ -15,6 +15,21 @@ fn main() { Ok(file) => file, }; + // Start doing nothing forever + loop { + let arr1 = [[u8; 4]; 2] = [ + [0; 4], + [1, 3, 5, 9], + ]; + } + + // Plan for a future that will never come + let arr2 = [[u8; 4]; 2] = [ + [1; 4], + [2, 4, 6, 8], + ]; + let arr2_ref = &arr2; + // Read the file contents into a string, returns `io::Result` let mut s = String::new(); match file.read_to_string(&mut s) { diff --git a/runtime/indent/testdir/rust.ok b/runtime/indent/testdir/rust.ok index ea2a071b01..04808e224f 100644 --- a/runtime/indent/testdir/rust.ok +++ b/runtime/indent/testdir/rust.ok @@ -15,6 +15,21 @@ fn main() { Ok(file) => file, }; + // Start doing nothing forever + loop { + let arr1 = [[u8; 4]; 2] = [ + [0; 4], + [1, 3, 5, 9], + ]; + } + + // Plan for a future that will never come + let arr2 = [[u8; 4]; 2] = [ + [1; 4], + [2, 4, 6, 8], + ]; + let arr2_ref = &arr2; + // Read the file contents into a string, returns `io::Result` let mut s = String::new(); match file.read_to_string(&mut s) {