From ff6f6b3a5223ddab81c7357a3c59bdb09936a552 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 11 Jun 2019 18:14:27 +0300 Subject: move docs under code model --- crates/ra_hir/src/code_model/docs.rs | 96 ++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 crates/ra_hir/src/code_model/docs.rs (limited to 'crates/ra_hir/src/code_model/docs.rs') diff --git a/crates/ra_hir/src/code_model/docs.rs b/crates/ra_hir/src/code_model/docs.rs new file mode 100644 index 000000000..da2b9b854 --- /dev/null +++ b/crates/ra_hir/src/code_model/docs.rs @@ -0,0 +1,96 @@ +use std::sync::Arc; + +use ra_syntax::ast; + +use crate::{ + HirDatabase, DefDatabase, AstDatabase, HasSource, + Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource, MacroDef, +}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum DocDef { + Module(Module), + StructField(StructField), + Struct(Struct), + Enum(Enum), + EnumVariant(EnumVariant), + Static(Static), + Const(Const), + Function(Function), + Union(Union), + Trait(Trait), + TypeAlias(TypeAlias), + MacroDef(MacroDef), +} + +impl_froms!( + DocDef: Module, + StructField, + Struct, + Enum, + EnumVariant, + Static, + Const, + Function, + Union, + Trait, + TypeAlias, + MacroDef +); + +/// Holds documentation +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Documentation(Arc); + +impl Documentation { + fn new(s: &str) -> Documentation { + Documentation(s.into()) + } + + pub fn as_str(&self) -> &str { + &*self.0 + } +} + +impl Into for Documentation { + fn into(self) -> String { + self.as_str().to_owned() + } +} + +pub trait Docs { + fn docs(&self, db: &impl HirDatabase) -> Option; +} + +pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option { + node.doc_comment_text().map(|it| Documentation::new(&it)) +} + +pub(crate) fn documentation_query( + db: &(impl DefDatabase + AstDatabase), + def: DocDef, +) -> Option { + match def { + DocDef::Module(it) => docs_from_ast(&*it.declaration_source(db)?.ast), + DocDef::StructField(it) => match it.source(db).ast { + FieldSource::Named(named) => docs_from_ast(&*named), + FieldSource::Pos(..) => return None, + }, + DocDef::Struct(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Enum(it) => docs_from_ast(&*it.source(db).ast), + DocDef::EnumVariant(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Static(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Const(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Function(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Union(it) => docs_from_ast(&*it.source(db).ast), + DocDef::Trait(it) => docs_from_ast(&*it.source(db).ast), + DocDef::TypeAlias(it) => docs_from_ast(&*it.source(db).ast), + DocDef::MacroDef(it) => docs_from_ast(&*it.source(db).ast), + } +} + +impl + Copy> Docs for T { + fn docs(&self, db: &impl HirDatabase) -> Option { + db.documentation((*self).into()) + } +} -- cgit v1.2.3