emmylua_parser_desc/
lib.rs1mod lang;
2mod markdown;
3mod markdown_rst;
4mod ref_target;
5mod util;
6
7use emmylua_parser::LuaDocDescription;
8use rowan::TextRange;
9
10pub use lang::{CodeBlockLang, process_code};
11pub use ref_target::*;
12pub use util::ResultContainer;
13use util::sort_result;
14
15#[cfg(test)]
16mod testlib;
17
18#[derive(Debug, Clone, Eq, PartialEq)]
19pub enum DescItemKind {
20 Scope,
22
23 Ref,
25
26 Em,
28
29 Strong,
31
32 Code,
34
35 Link,
37
38 JavadocLink,
40
41 Markup,
43
44 Arg,
47
48 CodeBlock,
50
51 CodeBlockHl(CodeBlockHighlightKind),
53}
54
55#[derive(Debug, Clone, Copy, Eq, PartialEq)]
56pub enum CodeBlockHighlightKind {
57 None,
58 String,
59 Number,
60 Keyword,
61 Operators,
62 Comment,
63 Function,
64 Class,
65 Enum,
66 Variable,
67 Property,
68 Decorator,
69}
70
71#[derive(Debug, Clone)]
72pub struct DescItem {
73 pub range: TextRange,
74 pub kind: DescItemKind,
75}
76
77#[derive(Debug, Clone, Eq, PartialEq, Hash, Default)]
78pub enum DescParserType {
79 #[default]
80 None,
81 Md,
82 MySt {
83 primary_domain: Option<String>,
84 },
85 Rst {
86 primary_domain: Option<String>,
87 default_role: Option<String>,
88 },
89}
90
91pub trait LuaDescParser {
93 fn parse(&mut self, text: &str, desc: LuaDocDescription) -> Vec<DescItem>;
95}
96
97pub fn parse(
98 kind: DescParserType,
99 text: &str,
100 desc: LuaDocDescription,
101 cursor_position: Option<usize>,
102) -> Vec<DescItem> {
103 let mut items = match kind {
104 DescParserType::None => Vec::new(),
105 DescParserType::Md => markdown::MarkdownParser::new(cursor_position).parse(text, desc),
106 DescParserType::MySt { primary_domain } => {
107 markdown::MarkdownParser::new_myst(primary_domain, cursor_position).parse(text, desc)
108 }
109 DescParserType::Rst {
110 primary_domain,
111 default_role,
112 } => markdown_rst::MarkdownRstParser::new(primary_domain, default_role, cursor_position)
113 .parse(text, desc),
114 };
115
116 sort_result(&mut items);
117
118 items
119}