@@ -141,18 +141,22 @@ def do_load_module(ref, fn, raise_on_missing:)
141141 @fn_map [ fn ] = ref
142142 code = read_file ( fn )
143143 env = @env . merge ( module_loader : self , ref : clean_ref ( ref ) )
144- mod = Syntropy ::ModuleContext . load ( env , code , fn , @extensions )
144+ mod = Syntropy ::ModuleContext . new ( env , code , fn , @extensions )
145145 add_dependencies ( ref , mod . __dependencies__ )
146146 export_value = transform_module_export_value (
147147 mod . __export_value__ , fn , raise_on_missing :
148148 )
149+ @env [ :logger ] &.info ( message : "Loaded module at #{ fn } " )
149150
150151 {
151152 fn : fn ,
152153 module : mod ,
153154 export_value : export_value ,
154155 reverse_deps : [ ]
155156 }
157+ rescue StandardError , SyntaxError => e
158+ env [ :logger ] &.error ( message : "Error while loading module at #{ fn } " , error : e )
159+ e . is_a? ( SyntaxError ) ? handle_syntax_error ( fn , e ) : ( raise e )
156160 ensure
157161 @loading . delete ( ref )
158162 end
@@ -193,6 +197,17 @@ def transform_module_export_value(export_value, fn, raise_on_missing:)
193197 export_value
194198 end
195199 end
200+
201+ def handle_syntax_error ( fn , e )
202+ $stderr. puts ( "\n #{ e . message } " ) if !Syntropy . test_mode
203+ m = e . message . match ( /^(.+): syntax/ )
204+ raise e if !m
205+
206+ location = m [ 1 ]
207+ e2 = SyntaxError . new ( "Syntax errors found in module at #{ fn } " )
208+ e2 . set_backtrace ( [ location ] + e . backtrace )
209+ raise e2
210+ end
196211 end
197212
198213 # The Syntropy::ModuleContext class provides a context for loading a module. A
@@ -212,44 +227,14 @@ def transform_module_export_value(export_value, fn, raise_on_missing:)
212227 # is set to `self`, and may be used to refer to various methods defined in the
213228 # module.
214229 class ModuleContext
215- # Loads a module, returning the module instance
216- # @param env [Hash] app environment
217- # @param code [String] module source code
218- # @param fn [String] module file name
219- # @param extensions [Module, Array<Module>] extension module(s)
220- # @return [Syntropy::ModuleContext] created module context
221- def self . load ( env , code , fn , extensions )
222- mod = new ( env )
223- apply_extensions ( mod , extensions )
224- mod . instance_eval ( code , fn )
225- env [ :logger ] &.info ( message : "Loaded module at #{ fn } " )
226- mod
227- rescue StandardError , SyntaxError => e
228- env [ :logger ] &.error ( message : "Error while loading module at #{ fn } " , error : e )
229- e . is_a? ( SyntaxError ) ? handle_syntax_error ( env , e ) : ( raise e )
230- end
231-
232- # Applies the given extension(s) to the given module context.
233- #
234- # @param mod [Syntropy::ModuleContext] module context
235- # @param extensions [Module, Array<Module>] extension module(s)
236- def self . apply_extensions ( mod , extensions )
237- case extensions
238- when Array
239- extensions . each { mod . extend ( it ) }
240- when Module
241- mod . extend ( extensions )
242- when nil # return
243- else
244- raise Syntropy ::Error , "Invalid module extensions: #{ extensions . inspect } "
245- end
246- end
247-
248230 # Initializes a module with the given environment hash.
249231 #
250232 # @param env [Hash] environment hash
233+ # @param code [String] module source code
234+ # @param fn [String] module filename
235+ # @param extensions [Array<Module>, Module]
251236 # @return [void]
252- def initialize ( env )
237+ def initialize ( env , code , fn , extensions )
253238 @env = env
254239 @machine = env [ :machine ]
255240 @module_loader = env [ :module_loader ]
@@ -258,6 +243,9 @@ def initialize(env)
258243 @logger = env [ :logger ]
259244 @__dependencies__ = [ ]
260245 singleton_class . const_set ( :MODULE , self )
246+
247+ apply_extensions ( extensions )
248+ instance_eval ( code , fn )
261249 end
262250
263251 attr_reader :__export_value__ , :__dependencies__
@@ -353,15 +341,20 @@ def app(**env)
353341 Syntropy ::App . new ( **env )
354342 end
355343
356- def handle_syntax_error ( env , e )
357- $stderr. puts ( "\n #{ e . message } " ) if !Syntropy . test_mode
358- m = e . message . match ( /^(.+): syntax/ )
359- raise e if !m
360-
361- location = m [ 1 ]
362- e2 = SyntaxError . new ( "Syntax errors found in module #{ env [ :ref ] } " )
363- e2 . set_backtrace ( [ location ] + e . backtrace )
364- raise e2
344+ # Applies the given extension(s) to the given module context.
345+ #
346+ # @param extensions [Module, Array<Module>] extension module(s)
347+ # @return [void]
348+ def apply_extensions ( extensions )
349+ case extensions
350+ when Array
351+ extensions . each { extend ( it ) }
352+ when Module
353+ extend ( extensions )
354+ when nil # return
355+ else
356+ raise Syntropy ::Error , "Invalid module extensions: #{ extensions . inspect } "
357+ end
365358 end
366359 end
367360end
0 commit comments