| //! This module contains tests for doc-expression parsing. |
| //! Currently, it tests `#[doc(hidden)]` and `#[doc(alias)]`. |
| |
| use triomphe::Arc; |
| |
| use base_db::FileId; |
| use hir_expand::span_map::{RealSpanMap, SpanMap}; |
| use mbe::syntax_node_to_token_tree; |
| use syntax::{ast, AstNode, TextRange}; |
| |
| use crate::attr::{DocAtom, DocExpr}; |
| |
| fn assert_parse_result(input: &str, expected: DocExpr) { |
| let source_file = ast::SourceFile::parse(input).ok().unwrap(); |
| let tt = source_file.syntax().descendants().find_map(ast::TokenTree::cast).unwrap(); |
| let map = SpanMap::RealSpanMap(Arc::new(RealSpanMap::absolute(FileId::from_raw(0)))); |
| let tt = syntax_node_to_token_tree( |
| tt.syntax(), |
| map.as_ref(), |
| map.span_for_range(TextRange::empty(0.into())), |
| ); |
| let cfg = DocExpr::parse(&tt); |
| assert_eq!(cfg, expected); |
| } |
| |
| #[test] |
| fn test_doc_expr_parser() { |
| assert_parse_result("#![doc(hidden)]", DocAtom::Flag("hidden".into()).into()); |
| |
| assert_parse_result( |
| r#"#![doc(alias = "foo")]"#, |
| DocAtom::KeyValue { key: "alias".into(), value: "foo".into() }.into(), |
| ); |
| |
| assert_parse_result(r#"#![doc(alias("foo"))]"#, DocExpr::Alias(["foo".into()].into())); |
| assert_parse_result( |
| r#"#![doc(alias("foo", "bar", "baz"))]"#, |
| DocExpr::Alias(["foo".into(), "bar".into(), "baz".into()].into()), |
| ); |
| |
| assert_parse_result( |
| r#" |
| #[doc(alias("Bar", "Qux"))] |
| struct Foo;"#, |
| DocExpr::Alias(["Bar".into(), "Qux".into()].into()), |
| ); |
| } |