Class: Klenod::Build::RubyImportRewriter

Inherits:
Object
  • Object
show all
Defined in:
lib/klenod/build/ruby_import_rewriter.rb

Defined Under Namespace

Classes: ExpandedImport, ImportCall, Result

Constant Summary collapse

IMPORT_METHODS =
{
  "import" => {
    replacement: "__klenod_import__",
    eager: true
  },
  "lazy_import" => {
    replacement: "__klenod_lazy_import__",
    eager: false
  },
  "import_glob" => {
    replacement: nil,
    eager: true
  }
}.freeze
IMPORT_SOURCE_PATTERN =
/(?<![A-Za-z0-9_])(?:import|lazy_import|import_glob)\s*(?:\(|["'])/
FAST_LITERAL_IMPORT_PATTERN =
/(?<![A-Za-z0-9_])(import|lazy_import)\s*\(\s*("(?:\\.|[^"\\#])*")\s*\)/

Instance Method Summary collapse

Constructor Details

#initialize(module_id:, kind:, source_dir: nil, profiler: nil, dependency_id_offset: 0, source_line_offset: 0, source_column_offset: 0) ⇒ RubyImportRewriter

Returns a new instance of RubyImportRewriter.



42
43
44
45
46
47
48
49
50
# File 'lib/klenod/build/ruby_import_rewriter.rb', line 42

def initialize(module_id:, kind:, source_dir: nil, profiler: nil, dependency_id_offset: 0, source_line_offset: 0, source_column_offset: 0)
  @module_id = module_id
  @kind = kind
  @source_dir = source_dir && Pathname.new(source_dir).expand_path
  @profiler = profiler
  @dependency_id_offset = dependency_id_offset
  @source_line_offset = source_line_offset
  @source_column_offset = source_column_offset
end

Instance Method Details

#rewrite(code) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/klenod/build/ruby_import_rewriter.rb', line 52

def rewrite(code)
  return Result.new(code, [], []) unless import_source?(code)
  fast_result = rewrite_literal_import_calls(code)
  return fast_result if fast_result

  ast = measure(:ruby_import_parse) { SyntaxTree.parse(code) }
  calls = measure(:ruby_import_scan) { import_calls(ast) }
  expanded = expand_import_calls(calls)

  rewritten = measure(:ruby_import_rewrite_source) { rewrite_import_calls(code, expanded) }
  Result.new(
    rewritten,
    expanded.flat_map(&:dependencies),
    expanded.flat_map(&:watched_patterns)
  )
end