1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
use HashSet;
/// Merges adjacent or overlapping line ranges into a minimal set of non-overlapping ranges
/// This improves efficiency by reducing the number of blocks that need to be processed
///
/// # Arguments
/// * `line_numbers` - A HashSet of line numbers to merge
///
/// # Returns
/// * A vector of (start, end) tuples representing merged line ranges
///
/// # Example
/// ```
/// use std::collections::HashSet;
/// use probe_code::language::block_optimization::merge_line_ranges;
///
/// let mut line_numbers = HashSet::new();
/// line_numbers.insert(1);
/// line_numbers.insert(2);
/// line_numbers.insert(3);
/// line_numbers.insert(5);
/// line_numbers.insert(6);
///
/// let ranges = merge_line_ranges(&line_numbers);
/// assert_eq!(ranges.len(), 2);
/// assert!(ranges.contains(&(1, 3)));
/// assert!(ranges.contains(&(5, 6)));
/// ```
/// Optimized version of parse_file_for_code_blocks that merges adjacent line numbers
/// before processing to reduce the number of blocks that need to be processed.
///
/// This function is not currently used in the main code path to maintain compatibility
/// with existing tests. It can be enabled in the future by setting the PROBE_OPTIMIZE_BLOCKS
/// environment variable to "1".
///
/// # Implementation Notes
///
/// To use this optimization in the parse_file_for_code_blocks function:
///
/// 1. Merge adjacent line numbers into ranges before processing:
/// ```rust
/// let merged_ranges = merge_line_ranges(line_numbers);
/// ```
///
/// 2. Get or build the line map for the requested lines:
/// ```rust
/// let line_map = tree_cache::get_or_build_line_map(
/// &cache_key,
/// &tree,
/// line_numbers, // Use the original line_numbers for compatibility
/// content,
/// extension,
/// language_impl.as_ref(),
/// allow_tests,
/// );
/// ```
///
/// 3. Process each range of lines:
/// ```rust
/// for &(range_start, range_end) in &merged_ranges {
/// // Process each line in the range
/// for line in range_start..=range_end {
/// // Only process lines that were in the original line_numbers set
/// if !line_numbers.contains(&line) {
/// continue;
/// }
///
/// // Process the line as usual...
/// }
/// }
/// ```
///
/// This optimization can significantly reduce the number of blocks that need to be processed
/// when there are many adjacent line numbers, improving performance for large files.