feat: allow @injection.self to inject the node w/ itself

This commit is contained in:
Amaan Qureshi 2023-08-21 00:53:04 -04:00
parent 023e0f2503
commit da6affaf94
No known key found for this signature in database
GPG key ID: E67890ADC4227273

View file

@ -112,6 +112,7 @@ pub struct HighlightConfiguration {
non_local_variable_patterns: Vec<bool>, non_local_variable_patterns: Vec<bool>,
injection_content_capture_index: Option<u32>, injection_content_capture_index: Option<u32>,
injection_language_capture_index: Option<u32>, injection_language_capture_index: Option<u32>,
injection_self_capture_index: Option<u32>,
local_scope_capture_index: Option<u32>, local_scope_capture_index: Option<u32>,
local_def_capture_index: Option<u32>, local_def_capture_index: Option<u32>,
local_def_value_capture_index: Option<u32>, local_def_value_capture_index: Option<u32>,
@ -309,6 +310,7 @@ impl HighlightConfiguration {
// Store the numeric ids for all of the special captures. // Store the numeric ids for all of the special captures.
let mut injection_content_capture_index = None; let mut injection_content_capture_index = None;
let mut injection_language_capture_index = None; let mut injection_language_capture_index = None;
let mut injection_self_capture_index = None;
let mut local_def_capture_index = None; let mut local_def_capture_index = None;
let mut local_def_value_capture_index = None; let mut local_def_value_capture_index = None;
let mut local_ref_capture_index = None; let mut local_ref_capture_index = None;
@ -318,6 +320,7 @@ impl HighlightConfiguration {
match name.as_str() { match name.as_str() {
"injection.content" => injection_content_capture_index = i, "injection.content" => injection_content_capture_index = i,
"injection.language" => injection_language_capture_index = i, "injection.language" => injection_language_capture_index = i,
"injection.self" => injection_self_capture_index = i,
"local.definition" => local_def_capture_index = i, "local.definition" => local_def_capture_index = i,
"local.definition-value" => local_def_value_capture_index = i, "local.definition-value" => local_def_value_capture_index = i,
"local.reference" => local_ref_capture_index = i, "local.reference" => local_ref_capture_index = i,
@ -339,6 +342,7 @@ impl HighlightConfiguration {
non_local_variable_patterns, non_local_variable_patterns,
injection_content_capture_index, injection_content_capture_index,
injection_language_capture_index, injection_language_capture_index,
injection_self_capture_index,
local_def_capture_index, local_def_capture_index,
local_def_value_capture_index, local_def_value_capture_index,
local_ref_capture_index, local_ref_capture_index,
@ -1120,6 +1124,7 @@ fn injection_for_match<'a>(
) -> (Option<&'a str>, Option<Node<'a>>, bool) { ) -> (Option<&'a str>, Option<Node<'a>>, bool) {
let content_capture_index = config.injection_content_capture_index; let content_capture_index = config.injection_content_capture_index;
let language_capture_index = config.injection_language_capture_index; let language_capture_index = config.injection_language_capture_index;
let self_capture_index = config.injection_self_capture_index;
let mut language_name = None; let mut language_name = None;
let mut content_node = None; let mut content_node = None;
@ -1129,6 +1134,11 @@ fn injection_for_match<'a>(
language_name = capture.node.utf8_text(source).ok(); language_name = capture.node.utf8_text(source).ok();
} else if index == content_capture_index { } else if index == content_capture_index {
content_node = Some(capture.node); content_node = Some(capture.node);
} else if index == self_capture_index {
if let Ok(name) = capture.node.utf8_text(source) {
language_name = Some(name);
content_node = Some(capture.node);
}
} }
} }
@ -1144,6 +1154,9 @@ fn injection_for_match<'a>(
} }
} }
// Setting the `injection.self` key can be used to specify that the
// language name should be the same as the language of the current
// layer.
"injection.self" => { "injection.self" => {
if language_name.is_none() { if language_name.is_none() {
language_name = Some(config.language_name.as_str()); language_name = Some(config.language_name.as_str());