|
|
@ -6,7 +6,7 @@ use crate::{
|
|
|
|
chars::{char_is_line_ending, char_is_whitespace},
|
|
|
|
chars::{char_is_line_ending, char_is_whitespace},
|
|
|
|
find_first_non_whitespace_char,
|
|
|
|
find_first_non_whitespace_char,
|
|
|
|
graphemes::{grapheme_width, tab_width_at},
|
|
|
|
graphemes::{grapheme_width, tab_width_at},
|
|
|
|
syntax::{LanguageConfiguration, RopeProvider, Syntax},
|
|
|
|
syntax::{IndentationHeuristic, LanguageConfiguration, RopeProvider, Syntax},
|
|
|
|
tree_sitter::Node,
|
|
|
|
tree_sitter::Node,
|
|
|
|
Rope, RopeGraphemes, RopeSlice,
|
|
|
|
Rope, RopeGraphemes, RopeSlice,
|
|
|
|
};
|
|
|
|
};
|
|
|
@ -931,6 +931,7 @@ pub fn treesitter_indent_for_pos<'a>(
|
|
|
|
pub fn indent_for_newline(
|
|
|
|
pub fn indent_for_newline(
|
|
|
|
language_config: Option<&LanguageConfiguration>,
|
|
|
|
language_config: Option<&LanguageConfiguration>,
|
|
|
|
syntax: Option<&Syntax>,
|
|
|
|
syntax: Option<&Syntax>,
|
|
|
|
|
|
|
|
indent_heuristic: &IndentationHeuristic,
|
|
|
|
indent_style: &IndentStyle,
|
|
|
|
indent_style: &IndentStyle,
|
|
|
|
tab_width: usize,
|
|
|
|
tab_width: usize,
|
|
|
|
text: RopeSlice,
|
|
|
|
text: RopeSlice,
|
|
|
@ -939,7 +940,12 @@ pub fn indent_for_newline(
|
|
|
|
current_line: usize,
|
|
|
|
current_line: usize,
|
|
|
|
) -> String {
|
|
|
|
) -> String {
|
|
|
|
let indent_width = indent_style.indent_width(tab_width);
|
|
|
|
let indent_width = indent_style.indent_width(tab_width);
|
|
|
|
if let (Some(query), Some(syntax)) = (
|
|
|
|
if let (
|
|
|
|
|
|
|
|
IndentationHeuristic::TreeSitter | IndentationHeuristic::Hybrid,
|
|
|
|
|
|
|
|
Some(query),
|
|
|
|
|
|
|
|
Some(syntax),
|
|
|
|
|
|
|
|
) = (
|
|
|
|
|
|
|
|
indent_heuristic,
|
|
|
|
language_config.and_then(|config| config.indent_query()),
|
|
|
|
language_config.and_then(|config| config.indent_query()),
|
|
|
|
syntax,
|
|
|
|
syntax,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
@ -953,6 +959,7 @@ pub fn indent_for_newline(
|
|
|
|
line_before_end_pos,
|
|
|
|
line_before_end_pos,
|
|
|
|
true,
|
|
|
|
true,
|
|
|
|
) {
|
|
|
|
) {
|
|
|
|
|
|
|
|
if let IndentationHeuristic::Hybrid = indent_heuristic {
|
|
|
|
// We want to compute the indentation not only based on the
|
|
|
|
// We want to compute the indentation not only based on the
|
|
|
|
// syntax tree but also on the actual indentation of a previous
|
|
|
|
// syntax tree but also on the actual indentation of a previous
|
|
|
|
// line. This makes indentation computation more resilient to
|
|
|
|
// line. This makes indentation computation more resilient to
|
|
|
@ -998,6 +1005,7 @@ pub fn indent_for_newline(
|
|
|
|
break;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
return indent.to_string(indent_style, tab_width);
|
|
|
|
return indent.to_string(indent_style, tab_width);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|