#![cfg_attr(coverage_nightly, coverage(off))]
use crate::ast::core::{AstDag, Language};
#[derive(Debug, Clone, Default)]
pub struct ParserConfig {
pub include_comments: bool,
pub include_docs: bool,
pub max_depth: Option<u32>,
pub calculate_complexity: bool,
}
#[derive(Debug, Clone)]
pub struct ParserCapabilities {
pub languages: Vec<Language>,
pub incremental: bool,
pub error_recovery: bool,
}
pub struct ParseResult {
pub ast: AstDag,
pub errors: Vec<String>,
pub warnings: Vec<String>,
}
pub struct UnifiedParser {
#[allow(dead_code)]
config: ParserConfig,
}
impl UnifiedParser {
#[must_use]
pub fn new() -> Self {
Self {
config: ParserConfig::default(),
}
}
#[must_use]
pub fn with_config(config: ParserConfig) -> Self {
Self { config }
}
#[must_use]
pub fn capabilities(&self) -> ParserCapabilities {
ParserCapabilities {
languages: vec![Language::Rust, Language::Python, Language::TypeScript],
incremental: false,
error_recovery: true,
}
}
}
impl Default for UnifiedParser {
fn default() -> Self {
Self::new()
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parser_new() {
let parser = UnifiedParser::new();
assert!(parser.config.include_comments == false);
assert!(parser.config.include_docs == false);
assert!(parser.config.max_depth.is_none());
assert!(parser.config.calculate_complexity == false);
}
#[test]
fn test_parser_default() {
let parser = UnifiedParser::default();
assert!(parser.config.include_comments == false);
}
#[test]
fn test_parser_with_config() {
let config = ParserConfig {
include_comments: true,
include_docs: true,
max_depth: Some(10),
calculate_complexity: true,
};
let parser = UnifiedParser::with_config(config);
assert!(parser.config.include_comments);
assert!(parser.config.include_docs);
assert_eq!(parser.config.max_depth, Some(10));
assert!(parser.config.calculate_complexity);
}
#[test]
fn test_parser_capabilities() {
let parser = UnifiedParser::new();
let caps = parser.capabilities();
assert_eq!(caps.languages.len(), 3);
assert!(caps.languages.contains(&Language::Rust));
assert!(caps.languages.contains(&Language::Python));
assert!(caps.languages.contains(&Language::TypeScript));
assert!(!caps.incremental);
assert!(caps.error_recovery);
}
#[test]
fn test_parser_config_default() {
let config = ParserConfig::default();
assert!(!config.include_comments);
assert!(!config.include_docs);
assert!(config.max_depth.is_none());
assert!(!config.calculate_complexity);
}
}
#[cfg_attr(coverage_nightly, coverage(off))]
#[cfg(test)]
mod property_tests {
use proptest::prelude::*;
proptest! {
#[test]
fn basic_property_stability(_input in ".*") {
prop_assert!(true);
}
#[test]
fn module_consistency_check(_x in 0u32..1000) {
prop_assert!(_x < 1001);
}
}
}