codehelion_core/
structural.rs1use std::collections::{BTreeMap, BTreeSet};
33
34use crate::boilerplate::{self, Boilerplate};
35use crate::candidate::{self, CandidateConfig, CandidateStats};
36use crate::clone_class::CloneClass;
37use crate::conditional::ArmPath;
38use crate::control_flow::{self, ControlFlowConfig, ControlFlowStats};
39use crate::discovery::{BuildVariant, Language};
40use crate::engine::{LiteralNorm, normalize::Resolution};
41use crate::features::{self, FileFeatures};
42use crate::frontend::{Lexeme, Token, TokenKind, UnitKind};
43use crate::grouping::{
44 self, GroupingConfig, GroupingSet, GroupingStats, GroupingUnit, SimilarityEdge,
45};
46use crate::ir::{ByteRange, IrNode, Shape, SyntaxIrFile};
47use crate::maximal::{self, MaximalConfig, RegionSide, RegionStats, SharedRegion};
48use crate::near_match::{self, NearMatchConfig, NearMatchStats};
49use crate::stable_id::{
50 self, CloneGroupFingerprint, ContentNorm, CrossVariantComparisonId, CrossVariantGroupId,
51 FileContext, FragmentFingerprint, UnitFingerprint,
52};
53use crate::substitution;
54use crate::test_code::{self, TestCodeEvidence};
55use crate::types::{ApiEvidence, TypeEvidence, TypeTag};
56use crate::verify::{self, SimilarityBreakdown, UnitView, VerifyConfig};
57
58mod analysis;
59mod evidence;
60mod model;
61mod pairs;
62mod regions;
63mod reporting;
64mod siblings;
65mod units;
66
67use evidence::{UnitEvidence, token_count_meets_minimum, unit_evidence, unit_meets_minimum};
68use pairs::{lift_to_unit_pairs, unrepresented_pairs};
69use regions::{confirm_regions, drop_subsumed, grow_runs};
70use reporting::{dominant_boilerplate_members, group_detail, written_once_per_width_members};
71use siblings::sweep_siblings;
72use units::{flatten_units, line_range, view};
73
74#[cfg(test)]
75use regions::{Confirmed, covers_run, merge_adjacent};
76#[cfg(test)]
77use reporting::{dominant_boilerplate, is_allocation_api, set_jaccard};
78
79pub use analysis::*;
80pub use evidence::*;
81pub use model::*;
82pub use reporting::span_identifier_jaccard;
83
84struct Unit {
86 file: usize,
87 local: usize,
88 kind: UnitKind,
89 statements: Vec<crate::ir::StatementSummary>,
90 fingerprint: UnitFingerprint,
91 content: FragmentFingerprint,
92 normalized_content: FragmentFingerprint,
93 range: ByteRange,
94 lines: (u32, u32),
95 tokens: (usize, usize),
96 name: Option<Lexeme>,
97 boilerplate: Option<Boilerplate>,
98 test_code: bool,
99 test_code_evidence: Option<TestCodeEvidence>,
100 arms: ArmPath,
102}
103
104impl Unit {
105 const fn group_content(&self, class: CloneClass) -> FragmentFingerprint {
107 if matches!(class, CloneClass::Type1) {
108 self.content
109 } else {
110 self.normalized_content
111 }
112 }
113}
114
115#[cfg(test)]
116#[allow(clippy::expect_used)]
117mod tests;