@@ -24,7 +24,7 @@ use crate::{
24
24
index_map_ext:: IndexMapExt ,
25
25
name:: { Name , ResolvedName } ,
26
26
resolved:: { self , Enum , TypedExpr , VariableStorage } ,
27
- source_files:: { Source , SourceFiles } ,
27
+ source_files:: Source ,
28
28
tag:: Tag ,
29
29
workspace:: fs:: FsNodeId ,
30
30
} ;
@@ -94,9 +94,12 @@ pub fn resolve<'a>(
94
94
. get_owning_module ( * real_file_id)
95
95
. unwrap_or ( * real_file_id) ;
96
96
97
- let type_aliases = ctx
98
- . type_search_ctxs
99
- . get_or_insert_with ( file_id, || TypeSearchCtx :: default ( ) ) ;
97
+ let imported_namespaces =
98
+ & ast_workspace. settings [ file. settings . unwrap_or_default ( ) . 0 ] . imported_namespaces ;
99
+
100
+ let type_aliases = ctx. type_search_ctxs . get_or_insert_with ( file_id, || {
101
+ TypeSearchCtx :: new ( imported_namespaces. clone ( ) , source_files)
102
+ } ) ;
100
103
101
104
for ( alias_name, alias) in file. type_aliases . iter ( ) {
102
105
type_aliases. put_type_alias ( alias_name. clone ( ) , alias, alias. source ) ?;
@@ -117,7 +120,6 @@ pub fn resolve<'a>(
117
120
for ( enum_name, enum_definition) in file. enums . iter ( ) {
118
121
let resolved_type = resolve_enum_backing_type (
119
122
type_search_ctx,
120
- source_files,
121
123
enum_definition. backing_type . as_ref ( ) ,
122
124
& mut used_aliases,
123
125
enum_definition. source ,
@@ -159,7 +161,6 @@ pub fn resolve<'a>(
159
161
resolved:: Field {
160
162
resolved_type : resolve_type (
161
163
type_search_ctx,
162
- source_files,
163
164
& field. ast_type ,
164
165
& mut used_aliases,
165
166
) ?,
@@ -195,18 +196,10 @@ pub fn resolve<'a>(
195
196
let type_search_ctx = ctx. type_search_ctxs . get_mut ( & file_id) . unwrap ( ) ;
196
197
197
198
for ( alias_name, alias) in file. type_aliases . iter ( ) {
198
- let resolved_type = resolve_type_or_undeclared (
199
- type_search_ctx,
200
- source_files,
201
- & alias. value ,
202
- & mut used_aliases,
203
- ) ?;
199
+ let resolved_type =
200
+ resolve_type_or_undeclared ( type_search_ctx, & alias. value , & mut used_aliases) ?;
204
201
205
- type_search_ctx. put_type (
206
- & Name :: plain ( alias_name. clone ( ) ) ,
207
- resolved_type. kind ,
208
- alias. source ,
209
- ) ?;
202
+ type_search_ctx. override_type ( & Name :: plain ( alias_name. clone ( ) ) , resolved_type. kind ) ;
210
203
}
211
204
}
212
205
@@ -223,12 +216,8 @@ pub fn resolve<'a>(
223
216
. get_or_insert_with ( file_id, || GlobalSearchCtx :: new ( ) ) ;
224
217
225
218
for global in file. global_variables . iter ( ) {
226
- let resolved_type = resolve_type (
227
- type_search_ctx,
228
- source_files,
229
- & global. ast_type ,
230
- & mut Default :: default ( ) ,
231
- ) ?;
219
+ let resolved_type =
220
+ resolve_type ( type_search_ctx, & global. ast_type , & mut Default :: default ( ) ) ?;
232
221
233
222
let global_ref = resolved_ast. globals . insert ( resolved:: GlobalVar {
234
223
name : global. name . clone ( ) ,
@@ -255,14 +244,9 @@ pub fn resolve<'a>(
255
244
256
245
let function_ref = resolved_ast. functions . insert ( resolved:: Function {
257
246
name : name. clone ( ) ,
258
- parameters : resolve_parameters (
259
- type_search_ctx,
260
- source_files,
261
- & function. parameters ,
262
- ) ?,
247
+ parameters : resolve_parameters ( type_search_ctx, & function. parameters ) ?,
263
248
return_type : resolve_type (
264
249
type_search_ctx,
265
- source_files,
266
250
& function. return_type ,
267
251
& mut Default :: default ( ) ,
268
252
) ?,
@@ -347,7 +331,6 @@ pub fn resolve<'a>(
347
331
for parameter in ast_function. parameters . required . iter ( ) {
348
332
let resolved_type = resolve_type (
349
333
type_search_ctx,
350
- source_files,
351
334
& parameter. ast_type ,
352
335
& mut Default :: default ( ) ,
353
336
) ?;
@@ -405,11 +388,10 @@ enum Initialized {
405
388
406
389
fn resolve_type_or_undeclared < ' a > (
407
390
type_search_ctx : & ' a TypeSearchCtx < ' _ > ,
408
- source_files : & SourceFiles ,
409
391
ast_type : & ' a ast:: Type ,
410
392
used_aliases_stack : & mut HashSet < ResolvedName > ,
411
393
) -> Result < resolved:: Type , ResolveError > {
412
- match resolve_type ( type_search_ctx, source_files , ast_type, used_aliases_stack) {
394
+ match resolve_type ( type_search_ctx, ast_type, used_aliases_stack) {
413
395
Ok ( inner) => Ok ( inner) ,
414
396
Err ( _) if ast_type. kind . allow_indirect_undefined ( ) => {
415
397
Ok ( resolved:: TypeKind :: Void . at ( ast_type. source ) )
@@ -420,7 +402,6 @@ fn resolve_type_or_undeclared<'a>(
420
402
421
403
fn resolve_type < ' a > (
422
404
type_search_ctx : & ' a TypeSearchCtx < ' _ > ,
423
- source_files : & SourceFiles ,
424
405
ast_type : & ' a ast:: Type ,
425
406
used_aliases_stack : & mut HashSet < ResolvedName > ,
426
407
) -> Result < resolved:: Type , ResolveError > {
@@ -429,51 +410,21 @@ fn resolve_type<'a>(
429
410
ast:: TypeKind :: Integer ( bits, sign) => Ok ( resolved:: TypeKind :: Integer ( * bits, * sign) ) ,
430
411
ast:: TypeKind :: CInteger ( integer, sign) => Ok ( resolved:: TypeKind :: CInteger ( * integer, * sign) ) ,
431
412
ast:: TypeKind :: Pointer ( inner) => {
432
- let inner = resolve_type_or_undeclared (
433
- type_search_ctx,
434
- source_files,
435
- inner,
436
- used_aliases_stack,
437
- ) ?;
413
+ let inner = resolve_type_or_undeclared ( type_search_ctx, inner, used_aliases_stack) ?;
438
414
439
415
Ok ( resolved:: TypeKind :: Pointer ( Box :: new ( inner) ) )
440
416
}
441
417
ast:: TypeKind :: Void => Ok ( resolved:: TypeKind :: Void ) ,
442
- ast:: TypeKind :: Named ( name) => {
443
- let resolved_name = ResolvedName :: new ( name) ;
444
-
445
- if let Some ( found) = type_search_ctx. find_type ( & resolved_name) {
446
- Ok ( found. clone ( ) )
447
- } else if let Some ( definition) = type_search_ctx. find_alias ( & resolved_name) {
448
- if used_aliases_stack. insert ( resolved_name. clone ( ) ) {
449
- let inner = resolve_type (
450
- type_search_ctx,
451
- source_files,
452
- & definition. value ,
453
- used_aliases_stack,
454
- ) ;
455
- used_aliases_stack. remove ( & resolved_name) ;
456
- inner. map ( |ty| ty. kind )
457
- } else {
458
- Err ( ResolveErrorKind :: RecursiveTypeAlias {
459
- name : name. to_string ( ) ,
460
- }
461
- . at ( definition. source ) )
462
- }
463
- } else {
464
- Err ( ResolveErrorKind :: UndeclaredType {
465
- name : name. to_string ( ) ,
466
- }
467
- . at ( ast_type. source ) )
468
- }
469
- }
418
+ ast:: TypeKind :: Named ( name) => match type_search_ctx. find_type ( name, used_aliases_stack) {
419
+ Ok ( found) => Ok ( found. into_owned ( ) ) ,
420
+ Err ( err) => Err ( err. into_resolve_error ( name, ast_type. source ) ) ,
421
+ } ,
470
422
ast:: TypeKind :: Floating ( size) => Ok ( resolved:: TypeKind :: Floating ( * size) ) ,
471
423
ast:: TypeKind :: AnonymousStruct ( ..) => todo ! ( "resolve anonymous struct type" ) ,
472
424
ast:: TypeKind :: AnonymousUnion ( ..) => todo ! ( "resolve anonymous union type" ) ,
473
425
ast:: TypeKind :: AnonymousEnum ( anonymous_enum) => {
474
426
let resolved_type = Box :: new ( resolve_enum_backing_type (
475
427
type_search_ctx,
476
- source_files,
477
428
anonymous_enum. backing_type . as_deref ( ) ,
478
429
& mut Default :: default ( ) ,
479
430
ast_type. source ,
@@ -490,12 +441,8 @@ fn resolve_type<'a>(
490
441
ast:: TypeKind :: FixedArray ( fixed_array) => {
491
442
if let ast:: ExprKind :: Integer ( integer) = & fixed_array. count . kind {
492
443
if let Ok ( size) = integer. value ( ) . try_into ( ) {
493
- let inner = resolve_type (
494
- type_search_ctx,
495
- source_files,
496
- & fixed_array. ast_type ,
497
- used_aliases_stack,
498
- ) ?;
444
+ let inner =
445
+ resolve_type ( type_search_ctx, & fixed_array. ast_type , used_aliases_stack) ?;
499
446
500
447
Ok ( resolved:: TypeKind :: FixedArray ( Box :: new (
501
448
resolved:: FixedArray { size, inner } ,
@@ -511,12 +458,8 @@ fn resolve_type<'a>(
511
458
let mut parameters = Vec :: with_capacity ( function_pointer. parameters . len ( ) ) ;
512
459
513
460
for parameter in function_pointer. parameters . iter ( ) {
514
- let resolved_type = resolve_type (
515
- type_search_ctx,
516
- source_files,
517
- & parameter. ast_type ,
518
- used_aliases_stack,
519
- ) ?;
461
+ let resolved_type =
462
+ resolve_type ( type_search_ctx, & parameter. ast_type , used_aliases_stack) ?;
520
463
521
464
parameters. push ( resolved:: Parameter {
522
465
name : parameter. name . clone ( ) ,
@@ -526,7 +469,6 @@ fn resolve_type<'a>(
526
469
527
470
let return_type = Box :: new ( resolve_type (
528
471
type_search_ctx,
529
- source_files,
530
472
& function_pointer. return_type ,
531
473
used_aliases_stack,
532
474
) ?) ;
@@ -545,7 +487,6 @@ fn resolve_type<'a>(
545
487
546
488
fn resolve_parameters (
547
489
type_search_ctx : & TypeSearchCtx < ' _ > ,
548
- source_files : & SourceFiles ,
549
490
parameters : & ast:: Parameters ,
550
491
) -> Result < resolved:: Parameters , ResolveError > {
551
492
let mut required = Vec :: with_capacity ( parameters. required . len ( ) ) ;
@@ -555,7 +496,6 @@ fn resolve_parameters(
555
496
name : parameter. name . clone ( ) ,
556
497
resolved_type : resolve_type (
557
498
type_search_ctx,
558
- source_files,
559
499
& parameter. ast_type ,
560
500
& mut Default :: default ( ) ,
561
501
) ?,
@@ -589,13 +529,12 @@ fn ensure_initialized(
589
529
590
530
fn resolve_enum_backing_type (
591
531
type_search_ctx : & TypeSearchCtx ,
592
- source_files : & SourceFiles ,
593
532
backing_type : Option < impl Borrow < Type > > ,
594
533
used_aliases : & mut HashSet < ResolvedName > ,
595
534
source : Source ,
596
535
) -> Result < resolved:: Type , ResolveError > {
597
536
if let Some ( backing_type) = backing_type. as_ref ( ) . map ( Borrow :: borrow) {
598
- resolve_type ( type_search_ctx, source_files , backing_type, used_aliases)
537
+ resolve_type ( type_search_ctx, backing_type, used_aliases)
599
538
} else {
600
539
Ok ( resolved:: TypeKind :: Integer ( IntegerBits :: Bits64 , IntegerSign :: Unsigned ) . at ( source) )
601
540
}
0 commit comments