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 +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
|