Fix handling of plain text.
This commit is contained in:
parent
acdc8b8993
commit
9032b00e1b
@ -53,22 +53,22 @@ pub struct SourceRange {
|
|||||||
|
|
||||||
fn build_ast_node<'a>(
|
fn build_ast_node<'a>(
|
||||||
original_source: &str,
|
original_source: &str,
|
||||||
parent_range: Option<&SourceRange>,
|
parent_contents_begin: Option<u32>,
|
||||||
current_token: &Token<'a>,
|
current_token: &Token<'a>,
|
||||||
) -> Result<AstNode, Box<dyn std::error::Error>> {
|
) -> Result<AstNode, Box<dyn std::error::Error>> {
|
||||||
let maybe_plain_text = current_token.as_text();
|
let maybe_plain_text = current_token.as_text();
|
||||||
let ast_node = match maybe_plain_text {
|
let ast_node = match maybe_plain_text {
|
||||||
Ok(plain_text) => {
|
Ok(plain_text) => {
|
||||||
let parent_range =
|
let parent_contents_begin = parent_contents_begin
|
||||||
parent_range.ok_or("parent_range should be set for all plain text nodes.")?;
|
.ok_or("parent_contents_begin should be set for all plain text nodes.")?;
|
||||||
let parameters = &plain_text.properties;
|
let parameters = &plain_text.properties;
|
||||||
let begin = parent_range.start_character
|
let begin = parent_contents_begin
|
||||||
+ parameters
|
+ parameters
|
||||||
.get(0)
|
.get(0)
|
||||||
.ok_or("Missing first element past the text.")?
|
.ok_or("Missing first element past the text.")?
|
||||||
.as_atom()?
|
.as_atom()?
|
||||||
.parse::<u32>()?;
|
.parse::<u32>()?;
|
||||||
let end = parent_range.start_character
|
let end = parent_contents_begin
|
||||||
+ parameters
|
+ parameters
|
||||||
.get(1)
|
.get(1)
|
||||||
.ok_or("Missing second element past the text.")?
|
.ok_or("Missing second element past the text.")?
|
||||||
@ -94,16 +94,18 @@ fn build_ast_node<'a>(
|
|||||||
.ok_or("Should have at least one child.")?
|
.ok_or("Should have at least one child.")?
|
||||||
.as_atom()?;
|
.as_atom()?;
|
||||||
let position = get_bounds(original_source, current_token)?;
|
let position = get_bounds(original_source, current_token)?;
|
||||||
let children: Result<Vec<_>, _> = parameters
|
let mut children = Vec::new();
|
||||||
.iter()
|
let mut contents_begin = get_contents_begin(current_token)?;
|
||||||
.skip(2)
|
for child in parameters.into_iter().skip(2) {
|
||||||
.map(|param| build_ast_node(original_source, Some(&position), param))
|
let new_ast_node = build_ast_node(original_source, Some(contents_begin), child)?;
|
||||||
.collect();
|
contents_begin = new_ast_node.position.end_character;
|
||||||
|
children.push(new_ast_node);
|
||||||
|
}
|
||||||
|
|
||||||
AstNode {
|
AstNode {
|
||||||
name: name.to_owned(),
|
name: name.to_owned(),
|
||||||
position,
|
position,
|
||||||
children: children?,
|
children,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -173,6 +175,33 @@ fn get_bounds<'s>(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_contents_begin<'s>(emacs: &'s Token<'s>) -> Result<u32, Box<dyn std::error::Error>> {
|
||||||
|
let children = emacs.as_list()?;
|
||||||
|
let attributes_child = children
|
||||||
|
.iter()
|
||||||
|
.nth(1)
|
||||||
|
.ok_or("Should have an attributes child.")?;
|
||||||
|
let attributes_map = attributes_child.as_map()?;
|
||||||
|
let standard_properties = attributes_map.get(":standard-properties");
|
||||||
|
let contents_begin = if standard_properties.is_some() {
|
||||||
|
let std_props = standard_properties
|
||||||
|
.expect("if statement proves its Some")
|
||||||
|
.as_vector()?;
|
||||||
|
let contents_begin = std_props
|
||||||
|
.get(2)
|
||||||
|
.ok_or("Missing third element in standard properties")?
|
||||||
|
.as_atom()?;
|
||||||
|
contents_begin
|
||||||
|
} else {
|
||||||
|
let contents_begin = attributes_map
|
||||||
|
.get(":contents-begin")
|
||||||
|
.ok_or("Missing :contents-begin attribute.")?
|
||||||
|
.as_atom()?;
|
||||||
|
contents_begin
|
||||||
|
};
|
||||||
|
Ok(contents_begin.parse::<u32>()?)
|
||||||
|
}
|
||||||
|
|
||||||
fn get_line_numbers<'s>(
|
fn get_line_numbers<'s>(
|
||||||
original_source: &'s str,
|
original_source: &'s str,
|
||||||
begin: u32,
|
begin: u32,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user