riml 0.1.9 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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