Graph semantics
This commit is contained in:
parent
dc358a6a66
commit
430c48a61a
3 changed files with 72 additions and 5 deletions
|
@ -14,6 +14,7 @@ use crypto::sha2::Sha512;
|
|||
use graphviz_rust::cmd::Format;
|
||||
use graphviz_rust::cmd::Layout;
|
||||
use graphviz_rust::exec_dot;
|
||||
use lsp::semantic::Semantics;
|
||||
use mlua::Error::BadArgument;
|
||||
use mlua::Function;
|
||||
use mlua::Lua;
|
||||
|
@ -335,13 +336,33 @@ impl RegexRule for GraphRule {
|
|||
state.push(
|
||||
document,
|
||||
Box::new(Graphviz {
|
||||
location: token,
|
||||
location: token.clone(),
|
||||
dot: graph_content,
|
||||
layout: graph_layout,
|
||||
width: graph_width,
|
||||
}),
|
||||
);
|
||||
|
||||
if let Some((sems, tokens)) =
|
||||
Semantics::from_source(token.source(), &state.shared.semantics)
|
||||
{
|
||||
let range = token.range;
|
||||
sems.add(
|
||||
range.start..range.start + 7,
|
||||
tokens.graph_sep,
|
||||
);
|
||||
if let Some(props) = matches.get(1).map(|m| m.range()) {
|
||||
sems.add(props.start - 1..props.start, tokens.tex_props_sep);
|
||||
sems.add(props.clone(), tokens.tex_props);
|
||||
sems.add(props.end..props.end + 1, tokens.tex_props_sep);
|
||||
}
|
||||
sems.add(matches.get(2).unwrap().range(), tokens.tex_content);
|
||||
sems.add(
|
||||
range.end - 8..range.end,
|
||||
tokens.graph_sep,
|
||||
);
|
||||
}
|
||||
|
||||
reports
|
||||
}
|
||||
|
||||
|
@ -453,4 +474,36 @@ Another graph
|
|||
Graphviz { dot == "Another graph" };
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn semantic() {
|
||||
let source = Rc::new(SourceFile::with_content(
|
||||
"".to_string(),
|
||||
r#"
|
||||
[graph][width=50%]
|
||||
digraph {
|
||||
}
|
||||
[/graph]
|
||||
"#
|
||||
.to_string(),
|
||||
None,
|
||||
));
|
||||
let parser = LangParser::default();
|
||||
let (_, state) = parser.parse(
|
||||
ParserState::new_with_semantics(&parser, None),
|
||||
source.clone(),
|
||||
None,
|
||||
ParseMode::default(),
|
||||
);
|
||||
validate_semantics!(state, source.clone(), 0,
|
||||
graph_sep { delta_line == 1, delta_start == 0, length == 7 };
|
||||
graph_props_sep { delta_line == 0, delta_start == 7, length == 1 };
|
||||
graph_props { delta_line == 0, delta_start == 1, length == 9 };
|
||||
graph_props_sep { delta_line == 0, delta_start == 9, length == 1 };
|
||||
graph_content { delta_line == 0, delta_start == 1, length == 1 };
|
||||
graph_content { delta_line == 1, delta_start == 0, length == 10 };
|
||||
graph_content { delta_line == 1, delta_start == 0, length == 2 };
|
||||
graph_sep { delta_line == 1, delta_start == 0, length == 8 };
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -547,6 +547,7 @@ impl RegexRule for LayoutRule {
|
|||
if layout_type.expects().end < tokens.len()
|
||||
// Too many blocks
|
||||
{
|
||||
let start = &tokens[0];
|
||||
report_err!(
|
||||
&mut reports,
|
||||
token.source(),
|
||||
|
@ -558,6 +559,11 @@ impl RegexRule for LayoutRule {
|
|||
layout_type.expects().end.fg(state.parser.colors().info),
|
||||
tokens.len().fg(state.parser.colors().info),
|
||||
)
|
||||
),
|
||||
span(
|
||||
start.source(),
|
||||
start.start() + 1..start.end(),
|
||||
format!("Layout starts here",)
|
||||
)
|
||||
);
|
||||
return reports;
|
||||
|
@ -639,10 +645,8 @@ impl RegexRule for LayoutRule {
|
|||
),
|
||||
span(
|
||||
start.source(),
|
||||
start.start() + 1.. start.end(),
|
||||
format!(
|
||||
"Layout begins here",
|
||||
)
|
||||
start.start() + 1..start.end(),
|
||||
format!("Layout starts here",)
|
||||
)
|
||||
);
|
||||
return reports;
|
||||
|
|
|
@ -151,6 +151,11 @@ pub struct Tokens {
|
|||
pub tex_props: (u32, u32),
|
||||
pub tex_content: (u32, u32),
|
||||
|
||||
pub graph_sep: (u32, u32),
|
||||
pub graph_props_sep: (u32, u32),
|
||||
pub graph_props: (u32, u32),
|
||||
pub graph_content: (u32, u32),
|
||||
|
||||
pub layout_sep: (u32, u32),
|
||||
pub layout_token: (u32, u32),
|
||||
pub layout_props_sep: (u32, u32),
|
||||
|
@ -223,6 +228,11 @@ impl Tokens {
|
|||
tex_props: token!("enum"),
|
||||
tex_content: token!("string"),
|
||||
|
||||
graph_sep: token!("modifier"),
|
||||
graph_props_sep: token!("operator"),
|
||||
graph_props: token!("enum"),
|
||||
graph_content: token!("string"),
|
||||
|
||||
layout_sep: token!("number"),
|
||||
layout_token: token!("number"),
|
||||
layout_props_sep: token!("operator"),
|
||||
|
|
Loading…
Reference in a new issue