mirror of
https://github.com/Myriad-Dreamin/tinymist.git
synced 2025-11-22 20:35:20 +00:00
feat: make enter feature in list or enum work (#2022)
Continue work on Myriad-Dreamin/tinymist#1446
This commit is contained in:
parent
a561059a4e
commit
2c552ce985
17 changed files with 113 additions and 13 deletions
2
crates/tinymist-query/src/fixtures/on_enter/enum_let.typ
Normal file
2
crates/tinymist-query/src/fixtures/on_enter/enum_let.typ
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
/* range after 2..10 */
|
||||
+ #let f = 1;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
/* range after 2..10 */
|
||||
+ #let f() = 1;
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
/* range after 2..7 */
|
||||
+ test
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
/* range after 4..7 */
|
||||
+ test
|
||||
|
|
@ -0,0 +1,2 @@
|
|||
/* range after 4..4 */
|
||||
+ test
|
||||
3
crates/tinymist-query/src/fixtures/on_enter/enum_var.typ
Normal file
3
crates/tinymist-query/src/fixtures/on_enter/enum_var.typ
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
#let a = 1;
|
||||
/* range after 2..10 */
|
||||
+ #a test
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
@ -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
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
@ -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"
|
||||
}
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue