16
16
*/
17
17
18
18
pub ( crate ) mod payload;
19
+ pub ( crate ) mod scope_resolver_globals;
19
20
mod tests;
20
21
21
22
use std:: collections:: HashMap ;
@@ -50,7 +51,6 @@ use crate::codemap::CodeMap;
50
51
use crate :: codemap:: Span ;
51
52
use crate :: environment:: names:: MutableNames ;
52
53
use crate :: environment:: slots:: ModuleSlotId ;
53
- use crate :: environment:: Globals ;
54
54
use crate :: environment:: Module ;
55
55
use crate :: errors:: did_you_mean:: did_you_mean;
56
56
use crate :: eval:: compiler:: def:: CopySlotFromParent ;
@@ -63,6 +63,7 @@ use crate::eval::compiler::scope::payload::CstPayload;
63
63
use crate :: eval:: compiler:: scope:: payload:: CstStmt ;
64
64
use crate :: eval:: compiler:: scope:: payload:: CstStmtFromAst ;
65
65
use crate :: eval:: compiler:: scope:: payload:: CstTypeExpr ;
66
+ use crate :: eval:: compiler:: scope:: scope_resolver_globals:: ScopeResolverGlobals ;
66
67
use crate :: eval:: runtime:: slots:: LocalSlotIdCapturedOrNot ;
67
68
use crate :: syntax:: Dialect ;
68
69
use crate :: typing:: error:: InternalError ;
@@ -93,7 +94,7 @@ struct ModuleScopeBuilder<'a> {
93
94
locals : Vec < ScopeId > ,
94
95
unscopes : Vec < Unscope > ,
95
96
codemap : FrozenRef < ' static , CodeMap > ,
96
- globals : FrozenRef < ' static , Globals > ,
97
+ globals : ScopeResolverGlobals ,
97
98
errors : Vec < EvalException > ,
98
99
top_level_stmt_count : usize ,
99
100
}
@@ -265,7 +266,7 @@ impl<'f> ModuleScopeBuilder<'f> {
265
266
frozen_heap : & ' f FrozenHeap ,
266
267
loads : & HashMap < String , Interface > ,
267
268
stmt : AstStmt ,
268
- globals : FrozenRef < ' static , Globals > ,
269
+ globals : ScopeResolverGlobals ,
269
270
codemap : FrozenRef < ' static , CodeMap > ,
270
271
dialect : & Dialect ,
271
272
) -> ( CstStmt , ModuleScopeBuilder < ' f > ) {
@@ -371,7 +372,7 @@ impl<'f> ModuleScopes<'f> {
371
372
frozen_heap : & ' f FrozenHeap ,
372
373
loads : & HashMap < String , Interface > ,
373
374
stmt : AstStmt ,
374
- globals : FrozenRef < ' static , Globals > ,
375
+ globals : ScopeResolverGlobals ,
375
376
codemap : FrozenRef < ' static , CodeMap > ,
376
377
dialect : & Dialect ,
377
378
) -> anyhow:: Result < ModuleScopes < ' f > > {
@@ -388,7 +389,7 @@ impl<'f> ModuleScopes<'f> {
388
389
frozen_heap : & ' f FrozenHeap ,
389
390
loads : & HashMap < String , Interface > ,
390
391
stmt : AstStmt ,
391
- globals : FrozenRef < ' static , Globals > ,
392
+ globals : ScopeResolverGlobals ,
392
393
codemap : FrozenRef < ' static , CodeMap > ,
393
394
dialect : & Dialect ,
394
395
) -> ( Vec < EvalException > , ModuleScopes < ' f > ) {
@@ -635,20 +636,23 @@ impl<'f> ModuleScopeBuilder<'f> {
635
636
) ;
636
637
}
637
638
638
- fn current_scope_all_visible_names_for_did_you_mean ( & self ) -> Vec < FrozenStringValue > {
639
+ fn current_scope_all_visible_names_for_did_you_mean ( & self ) -> Option < Vec < String > > {
639
640
// It is OK to return non-unique identifiers
640
- let mut r: Vec < FrozenStringValue > = Vec :: new ( ) ;
641
+ let mut r: Vec < String > = Vec :: new ( ) ;
641
642
for & scope_id in self . locals . iter ( ) . rev ( ) {
642
643
let scope = self . scope_data . get_scope ( scope_id) ;
643
- r. extend ( scope. mp . keys ( ) . copied ( ) ) ;
644
+ r. extend ( scope. mp . keys ( ) . map ( |s| s . as_str ( ) . to_owned ( ) ) ) ;
644
645
}
645
- r. extend ( self . module_bindings . keys ( ) . copied ( ) ) ;
646
- r. extend ( self . globals . names ( ) ) ;
647
- r
646
+ r. extend ( self . module_bindings . keys ( ) . map ( |s| s . as_str ( ) . to_owned ( ) ) ) ;
647
+ r. extend ( self . globals . names ( ) ? ) ;
648
+ Some ( r )
648
649
}
649
650
651
+ #[ cold]
650
652
fn variable_not_found_err ( & self , ident : & CstIdent ) -> EvalException {
651
- let variants = self . current_scope_all_visible_names_for_did_you_mean ( ) ;
653
+ let variants = self
654
+ . current_scope_all_visible_names_for_did_you_mean ( )
655
+ . unwrap_or ( Vec :: new ( ) ) ;
652
656
let better = did_you_mean (
653
657
ident. node . ident . as_str ( ) ,
654
658
variants. iter ( ) . map ( |s| s. as_str ( ) ) ,
@@ -672,7 +676,7 @@ impl<'f> ModuleScopeBuilder<'f> {
672
676
let resolved = match self . get_name ( self . frozen_heap . alloc_str_intern ( & ident. node . ident ) ) {
673
677
None => {
674
678
// Must be a global, since we know all variables
675
- match self . globals . get_frozen ( & ident. node . ident ) {
679
+ match self . globals . get_global ( & ident. node . ident ) {
676
680
None => {
677
681
self . errors . push ( self . variable_not_found_err ( ident) ) ;
678
682
return ;
0 commit comments