java_lang/tree/parser/
package.rs1use super::{super::PackageDeclaration, identifier, documentation_comment};
2use crate::{ts, Token, TokenStream};
3use nom::{bytes::tag, combinator::opt, multi::separated_list1, IResult, Parser};
4use std::borrow::Cow;
5
6pub fn package_declaration<'a>(
44 tokens: TokenStream,
45) -> IResult<TokenStream, PackageDeclaration<'a>> {
46 let (tokens, documentation) = opt(documentation_comment).parse(tokens)?;
47 let (tokens, _) = tag(ts![Package]).parse(tokens)?;
48 let (tokens, idents) = separated_list1(tag(ts![Dot]), identifier).parse(tokens)?;
49 let (tokens, _) = tag(ts![SemiColon]).parse(tokens)?;
50 let name = idents
51 .into_iter()
52 .map(|i| i.to_string())
53 .collect::<Vec<_>>()
54 .join(Token::DOT);
55 Ok((
56 tokens,
57 PackageDeclaration {
58 name: Cow::Owned(name),
59 modifiers: Default::default(),
60 documentation,
61 },
62 ))
63}
64
65#[cfg(test)]
66mod tests {
67 use super::*;
68
69 #[test]
70 fn test_package_declaration() -> anyhow::Result<()> {
71 let (_, tokens) = TokenStream::from_str(
72 "\
73 /** 定义包 */
74 package com.test;
75 ",
76 )?;
77 assert!(!tokens.is_empty());
78
79 let (tokens, package) = package_declaration(tokens)?;
80 assert_eq!(
81 package,
82 PackageDeclaration {
83 name: "com.test".into(),
84 modifiers: Default::default(),
85 documentation: Some(" 定义包 ".into())
86 }
87 );
88
89 assert!(tokens.is_empty());
90
91 Ok(())
92 }
93}