use std::sync::Arc;
use wootype::core::{CrossPackageIndex, CrossPackageNavigator, ModuleResolver, SymbolId};
use wootype::salsa_full::{ChangeSet, ChangeType, DependencyGraph, IncrementalProcessor};
fn main() {
println!("=== wootype Feature Demo ===\n");
println!("1. Go Modules Support");
println!(" - Parsing go.mod files");
println!(" - Resolving imports with replace directives");
println!(" - Standard library detection");
let resolver = ModuleResolver::new();
let fmt_result = resolver.resolve_import("fmt");
println!(" - Import 'fmt' resolved: {:?}", fmt_result.is_some());
let net_http_result = resolver.resolve_import("net/http");
println!(
" - Import 'net/http' resolved: {:?}",
net_http_result.is_some()
);
let external_result = resolver.resolve_import("github.com/example/foo");
println!(
" - Import 'github.com/example/foo' resolved: {:?}",
external_result.is_some()
);
println!();
println!("2. Cross-package Code Navigation");
println!(" - Global symbol index");
println!(" - Definition lookup");
println!(" - Dependency graph");
let index = Arc::new(CrossPackageIndex::new());
let navigator = CrossPackageNavigator::new(index.clone());
let symbol = SymbolId::new(42);
let location = wootype::core::xpackage::SymbolLocation {
package: Arc::from("github.com/example/mypackage"),
file: std::path::PathBuf::from("/project/mypackage/foo.go"),
line: 10,
column: 5,
};
index.register_symbol(symbol, location);
let found = navigator.goto_definition(symbol);
println!(" - Symbol definition found: {:?}", found.is_some());
if let Some(loc) = found {
println!(" Package: {}", loc.package);
println!(" File: {:?}", loc.file);
println!(" Line: {}", loc.line);
}
println!();
println!("3. Incremental Update Optimization");
println!(" - Fine-grained dependency tracking");
println!(" - Parallel change processing");
println!(" - Affected file computation");
let graph = Arc::new(DependencyGraph::new());
let processor = IncrementalProcessor::new(graph.clone());
let mut changes = ChangeSet {
changed_files: std::collections::HashSet::new(),
changed_symbols: std::collections::HashSet::new(),
change_type: ChangeType::FileContent,
};
changes
.changed_files
.insert(std::path::PathBuf::from("/project/main.go"));
graph.register_symbol(
&std::path::PathBuf::from("/project/utils.go"),
"Helper".to_string(),
);
let affected = graph.affected_files(&changes);
println!(" - Affected files count: {}", affected.len());
println!(" - Changes processed in parallel");
println!("\n=== Demo Complete ===");
}