From 58758fee610a3808dfaeafddd1b4b4242a7e42cd Mon Sep 17 00:00:00 2001
From: Triton171
Date: Wed, 30 Mar 2022 17:08:07 +0200
Subject: Indentation rework (#1562)

* WIP: Rework indentation system

* Add ComplexNode for context-aware indentation (including a proof of concept for assignment statements in rust)

* Add switch statements to Go indents.toml (fixes the second half of issue #1523)
Remove commented-out code

* Migrate all existing indentation queries.
Add more options to ComplexNode and use them to improve C/C++ indentation.

* Add comments & replace Option<Vec<_>> with Vec<_>

* Add more detailed documentation for tree-sitter indentation

* Improve code style in indent.rs

* Use tree-sitter queries for indentation instead of TOML config.
Migrate existing indent queries.

* Add documentation for the new indent queries.
Change xtask docgen to look for indents.scm instead of indents.toml

* Improve code style in indent.rs.
Fix an issue with the rust indent query.

* Move indentation test sources to separate files.
Add `#not-kind-eq?`, `#same-line?` and `#not-same-line` custom predicates.
Improve the rust and c indent queries.

* Fix indent test.
Improve rust indent queries.

* Move indentation tests to integration test folder.

* Improve code style in indent.rs.
Reuse tree-sitter cursors for indentation queries.

* Migrate HCL indent query

* Replace custom loading in indent tests with a designated languages.toml

* Update indent query file name for --health command.

* Fix single-space formatting in indent queries.

* Add explanation for unwrapping.

Co-authored-by: Triton171 <triton0171@gmail.com>---
 helix-term/src/commands.rs | 28 ++++++++++++----------------
 helix-term/src/health.rs   |  2 +-
 2 files changed, 13 insertions(+), 17 deletions(-)

(limited to 'helix-term')

diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index 4b4e834a..bd66f26a 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -2240,17 +2240,16 @@ fn open(cx: &mut Context, open: Open) {
             )
         };
 
-        // TODO: share logic with insert_newline for indentation
-        let indent_level = indent::suggested_indent_for_pos(
+        let indent = indent::indent_for_newline(
             doc.language_config(),
             doc.syntax(),
+            &doc.indent_style,
+            doc.tab_width(),
             text,
-            line_end_index,
             new_line.saturating_sub(1),
-            true,
-        )
-        .unwrap_or_else(|| indent::indent_level_for_line(text.line(cursor_line), doc.tab_width()));
-        let indent = doc.indent_unit().repeat(indent_level);
+            line_end_index,
+            cursor_line,
+        );
         let indent_len = indent.len();
         let mut text = String::with_capacity(1 + indent_len);
         text.push_str(doc.line_ending.as_str());
@@ -2703,19 +2702,16 @@ pub mod insert {
             let curr = contents.get_char(pos).unwrap_or(' ');
 
             let current_line = text.char_to_line(pos);
-            let indent_level = indent::suggested_indent_for_pos(
+            let indent = indent::indent_for_newline(
                 doc.language_config(),
                 doc.syntax(),
+                &doc.indent_style,
+                doc.tab_width(),
                 text,
+                current_line,
                 pos,
                 current_line,
-                true,
-            )
-            .unwrap_or_else(|| {
-                indent::indent_level_for_line(text.line(current_line), doc.tab_width())
-            });
-
-            let indent = doc.indent_unit().repeat(indent_level);
+            );
             let mut text = String::new();
             // If we are between pairs (such as brackets), we want to
             // insert an additional line which is indented one level
@@ -2727,7 +2723,7 @@ pub mod insert {
                 .is_some();
 
             let new_head_pos = if on_auto_pair {
-                let inner_indent = doc.indent_unit().repeat(indent_level + 1);
+                let inner_indent = indent.clone() + doc.indent_style.as_str();
                 text.reserve_exact(2 + indent.len() + inner_indent.len());
                 text.push_str(doc.line_ending.as_str());
                 text.push_str(&inner_indent);
diff --git a/helix-term/src/health.rs b/helix-term/src/health.rs
index 80f59680..f73139fc 100644
--- a/helix-term/src/health.rs
+++ b/helix-term/src/health.rs
@@ -19,7 +19,7 @@ impl TsFeature {
         match *self {
             Self::Highlight => "highlights.scm",
             Self::TextObject => "textobjects.scm",
-            Self::AutoIndent => "indents.toml",
+            Self::AutoIndent => "indents.scm",
         }
     }
 
-- 
cgit v1.2.3-70-g09d2