feat: make enter feature in list or enum work (#2022)

Continue work on Myriad-Dreamin/tinymist#1446
This commit is contained in:
Myriad-Dreamin 2025-08-13 11:15:31 +08:00 committed by GitHub
parent a561059a4e
commit 2c552ce985
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 113 additions and 13 deletions

View file

@ -0,0 +1,2 @@
/* range after 2..10 */
+ #let f = 1;

View file

@ -0,0 +1,2 @@
/* range after 2..10 */
+ #let f() = 1;

View file

@ -0,0 +1,2 @@
/* range after 2..7 */
+ test

View file

@ -0,0 +1,2 @@
/* range after 4..7 */
+ test

View file

@ -0,0 +1,2 @@
/* range after 4..4 */
+ test

View file

@ -0,0 +1,3 @@
#let a = 1;
/* range after 2..10 */
+ #a test

View file

@ -4,4 +4,9 @@ description: "On Enter on 3..3 */\n+ ||\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum2.typ
---
null
[
{
"newText": "\n+ $0",
"range": "1:2:1:2"
}
]

View file

@ -0,0 +1,7 @@
---
source: crates/tinymist-query/src/on_enter.rs
description: "On Enter on 2..10 */\n+| #let f |= 1;\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum_let.typ
---
null

View file

@ -0,0 +1,7 @@
---
source: crates/tinymist-query/src/on_enter.rs
description: "On Enter on 2..10 */\n+| #let f(|) = 1;\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum_let2.typ
---
null

View file

@ -0,0 +1,12 @@
---
source: crates/tinymist-query/src/on_enter.rs
description: "On Enter on 2..7 */\n+| test|\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum_plain.typ
---
[
{
"newText": "\n+ $0",
"range": "1:1:1:6"
}
]

View file

@ -0,0 +1,12 @@
---
source: crates/tinymist-query/src/on_enter.rs
description: "On Enter on ..7 */\n+ t|est|\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum_plain2.typ
---
[
{
"newText": "\n+ $0",
"range": "1:3:1:6"
}
]

View file

@ -0,0 +1,7 @@
---
source: crates/tinymist-query/src/on_enter.rs
description: "On Enter on ..4 */\n+ t||est\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum_plain3.typ
---
null

View file

@ -0,0 +1,12 @@
---
source: crates/tinymist-query/src/on_enter.rs
description: "On Enter on 2..10 */\n+| #a test|\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/enum_var.typ
---
[
{
"newText": "\n+ $0",
"range": "2:1:2:9"
}
]

View file

@ -4,4 +4,9 @@ description: "On Enter on 3..3 */\n- ||\n)"
expression: "JsonRepr::new_redacted(result, &REDACT_LOC)"
input_file: crates/tinymist-query/src/fixtures/on_enter/list2.typ
---
null
[
{
"newText": "\n- $0",
"range": "1:2:1:2"
}
]

View file

@ -25,6 +25,8 @@ pub struct OnEnterRequest {
pub path: PathBuf,
/// The source code range to request for.
pub range: LspRange,
/// Whether to handle list and enum items.
pub handle_list: bool,
}
impl SyntaxRequest for OnEnterRequest {
@ -54,8 +56,10 @@ impl SyntaxRequest for OnEnterRequest {
let case = node_ancestors(&leaf).find_map(|node| match node.kind() {
SyntaxKind::LineComment => Some(Cases::LineComment(node.clone())),
SyntaxKind::Equation => Some(Cases::Equation(node.clone())),
SyntaxKind::ListItem | SyntaxKind::EnumItem => Some(Cases::ListOrEnum(node.clone())),
SyntaxKind::Space | SyntaxKind::Parbreak => {
SyntaxKind::ListItem | SyntaxKind::EnumItem if self.handle_list => {
Some(Cases::ListOrEnum(node.clone()))
}
SyntaxKind::Space | SyntaxKind::Parbreak if self.handle_list => {
let prev_leaf = node.prev_sibling()?;
let inter_space = node.offset()..rng.start;
@ -78,13 +82,7 @@ impl SyntaxRequest for OnEnterRequest {
match case {
Some(Cases::LineComment(node)) => worker.enter_line_doc_comment(node, rng),
Some(Cases::Equation(node)) => worker.enter_block_math(node, rng),
Some(Cases::ListOrEnum(node)) => {
let _ = node;
let _ = OnEnterWorker::enter_list_or_enum;
// worker.enter_list_or_enum(node, rng)
None
}
Some(Cases::ListOrEnum(node)) => worker.enter_list_or_enum(node, rng),
_ => None,
}
}
@ -175,6 +173,15 @@ impl OnEnterWorker<'_> {
}
fn enter_list_or_enum(&self, node: LinkedNode<'_>, rng: Range<usize>) -> Option<Vec<TextEdit>> {
let rng_end = rng.end;
let node_end = node.range().end;
let in_middle_of_node = rng_end < node_end
&& self.source.text()[rng_end..node_end].contains(|c: char| !c.is_whitespace());
if in_middle_of_node {
return None;
}
let indent = self.indent_of(node.range().start);
let is_list = matches!(node.kind(), SyntaxKind::ListItem);
@ -202,6 +209,7 @@ mod tests {
let request = OnEnterRequest {
path: path.clone(),
range: find_test_range(&source),
handle_list: true,
};
let result = request.request(&source, PositionEncoding::Utf16);