Skip to content

Commit 5d58fa6

Browse files
committed
Semantic type diffing support
1 parent 97b399c commit 5d58fa6

File tree

6 files changed

+1863
-1
lines changed

6 files changed

+1863
-1
lines changed

crates/semantic-analysis/Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ path = "../../examples/type_extraction_demo.rs"
3636
[[example]]
3737
name = "dependency_graph_demo"
3838
path = "../../examples/dependency_graph_demo.rs"
39+
40+
[[example]]
41+
name = "function_signature_demo"
42+
path = "../../examples/function_signature_demo.rs"

crates/semantic-analysis/README.md

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,27 @@ Advanced semantic analysis engine that provides comprehensive symbol resolution,
5454
- Dependency hotspot identification
5555
- **Cross-file dependency tracking** with import graph construction
5656

57+
### 🔍 **Function Signature Extraction and Analysis**
58+
- **Comprehensive signature extraction**:
59+
- Enhanced function signatures with detailed metadata
60+
- Parameter analysis with type information and annotations
61+
- Generic parameter extraction with bounds and variance
62+
- Return type analysis with complex type support
63+
- **Function classification and analysis**:
64+
- Function type detection (method, constructor, getter/setter, etc.)
65+
- Visibility and modifier extraction
66+
- Complexity metrics calculation (cyclomatic, cognitive, nesting depth)
67+
- Dependency tracking (function calls, variable access)
68+
- **Advanced similarity comparison**:
69+
- Weighted similarity scoring (name 40%, parameters 30%, return type 20%, modifiers 10%)
70+
- Exact match detection via signature hashing
71+
- Normalized matching for refactoring detection
72+
- Cross-language signature normalization
73+
- **Overload detection and analysis**:
74+
- Function overload grouping and analysis
75+
- Parameter variation tracking
76+
- API evolution support
77+
5778
### 🎯 **Scope Management**
5879
- **Hierarchical scope resolution** (global → file → class → function → block)
5980
- **Symbol shadowing detection** and resolution
@@ -268,6 +289,99 @@ for hotspot in &analysis.hotspots {
268289
}
269290
```
270291

292+
### Function Signature Extraction and Analysis
293+
294+
```rust
295+
use smart_diff_semantic::{
296+
FunctionSignatureExtractor, FunctionSignatureConfig,
297+
FunctionType, Visibility
298+
};
299+
300+
// Create function signature extractor
301+
let config = FunctionSignatureConfig {
302+
include_private: true,
303+
include_static: true,
304+
include_abstract: true,
305+
include_constructors: true,
306+
include_accessors: true,
307+
normalize_parameter_names: false,
308+
extract_complexity_metrics: true,
309+
max_parameter_count: 20,
310+
};
311+
312+
let mut extractor = FunctionSignatureExtractor::new(Language::Java, config);
313+
314+
// Extract function signatures
315+
let extraction_result = extractor.extract_signatures("MyClass.java", &parse_result)?;
316+
317+
// Analyze extracted signatures
318+
for signature in &extraction_result.signatures {
319+
println!("Function: {} ({})", signature.name, format!("{:?}", signature.function_type));
320+
println!(" Qualified name: {}", signature.qualified_name);
321+
println!(" Visibility: {:?}", signature.visibility);
322+
println!(" Parameters: {}", signature.parameters.len());
323+
println!(" Return type: {}", signature.return_type.to_string());
324+
325+
if let Some(metrics) = &signature.complexity_metrics {
326+
println!(" Complexity: cyclomatic={}, cognitive={}, loc={}",
327+
metrics.cyclomatic_complexity,
328+
metrics.cognitive_complexity,
329+
metrics.lines_of_code);
330+
}
331+
}
332+
333+
// Compare function signatures
334+
let similarity = extractor.calculate_similarity(&signature1, &signature2);
335+
println!("Overall similarity: {:.3}", similarity.overall_similarity);
336+
println!("Name similarity: {:.3}", similarity.name_similarity);
337+
println!("Parameter similarity: {:.3}", similarity.parameter_similarity);
338+
println!("Is potential match: {}", similarity.is_potential_match);
339+
340+
// Find similar functions
341+
let similar_functions = extractor.find_similar_functions(
342+
&target_signature,
343+
&all_signatures,
344+
0.7 // minimum similarity threshold
345+
);
346+
347+
for (similar_func, similarity) in similar_functions {
348+
println!("Similar function: {} (similarity: {:.3})",
349+
similar_func.name,
350+
similarity.overall_similarity);
351+
}
352+
353+
// Detect exact matches and potential renames
354+
let exact_matches = extractor.find_exact_matches(&target_signature, &all_signatures);
355+
let potential_renames = extractor.find_potential_renames(&target_signature, &all_signatures);
356+
```
357+
358+
### Function Signature Statistics
359+
360+
```rust
361+
// Get extraction statistics
362+
let stats = &extraction_result.extraction_stats;
363+
println!("Extraction Statistics:");
364+
println!(" Total functions: {}", stats.total_functions);
365+
println!(" Public functions: {}", stats.public_functions);
366+
println!(" Private functions: {}", stats.private_functions);
367+
println!(" Static functions: {}", stats.static_functions);
368+
println!(" Abstract functions: {}", stats.abstract_functions);
369+
println!(" Constructors: {}", stats.constructors);
370+
println!(" Overloaded functions: {}", stats.overloaded_functions);
371+
println!(" Generic functions: {}", stats.generic_functions);
372+
println!(" Complex functions: {}", stats.complex_functions);
373+
374+
// Analyze overloaded functions
375+
for (name, overloads) in &extraction_result.overloaded_functions {
376+
if overloads.len() > 1 {
377+
println!("Overloaded function '{}' has {} variants:", name, overloads.len());
378+
for (i, overload) in overloads.iter().enumerate() {
379+
println!(" {}. {} parameters", i + 1, overload.parameters.len());
380+
}
381+
}
382+
}
383+
```
384+
271385
## Configuration
272386

273387
### SymbolResolverConfig
@@ -412,6 +526,23 @@ This demonstrates:
412526
- Dependency hotspot identification
413527
- Cross-file dependency tracking
414528

529+
### Function Signature Demo
530+
531+
Run the comprehensive function signature extraction demo:
532+
533+
```bash
534+
cargo run --example function_signature_demo
535+
```
536+
537+
This demonstrates:
538+
- Enhanced function signature extraction with metadata
539+
- Parameter analysis with type information and annotations
540+
- Generic parameter extraction with bounds and variance
541+
- Function complexity metrics calculation
542+
- Advanced similarity comparison algorithms
543+
- Overload detection and analysis
544+
- Cross-language signature normalization
545+
415546
## Testing
416547

417548
Run the test suite:

0 commit comments

Comments
 (0)