From 860b73f1644ecd6548ae403ec483625fb7b625ea Mon Sep 17 00:00:00 2001 From: Minijackson Date: Sat, 23 Nov 2019 19:27:21 +0100 Subject: entities rework, allow "inline" documentation, merge config with cli --- src/parsing.rs | 55 ++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 40 insertions(+), 15 deletions(-) (limited to 'src/parsing.rs') diff --git a/src/parsing.rs b/src/parsing.rs index 137b89d..d7aaa49 100644 --- a/src/parsing.rs +++ b/src/parsing.rs @@ -6,11 +6,13 @@ use codemap::CodeMap; use std::collections::HashMap; use std::path::{Path, PathBuf}; -pub(crate) fn parse_file(path: T, mut extra_args: Vec<&str>) -> EntitiesManager +pub(crate) fn parse_file(path: T, extra_args: &[S]) -> EntitiesManager where T: Into, T: AsRef, T: ToString, + S: AsRef, + S: std::fmt::Debug, { let mut codemap = CodeMap::new(); let file_map = codemap.add_file(path.to_string(), std::fs::read_to_string(&path).unwrap()); @@ -21,7 +23,6 @@ where let mut parser = index.parser(path); parser.skip_function_bodies(true); - extra_args.push("-Werror=documentation"); parser.arguments(&extra_args); if log_enabled!(log::Level::Debug) { @@ -70,7 +71,7 @@ where let mut emitter = Emitter::stderr(ColorConfig::Auto, Some(&codemap)); for diagnostic in trans_unit.get_diagnostics().iter() { - let main_diag = match clang_diag_to_codemap_diag(&diagnostic, &file_span) { + let main_diag = match clang_diag_to_codemap_diag(&diagnostic, file_span) { Some(diag) => diag, None => continue, }; @@ -78,12 +79,12 @@ where let sub_diags = diagnostic .get_children() .into_iter() - .filter_map(|diagnostic| clang_diag_to_codemap_diag(&diagnostic, &file_span)); + .filter_map(|diagnostic| clang_diag_to_codemap_diag(&diagnostic, file_span)); let fix_it_diags = diagnostic .get_fix_its() .into_iter() - .map(|fix_it| clang_fix_it_to_codemap_diag(&fix_it, &file_span)); + .map(|fix_it| clang_fix_it_to_codemap_diag(&fix_it, file_span)); emitter.emit( &std::iter::once(main_diag) @@ -98,7 +99,7 @@ where fn clang_diag_to_codemap_diag( diagnostic: &clang::diagnostic::Diagnostic, - file_span: &codemap::Span, + file_span: codemap::Span, ) -> Option { use codemap_diagnostic::{Diagnostic, Level, SpanLabel, SpanStyle}; @@ -146,7 +147,7 @@ fn clang_diag_to_codemap_diag( fn clang_fix_it_to_codemap_diag( fix_it: &clang::diagnostic::FixIt, - file_span: &codemap::Span, + file_span: codemap::Span, ) -> codemap_diagnostic::Diagnostic { use clang::diagnostic::FixIt; use codemap_diagnostic::{Diagnostic, Level, SpanLabel, SpanStyle}; @@ -195,6 +196,7 @@ fn clang_fix_it_to_codemap_diag( pub(crate) struct Comment(String); impl Comment { + // TODO: weirdness with emojis and line returns? pub fn from_raw(raw: String) -> Self { #[derive(Debug)] enum CommentStyle { @@ -237,7 +239,7 @@ impl Comment { break; } Some(position) => { - result.push_str(&rest[..position + 1]); + result.push_str(&rest[..=position]); chars.nth(position); } } @@ -318,20 +320,20 @@ fn get_description(entity: &clang::Entity) -> Description { } } -impl FromClangEntity for Entity { +impl FromClangEntity for Box { fn from_clang_entity(entity: clang::Entity, manager: &mut EntitiesManager) -> Self { use clang::EntityKind; match entity.get_kind() { - EntityKind::Namespace => Self::NameSpace(entity.into_poseidoc_entity(manager)), + EntityKind::Namespace => Box::new(NameSpace::from_clang_entity(entity, manager)), EntityKind::FieldDecl | EntityKind::VarDecl => { - Self::Variable(entity.into_poseidoc_entity(manager)) + Box::new(Variable::from_clang_entity(entity, manager)) } EntityKind::FunctionDecl | EntityKind::Method | EntityKind::FunctionTemplate => { - Self::Function(entity.into_poseidoc_entity(manager)) + Box::new(Function::from_clang_entity(entity, manager)) } EntityKind::ClassDecl | EntityKind::StructDecl | EntityKind::ClassTemplate => { - Self::Class(entity.into_poseidoc_entity(manager)) + Box::new(Class::from_clang_entity(entity, manager)) } _ => panic!("Unsupported entity: {:?}", entity), } @@ -362,6 +364,28 @@ impl FromClangEntity for NameSpace { } } +impl FromClangEntity for NameSpaceChild { + fn from_clang_entity(entity: clang::Entity, manager: &mut EntitiesManager) -> Self { + use clang::EntityKind; + + match entity.get_kind() { + EntityKind::Namespace => { + NameSpaceChild::NameSpace(NameSpace::from_clang_entity(entity, manager)) + } + EntityKind::FieldDecl | EntityKind::VarDecl => { + NameSpaceChild::Variable(Variable::from_clang_entity(entity, manager)) + } + EntityKind::FunctionDecl | EntityKind::Method | EntityKind::FunctionTemplate => { + NameSpaceChild::Function(Function::from_clang_entity(entity, manager)) + } + EntityKind::ClassDecl | EntityKind::StructDecl | EntityKind::ClassTemplate => { + NameSpaceChild::Class(Class::from_clang_entity(entity, manager)) + } + _ => panic!("Unsupported entity: {:?}", entity), + } + } +} + impl FromClangEntity for Variable { fn from_clang_entity(entity: clang::Entity, manager: &mut EntitiesManager) -> Self { match entity.get_kind() { @@ -383,6 +407,7 @@ impl FromClangEntity for Function { fn from_clang_entity(entity: clang::Entity, manager: &mut EntitiesManager) -> Self { match entity.get_kind() { clang::EntityKind::Method + | clang::EntityKind::Constructor | clang::EntityKind::FunctionDecl | clang::EntityKind::FunctionTemplate => {} _ => panic!("Trying to parse a non-function into a function"), @@ -436,7 +461,7 @@ impl FromClangEntity for Class { EntityKind::ClassDecl | EntityKind::StructDecl | EntityKind::TypeAliasDecl => { member_types.push(child_usr); } - EntityKind::Method => { + EntityKind::Method | EntityKind::Constructor | EntityKind::FunctionDecl => { member_functions.insert(child_usr, child.into_poseidoc_entity(manager)); } EntityKind::FieldDecl => { @@ -449,7 +474,7 @@ impl FromClangEntity for Class { manager.insert(entity.get_usr().unwrap().into(), get_description(&entity)); Class { - member_types, + //member_types, member_functions, member_variables, } -- cgit v1.2.3