riml 0.1.9 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/ast_rewriter.rb CHANGED
@@ -7,15 +7,19 @@ module Riml
7
7
  include Riml::Constants
8
8
 
9
9
  attr_accessor :ast
10
- attr_reader :classes
10
+ attr_reader :classes, :rewritten_include_files
11
11
 
12
12
  def initialize(ast = nil, classes = nil)
13
13
  @ast = ast
14
14
  @classes = classes || ClassMap.new
15
+ @rewritten_include_files = {}
15
16
  end
16
17
 
17
-
18
- def rewrite
18
+ def rewrite(file = nil)
19
+ if rewritten_ast = rewritten_include_files[file]
20
+ return rewritten_ast
21
+ end
22
+ rewrite_included_files!
19
23
  establish_parents(ast)
20
24
  rewriters = [
21
25
  StrictEqualsComparisonOperator.new(ast, classes),
@@ -49,6 +53,21 @@ module Riml
49
53
  replace node if match?(node)
50
54
  end
51
55
 
56
+ def rewrite_included_files!
57
+ old_ast = ast
58
+ ast.children.each do |node|
59
+ next unless RimlCommandNode === node && node.name == 'riml_include'
60
+ node.each_existing_file! do |file|
61
+ full_path = File.join(Riml.source_path, file)
62
+ riml_src = File.read(full_path)
63
+ rewritten_ast = Parser.new.parse(riml_src, self)
64
+ rewritten_include_files[file] = rewritten_ast
65
+ end
66
+ end
67
+ ensure
68
+ self.ast = old_ast
69
+ end
70
+
52
71
  def repeatable?
53
72
  true
54
73
  end
data/lib/compiler.rb CHANGED
@@ -491,11 +491,11 @@ module Riml
491
491
  def compile(node)
492
492
  if node.name == 'riml_source'
493
493
  node.name = 'source'
494
- each_existing_file!(node) do |file|
494
+ node.each_existing_file! do |file|
495
495
  root_node(node).current_compiler.compile_queue << file
496
496
  end
497
497
  elsif node.name == 'riml_include'
498
- each_existing_file!(node) do |file|
498
+ node.each_existing_file! do |file|
499
499
  full_path = File.join(Riml.source_path, file)
500
500
  riml_src = File.read(full_path)
501
501
  node.compiled_output << root_node(node).current_compiler.compile_include(riml_src, file)
@@ -509,20 +509,6 @@ module Riml
509
509
  node.compiled_output
510
510
  end
511
511
 
512
- def each_existing_file!(node)
513
- files = []
514
- node.arguments.map(&:value).each do |file|
515
- if File.exists?(File.join(Riml.source_path, file))
516
- files << file
517
- else
518
- raise Riml::FileNotFound, "#{file.inspect} could not be found in " \
519
- "source path (#{Riml.source_path.inspect})"
520
- end
521
- end
522
- # all files exist
523
- files.each {|f| yield f} if block_given?
524
- end
525
-
526
512
  def root_node(node)
527
513
  node = node.parent until node.parent.nil?
528
514
  node
@@ -660,7 +646,7 @@ module Riml
660
646
  end
661
647
 
662
648
  def compile_include(source, from_file = nil)
663
- root_node = parser.parse(source)
649
+ root_node = parser.parse(source, parser.ast_rewriter, from_file)
664
650
  output = compile(root_node)
665
651
  return output unless from_file
666
652
  (Riml::INCLUDE_COMMENT_FMT % from_file) + output
data/lib/grammar.y CHANGED
@@ -489,7 +489,7 @@ end
489
489
  attr_accessor :ast_rewriter
490
490
 
491
491
  # parses tokens or code into output nodes
492
- def parse(object, ast_rewriter = AST_Rewriter.new)
492
+ def parse(object, ast_rewriter = AST_Rewriter.new, include_file = nil)
493
493
  if tokens?(object)
494
494
  @tokens = object
495
495
  elsif code?(object)
@@ -506,7 +506,7 @@ end
506
506
  @ast_rewriter ||= ast_rewriter
507
507
  return ast unless @ast_rewriter
508
508
  @ast_rewriter.ast = ast
509
- @ast_rewriter.rewrite
509
+ @ast_rewriter.rewrite(include_file)
510
510
  end
511
511
 
512
512
  # get the next token from either the list of tokens provided, or
data/lib/included.vim CHANGED
@@ -1,2 +1 @@
1
-
2
1
  " included: '%s'
data/lib/nodes.rb CHANGED
@@ -305,7 +305,21 @@ end
305
305
  # call Method()
306
306
  # call s:Method(argument1, argument2)
307
307
  class ExplicitCallNode < CallNode; end
308
- class RimlCommandNode < CallNode; end
308
+ class RimlCommandNode < CallNode
309
+ def each_existing_file!
310
+ files = []
311
+ arguments.map(&:value).each do |file|
312
+ if File.exists?(File.join(Riml.source_path, file))
313
+ files << file
314
+ else
315
+ raise Riml::FileNotFound, "#{file.inspect} could not be found in " \
316
+ "source path (#{Riml.source_path.inspect})"
317
+ end
318
+ end
319
+ # all files exist
320
+ files.each {|f| yield f} if block_given?
321
+ end
322
+ end
309
323
 
310
324
  class OperatorNode < Struct.new(:operator, :operands)
311
325
  include Visitable
data/lib/parser.rb CHANGED
@@ -19,7 +19,7 @@ module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 487)
19
19
  attr_accessor :ast_rewriter
20
20
 
21
21
  # parses tokens or code into output nodes
22
- def parse(object, ast_rewriter = AST_Rewriter.new)
22
+ def parse(object, ast_rewriter = AST_Rewriter.new, include_file = nil)
23
23
  if tokens?(object)
24
24
  @tokens = object
25
25
  elsif code?(object)
@@ -36,7 +36,7 @@ module_eval(<<'...end grammar.y/module_eval...', 'grammar.y', 487)
36
36
  @ast_rewriter ||= ast_rewriter
37
37
  return ast unless @ast_rewriter
38
38
  @ast_rewriter.ast = ast
39
- @ast_rewriter.rewrite
39
+ @ast_rewriter.rewrite(include_file)
40
40
  end
41
41
 
42
42
  # get the next token from either the list of tokens provided, or
@@ -2473,7 +2473,7 @@ module_eval(<<'.,.,', 'grammar.y', 380)
2473
2473
 
2474
2474
  module_eval(<<'.,.,', 'grammar.y', 381)
2475
2475
  def _reduce_179(val, _values, result)
2476
- result = ReturnNode.new(nil)
2476
+ result = ReturnNode.new(nil)
2477
2477
  result
2478
2478
  end
2479
2479
  .,.,
data/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Riml
2
2
  # last changed: Mar. 2, 2013
3
- VERSION = [0,1,9]
3
+ VERSION = [0,2,0]
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: riml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.9
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-03-02 00:00:00.000000000 Z
12
+ date: 2013-03-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: racc