diff --git a/crates/auto-registry/src/lib.rs b/crates/auto-registry/src/lib.rs
index 5a9196a..9e3617f 100644
--- a/crates/auto-registry/src/lib.rs
+++ b/crates/auto-registry/src/lib.rs
@@ -76,6 +76,12 @@ impl Parse for AutoRegistryArgs {
/// - registry: (String) Name of the registry to collect the struct into
/// - path: (Optional String) The crate path in which the struct is located
/// 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]
pub fn auto_registry(attr: TokenStream, input: TokenStream) -> TokenStream {
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 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 {
// Attempt to get the path in a hacky way in case the path wasn't
// specified as an attribute to the macro
@@ -229,6 +240,25 @@ impl Parse for GenerateRegistryArgs {
/// comma-separated and create the resulting expression
/// - return_type: (Type) The return type of the generated function.
/// 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]
pub fn generate_registry(attr: TokenStream, input: TokenStream) -> TokenStream {
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;
- //proc_macro2::Ident::new(args.target.value().as_str(), proc_macro2::Span::call_site());
let return_type = args.return_type;
let maker = args.maker;
diff --git a/src/compiler/compiler.rs b/src/compiler/compiler.rs
index de7c04f..24c37a5 100644
--- a/src/compiler/compiler.rs
+++ b/src/compiler/compiler.rs
@@ -13,6 +13,7 @@ use crate::document::variable::Variable;
#[derive(Clone, Copy)]
pub enum Target {
HTML,
+ #[allow(unused)]
LATEX,
}
@@ -21,7 +22,6 @@ pub struct Compiler {
cache: Option<RefCell<Connection>>,
reference_count: RefCell<HashMap<String, HashMap<String, usize>>>,
// TODO: External references, i.e resolved later
-
sections_counter: RefCell<Vec<usize>>,
}
@@ -44,11 +44,12 @@ impl Compiler {
/// Gets the section counter for a given depth
/// 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
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);
return Ref::map(self.sections_counter.borrow(), |b| &*b);
}
diff --git a/src/elements/code.rs b/src/elements/code.rs
index f7853fd..53f4de5 100644
--- a/src/elements/code.rs
+++ b/src/elements/code.rs
@@ -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 {
re: [Regex; 2],
properties: PropertyParser,
diff --git a/src/elements/comment.rs b/src/elements/comment.rs
index a5df792..a10dbb5 100644
--- a/src/elements/comment.rs
+++ b/src/elements/comment.rs
@@ -16,17 +16,9 @@ use std::rc::Rc;
#[derive(Debug)]
pub struct Comment {
- location: Token,
- content: String,
-}
-
-impl Comment {
- pub fn new(location: Token, content: String) -> Self {
- Self {
- location: location,
- content,
- }
- }
+ pub location: Token,
+ #[allow(unused)]
+ pub content: String,
}
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 {
re: [Regex; 1],
}
diff --git a/src/elements/customstyle.rs b/src/elements/customstyle.rs
index 06c94a9..f2d6f14 100644
--- a/src/elements/customstyle.rs
+++ b/src/elements/customstyle.rs
@@ -178,7 +178,7 @@ impl RuleState for CustomStyleState {
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;
impl CustomStyleRule {
diff --git a/src/elements/elemstyle.rs b/src/elements/elemstyle.rs
index 2cfab00..6862294 100644
--- a/src/elements/elemstyle.rs
+++ b/src/elements/elemstyle.rs
@@ -21,7 +21,7 @@ use crate::parser::rule::Rule;
use crate::parser::source::Cursor;
use crate::parser::source::Source;
-#[auto_registry::auto_registry(registry = "rules")]
+#[auto_registry::auto_registry(registry = "rules", path = "crate::elements::elemstyle")]
pub struct ElemStyleRule {
start_re: Regex,
}
diff --git a/src/elements/graphviz.rs b/src/elements/graphviz.rs
index 378e33e..9b3ecab 100644
--- a/src/elements/graphviz.rs
+++ b/src/elements/graphviz.rs
@@ -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 {
re: [Regex; 1],
properties: PropertyParser,
diff --git a/src/elements/import.rs b/src/elements/import.rs
index 57386c7..14e5086 100644
--- a/src/elements/import.rs
+++ b/src/elements/import.rs
@@ -17,7 +17,7 @@ use std::rc::Rc;
use super::paragraph::Paragraph;
-#[auto_registry::auto_registry(registry = "rules")]
+#[auto_registry::auto_registry(registry = "rules", path = "crate::elements::import")]
pub struct ImportRule {
re: [Regex; 1],
}
diff --git a/src/elements/layout.rs b/src/elements/layout.rs
index 3128634..9e2a48a 100644
--- a/src/elements/layout.rs
+++ b/src/elements/layout.rs
@@ -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 {
re: [Regex; 3],
}
diff --git a/src/elements/link.rs b/src/elements/link.rs
index ab388d1..f191e36 100644
--- a/src/elements/link.rs
+++ b/src/elements/link.rs
@@ -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 {
re: [Regex; 1],
}
diff --git a/src/elements/list.rs b/src/elements/list.rs
index ad9058b..e5fdc93 100644
--- a/src/elements/list.rs
+++ b/src/elements/list.rs
@@ -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 {
start_re: Regex,
continue_re: Regex,
diff --git a/src/elements/media.rs b/src/elements/media.rs
index d4d49ef..26a277a 100644
--- a/src/elements/media.rs
+++ b/src/elements/media.rs
@@ -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 {
re: [Regex; 1],
properties: PropertyParser,
diff --git a/src/elements/paragraph.rs b/src/elements/paragraph.rs
index a631390..3c962b0 100644
--- a/src/elements/paragraph.rs
+++ b/src/elements/paragraph.rs
@@ -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 {
re: Regex,
}
diff --git a/src/elements/raw.rs b/src/elements/raw.rs
index bbb34d1..edb0b98 100644
--- a/src/elements/raw.rs
+++ b/src/elements/raw.rs
@@ -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 {
re: [Regex; 1],
properties: PropertyParser,
diff --git a/src/elements/reference.rs b/src/elements/reference.rs
index 026ddee..5647091 100644
--- a/src/elements/reference.rs
+++ b/src/elements/reference.rs
@@ -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 {
re: [Regex; 1],
properties: PropertyParser,
diff --git a/src/elements/script.rs b/src/elements/script.rs
index 11d3ea2..cac0d30 100644
--- a/src/elements/script.rs
+++ b/src/elements/script.rs
@@ -20,7 +20,7 @@ use std::rc::Rc;
use super::text::Text;
-#[auto_registry::auto_registry(registry = "rules")]
+#[auto_registry::auto_registry(registry = "rules", path = "crate::elements::script")]
pub struct ScriptRule {
re: [Regex; 2],
eval_kinds: [(&'static str, &'static str); 3],
diff --git a/src/elements/section.rs b/src/elements/section.rs
index 3711b73..6c257c6 100644
--- a/src/elements/section.rs
+++ b/src/elements/section.rs
@@ -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 {
re: [Regex; 1],
}
diff --git a/src/elements/style.rs b/src/elements/style.rs
index bd5fb04..d11ce0f 100644
--- a/src/elements/style.rs
+++ b/src/elements/style.rs
@@ -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 {
re: [Regex; 4],
}
diff --git a/src/elements/tex.rs b/src/elements/tex.rs
index e6ba28a..da7c091 100644
--- a/src/elements/tex.rs
+++ b/src/elements/tex.rs
@@ -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 {
re: [Regex; 2],
properties: PropertyParser,
diff --git a/src/elements/text.rs b/src/elements/text.rs
index 58e2d38..16130a0 100644
--- a/src/elements/text.rs
+++ b/src/elements/text.rs
@@ -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;
impl TextRule {
diff --git a/src/elements/variable.rs b/src/elements/variable.rs
index a62ae5b..8ca93a7 100644
--- a/src/elements/variable.rs
+++ b/src/elements/variable.rs
@@ -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 {
re: [Regex; 1],
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 {
re: [Regex; 1],
}
diff --git a/src/lsp/parser.rs b/src/lsp/parser.rs
index b222432..d72952b 100644
--- a/src/lsp/parser.rs
+++ b/src/lsp/parser.rs
@@ -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!()
- }
-}
diff --git a/src/parser/util.rs b/src/parser/util.rs
index 8c73daa..7e69b64 100644
--- a/src/parser/util.rs
+++ b/src/parser/util.rs
@@ -423,7 +423,10 @@ mod tests {
(&doc as &dyn Document)
.last_element_mut::<Paragraph>()
.unwrap()
- .push(Box::new(Comment::new(tok.clone(), "COMMENT".to_string())))
+ .push(Box::new(Comment {
+ location: tok.clone(),
+ content: "COMMENT".into(),
+ }))
.unwrap();
assert_eq!(process_text(&doc, "\na"), "a");