@@ -2213,30 +2213,30 @@ impl Symbol {
2213
2213
let mut iter: Vec < Rc < RefCell < Symbol > > > = Vec :: new ( ) ;
2214
2214
match self {
2215
2215
Symbol :: File ( _) => {
2216
- for symbol in self . iter_symbols ( ) . flat_map ( |( name , hashmap) | hashmap. into_iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2216
+ for symbol in self . iter_symbols ( ) . flat_map ( |( _ , hashmap) | hashmap. into_iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2217
2217
iter. push ( symbol. clone ( ) ) ;
2218
2218
}
2219
2219
} ,
2220
2220
Symbol :: Class ( _) => {
2221
- for symbol in self . iter_symbols ( ) . flat_map ( |( name , hashmap) | hashmap. into_iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2221
+ for symbol in self . iter_symbols ( ) . flat_map ( |( _ , hashmap) | hashmap. into_iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2222
2222
iter. push ( symbol. clone ( ) ) ;
2223
2223
}
2224
2224
} ,
2225
2225
Symbol :: Function ( _) => {
2226
- for symbol in self . iter_symbols ( ) . flat_map ( |( name , hashmap) | hashmap. iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2226
+ for symbol in self . iter_symbols ( ) . flat_map ( |( _ , hashmap) | hashmap. iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2227
2227
iter. push ( symbol. clone ( ) ) ;
2228
2228
}
2229
2229
} ,
2230
2230
Symbol :: Package ( PackageSymbol :: Module ( m) ) => {
2231
- for symbol in self . iter_symbols ( ) . flat_map ( |( name , hashmap) | hashmap. iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2231
+ for symbol in self . iter_symbols ( ) . flat_map ( |( _ , hashmap) | hashmap. iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2232
2232
iter. push ( symbol. clone ( ) ) ;
2233
2233
}
2234
2234
for symbol in m. module_symbols . values ( ) . cloned ( ) {
2235
2235
iter. push ( symbol. clone ( ) ) ;
2236
2236
}
2237
2237
} ,
2238
2238
Symbol :: Package ( PackageSymbol :: PythonPackage ( p) ) => {
2239
- for symbol in self . iter_symbols ( ) . flat_map ( |( name , hashmap) | hashmap. iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2239
+ for symbol in self . iter_symbols ( ) . flat_map ( |( _ , hashmap) | hashmap. iter ( ) . flat_map ( |( _, vec) | vec. clone ( ) ) ) {
2240
2240
iter. push ( symbol. clone ( ) ) ;
2241
2241
}
2242
2242
for symbol in p. module_symbols . values ( ) . cloned ( ) {
@@ -2260,77 +2260,81 @@ impl Symbol {
2260
2260
2261
2261
//store in result all available members for symbol: sub symbols, base class elements and models symbols
2262
2262
//TODO is order right of Vec in HashMap? if we take first or last in it, do we have the last effective value?
2263
- pub fn all_members ( symbol : & Rc < RefCell < Symbol > > , session : & mut SessionInfo , result : & mut HashMap < OYarn , Vec < ( Rc < RefCell < Symbol > > , Option < OYarn > ) > > , with_co_models : bool , only_fields : bool , only_methods : bool , from_module : Option < Rc < RefCell < Symbol > > > , acc : & mut Option < HashSet < Tree > > , is_super : bool ) {
2264
- if acc. is_none ( ) {
2265
- * acc = Some ( HashSet :: new ( ) ) ;
2266
- }
2263
+ pub fn all_members (
2264
+ symbol : & Rc < RefCell < Symbol > > ,
2265
+ session : & mut SessionInfo ,
2266
+ with_co_models : bool ,
2267
+ only_fields : bool ,
2268
+ only_methods : bool ,
2269
+ from_module : Option < Rc < RefCell < Symbol > > > ,
2270
+ is_super : bool ) -> HashMap < OYarn , Vec < ( Rc < RefCell < Symbol > > , Option < OYarn > ) > > {
2271
+ let mut result: HashMap < OYarn , Vec < ( Rc < RefCell < Symbol > > , Option < OYarn > ) > > = HashMap :: new ( ) ;
2272
+ let mut acc: HashSet < Tree > = HashSet :: new ( ) ;
2273
+ Symbol :: _all_members ( symbol, session, & mut result, with_co_models, only_fields, only_methods, from_module, & mut acc, is_super) ;
2274
+ return result;
2275
+ }
2276
+ fn _all_members ( symbol : & Rc < RefCell < Symbol > > , session : & mut SessionInfo , result : & mut HashMap < OYarn , Vec < ( Rc < RefCell < Symbol > > , Option < OYarn > ) > > , with_co_models : bool , only_fields : bool , only_methods : bool , from_module : Option < Rc < RefCell < Symbol > > > , acc : & mut HashSet < Tree > , is_super : bool ) {
2267
2277
let tree = symbol. borrow ( ) . get_tree ( ) ;
2268
- if acc. as_mut ( ) . unwrap ( ) . contains ( & tree) {
2278
+ if acc. contains ( & tree) {
2269
2279
return ;
2270
2280
}
2271
- acc. as_mut ( ) . unwrap ( ) . insert ( tree) ;
2281
+ acc. insert ( tree) ;
2282
+ let mut append_result = |symbol : Rc < RefCell < Symbol > > , dep : Option < OYarn > | {
2283
+ let name = symbol. borrow ( ) . name ( ) . clone ( ) ;
2284
+ if let Some ( vec) = result. get_mut ( & name) {
2285
+ vec. push ( ( symbol, dep) ) ;
2286
+ } else {
2287
+ result. insert ( name. clone ( ) , vec ! [ ( symbol, dep) ] ) ;
2288
+ }
2289
+ } ;
2272
2290
let typ = symbol. borrow ( ) . typ ( ) ;
2273
2291
match typ {
2274
2292
SymType :: CLASS => {
2275
2293
// Skip current class symbols for super
2276
2294
if !is_super{
2277
2295
for symbol in symbol. borrow ( ) . all_symbols ( ) {
2278
- if only_fields && !symbol. borrow ( ) . is_field ( session) {
2296
+ if ( only_fields && !symbol. borrow ( ) . is_field ( session) ) || ( only_methods && symbol . borrow ( ) . typ ( ) != SymType :: FUNCTION ) {
2279
2297
continue ;
2280
2298
}
2281
- if only_methods && symbol. borrow ( ) . typ ( ) != SymType :: FUNCTION {
2282
- continue ;
2283
- }
2284
- let name = symbol. borrow ( ) . name ( ) . clone ( ) ;
2285
- if let Some ( vec) = result. get_mut ( & name) {
2286
- vec. push ( ( symbol, None ) ) ;
2287
- } else {
2288
- result. insert ( name. clone ( ) , vec ! [ ( symbol, None ) ] ) ;
2289
- }
2299
+ append_result ( symbol, None ) ;
2290
2300
}
2291
2301
}
2302
+ let mut bases: PtrWeakHashSet < Weak < RefCell < Symbol > > > = PtrWeakHashSet :: new ( ) ;
2303
+ symbol. borrow ( ) . as_class_sym ( ) . bases . iter ( ) . for_each ( |base| {
2304
+ base. upgrade ( ) . map ( |b| bases. insert ( b) ) ;
2305
+ } ) ;
2292
2306
if with_co_models {
2293
- let sym = symbol. borrow ( ) ;
2294
- let model_data = sym. as_class_sym ( ) . _model . as_ref ( ) ;
2295
- if let Some ( model_data) = model_data {
2296
- if let Some ( model) = session. sync_odoo . models . get ( & model_data. name ) . cloned ( ) {
2297
- for ( model_sym, dependency) in model. borrow ( ) . all_symbols ( session, from_module. clone ( ) , true ) {
2298
- if dependency. is_none ( ) && !Rc :: ptr_eq ( symbol, & model_sym) {
2299
- for s in model_sym. borrow ( ) . all_symbols ( ) {
2300
- if only_fields && !s. borrow ( ) . is_field ( session) {
2301
- continue ;
2302
- }
2303
- if only_methods && symbol. borrow ( ) . typ ( ) != SymType :: FUNCTION {
2304
- continue ;
2305
- }
2306
- let name = s. borrow ( ) . name ( ) . clone ( ) ;
2307
- if let Some ( vec) = result. get_mut ( & name) {
2308
- vec. push ( ( s, Some ( model_sym. borrow ( ) . name ( ) . clone ( ) ) ) ) ;
2309
- } else {
2310
- result. insert ( name. clone ( ) , vec ! [ ( s, Some ( model_sym. borrow( ) . name( ) . clone( ) ) ) ] ) ;
2311
- }
2312
- }
2313
- //add fields from _inherits
2314
- if let Some ( model_data) = model_sym. borrow ( ) . as_class_sym ( ) . _model . as_ref ( ) {
2315
- for ( inherits_model, inherits_field) in model_data. inherits . iter ( ) {
2316
- let inherits_model_sym = session. sync_odoo . models . get ( inherits_model) . cloned ( ) ;
2317
- if let Some ( inherits_model_sym) = inherits_model_sym {
2318
- for ( model_symbol, deps) in inherits_model_sym. borrow ( ) . all_symbols ( session, from_module. clone ( ) , true ) . iter ( ) . filter ( |( x, deps) | deps. is_none ( ) ) {
2319
- for ( field_name, field_symbols) in Symbol :: all_fields ( & model_symbol, session, from_module. clone ( ) ) {
2320
- for ( s, deps) in field_symbols. iter ( ) . filter ( |( x, deps) | deps. is_none ( ) ) {
2321
- if let Some ( vec) = result. get_mut ( & field_name) {
2322
- vec. push ( ( s. clone ( ) , Some ( model_sym. borrow ( ) . name ( ) . clone ( ) ) ) ) ;
2323
- } else {
2324
- result. insert ( field_name. clone ( ) , vec ! [ ( s. clone( ) , Some ( model_sym. borrow( ) . name( ) . clone( ) ) ) ] ) ;
2325
- }
2326
- }
2327
- }
2328
- }
2329
- }
2330
- }
2331
- }
2332
- }
2307
+ let Some ( model) = symbol. borrow ( ) . as_class_sym ( ) . _model . as_ref ( ) . and_then ( |model_data|
2308
+ session. sync_odoo . models . get ( & model_data. name ) . cloned ( )
2309
+ ) else {
2310
+ return ;
2311
+ } ;
2312
+ // no recursion because it is handled in all_symbols_inherits
2313
+ let ( model_symbols, model_inherits_symbols) = model. borrow ( ) . all_symbols_inherits ( session, from_module. clone ( ) ) ;
2314
+ for ( model_sym, dependency) in model_symbols {
2315
+ if dependency. is_some ( ) || Rc :: ptr_eq ( symbol, & model_sym) {
2316
+ continue ;
2317
+ }
2318
+ model_sym. borrow ( ) . as_class_sym ( ) . bases . iter ( ) . for_each ( |base| {
2319
+ base. upgrade ( ) . map ( |b| bases. insert ( b) ) ;
2320
+ } ) ;
2321
+ for s in model_sym. borrow ( ) . all_symbols ( ) {
2322
+ if ( only_fields && !s. borrow ( ) . is_field ( session) ) || ( only_methods && s. borrow ( ) . typ ( ) != SymType :: FUNCTION ) {
2323
+ continue ;
2333
2324
}
2325
+ append_result ( s, Some ( model_sym. borrow ( ) . name ( ) . clone ( ) ) ) ;
2326
+ }
2327
+ }
2328
+ for ( model_sym, dependency) in model_inherits_symbols {
2329
+ if dependency. is_some ( ) || Rc :: ptr_eq ( symbol, & model_sym) {
2330
+ continue ;
2331
+ }
2332
+ model_sym. borrow ( ) . as_class_sym ( ) . bases . iter ( ) . for_each ( |base| {
2333
+ base. upgrade ( ) . map ( |b| bases. insert ( b) ) ;
2334
+ } ) ;
2335
+ // for inherits symbols, we only add fields
2336
+ for s in model_sym. borrow ( ) . all_symbols ( ) . filter ( |s| s. borrow ( ) . is_field ( session) ) {
2337
+ append_result ( s, Some ( model_sym. borrow ( ) . name ( ) . clone ( ) ) ) ;
2334
2338
}
2335
2339
}
2336
2340
}
@@ -2339,23 +2343,14 @@ impl Symbol {
2339
2343
//no comodel as we will search for co-model from original class (what about overrided _name?)
2340
2344
//TODO what about base of co-models classes?
2341
2345
if let Some ( base) = base. upgrade ( ) {
2342
- Symbol :: all_members ( & base, session, result, false , only_fields, only_methods, from_module. clone ( ) , acc, false ) ;
2346
+ Symbol :: _all_members ( & base, session, result, false , only_fields, only_methods, from_module. clone ( ) , acc, false ) ;
2343
2347
}
2344
2348
}
2345
2349
} ,
2346
- _ => {
2347
- for symbol in symbol. borrow ( ) . all_symbols ( ) {
2348
- if only_fields && !symbol. borrow ( ) . is_field ( session) {
2349
- continue ;
2350
- }
2351
- let name = symbol. borrow ( ) . name ( ) . clone ( ) ;
2352
- if let Some ( vec) = result. get_mut ( & name) {
2353
- vec. push ( ( symbol, None ) ) ;
2354
- } else {
2355
- result. insert ( name. clone ( ) , vec ! [ ( symbol, None ) ] ) ;
2356
- }
2357
- }
2358
- }
2350
+ // if not class just add it to result
2351
+ _ => symbol. borrow ( ) . all_symbols ( ) . for_each ( |s|
2352
+ if !( only_fields && !s. borrow ( ) . is_field ( session) ) { append_result ( s, None ) }
2353
+ )
2359
2354
}
2360
2355
}
2361
2356
@@ -2596,9 +2591,7 @@ impl Symbol {
2596
2591
}
2597
2592
2598
2593
pub fn all_fields ( symbol : & Rc < RefCell < Symbol > > , session : & mut SessionInfo , from_module : Option < Rc < RefCell < Symbol > > > ) -> HashMap < OYarn , Vec < ( Rc < RefCell < Symbol > > , Option < OYarn > ) > > {
2599
- let mut all_fields = HashMap :: new ( ) ;
2600
- Symbol :: all_members ( symbol, session, & mut all_fields, true , true , false , from_module. clone ( ) , & mut None , false ) ;
2601
- all_fields
2594
+ Symbol :: all_members ( symbol, session, true , true , false , from_module. clone ( ) , false )
2602
2595
}
2603
2596
2604
2597
/* similar to get_symbol: will return the symbol that is under this one with the specified name.
0 commit comments