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 +22 -3
- data/lib/compiler.rb +3 -17
- data/lib/grammar.y +2 -2
- data/lib/included.vim +0 -1
- data/lib/nodes.rb +15 -1
- data/lib/parser.rb +3 -3
- data/version.rb +1 -1
- metadata +2 -2
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
|
-
|
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!
|
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!
|
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
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
|
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
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.
|
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-
|
12
|
+
date: 2013-03-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: racc
|