@@ -103,14 +103,10 @@ impl Compiler {
103
103
}
104
104
105
105
fn compile_template ( & mut self , name : Token , this : Option < Token > , args : Vec < Token > , expr : TemplateExpr ) {
106
- let current_module = self . current_module ( ) ;
106
+ let current_module = self . current_or_outer_module ( ) ;
107
107
let mut current_module = current_module. borrow_mut ( ) ;
108
- let outer_current_module = self . outer_current_module ( ) ;
109
- let outer_current_module = outer_current_module. as_ref ( ) . map ( |module| module. borrow ( ) ) ;
110
108
111
- if current_module. templates . iter ( )
112
- . chain ( outer_current_module. iter ( ) . flat_map ( |module| module. templates . iter ( ) ) )
113
- . any ( |template|
109
+ if current_module. templates . iter ( ) . any ( |template|
114
110
* template. borrow ( ) . name == * name. source ( ) && template. borrow ( ) . args . len ( ) == args. len ( ) && template. borrow ( ) . receiver == this. is_some ( ) ) {
115
111
self . error_at ( * name. start ( ) , "Tried to define multiple templates with the same name" , false ) ;
116
112
return ;
@@ -130,19 +126,14 @@ impl Compiler {
130
126
}
131
127
132
128
fn compile_export ( & mut self , name : Token , expr : Expr ) {
133
- let current_module = self . current_module ( ) ;
129
+ let current_module = self . current_or_outer_module ( ) ;
134
130
let current_module_borrow = current_module. borrow ( ) ;
135
- let outer_current_module = self . outer_current_module ( ) ;
136
- let outer_current_module_borrow = outer_current_module. as_ref ( ) . map ( |module| module. borrow ( ) ) ;
137
131
138
- if current_module_borrow. exports . iter ( )
139
- . chain ( outer_current_module_borrow. iter ( ) . flat_map ( |module| module. exports . iter ( ) ) )
140
- . any ( |function| * function. borrow ( ) . name == * name. source ( ) ) {
132
+ if current_module_borrow. exports . iter ( ) . any ( |function| * function. borrow ( ) . name == * name. source ( ) ) {
141
133
self . error_at ( * name. start ( ) , "Tried to define multiple exports with the same name" , false ) ;
142
134
return ;
143
135
}
144
136
145
- drop ( outer_current_module_borrow) ;
146
137
drop ( current_module_borrow) ;
147
138
let expr = self . compile_expr ( expr, false ) ;
148
139
@@ -154,16 +145,13 @@ impl Compiler {
154
145
}
155
146
156
147
fn compile_module ( & mut self , name : Token , statements : Vec < Decl > ) {
157
- let current_module = self . current_module ( ) ;
148
+ let current_module = self . current_or_outer_module ( ) ;
158
149
let current_module_borrow = current_module. borrow ( ) ;
159
- let outer_current_module = self . outer_current_module ( ) ;
160
- let outer_current_module_borrow = outer_current_module. as_ref ( ) . map ( |module| module. borrow ( ) ) ;
161
150
162
151
let module;
163
152
let extending;
164
153
165
154
if let Some ( existing) = current_module_borrow. sub_modules . iter ( )
166
- . chain ( outer_current_module_borrow. iter ( ) . flat_map ( |module| module. sub_modules . iter ( ) ) )
167
155
. find ( |module| * module. borrow ( ) . name == * name. source ( ) ) {
168
156
module = Rc :: clone ( existing) ;
169
157
drop ( current_module_borrow) ;
@@ -233,7 +221,7 @@ impl Compiler {
233
221
234
222
current_module_borrow. imported_sub_modules . append ( & mut compiler. top_level_module . borrow_mut ( ) . sub_modules ) ;
235
223
current_module_borrow. imported_templates . append ( & mut compiler. top_level_module . borrow_mut ( ) . templates ) ;
236
- current_module_borrow. imported_exports . append ( & mut compiler. top_level_module . borrow_mut ( ) . exports ) ;
224
+ current_module_borrow. exports . append ( & mut compiler. top_level_module . borrow_mut ( ) . exports ) ;
237
225
}
238
226
}
239
227
@@ -765,9 +753,12 @@ impl Compiler {
765
753
self . current_module . last ( ) . map ( |module| Rc :: clone ( & module) ) . unwrap_or_else ( || Rc :: clone ( & self . top_level_module ) )
766
754
}
767
755
768
- fn outer_current_module ( & self ) -> Option < Rc < RefCell < Module > > > {
769
- self . outer_current_module . as_ref ( ) . and_then ( |modules| modules. last ( ) . map ( |module| Rc :: clone ( & module) ) )
770
- . or_else ( || self . outer_top_level_module . as_ref ( ) . map ( |module| Rc :: clone ( & module) ) )
756
+ fn current_or_outer_module ( & self ) -> Rc < RefCell < Module > > {
757
+ self . current_module . last ( ) . map ( |module| Rc :: clone ( & module) )
758
+ . or_else ( || self . outer_current_module . as_ref ( )
759
+ . and_then ( |modules| modules. last ( ) . map ( Rc :: clone) )
760
+ . or_else ( || self . outer_top_level_module . as_ref ( ) . map ( Rc :: clone) ) )
761
+ . unwrap_or_else ( || Rc :: clone ( & self . top_level_module ) )
771
762
}
772
763
773
764
// Error handling
0 commit comments