From a27186636d030c847193ab21c59a1857a1e93785 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Thu, 12 Nov 2020 12:09:12 +0100 Subject: Fix attachment of inner doc comments --- crates/syntax/src/ast.rs | 19 +++++++++++++++-- crates/syntax/src/parsing/text_tree_sink.rs | 27 ++++++++++++------------- crates/syntax/test_data/parser/ok/0037_mod.rast | 6 +++--- 3 files changed, 33 insertions(+), 19 deletions(-) (limited to 'crates') diff --git a/crates/syntax/src/ast.rs b/crates/syntax/src/ast.rs index 8a0e3d27b..7844f9ed6 100644 --- a/crates/syntax/src/ast.rs +++ b/crates/syntax/src/ast.rs @@ -115,10 +115,10 @@ fn test_doc_comment_none() { } #[test] -fn test_doc_comment_of_items() { +fn test_outer_doc_comment_of_items() { let file = SourceFile::parse( r#" - //! doc + /// doc // non-doc mod foo {} "#, @@ -129,6 +129,21 @@ fn test_doc_comment_of_items() { assert_eq!("doc", module.doc_comment_text().unwrap()); } +#[test] +fn test_inner_doc_comment_of_items() { + let file = SourceFile::parse( + r#" + //! doc + // non-doc + mod foo {} + "#, + ) + .ok() + .unwrap(); + let module = file.syntax().descendants().find_map(Module::cast).unwrap(); + assert!(module.doc_comment_text().is_none()); +} + #[test] fn test_doc_comment_of_statics() { let file = SourceFile::parse( diff --git a/crates/syntax/src/parsing/text_tree_sink.rs b/crates/syntax/src/parsing/text_tree_sink.rs index c1b5f246d..997bc5d28 100644 --- a/crates/syntax/src/parsing/text_tree_sink.rs +++ b/crates/syntax/src/parsing/text_tree_sink.rs @@ -5,6 +5,7 @@ use std::mem; use parser::{ParseError, TreeSink}; use crate::{ + ast, parsing::Token, syntax_node::GreenNode, SmolStr, SyntaxError, @@ -153,24 +154,22 @@ fn n_attached_trivias<'a>( while let Some((i, (kind, text))) = trivias.next() { match kind { - WHITESPACE => { - if text.contains("\n\n") { - // we check whether the next token is a doc-comment - // and skip the whitespace in this case - if let Some((peek_kind, peek_text)) = - trivias.peek().map(|(_, pair)| pair) - { - if *peek_kind == COMMENT - && peek_text.starts_with("///") - && !peek_text.starts_with("////") - { - continue; - } + WHITESPACE if text.contains("\n\n") => { + // we check whether the next token is a doc-comment + // and skip the whitespace in this case + if let Some((COMMENT, peek_text)) = trivias.peek().map(|(_, pair)| pair) { + let comment_kind = ast::CommentKind::from_text(peek_text); + if comment_kind.doc == Some(ast::CommentPlacement::Outer) { + continue; } - break; } + break; } COMMENT => { + let comment_kind = ast::CommentKind::from_text(text); + if comment_kind.doc == Some(ast::CommentPlacement::Inner) { + break; + } res = i + 1; } _ => (), diff --git a/crates/syntax/test_data/parser/ok/0037_mod.rast b/crates/syntax/test_data/parser/ok/0037_mod.rast index 1d5d94bde..35577272e 100644 --- a/crates/syntax/test_data/parser/ok/0037_mod.rast +++ b/crates/syntax/test_data/parser/ok/0037_mod.rast @@ -1,9 +1,9 @@ SOURCE_FILE@0..93 COMMENT@0..60 "// https://github.com ..." WHITESPACE@60..62 "\n\n" - MODULE@62..93 - COMMENT@62..70 "//! docs" - WHITESPACE@70..71 "\n" + COMMENT@62..70 "//! docs" + WHITESPACE@70..71 "\n" + MODULE@71..93 COMMENT@71..82 "// non-docs" WHITESPACE@82..83 "\n" MOD_KW@83..86 "mod" -- cgit v1.2.3