riml 0.3.8 → 0.3.9
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.
- checksums.yaml +15 -0
- data/LICENSE +1 -1
- data/README.md +83 -30
- data/Rakefile +5 -0
- data/bin/riml +1 -0
- data/lib/riml.rb +17 -2
- data/lib/riml/ast_rewriter.rb +206 -166
- data/lib/riml/backtrace_filter.rb +2 -2
- data/lib/riml/class_map.rb +7 -1
- data/lib/riml/compiler.rb +14 -18
- data/lib/riml/file_rollback.rb +3 -1
- data/lib/riml/grammar.y +6 -6
- data/lib/riml/lexer.rb +11 -8
- data/lib/riml/nodes.rb +67 -22
- data/lib/riml/parser.rb +666 -667
- data/lib/riml/repl.rb +71 -13
- data/lib/riml/walker.rb +5 -2
- data/version.rb +2 -2
- metadata +31 -46
data/lib/riml/repl.rb
CHANGED
@@ -4,6 +4,8 @@ rescue LoadError => e
|
|
4
4
|
$stderr.puts e, "Readline is required to run repl."
|
5
5
|
exit 1
|
6
6
|
end
|
7
|
+
|
8
|
+
require 'ostruct'
|
7
9
|
require File.expand_path('../../riml', __FILE__)
|
8
10
|
|
9
11
|
module Riml
|
@@ -13,12 +15,15 @@ module Riml
|
|
13
15
|
private :parser, :compiler
|
14
16
|
|
15
17
|
COMPILE_ON = %w(compile c)
|
16
|
-
RELOAD_ON = %w(reload r)
|
17
18
|
EXIT_ON = %w(quit q)
|
19
|
+
EVAL_RIML_ON = %w(eval\ <<riml)
|
20
|
+
END_EVAL_RIML_ON = %w(riml)
|
18
21
|
|
19
22
|
HELP_MSG = <<msg
|
20
23
|
compile riml line(s): #{COMPILE_ON.join(', ')}
|
21
|
-
|
24
|
+
eval riml code: eval \<\<riml
|
25
|
+
code goes here!
|
26
|
+
riml
|
22
27
|
exit repl: #{EXIT_ON.join(', ')}
|
23
28
|
msg
|
24
29
|
|
@@ -26,24 +31,38 @@ msg
|
|
26
31
|
@indent_amount = 0
|
27
32
|
@line = nil
|
28
33
|
@compiler_options = DEFAULT_COMPILE_OPTIONS.merge(compile_options)
|
34
|
+
@in_eval_heredoc = false
|
35
|
+
Riml.config = OpenStruct.new if Riml.config.nil?
|
36
|
+
Riml.config.repl = true
|
29
37
|
prepare_new_context
|
30
38
|
Readline.vi_editing_mode if vi_readline
|
31
|
-
trap(:INT) { reset!; puts }
|
32
39
|
end
|
33
40
|
|
34
41
|
def run
|
42
|
+
trap(:INT) { reset!; puts }
|
35
43
|
puts HELP_MSG, "\n"
|
36
44
|
while @line = Readline.readline(current_indent, true)
|
37
45
|
line.strip!
|
38
46
|
next if line.empty?
|
39
47
|
line_dc = line.downcase
|
40
|
-
if
|
48
|
+
if @in_eval_heredoc && END_EVAL_RIML_ON.include?(line_dc)
|
49
|
+
begin
|
50
|
+
riml = compile_unit! # raises errors
|
51
|
+
output = eval_riml(riml)
|
52
|
+
puts riml
|
53
|
+
output = "Blank vim output! Try echoing something." if output.strip.empty?
|
54
|
+
puts "\n", "#=>", output
|
55
|
+
rescue => e
|
56
|
+
handle_compile_error(e)
|
57
|
+
end
|
58
|
+
reset!
|
59
|
+
elsif !@in_eval_heredoc && EVAL_RIML_ON.include?(line_dc)
|
60
|
+
reset!
|
61
|
+
@in_eval_heredoc = true
|
62
|
+
elsif !@in_eval_heredoc && COMPILE_ON.include?(line_dc)
|
41
63
|
next if current_compilation_unit.empty?
|
42
|
-
|
43
|
-
elsif
|
44
|
-
reload!
|
45
|
-
puts "reloaded"
|
46
|
-
elsif EXIT_ON.include?(line_dc)
|
64
|
+
compile_and_print_unit
|
65
|
+
elsif !@in_eval_heredoc && EXIT_ON.include?(line_dc)
|
47
66
|
exit_repl
|
48
67
|
else
|
49
68
|
current_compilation_unit << line
|
@@ -77,14 +96,43 @@ msg
|
|
77
96
|
' ' * @indent_amount
|
78
97
|
end
|
79
98
|
|
80
|
-
|
81
|
-
|
99
|
+
# handles and swallows errors
|
100
|
+
def compile_and_print_unit
|
101
|
+
viml = compile_unit!
|
82
102
|
puts viml, "\n"
|
103
|
+
rescue => e
|
104
|
+
handle_compile_error(e)
|
105
|
+
ensure
|
106
|
+
reset!
|
107
|
+
end
|
108
|
+
|
109
|
+
# raises errors
|
110
|
+
def compile_unit!
|
111
|
+
Riml.do_compile(current_compilation_unit.join("\n"), parser, compiler).chomp
|
112
|
+
end
|
113
|
+
|
114
|
+
# TODO: Start only 1 vim process and use pipes to save time when using
|
115
|
+
# `eval <<riml` multiple times in the same repl session.
|
116
|
+
def eval_riml(riml)
|
117
|
+
require 'tempfile' unless defined?(Tempfile)
|
118
|
+
infile, outfile = Tempfile.new('riml_in'), Tempfile.new('vim_output')
|
119
|
+
riml = Riml::GET_SID_FUNCTION_SRC + "\n#{riml}"
|
120
|
+
infile.write("redir! > #{outfile.path}\n#{riml}\nredir END\nq!")
|
121
|
+
infile.close
|
122
|
+
system(%Q(vim -c "source #{infile.path}"))
|
123
|
+
raw = outfile.read.sub(/\A\n/, '')
|
124
|
+
# Since we don't show the generated SID function, we have to modify the
|
125
|
+
# error line numbers to account for it.
|
126
|
+
raw.gsub(/line\s+(\d+):/) do
|
127
|
+
"line #{$1.to_i - (Riml::GET_SID_FUNCTION_SRC.each_line.to_a.size + 2)}:"
|
128
|
+
end
|
83
129
|
rescue => e
|
84
130
|
print_error(e)
|
85
131
|
reload!
|
132
|
+
nil
|
86
133
|
ensure
|
87
|
-
|
134
|
+
infile.close
|
135
|
+
outfile.close
|
88
136
|
end
|
89
137
|
|
90
138
|
def current_compilation_unit
|
@@ -93,11 +141,21 @@ msg
|
|
93
141
|
|
94
142
|
def reset!
|
95
143
|
@indent_amount = 0
|
144
|
+
@in_eval_heredoc = false
|
96
145
|
current_compilation_unit.clear
|
97
146
|
end
|
98
147
|
|
148
|
+
def handle_compile_error(e)
|
149
|
+
print_error(e)
|
150
|
+
reload!
|
151
|
+
end
|
152
|
+
|
99
153
|
def print_error(e)
|
100
|
-
|
154
|
+
if e.respond_to?(:verbose_message)
|
155
|
+
puts e.verbose_message
|
156
|
+
else
|
157
|
+
puts e.message
|
158
|
+
end
|
101
159
|
end
|
102
160
|
|
103
161
|
def exit_repl
|
data/lib/riml/walker.rb
CHANGED
@@ -10,9 +10,12 @@ module Riml
|
|
10
10
|
to_visit = [node]
|
11
11
|
lvl = 0
|
12
12
|
while to_visit.length > 0
|
13
|
-
|
13
|
+
# use pop and unshift instead of shift and push for performance
|
14
|
+
# reasons. This is a hotspot, and `shift` was found to be a big issue
|
15
|
+
# using ruby-prof on ruby <= 1.9.3 (not an issue on 2.0.0+)
|
16
|
+
cur_node = to_visit.pop
|
14
17
|
cur_node.children.each do |child|
|
15
|
-
to_visit
|
18
|
+
to_visit.unshift(child)
|
16
19
|
end if lvl < max_recursion_lvl && cur_node.respond_to?(:children)
|
17
20
|
method.call(cur_node)
|
18
21
|
lvl += 1
|
data/version.rb
CHANGED
metadata
CHANGED
@@ -1,36 +1,32 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: riml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
5
|
-
prerelease:
|
4
|
+
version: 0.3.9
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Luke Gruber
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-01-12 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: racc
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: 1.4.9
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 1.4.9
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rake
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
31
|
- - ~>
|
36
32
|
- !ruby/object:Gem::Version
|
@@ -38,7 +34,6 @@ dependencies:
|
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
38
|
- - ~>
|
44
39
|
- !ruby/object:Gem::Version
|
@@ -46,7 +41,6 @@ dependencies:
|
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: bundler
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
45
|
- - ~>
|
52
46
|
- !ruby/object:Gem::Version
|
@@ -54,7 +48,6 @@ dependencies:
|
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
52
|
- - ~>
|
60
53
|
- !ruby/object:Gem::Version
|
@@ -62,7 +55,6 @@ dependencies:
|
|
62
55
|
- !ruby/object:Gem::Dependency
|
63
56
|
name: minitest
|
64
57
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
58
|
requirements:
|
67
59
|
- - ! '>='
|
68
60
|
- !ruby/object:Gem::Version
|
@@ -70,7 +62,6 @@ dependencies:
|
|
70
62
|
type: :development
|
71
63
|
prerelease: false
|
72
64
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
65
|
requirements:
|
75
66
|
- - ! '>='
|
76
67
|
- !ruby/object:Gem::Version
|
@@ -78,7 +69,6 @@ dependencies:
|
|
78
69
|
- !ruby/object:Gem::Dependency
|
79
70
|
name: mocha
|
80
71
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
72
|
requirements:
|
83
73
|
- - ~>
|
84
74
|
- !ruby/object:Gem::Version
|
@@ -86,7 +76,6 @@ dependencies:
|
|
86
76
|
type: :development
|
87
77
|
prerelease: false
|
88
78
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
79
|
requirements:
|
91
80
|
- - ~>
|
92
81
|
- !ruby/object:Gem::Version
|
@@ -101,63 +90,59 @@ executables:
|
|
101
90
|
extensions: []
|
102
91
|
extra_rdoc_files: []
|
103
92
|
files:
|
104
|
-
-
|
93
|
+
- CONTRIBUTING
|
105
94
|
- LICENSE
|
106
|
-
-
|
95
|
+
- README.md
|
96
|
+
- Rakefile
|
97
|
+
- bin/riml
|
107
98
|
- lib/riml.rb
|
108
|
-
- lib/riml/
|
99
|
+
- lib/riml/ast_rewriter.rb
|
100
|
+
- lib/riml/backtrace_filter.rb
|
101
|
+
- lib/riml/class_dependency_graph.rb
|
102
|
+
- lib/riml/class_map.rb
|
103
|
+
- lib/riml/compiler.rb
|
104
|
+
- lib/riml/constants.rb
|
105
|
+
- lib/riml/environment.rb
|
106
|
+
- lib/riml/errors.rb
|
109
107
|
- lib/riml/file_rollback.rb
|
110
108
|
- lib/riml/get_sid_function.vim
|
111
|
-
- lib/riml/
|
112
|
-
- lib/riml/
|
113
|
-
- lib/riml/
|
114
|
-
- lib/riml/
|
115
|
-
- lib/riml/class_dependency_graph.rb
|
109
|
+
- lib/riml/grammar.y
|
110
|
+
- lib/riml/header.vim
|
111
|
+
- lib/riml/imported_class.rb
|
112
|
+
- lib/riml/include_cache.rb
|
116
113
|
- lib/riml/included.vim
|
117
|
-
- lib/riml/
|
114
|
+
- lib/riml/lexer.rb
|
115
|
+
- lib/riml/nodes.rb
|
118
116
|
- lib/riml/parser.output
|
119
|
-
- lib/riml/
|
117
|
+
- lib/riml/parser.rb
|
120
118
|
- lib/riml/path_cache.rb
|
121
|
-
- lib/riml/lexer.rb
|
122
|
-
- lib/riml/grammar.y
|
123
|
-
- lib/riml/compiler.rb
|
124
|
-
- lib/riml/environment.rb
|
125
|
-
- lib/riml/imported_class.rb
|
126
|
-
- lib/riml/header.vim
|
127
119
|
- lib/riml/repl.rb
|
128
|
-
- lib/riml/
|
129
|
-
- lib/riml/
|
130
|
-
- lib/riml/
|
131
|
-
-
|
132
|
-
- Rakefile
|
133
|
-
- CONTRIBUTING
|
134
|
-
- bin/riml
|
120
|
+
- lib/riml/rewritten_ast_cache.rb
|
121
|
+
- lib/riml/walker.rb
|
122
|
+
- lib/riml/warning_buffer.rb
|
123
|
+
- version.rb
|
135
124
|
homepage: https://github.com/luke-gru/riml
|
136
125
|
licenses:
|
137
126
|
- MIT
|
127
|
+
metadata: {}
|
138
128
|
post_install_message:
|
139
129
|
rdoc_options: []
|
140
130
|
require_paths:
|
141
131
|
- lib
|
142
132
|
required_ruby_version: !ruby/object:Gem::Requirement
|
143
|
-
none: false
|
144
133
|
requirements:
|
145
134
|
- - ! '>='
|
146
135
|
- !ruby/object:Gem::Version
|
147
136
|
version: 1.8.7
|
148
137
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
|
-
none: false
|
150
138
|
requirements:
|
151
139
|
- - ! '>='
|
152
140
|
- !ruby/object:Gem::Version
|
153
141
|
version: '0'
|
154
|
-
segments:
|
155
|
-
- 0
|
156
|
-
hash: 4386632180611596538
|
157
142
|
requirements: []
|
158
143
|
rubyforge_project:
|
159
|
-
rubygems_version:
|
144
|
+
rubygems_version: 2.2.0
|
160
145
|
signing_key:
|
161
|
-
specification_version:
|
162
|
-
summary: Riml is a language that compiles into
|
146
|
+
specification_version: 4
|
147
|
+
summary: Riml is a language that compiles into VimL
|
163
148
|
test_files: []
|