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");