mirror of
https://github.com/helix-editor/helix.git
synced 2025-04-06 20:37:44 +03:00
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>
This commit is contained in:
parent
c18de0e8f0
commit
58758fee61
66 changed files with 1160 additions and 724 deletions
|
@ -92,7 +92,7 @@ pub struct LanguageConfiguration {
|
|||
pub indent: Option<IndentationConfiguration>,
|
||||
|
||||
#[serde(skip)]
|
||||
pub(crate) indent_query: OnceCell<Option<IndentQuery>>,
|
||||
pub(crate) indent_query: OnceCell<Option<Query>>,
|
||||
#[serde(skip)]
|
||||
pub(crate) textobject_query: OnceCell<Option<TextObjectQuery>>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
|
@ -220,17 +220,6 @@ impl FromStr for AutoPairConfig {
|
|||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize)]
|
||||
#[serde(rename_all = "kebab-case")]
|
||||
pub struct IndentQuery {
|
||||
#[serde(default)]
|
||||
#[serde(skip_serializing_if = "HashSet::is_empty")]
|
||||
pub indent: HashSet<String>,
|
||||
#[serde(default)]
|
||||
#[serde(skip_serializing_if = "HashSet::is_empty")]
|
||||
pub outdent: HashSet<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct TextObjectQuery {
|
||||
pub query: Query,
|
||||
|
@ -404,13 +393,13 @@ impl LanguageConfiguration {
|
|||
self.highlight_config.get().is_some()
|
||||
}
|
||||
|
||||
pub fn indent_query(&self) -> Option<&IndentQuery> {
|
||||
pub fn indent_query(&self) -> Option<&Query> {
|
||||
self.indent_query
|
||||
.get_or_init(|| {
|
||||
let language = self.language_id.to_ascii_lowercase();
|
||||
|
||||
let toml = load_runtime_file(&language, "indents.toml").ok()?;
|
||||
toml::from_slice(toml.as_bytes()).ok()
|
||||
let lang_name = self.language_id.to_ascii_lowercase();
|
||||
let query_text = read_query(&lang_name, "indents.scm");
|
||||
let lang = self.highlight_config.get()?.as_ref()?.language;
|
||||
Query::new(lang, &query_text).ok()
|
||||
})
|
||||
.as_ref()
|
||||
}
|
||||
|
@ -557,7 +546,7 @@ impl Loader {
|
|||
|
||||
pub struct TsParser {
|
||||
parser: tree_sitter::Parser,
|
||||
cursors: Vec<QueryCursor>,
|
||||
pub cursors: Vec<QueryCursor>,
|
||||
}
|
||||
|
||||
// could also just use a pool, or a single instance?
|
||||
|
@ -1180,7 +1169,7 @@ struct HighlightIter<'a> {
|
|||
}
|
||||
|
||||
// Adapter to convert rope chunks to bytes
|
||||
struct ChunksBytes<'a> {
|
||||
pub struct ChunksBytes<'a> {
|
||||
chunks: ropey::iter::Chunks<'a>,
|
||||
}
|
||||
impl<'a> Iterator for ChunksBytes<'a> {
|
||||
|
@ -1190,7 +1179,7 @@ impl<'a> Iterator for ChunksBytes<'a> {
|
|||
}
|
||||
}
|
||||
|
||||
struct RopeProvider<'a>(RopeSlice<'a>);
|
||||
pub struct RopeProvider<'a>(pub RopeSlice<'a>);
|
||||
impl<'a> TextProvider<'a> for RopeProvider<'a> {
|
||||
type I = ChunksBytes<'a>;
|
||||
|
||||
|
@ -2126,7 +2115,7 @@ mod test {
|
|||
#[test]
|
||||
fn test_load_runtime_file() {
|
||||
// Test to make sure we can load some data from the runtime directory.
|
||||
let contents = load_runtime_file("rust", "indents.toml").unwrap();
|
||||
let contents = load_runtime_file("rust", "indents.scm").unwrap();
|
||||
assert!(!contents.is_empty());
|
||||
|
||||
let results = load_runtime_file("rust", "does-not-exist");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue