1- use crate :: trap:: TrapId ;
21use anyhow:: Context ;
3- use itertools:: Itertools ;
4- use log:: info;
5- use ra_ap_hir:: db:: DefDatabase ;
6- use ra_ap_hir:: Crate ;
7- use ra_ap_load_cargo:: { load_workspace_at, LoadCargoConfig , ProcMacroServerChoice } ;
8- use ra_ap_project_model:: CargoConfig ;
9- use ra_ap_project_model:: RustLibSource ;
10- use ra_ap_vfs:: AbsPathBuf ;
11- use std:: path:: PathBuf ;
12-
2+ use ra_ap_ide_db:: line_index:: LineIndex ;
133mod archive;
144mod config;
155pub mod generated;
166mod translate;
177pub mod trap;
188
19- fn find_project_manifests (
20- files : & [ PathBuf ] ,
21- ) -> anyhow:: Result < Vec < ra_ap_project_model:: ProjectManifest > > {
22- let current = std:: env:: current_dir ( ) ?;
23- let abs_files: Vec < _ > = files
24- . iter ( )
25- . map ( |path| AbsPathBuf :: assert_utf8 ( current. join ( path) ) )
26- . collect ( ) ;
27- let ret = ra_ap_project_model:: ProjectManifest :: discover_all ( & abs_files) ;
28- info ! (
29- "found manifests: {}" ,
30- ret. iter( ) . map( |m| format!( "{m}" ) ) . join( ", " )
31- ) ;
32- Ok ( ret)
33- }
34-
359fn main ( ) -> anyhow:: Result < ( ) > {
3610 let cfg = config:: Config :: extract ( ) . context ( "failed to load configuration" ) ?;
3711 stderrlog:: new ( )
@@ -43,52 +17,20 @@ fn main() -> anyhow::Result<()> {
4317 let archiver = archive:: Archiver {
4418 root : cfg. source_archive_dir ,
4519 } ;
46-
47- let config = CargoConfig {
48- sysroot : Some ( RustLibSource :: Discover ) ,
49- target_dir : ra_ap_paths:: Utf8PathBuf :: from_path_buf ( cfg. scratch_dir )
50- . map ( |x| x. join ( "target" ) )
51- . ok ( ) ,
52- ..Default :: default ( )
53- } ;
54- let progress = |t| ( log:: info!( "progress: {}" , t) ) ;
55- let load_config = LoadCargoConfig {
56- load_out_dirs_from_check : true ,
57- with_proc_macro_server : ProcMacroServerChoice :: Sysroot ,
58- prefill_caches : false ,
59- } ;
60- let projects = find_project_manifests ( & cfg. inputs ) . context ( "loading inputs" ) ?;
61- for project in projects {
62- let ( db, vfs, _macro_server) = load_workspace_at (
63- project. manifest_path ( ) . as_ref ( ) ,
64- & config,
65- & load_config,
66- & progress,
67- ) ?;
68-
69- let crates = <dyn DefDatabase >:: crate_graph ( & db) ;
70- for crate_id in crates. iter ( ) {
71- let krate = Crate :: from ( crate_id) ;
72- if !cfg. extract_dependencies && !krate. origin ( & db) . is_local ( ) {
73- continue ;
74- }
75- let name = krate. display_name ( & db) ;
76- let crate_name = name
77- . as_ref ( )
78- . map ( |n| n. canonical_name ( ) . as_str ( ) )
79- . unwrap_or ( "" ) ;
80- let trap = traps. create (
81- "crates" ,
82- & PathBuf :: from ( format ! (
83- "/{}_{}" ,
84- crate_name,
85- crate_id. into_raw( ) . into_u32( )
86- ) ) ,
87- ) ;
88- translate:: CrateTranslator :: new ( & db, trap, & krate, & vfs, & archiver)
89- . emit_crate ( )
90- . context ( "writing trap file" ) ?;
91- }
20+ for file in cfg. inputs {
21+ let file = std:: path:: absolute ( & file) . unwrap_or ( file) ;
22+ let file = std:: fs:: canonicalize ( & file) . unwrap_or ( file) ;
23+ archiver. archive ( & file) ;
24+ let input = std:: fs:: read ( & file) ?;
25+ let input = String :: from_utf8 ( input) ?;
26+ let line_index = LineIndex :: new ( & input) ;
27+ let display_path = file. to_string_lossy ( ) ;
28+ let mut trap = traps. create ( "source" , & file) ;
29+ let label = trap. emit_file ( & file) ;
30+ translate:: SourceFileTranslator :: new ( trap, label, line_index)
31+ . extract ( & display_path, & input)
32+ . context ( "writing trap file" ) ?;
9233 }
34+
9335 Ok ( ( ) )
9436}
0 commit comments