#![cfg_attr(coverage_nightly, coverage(off))]
use super::{
DetectionConfig, DetectionInput, DetectionOutput, Detector, DetectorCapabilities,
DetectorSpecificConfig,
};
use anyhow::Result;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::path::Path;
pub struct DuplicateDetector;
impl Default for DuplicateDetector {
fn default() -> Self {
Self::new()
}
}
impl DuplicateDetector {
#[must_use]
pub fn new() -> Self {
Self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DuplicateConfig {
pub similarity_threshold: f64,
pub min_lines: usize,
pub hash_count: usize,
pub ignore_whitespace: bool,
pub cross_language: bool,
}
impl Default for DuplicateConfig {
fn default() -> Self {
Self {
similarity_threshold: 0.8,
min_lines: 3,
hash_count: 128,
ignore_whitespace: true,
cross_language: true,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DuplicateDetectionResult {
pub duplicates: Vec<DuplicateGroup>,
pub summary: DuplicateSummary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DuplicateGroup {
pub id: String,
pub similarity: f64,
pub fragments: Vec<CodeFragment>,
pub clone_type: CloneType,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CodeFragment {
pub file: std::path::PathBuf,
pub start_line: usize,
pub end_line: usize,
pub content: String,
pub hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DuplicateSummary {
pub total_groups: usize,
pub total_duplicates: usize,
pub files_analyzed: usize,
pub time_saved_hours: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum CloneType {
Type1 { similarity: f64 },
Type2 { similarity: f64, normalized: bool },
Type3 { similarity: f64, ast_distance: f64 },
}
include!("duplicates_detection.rs");
include!("duplicates_tests.rs");
include!("duplicates_tests_detector.rs");