java_lang/tree/parser/
compilation_unit.rs

1use super::{
2    super::{import_declarations, package_declaration},
3    CompilationUnitDeclaration,
4};
5use crate::TokenStream;
6use nom::{combinator::opt, IResult, Parser};
7
8/// 解析编译单元声明从给定的标记流中。
9///
10/// 这个函数接受一个 `TokenStream` 并返回一个 `CompilationUnitDeclaration` 以及剩余的标记。
11///
12/// # 参数
13///
14/// * `tokens` - 一个 `TokenStream`,从中解析编译单元声明。
15///
16/// # 返回
17///
18/// 包含剩余标记和 `CompilationUnitDeclaration` 的元组。
19///
20/// # 示例
21///
22/// ```
23/// fn main() -> anyhow::Result<()> {
24/// use java_lang::{
25/// TokenStream,
26/// compilation_unit_declaration
27/// };
28///
29/// let (_, tokens) = TokenStream::from_str("
30/// package com.test;
31/// import java.io.File;
32/// ")?;
33/// assert!(!tokens.is_empty());
34///
35/// let (tokens, cu) = compilation_unit_declaration(tokens)?;
36/// assert_eq!(cu.package().unwrap().name, "com.test");
37/// assert_eq!(cu.imports().len(), 1);
38///
39/// assert!(tokens.is_empty());
40/// Ok(())
41/// }
42/// ```
43///
44/// # 错误
45///
46/// 如果标记流不包含有效的编译单元声明,这个函数将返回一个错误。
47pub fn compilation_unit_declaration<'a>(
48    tokens: TokenStream,
49) -> IResult<TokenStream, CompilationUnitDeclaration<'a>> {
50    let (tokens, package) = opt(package_declaration).parse(tokens)?;
51    let (tokens, imports) = import_declarations(tokens)?;
52
53    Ok((
54        tokens,
55        CompilationUnitDeclaration::Ordinary {package, imports, top_level_class_or_interfaces: Default::default()},
56    ))
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_compile_unit() -> anyhow::Result<()> {
65        let (_, tokens) = TokenStream::from_str(
66            "\
67            package com.test;\
68            import java.io.File;
69            ",
70        )?;
71        assert!(!tokens.is_empty());
72
73        let (tokens, cu) = compilation_unit_declaration(tokens)?;
74        assert_eq!(cu.package().unwrap().name, "com.test");
75        assert_eq!(cu.imports().len(), 1);
76
77        assert!(tokens.is_empty());
78
79        Ok(())
80    }
81}