riml 0.3.8 → 0.3.9

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
- clear previous class definitions: #{RELOAD_ON.join(', ')}
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 COMPILE_ON.include?(line_dc)
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
- compile_unit!
43
- elsif RELOAD_ON.include?(line_dc)
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
- def compile_unit!
81
- viml = Riml.do_compile(current_compilation_unit.join("\n"), parser, compiler).chomp
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
- reset!
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
- puts e.verbose_message
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
@@ -10,9 +10,12 @@ module Riml
10
10
  to_visit = [node]
11
11
  lvl = 0
12
12
  while to_visit.length > 0
13
- cur_node = to_visit.shift
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 << child
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
@@ -1,4 +1,4 @@
1
1
  module Riml
2
- # release date: Dec 4, 2013
3
- VERSION = [0,3,8]
2
+ # release date: Jan. 12, 2014
3
+ VERSION = [0,3,9]
4
4
  end
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.8
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: 2013-12-04 00:00:00.000000000 Z
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
- - README.md
93
+ - CONTRIBUTING
105
94
  - LICENSE
106
- - version.rb
95
+ - README.md
96
+ - Rakefile
97
+ - bin/riml
107
98
  - lib/riml.rb
108
- - lib/riml/parser.rb
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/walker.rb
112
- - lib/riml/rewritten_ast_cache.rb
113
- - lib/riml/warning_buffer.rb
114
- - lib/riml/class_map.rb
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/constants.rb
114
+ - lib/riml/lexer.rb
115
+ - lib/riml/nodes.rb
118
116
  - lib/riml/parser.output
119
- - lib/riml/backtrace_filter.rb
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/nodes.rb
129
- - lib/riml/errors.rb
130
- - lib/riml/ast_rewriter.rb
131
- - lib/riml/include_cache.rb
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: 1.8.25
144
+ rubygems_version: 2.2.0
160
145
  signing_key:
161
- specification_version: 3
162
- summary: Riml is a language that compiles into Vim script
146
+ specification_version: 4
147
+ summary: Riml is a language that compiles into VimL
163
148
  test_files: []