Update macro

This commit is contained in:
ef3d0c3e 2024-08-08 17:11:32 +02:00
parent 4784921bb8
commit fcc401f203
23 changed files with 63 additions and 120 deletions

View file

@ -76,6 +76,12 @@ impl Parse for AutoRegistryArgs {
/// - registry: (String) Name of the registry to collect the struct into /// - registry: (String) Name of the registry to collect the struct into
/// - path: (Optional String) The crate path in which the struct is located /// - path: (Optional String) The crate path in which the struct is located
/// If left empty, the path will be try to be automatically-deduced /// If left empty, the path will be try to be automatically-deduced
///
/// # Note
///
/// Due to a lacking implementation of `proc_macro_span` in rust-analyzer,
/// it is highly advised the set the `path` attribute when using this macro.
/// See https://github.com/rust-lang/rust-analyzer/issues/15950
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn auto_registry(attr: TokenStream, input: TokenStream) -> TokenStream { pub fn auto_registry(attr: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(attr as AutoRegistryArgs); let args = parse_macro_input!(attr as AutoRegistryArgs);
@ -84,7 +90,12 @@ pub fn auto_registry(attr: TokenStream, input: TokenStream) -> TokenStream {
let ident = &input.ident; let ident = &input.ident;
let path = if let Some(path) = args.path { let path = if let Some(path) = args.path {
format!("{}::{}", path.value(), ident.to_string().as_str()) let value = path.value();
if value.is_empty() {
value
} else {
format!("{}::{}", value, ident.to_string().as_str())
}
} else { } else {
// Attempt to get the path in a hacky way in case the path wasn't // Attempt to get the path in a hacky way in case the path wasn't
// specified as an attribute to the macro // specified as an attribute to the macro
@ -229,6 +240,25 @@ impl Parse for GenerateRegistryArgs {
/// comma-separated and create the resulting expression /// comma-separated and create the resulting expression
/// - return_type: (Type) The return type of the generated function. /// - return_type: (Type) The return type of the generated function.
/// Must match the type of the macro invocation /// Must match the type of the macro invocation
///
/// # Example
/// ```
/// macro_rules! create_listeners {
/// ( $($construct:expr),+ $(,)? ) => {{
/// vec![$(Box::new($construct) as Box<dyn Listener>,)+]
/// }};
/// }
/// #[generate_registry(
/// registry = "listeners",
/// target = build_listeners,
/// return_type = Vec<Box<dyn Listener>>,
/// maker = create_listeners)]
///
/// fn main()
/// {
/// let all_listeners : Vec<Box<dyn Listener>> = build_listeners();
/// }
/// ```
#[proc_macro_attribute] #[proc_macro_attribute]
pub fn generate_registry(attr: TokenStream, input: TokenStream) -> TokenStream { pub fn generate_registry(attr: TokenStream, input: TokenStream) -> TokenStream {
let args = parse_macro_input!(attr as GenerateRegistryArgs); let args = parse_macro_input!(attr as GenerateRegistryArgs);
@ -250,7 +280,6 @@ pub fn generate_registry(attr: TokenStream, input: TokenStream) -> TokenStream {
} }
let function = args.target; let function = args.target;
//proc_macro2::Ident::new(args.target.value().as_str(), proc_macro2::Span::call_site());
let return_type = args.return_type; let return_type = args.return_type;
let maker = args.maker; let maker = args.maker;

View file

@ -13,6 +13,7 @@ use crate::document::variable::Variable;
#[derive(Clone, Copy)] #[derive(Clone, Copy)]
pub enum Target { pub enum Target {
HTML, HTML,
#[allow(unused)]
LATEX, LATEX,
} }
@ -21,7 +22,6 @@ pub struct Compiler {
cache: Option<RefCell<Connection>>, cache: Option<RefCell<Connection>>,
reference_count: RefCell<HashMap<String, HashMap<String, usize>>>, reference_count: RefCell<HashMap<String, HashMap<String, usize>>>,
// TODO: External references, i.e resolved later // TODO: External references, i.e resolved later
sections_counter: RefCell<Vec<usize>>, sections_counter: RefCell<Vec<usize>>,
} }
@ -44,11 +44,12 @@ impl Compiler {
/// Gets the section counter for a given depth /// Gets the section counter for a given depth
/// This function modifies the section counter /// This function modifies the section counter
pub fn section_counter(&self, depth: usize) -> Ref<'_, Vec<usize>> pub fn section_counter(&self, depth: usize) -> Ref<'_, Vec<usize>> {
{
// Increment current counter // Increment current counter
if self.sections_counter.borrow().len() == depth { if self.sections_counter.borrow().len() == depth {
self.sections_counter.borrow_mut().last_mut() self.sections_counter
.borrow_mut()
.last_mut()
.map(|id| *id += 1); .map(|id| *id += 1);
return Ref::map(self.sections_counter.borrow(), |b| &*b); return Ref::map(self.sections_counter.borrow(), |b| &*b);
} }

View file

@ -296,7 +296,7 @@ impl Element for Code {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::code")]
pub struct CodeRule { pub struct CodeRule {
re: [Regex; 2], re: [Regex; 2],
properties: PropertyParser, properties: PropertyParser,

View file

@ -16,17 +16,9 @@ use std::rc::Rc;
#[derive(Debug)] #[derive(Debug)]
pub struct Comment { pub struct Comment {
location: Token, pub location: Token,
content: String, #[allow(unused)]
} pub content: String,
impl Comment {
pub fn new(location: Token, content: String) -> Self {
Self {
location: location,
content,
}
}
} }
impl Element for Comment { impl Element for Comment {
@ -38,7 +30,7 @@ impl Element for Comment {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::comment")]
pub struct CommentRule { pub struct CommentRule {
re: [Regex; 1], re: [Regex; 1],
} }

View file

@ -178,7 +178,7 @@ impl RuleState for CustomStyleState {
static STATE_NAME: &'static str = "elements.custom_style"; static STATE_NAME: &'static str = "elements.custom_style";
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::customstyle")]
pub struct CustomStyleRule; pub struct CustomStyleRule;
impl CustomStyleRule { impl CustomStyleRule {

View file

@ -21,7 +21,7 @@ use crate::parser::rule::Rule;
use crate::parser::source::Cursor; use crate::parser::source::Cursor;
use crate::parser::source::Source; use crate::parser::source::Source;
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::elemstyle")]
pub struct ElemStyleRule { pub struct ElemStyleRule {
start_re: Regex, start_re: Regex,
} }

View file

@ -146,7 +146,7 @@ impl Element for Graphviz {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::graphviz")]
pub struct GraphRule { pub struct GraphRule {
re: [Regex; 1], re: [Regex; 1],
properties: PropertyParser, properties: PropertyParser,

View file

@ -17,7 +17,7 @@ use std::rc::Rc;
use super::paragraph::Paragraph; use super::paragraph::Paragraph;
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::import")]
pub struct ImportRule { pub struct ImportRule {
re: [Regex; 1], re: [Regex; 1],
} }

View file

@ -284,7 +284,7 @@ impl RuleState for LayoutState {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::layout")]
pub struct LayoutRule { pub struct LayoutRule {
re: [Regex; 3], re: [Regex; 3],
} }

View file

@ -71,7 +71,7 @@ impl ContainerElement for Link {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::link")]
pub struct LinkRule { pub struct LinkRule {
re: [Regex; 1], re: [Regex; 1],
} }

View file

@ -106,7 +106,7 @@ impl ContainerElement for ListEntry {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::list")]
pub struct ListRule { pub struct ListRule {
start_re: Regex, start_re: Regex,
continue_re: Regex, continue_re: Regex,

View file

@ -221,7 +221,7 @@ impl ReferenceableElement for Medium {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::media")]
pub struct MediaRule { pub struct MediaRule {
re: [Regex; 1], re: [Regex; 1],
properties: PropertyParser, properties: PropertyParser,

View file

@ -91,7 +91,7 @@ impl ContainerElement for Paragraph {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::paragraph")]
pub struct ParagraphRule { pub struct ParagraphRule {
re: Regex, re: Regex,
} }

View file

@ -44,7 +44,7 @@ impl Element for Raw {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::raw")]
pub struct RawRule { pub struct RawRule {
re: [Regex; 1], re: [Regex; 1],
properties: PropertyParser, properties: PropertyParser,

View file

@ -62,7 +62,7 @@ impl Element for Reference {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::reference")]
pub struct ReferenceRule { pub struct ReferenceRule {
re: [Regex; 1], re: [Regex; 1],
properties: PropertyParser, properties: PropertyParser,

View file

@ -20,7 +20,7 @@ use std::rc::Rc;
use super::text::Text; use super::text::Text;
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::script")]
pub struct ScriptRule { pub struct ScriptRule {
re: [Regex; 2], re: [Regex; 2],
eval_kinds: [(&'static str, &'static str); 3], eval_kinds: [(&'static str, &'static str); 3],

View file

@ -135,7 +135,7 @@ impl ReferenceableElement for Section {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::section")]
pub struct SectionRule { pub struct SectionRule {
re: [Regex; 1], re: [Regex; 1],
} }

View file

@ -132,7 +132,7 @@ impl RuleState for StyleState {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::style")]
pub struct StyleRule { pub struct StyleRule {
re: [Regex; 4], re: [Regex; 4],
} }

View file

@ -219,7 +219,7 @@ impl Element for Tex {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::tex")]
pub struct TexRule { pub struct TexRule {
re: [Regex; 2], re: [Regex; 2],
properties: PropertyParser, properties: PropertyParser,

View file

@ -42,7 +42,7 @@ impl Element for Text {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::text")]
pub struct TextRule; pub struct TextRule;
impl TextRule { impl TextRule {

View file

@ -37,7 +37,7 @@ impl FromStr for VariableKind {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::variable")]
pub struct VariableRule { pub struct VariableRule {
re: [Regex; 1], re: [Regex; 1],
kinds: Vec<(String, String)>, kinds: Vec<(String, String)>,
@ -297,7 +297,7 @@ impl RegexRule for VariableRule {
} }
} }
#[auto_registry::auto_registry(registry = "rules")] #[auto_registry::auto_registry(registry = "rules", path = "crate::elements::variable")]
pub struct VariableSubstitutionRule { pub struct VariableSubstitutionRule {
re: [Regex; 1], re: [Regex; 1],
} }

View file

@ -94,85 +94,3 @@ impl From<&LineCursor> for Cursor
} }
} }
} }
#[derive(Debug)]
pub struct LsParser
{
rules: Vec<Box<dyn Rule>>,
colors: ReportColors,
// Parser state
pub state: RefCell<StateHolder>,
pub kernels: RefCell<HashMap<String, Kernel>>,
}
impl Parser for LsParser
{
fn colors(&self) -> &ReportColors { &self.colors }
fn rules(&self) -> &Vec<Box<dyn Rule>> { &self.rules }
fn rules_mut(&mut self) -> &mut Vec<Box<dyn Rule>> { &mut self.rules }
fn state(&self) -> Ref<'_, StateHolder> { self.state.borrow() }
fn state_mut(&self) -> std::cell::RefMut<'_, StateHolder> { self.state.borrow_mut() }
fn has_error(&self) -> bool { true }
fn push<'a>(&self, doc: &dyn Document, elem: Box<dyn Element>) {
todo!()
}
fn parse<'a>(&self, source: Rc<dyn Source>, parent: Option<&'a dyn Document<'a>>) -> Box<dyn Document<'a>+'a> {
todo!()
}
fn parse_into<'a>(&self, source: Rc<dyn Source>, document: &'a dyn Document<'a>) {
todo!()
}
}
impl KernelHolder for LsParser
{
fn get_kernel(&self, name: &str)
-> Option<RefMut<'_, Kernel>> {
RefMut::filter_map(self.kernels.borrow_mut(),
|map| map.get_mut(name)).ok()
}
fn insert_kernel(&self, name: String, kernel: Kernel)
-> RefMut<'_, Kernel> {
//TODO do not get
self.kernels.borrow_mut()
.insert(name.clone(), kernel);
self.get_kernel(name.as_str()).unwrap()
}
}
impl StyleHolder for LsParser {
fn element_styles(&self) -> Ref<'_, HashMap<String, Rc<dyn ElementStyle>>> {
todo!()
}
fn element_styles_mut(&self) -> RefMut<'_, HashMap<String, Rc<dyn ElementStyle>>> {
todo!()
}
}
impl LayoutHolder for LsParser {
fn layouts(&self) -> Ref<'_, HashMap<String, Rc<dyn LayoutType>>> {
todo!()
}
fn layouts_mut(&self) -> RefMut<'_, HashMap<String, Rc<dyn LayoutType>>> {
todo!()
}
}
impl CustomStyleHolder for LsParser {
fn custom_styles(&self) -> Ref<'_, HashMap<String, Rc<dyn CustomStyle>>> {
todo!()
}
fn custom_styles_mut(&self) -> RefMut<'_, HashMap<String, Rc<dyn CustomStyle>>> {
todo!()
}
}

View file

@ -423,7 +423,10 @@ mod tests {
(&doc as &dyn Document) (&doc as &dyn Document)
.last_element_mut::<Paragraph>() .last_element_mut::<Paragraph>()
.unwrap() .unwrap()
.push(Box::new(Comment::new(tok.clone(), "COMMENT".to_string()))) .push(Box::new(Comment {
location: tok.clone(),
content: "COMMENT".into(),
}))
.unwrap(); .unwrap();
assert_eq!(process_text(&doc, "\na"), "a"); assert_eq!(process_text(&doc, "\na"), "a");