Include newlines in between combined injection ranges on different lines
This commit is contained in:
parent
2f2ef7c165
commit
21e7e35e73
4 changed files with 201 additions and 17 deletions
|
@ -11,7 +11,7 @@ use util::test::marked_text_ranges;
|
|||
fn test_splice_included_ranges() {
|
||||
let ranges = vec![ts_range(20..30), ts_range(50..60), ts_range(80..90)];
|
||||
|
||||
let new_ranges = splice_included_ranges(
|
||||
let (new_ranges, change) = splice_included_ranges(
|
||||
ranges.clone(),
|
||||
&[54..56, 58..68],
|
||||
&[ts_range(50..54), ts_range(59..67)],
|
||||
|
@ -25,14 +25,16 @@ fn test_splice_included_ranges() {
|
|||
ts_range(80..90),
|
||||
]
|
||||
);
|
||||
assert_eq!(change, 1..3);
|
||||
|
||||
let new_ranges = splice_included_ranges(ranges.clone(), &[70..71, 91..100], &[]);
|
||||
let (new_ranges, change) = splice_included_ranges(ranges.clone(), &[70..71, 91..100], &[]);
|
||||
assert_eq!(
|
||||
new_ranges,
|
||||
&[ts_range(20..30), ts_range(50..60), ts_range(80..90)]
|
||||
);
|
||||
assert_eq!(change, 2..3);
|
||||
|
||||
let new_ranges =
|
||||
let (new_ranges, change) =
|
||||
splice_included_ranges(ranges.clone(), &[], &[ts_range(0..2), ts_range(70..75)]);
|
||||
assert_eq!(
|
||||
new_ranges,
|
||||
|
@ -44,16 +46,21 @@ fn test_splice_included_ranges() {
|
|||
ts_range(80..90)
|
||||
]
|
||||
);
|
||||
assert_eq!(change, 0..4);
|
||||
|
||||
let new_ranges = splice_included_ranges(ranges.clone(), &[30..50], &[ts_range(25..55)]);
|
||||
let (new_ranges, change) =
|
||||
splice_included_ranges(ranges.clone(), &[30..50], &[ts_range(25..55)]);
|
||||
assert_eq!(new_ranges, &[ts_range(25..55), ts_range(80..90)]);
|
||||
assert_eq!(change, 0..1);
|
||||
|
||||
// does not create overlapping ranges
|
||||
let new_ranges = splice_included_ranges(ranges.clone(), &[0..18], &[ts_range(20..32)]);
|
||||
let (new_ranges, change) =
|
||||
splice_included_ranges(ranges.clone(), &[0..18], &[ts_range(20..32)]);
|
||||
assert_eq!(
|
||||
new_ranges,
|
||||
&[ts_range(20..32), ts_range(50..60), ts_range(80..90)]
|
||||
);
|
||||
assert_eq!(change, 0..1);
|
||||
|
||||
fn ts_range(range: Range<usize>) -> tree_sitter::Range {
|
||||
tree_sitter::Range {
|
||||
|
@ -511,7 +518,7 @@ fn test_removing_injection_by_replacing_across_boundary() {
|
|||
}
|
||||
|
||||
#[gpui::test]
|
||||
fn test_combined_injections() {
|
||||
fn test_combined_injections_simple() {
|
||||
let (buffer, syntax_map) = test_edit_sequence(
|
||||
"ERB",
|
||||
&[
|
||||
|
@ -653,33 +660,78 @@ fn test_combined_injections_editing_after_last_injection() {
|
|||
|
||||
#[gpui::test]
|
||||
fn test_combined_injections_inside_injections() {
|
||||
let (_buffer, _syntax_map) = test_edit_sequence(
|
||||
let (buffer, syntax_map) = test_edit_sequence(
|
||||
"Markdown",
|
||||
&[
|
||||
r#"
|
||||
here is some ERB code:
|
||||
here is
|
||||
some
|
||||
ERB code:
|
||||
|
||||
```erb
|
||||
<ul>
|
||||
<% people.each do |person| %>
|
||||
<li><%= person.name %></li>
|
||||
<li><%= person.age %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
```
|
||||
"#,
|
||||
r#"
|
||||
here is some ERB code:
|
||||
here is
|
||||
some
|
||||
ERB code:
|
||||
|
||||
```erb
|
||||
<ul>
|
||||
<% people«2».each do |person| %>
|
||||
<li><%= person.name %></li>
|
||||
<li><%= person.age %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
```
|
||||
"#,
|
||||
// Inserting a comment character inside one code directive
|
||||
// does not cause the other code directive to become a comment,
|
||||
// because newlines are included in between each injection range.
|
||||
r#"
|
||||
here is
|
||||
some
|
||||
ERB code:
|
||||
|
||||
```erb
|
||||
<ul>
|
||||
<% people2.each do |person| %>
|
||||
<li><%= «# »person.name %></li>
|
||||
<li><%= person.age %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
```
|
||||
"#,
|
||||
],
|
||||
);
|
||||
|
||||
// Check that the code directive below the ruby comment is
|
||||
// not parsed as a comment.
|
||||
assert_capture_ranges(
|
||||
&syntax_map,
|
||||
&buffer,
|
||||
&["method"],
|
||||
"
|
||||
here is
|
||||
some
|
||||
ERB code:
|
||||
|
||||
```erb
|
||||
<ul>
|
||||
<% people2.«each» do |person| %>
|
||||
<li><%= # person.name %></li>
|
||||
<li><%= person.«age» %></li>
|
||||
<% end %>
|
||||
</ul>
|
||||
```
|
||||
",
|
||||
);
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
|
@ -984,11 +1036,14 @@ fn check_interpolation(
|
|||
|
||||
fn test_edit_sequence(language_name: &str, steps: &[&str]) -> (Buffer, SyntaxMap) {
|
||||
let registry = Arc::new(LanguageRegistry::test());
|
||||
registry.add(Arc::new(elixir_lang()));
|
||||
registry.add(Arc::new(heex_lang()));
|
||||
registry.add(Arc::new(rust_lang()));
|
||||
registry.add(Arc::new(ruby_lang()));
|
||||
registry.add(Arc::new(html_lang()));
|
||||
registry.add(Arc::new(erb_lang()));
|
||||
registry.add(Arc::new(markdown_lang()));
|
||||
|
||||
let language = registry
|
||||
.language_for_name(language_name)
|
||||
.now_or_never()
|
||||
|
@ -1074,6 +1129,7 @@ fn ruby_lang() -> Language {
|
|||
r#"
|
||||
["if" "do" "else" "end"] @keyword
|
||||
(instance_variable) @ivar
|
||||
(call method: (identifier) @method)
|
||||
"#,
|
||||
)
|
||||
.unwrap()
|
||||
|
@ -1158,6 +1214,52 @@ fn markdown_lang() -> Language {
|
|||
.unwrap()
|
||||
}
|
||||
|
||||
fn elixir_lang() -> Language {
|
||||
Language::new(
|
||||
LanguageConfig {
|
||||
name: "Elixir".into(),
|
||||
path_suffixes: vec!["ex".into()],
|
||||
..Default::default()
|
||||
},
|
||||
Some(tree_sitter_elixir::language()),
|
||||
)
|
||||
.with_highlights_query(
|
||||
r#"
|
||||
|
||||
"#,
|
||||
)
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn heex_lang() -> Language {
|
||||
Language::new(
|
||||
LanguageConfig {
|
||||
name: "HEEx".into(),
|
||||
path_suffixes: vec!["heex".into()],
|
||||
..Default::default()
|
||||
},
|
||||
Some(tree_sitter_heex::language()),
|
||||
)
|
||||
.with_injection_query(
|
||||
r#"
|
||||
(
|
||||
(directive
|
||||
[
|
||||
(partial_expression_value)
|
||||
(expression_value)
|
||||
(ending_expression_value)
|
||||
] @content)
|
||||
(#set! language "elixir")
|
||||
(#set! combined)
|
||||
)
|
||||
|
||||
((expression (expression_value) @content)
|
||||
(#set! language "elixir"))
|
||||
"#,
|
||||
)
|
||||
.unwrap()
|
||||
}
|
||||
|
||||
fn range_for_text(buffer: &Buffer, text: &str) -> Range<usize> {
|
||||
let start = buffer.as_rope().to_string().find(text).unwrap();
|
||||
start..start + text.len()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue