Skip to main content

emmylua_parser_desc/
lib.rs

1mod 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    /// Generic block of documentation.
21    Scope,
22
23    /// Cross-reference to a Lua object.
24    Ref,
25
26    /// Emphasis.
27    Em,
28
29    /// Strong emphasis.
30    Strong,
31
32    /// Code markup.
33    Code,
34
35    /// Hyperlink.
36    Link,
37
38    /// Javadoc @link
39    JavadocLink,
40
41    /// Inline markup, like stars around emphasized text.
42    Markup,
43
44    /// Directive name, code-block syntax name, role name,
45    /// or some other form of argument.
46    Arg,
47
48    /// Line of code in a code block.
49    CodeBlock,
50
51    /// Line of code in a code block highlighted by Lua lexer.
52    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
91/// Parses markup in comments.
92pub trait LuaDescParser {
93    /// Process a description node and yield found documentation ranges.
94    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}