rust/crates/ra_hir/src/docs.rs

101 lines
2.4 KiB
Rust
Raw Normal View History

use ra_syntax::ast;
2019-06-08 14:16:05 +03:00
use crate::{HirDatabase, Module, StructField, Struct, Enum, EnumVariant, Static, Const, Function, Union, Trait, TypeAlias, FieldSource};
2019-01-23 20:13:36 -05:00
/// Holds documentation
#[derive(Debug, Clone)]
pub struct Documentation(String);
impl Documentation {
2019-06-08 14:16:05 +03:00
fn new(s: &str) -> Documentation {
Documentation(s.into())
}
2019-06-08 14:16:05 +03:00
pub fn as_str(&self) -> &str {
&self.0
}
}
impl Into<String> for Documentation {
fn into(self) -> String {
2019-06-08 14:16:05 +03:00
self.0.clone()
}
}
pub trait Docs {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation>;
}
pub(crate) fn docs_from_ast(node: &impl ast::DocCommentsOwner) -> Option<Documentation> {
2019-01-26 10:35:23 -05:00
node.doc_comment_text().map(|it| Documentation::new(&it))
}
2019-06-08 13:51:18 +03:00
impl Docs for Module {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
self.declaration_source(db).and_then(|it| docs_from_ast(&*it.1))
}
}
impl Docs for StructField {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
match self.source(db).1 {
FieldSource::Named(named) => docs_from_ast(&*named),
FieldSource::Pos(..) => return None,
}
}
}
impl Docs for Struct {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for Union {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for Enum {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for EnumVariant {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for Function {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for Const {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for Static {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for Trait {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}
impl Docs for TypeAlias {
fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
docs_from_ast(&*self.source(db).1)
}
}