@@ -14,24 +14,51 @@ pub struct CrateId(pub u32);
1414
1515#[ derive( Debug , Clone , Default , PartialEq , Eq ) ]
1616pub struct CrateGraph {
17- crate_roots : FxHashMap < CrateId , FileId > ,
17+ arena : FxHashMap < CrateId , CrateData > ,
1818}
1919
20- impl CrateGraph {
21- pub fn crate_root ( & self , crate_id : CrateId ) -> FileId {
22- self . crate_roots [ & crate_id]
20+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
21+ struct CrateData {
22+ file_id : FileId ,
23+ deps : Vec < Dependency > ,
24+ }
25+
26+ impl CrateData {
27+ fn new ( file_id : FileId ) -> CrateData {
28+ CrateData {
29+ file_id,
30+ deps : Vec :: new ( ) ,
31+ }
32+ }
33+
34+ fn add_dep ( & mut self , dep : CrateId ) {
35+ self . deps . push ( Dependency { crate_ : dep } )
2336 }
37+ }
38+
39+ #[ derive( Debug , Clone , PartialEq , Eq ) ]
40+ pub struct Dependency {
41+ crate_ : CrateId ,
42+ }
43+
44+ impl CrateGraph {
2445 pub fn add_crate_root ( & mut self , file_id : FileId ) -> CrateId {
25- let crate_id = CrateId ( self . crate_roots . len ( ) as u32 ) ;
26- let prev = self . crate_roots . insert ( crate_id, file_id) ;
46+ let crate_id = CrateId ( self . arena . len ( ) as u32 ) ;
47+ let prev = self . arena . insert ( crate_id, CrateData :: new ( file_id) ) ;
2748 assert ! ( prev. is_none( ) ) ;
2849 crate_id
2950 }
51+ pub fn add_dep ( & mut self , from : CrateId , to : CrateId ) {
52+ self . arena . get_mut ( & from) . unwrap ( ) . add_dep ( to)
53+ }
54+ pub fn crate_root ( & self , crate_id : CrateId ) -> FileId {
55+ self . arena [ & crate_id] . file_id
56+ }
3057 pub fn crate_id_for_crate_root ( & self , file_id : FileId ) -> Option < CrateId > {
3158 let ( & crate_id, _) = self
32- . crate_roots
59+ . arena
3360 . iter ( )
34- . find ( |( _crate_id, & root_id ) | root_id == file_id) ?;
61+ . find ( |( _crate_id, data ) | data . file_id == file_id) ?;
3562 Some ( crate_id)
3663 }
3764}
0 commit comments