use std::collections::HashSet;
use crate::configuration::ParseConfiguration;
use crate::link_network::{LinkId, LinkMetadata, LinkNetwork, LinkType};
use crate::mixed_regions::detect_embedded_regions_in_tree;
use crate::{structured_text_parser, tree_sitter_adapter};
pub fn attach_embedded_regions(
network: &mut LinkNetwork,
document: LinkId,
text: &str,
language: &str,
configuration: ParseConfiguration,
) {
let policy = configuration.region_detection_policy();
let mut recorded = HashSet::new();
for region in detect_embedded_regions_in_tree(network, document, text, language, policy) {
let region_language = region.language().to_string();
let language_link = network.insert_typed_point(®ion_language, LinkType::Language, None);
let region_link = network.insert_link(
[document, language_link],
LinkMetadata::new()
.with_link_type(LinkType::Region)
.with_named(true)
.with_term(format!("{region_language} region"))
.with_language(region_language)
.with_span(region.span()),
);
let range = region.span().byte_range();
if region.language().eq_ignore_ascii_case(language)
&& range.start() == 0
&& range.end() == text.len()
{
continue;
}
let region_text = &text[range.start()..range.end()];
if recorded.insert(language_link) {
network.record_grammars(language_link, region.language());
}
if tree_sitter_adapter::parse_embedded_region_into(
network,
region_link,
region_text,
region.language(),
region.span(),
configuration,
)
.is_none()
{
let _ = structured_text_parser::parse_embedded_region_into(
network,
region_link,
region_text,
region.language(),
region.span(),
configuration,
);
}
}
}