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.
@@ -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: []