Skip to content

Commit 3fef442

Browse files
committed
Refactor module loader code
1 parent e8a230d commit 3fef442

1 file changed

Lines changed: 37 additions & 44 deletions

File tree

lib/syntropy/module_loader.rb

Lines changed: 37 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -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
367360
end

0 commit comments

Comments
 (0)