opal 0.5.5 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (257) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +40 -9
  3. data/CHANGELOG.md +349 -0
  4. data/Gemfile +7 -8
  5. data/README.md +25 -3
  6. data/Rakefile +4 -2
  7. data/bin/opal +1 -1
  8. data/examples/rack/Gemfile +3 -0
  9. data/examples/rack/app/application.rb +13 -0
  10. data/examples/rack/app/user.rb +21 -0
  11. data/examples/rack/config.ru +7 -0
  12. data/examples/rack/index.html.erb +10 -0
  13. data/examples/sinatra/Gemfile +4 -0
  14. data/examples/sinatra/app/application.rb +7 -0
  15. data/examples/sinatra/config.ru +21 -0
  16. data/lib/mspec/opal/rake_task.rb +29 -8
  17. data/lib/mspec/opal/runner.rb +5 -4
  18. data/lib/opal.rb +1 -0
  19. data/lib/opal/builder.rb +0 -28
  20. data/lib/opal/cli.rb +0 -14
  21. data/lib/opal/compiler.rb +12 -11
  22. data/lib/opal/fragment.rb +8 -1
  23. data/lib/opal/nodes/array.rb +1 -1
  24. data/lib/opal/nodes/base.rb +4 -0
  25. data/lib/opal/nodes/call.rb +6 -2
  26. data/lib/opal/nodes/call_special.rb +1 -1
  27. data/lib/opal/nodes/class.rb +2 -2
  28. data/lib/opal/nodes/constants.rb +3 -1
  29. data/lib/opal/nodes/helpers.rb +23 -14
  30. data/lib/opal/nodes/if.rb +16 -9
  31. data/lib/opal/nodes/literal.rb +37 -5
  32. data/lib/opal/nodes/logic.rb +7 -1
  33. data/lib/opal/nodes/module.rb +2 -2
  34. data/lib/opal/nodes/scope.rb +13 -2
  35. data/lib/opal/nodes/top.rb +9 -0
  36. data/lib/opal/nodes/variables.rb +5 -2
  37. data/lib/opal/parser.rb +306 -71
  38. data/lib/opal/parser/grammar.rb +2667 -2775
  39. data/lib/opal/parser/grammar.y +177 -233
  40. data/lib/opal/parser/lexer.rb +511 -427
  41. data/lib/opal/parser/sexp.rb +15 -3
  42. data/lib/opal/source_map.rb +8 -4
  43. data/lib/opal/sprockets.rb +4 -0
  44. data/lib/opal/sprockets/cache_key_fix.rb +17 -0
  45. data/lib/opal/sprockets/environment.rb +21 -0
  46. data/lib/opal/sprockets/erb.rb +30 -0
  47. data/lib/opal/sprockets/processor.rb +127 -0
  48. data/lib/opal/sprockets/server.rb +166 -0
  49. data/lib/opal/util.rb +29 -0
  50. data/lib/opal/version.rb +1 -1
  51. data/opal.gemspec +1 -1
  52. data/opal/corelib/array.rb +106 -187
  53. data/opal/corelib/array/inheritance.rb +113 -0
  54. data/opal/corelib/basic_object.rb +6 -2
  55. data/opal/corelib/boolean.rb +4 -0
  56. data/opal/corelib/class.rb +2 -0
  57. data/opal/corelib/complex.rb +3 -0
  58. data/opal/corelib/enumerable.rb +75 -8
  59. data/opal/corelib/enumerator.rb +2 -0
  60. data/opal/corelib/error.rb +23 -23
  61. data/opal/corelib/hash.rb +5 -5
  62. data/opal/corelib/helpers.rb +51 -16
  63. data/opal/corelib/io.rb +7 -24
  64. data/opal/corelib/kernel.rb +23 -11
  65. data/opal/corelib/module.rb +44 -47
  66. data/opal/corelib/nil_class.rb +4 -0
  67. data/opal/corelib/numeric.rb +101 -15
  68. data/opal/corelib/range.rb +2 -0
  69. data/opal/corelib/rational.rb +3 -0
  70. data/opal/corelib/regexp.rb +36 -17
  71. data/opal/corelib/runtime.js +22 -7
  72. data/opal/corelib/string.rb +213 -110
  73. data/opal/corelib/string/inheritance.rb +78 -0
  74. data/opal/corelib/struct.rb +8 -0
  75. data/opal/corelib/time.rb +54 -42
  76. data/opal/corelib/variables.rb +24 -0
  77. data/opal/opal.rb +5 -27
  78. data/spec/cli/compiler_spec.rb +136 -0
  79. data/spec/cli/dependency_resolver_spec.rb +40 -0
  80. data/spec/cli/lexer_spec.rb +110 -0
  81. data/spec/cli/parser/alias_spec.rb +26 -0
  82. data/spec/cli/parser/and_spec.rb +13 -0
  83. data/spec/cli/parser/attrasgn_spec.rb +28 -0
  84. data/spec/cli/parser/begin_spec.rb +42 -0
  85. data/spec/cli/parser/block_spec.rb +12 -0
  86. data/spec/cli/parser/break_spec.rb +17 -0
  87. data/spec/cli/parser/call_spec.rb +139 -0
  88. data/spec/cli/parser/class_spec.rb +35 -0
  89. data/spec/cli/parser/comments_spec.rb +11 -0
  90. data/spec/cli/parser/def_spec.rb +61 -0
  91. data/spec/cli/parser/if_spec.rb +26 -0
  92. data/spec/cli/parser/iter_spec.rb +59 -0
  93. data/spec/cli/parser/lambda_spec.rb +64 -0
  94. data/spec/cli/parser/literal_spec.rb +113 -0
  95. data/spec/cli/parser/masgn_spec.rb +37 -0
  96. data/spec/cli/parser/module_spec.rb +27 -0
  97. data/spec/cli/parser/not_spec.rb +27 -0
  98. data/spec/cli/parser/op_asgn1_spec.rb +23 -0
  99. data/spec/cli/parser/op_asgn2_spec.rb +23 -0
  100. data/spec/cli/parser/or_spec.rb +13 -0
  101. data/spec/cli/parser/return_spec.rb +17 -0
  102. data/spec/cli/parser/sclass_spec.rb +21 -0
  103. data/spec/cli/parser/string_spec.rb +269 -0
  104. data/spec/cli/parser/super_spec.rb +20 -0
  105. data/spec/cli/parser/undef_spec.rb +15 -0
  106. data/spec/cli/parser/unless_spec.rb +13 -0
  107. data/spec/cli/parser/variables_spec.rb +92 -0
  108. data/spec/cli/parser/while_spec.rb +15 -0
  109. data/spec/cli/parser/yield_spec.rb +20 -0
  110. data/spec/cli/spec_helper.rb +31 -11
  111. data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
  112. data/spec/opal/core/date_spec.rb +122 -0
  113. data/spec/opal/core/language/predefined_spec.rb +1 -1
  114. data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
  115. data/spec/opal/core/runtime/truthy_spec.rb +23 -0
  116. data/spec/opal/filters/bugs/array.rb +96 -87
  117. data/spec/opal/filters/bugs/basic_object.rb +9 -0
  118. data/spec/opal/filters/bugs/class.rb +16 -0
  119. data/spec/opal/filters/bugs/enumerable.rb +54 -0
  120. data/spec/opal/filters/bugs/language.rb +37 -3
  121. data/spec/opal/filters/bugs/math.rb +93 -0
  122. data/spec/opal/filters/bugs/nil.rb +7 -0
  123. data/spec/opal/filters/bugs/numeric.rb +19 -0
  124. data/spec/opal/filters/bugs/opal.rb +12 -0
  125. data/spec/opal/filters/bugs/regexp.rb +0 -2
  126. data/spec/opal/filters/bugs/string.rb +317 -19
  127. data/spec/opal/filters/bugs/struct.rb +29 -0
  128. data/spec/opal/filters/bugs/time.rb +130 -9
  129. data/spec/opal/filters/unsupported/encoding.rb +52 -4
  130. data/spec/opal/filters/unsupported/enumerator.rb +0 -3
  131. data/spec/opal/filters/unsupported/integer_size.rb +7 -0
  132. data/spec/opal/filters/unsupported/method_added.rb +10 -0
  133. data/spec/opal/filters/unsupported/mutable_strings.rb +299 -1
  134. data/spec/opal/filters/unsupported/private_constants.rb +30 -0
  135. data/spec/opal/filters/unsupported/private_methods.rb +16 -0
  136. data/spec/opal/filters/unsupported/random.rb +4 -0
  137. data/spec/opal/filters/unsupported/tainted.rb +53 -0
  138. data/spec/opal/filters/unsupported/trusted.rb +5 -0
  139. data/spec/opal/rubyspecs +167 -234
  140. data/spec/opal/spec_helper.rb +3 -0
  141. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  142. data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
  143. data/spec/opal/stdlib/promise/then_spec.rb +54 -0
  144. data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
  145. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  146. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  147. data/stdlib/base64.rb +152 -0
  148. data/stdlib/date.rb +82 -49
  149. data/{opal/corelib → stdlib}/encoding.rb +3 -1
  150. data/stdlib/erb.rb +0 -1
  151. data/stdlib/json.rb +10 -26
  152. data/stdlib/math.rb +370 -0
  153. data/stdlib/native.rb +40 -33
  154. data/stdlib/opal-parser.rb +7 -4
  155. data/stdlib/promise.rb +292 -0
  156. data/stdlib/strscan.rb +1 -1
  157. data/stdlib/template.rb +1 -3
  158. data/stdlib/time.rb +9 -0
  159. metadata +143 -204
  160. data/doc/compiler.md +0 -42
  161. data/doc/compiler_options.md +0 -5
  162. data/doc/examples/node_http_server.rb +0 -49
  163. data/doc/external_libraries.md +0 -9
  164. data/doc/generated_javascript.md +0 -272
  165. data/doc/home.md +0 -17
  166. data/doc/method_missing.md +0 -58
  167. data/doc/static_applications.md +0 -60
  168. data/doc/using_ruby_from_javascript.md +0 -18
  169. data/doc/using_sprockets.md +0 -65
  170. data/spec/opal/core/numeric/abs_spec.rb +0 -12
  171. data/spec/opal/core/numeric/downto_spec.rb +0 -19
  172. data/spec/opal/core/numeric/equal_value_spec.rb +0 -9
  173. data/spec/opal/core/numeric/even_spec.rb +0 -21
  174. data/spec/opal/core/numeric/magnitude_spec.rb +0 -12
  175. data/spec/opal/core/numeric/odd_spec.rb +0 -21
  176. data/spec/opal/core/string/chop_spec.rb +0 -10
  177. data/spec/opal/core/string/chr_spec.rb +0 -13
  178. data/spec/opal/core/string/clone_spec.rb +0 -8
  179. data/spec/opal/core/string/comparison_spec.rb +0 -13
  180. data/spec/opal/core/string/dup_spec.rb +0 -8
  181. data/spec/opal/core/string/element_reference_spec.rb +0 -96
  182. data/spec/opal/core/string/fixtures/classes.rb +0 -49
  183. data/spec/opal/core/string/format_spec.rb +0 -9
  184. data/spec/opal/core/string/freeze_spec.rb +0 -15
  185. data/spec/opal/core/string/gsub_spec.rb +0 -31
  186. data/spec/opal/core/string/lines_spec.rb +0 -9
  187. data/spec/opal/core/string/ljust_spec.rb +0 -32
  188. data/spec/opal/core/string/lstrip_spec.rb +0 -7
  189. data/spec/opal/core/string/match_spec.rb +0 -49
  190. data/spec/opal/core/string/next_spec.rb +0 -10
  191. data/spec/opal/core/string/ord_spec.rb +0 -9
  192. data/spec/opal/core/string/partition_spec.rb +0 -10
  193. data/spec/opal/core/string/rindex_spec.rb +0 -50
  194. data/spec/opal/core/string/rjust_spec.rb +0 -32
  195. data/spec/opal/core/string/rstrip_spec.rb +0 -7
  196. data/spec/opal/core/string/scan_spec.rb +0 -66
  197. data/spec/opal/core/string/slice_spec.rb +0 -74
  198. data/spec/opal/core/string/split_spec.rb +0 -5
  199. data/spec/opal/core/string/strip_spec.rb +0 -6
  200. data/spec/opal/core/string/sub_spec.rb +0 -38
  201. data/spec/opal/core/string/succ_spec.rb +0 -10
  202. data/spec/opal/core/string/sum_spec.rb +0 -5
  203. data/spec/opal/core/string/to_f_spec.rb +0 -14
  204. data/spec/opal/core/string/to_i_spec.rb +0 -25
  205. data/spec/opal/core/string/tr_s_spec.rb +0 -31
  206. data/spec/opal/core/string/tr_spec.rb +0 -31
  207. data/spec/opal/filters/bugs/parser.rb +0 -10
  208. data/spec/opal/filters/unsupported/immutable_strings.rb +0 -24
  209. data/spec/opal/filters/unsupported/string_subclasses.rb +0 -8
  210. data/spec/opal/parser/alias_spec.rb +0 -26
  211. data/spec/opal/parser/and_spec.rb +0 -13
  212. data/spec/opal/parser/array_spec.rb +0 -22
  213. data/spec/opal/parser/attrasgn_spec.rb +0 -28
  214. data/spec/opal/parser/begin_spec.rb +0 -42
  215. data/spec/opal/parser/block_spec.rb +0 -12
  216. data/spec/opal/parser/break_spec.rb +0 -17
  217. data/spec/opal/parser/call_spec.rb +0 -131
  218. data/spec/opal/parser/class_spec.rb +0 -35
  219. data/spec/opal/parser/const_spec.rb +0 -13
  220. data/spec/opal/parser/cvar_spec.rb +0 -11
  221. data/spec/opal/parser/def_spec.rb +0 -61
  222. data/spec/opal/parser/false_spec.rb +0 -17
  223. data/spec/opal/parser/file_spec.rb +0 -7
  224. data/spec/opal/parser/gvar_spec.rb +0 -13
  225. data/spec/opal/parser/hash_spec.rb +0 -17
  226. data/spec/opal/parser/heredoc_spec.rb +0 -30
  227. data/spec/opal/parser/iasgn_spec.rb +0 -9
  228. data/spec/opal/parser/if_spec.rb +0 -26
  229. data/spec/opal/parser/int_spec.rb +0 -13
  230. data/spec/opal/parser/iter_spec.rb +0 -59
  231. data/spec/opal/parser/ivar_spec.rb +0 -9
  232. data/spec/opal/parser/lambda_spec.rb +0 -64
  233. data/spec/opal/parser/lasgn_spec.rb +0 -8
  234. data/spec/opal/parser/line_spec.rb +0 -8
  235. data/spec/opal/parser/lvar_spec.rb +0 -38
  236. data/spec/opal/parser/masgn_spec.rb +0 -37
  237. data/spec/opal/parser/module_spec.rb +0 -27
  238. data/spec/opal/parser/nil_spec.rb +0 -17
  239. data/spec/opal/parser/not_spec.rb +0 -27
  240. data/spec/opal/parser/nth_ref_spec.rb +0 -13
  241. data/spec/opal/parser/op_asgn1_spec.rb +0 -23
  242. data/spec/opal/parser/op_asgn2_spec.rb +0 -23
  243. data/spec/opal/parser/or_spec.rb +0 -13
  244. data/spec/opal/parser/parse_spec.rb +0 -66
  245. data/spec/opal/parser/regexp_spec.rb +0 -16
  246. data/spec/opal/parser/return_spec.rb +0 -17
  247. data/spec/opal/parser/sclass_spec.rb +0 -21
  248. data/spec/opal/parser/self_spec.rb +0 -17
  249. data/spec/opal/parser/str_spec.rb +0 -107
  250. data/spec/opal/parser/string_spec.rb +0 -8
  251. data/spec/opal/parser/super_spec.rb +0 -20
  252. data/spec/opal/parser/true_spec.rb +0 -17
  253. data/spec/opal/parser/undef_spec.rb +0 -15
  254. data/spec/opal/parser/unless_spec.rb +0 -13
  255. data/spec/opal/parser/while_spec.rb +0 -15
  256. data/spec/opal/parser/xstr_spec.rb +0 -116
  257. data/spec/opal/parser/yield_spec.rb +0 -20
data/Rakefile CHANGED
@@ -17,6 +17,8 @@ task :default => [:rspec, :mspec]
17
17
 
18
18
  desc 'Build opal.js and opal-parser.js to build/'
19
19
  task :dist do
20
+ require 'opal/util'
21
+
20
22
  Opal::Processor.arity_check_enabled = false
21
23
  Opal::Processor.const_missing_enabled = false
22
24
 
@@ -31,8 +33,8 @@ task :dist do
31
33
  $stdout.flush
32
34
 
33
35
  src = env[lib].to_s
34
- min = Opal::Builder::Util.uglify src
35
- gzp = Opal::Builder::Util.gzip min
36
+ min = Opal::Util.uglify src
37
+ gzp = Opal::Util.gzip min
36
38
 
37
39
  File.open("build/#{lib}.js", 'w+') { |f| f << src }
38
40
  File.open("build/#{lib}.min.js", 'w+') { |f| f << min } if min
data/bin/opal CHANGED
@@ -7,7 +7,7 @@ options.parse!
7
7
  require 'opal/cli'
8
8
 
9
9
  if ARGV.empty? and !options.options[:evals]
10
- p options
10
+ puts options
11
11
  else
12
12
  cli = Opal::CLI.new options.options.merge(:filename => ARGV.first)
13
13
  begin
@@ -0,0 +1,3 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'opal', :path => '../../'
@@ -0,0 +1,13 @@
1
+ require 'opal'
2
+ require 'user'
3
+
4
+ module MyApp
5
+ class Application
6
+ def initialize
7
+ @user = User.new('Bill')
8
+ @user.authenticated?
9
+ end
10
+ end
11
+ end
12
+
13
+ MyApp::Application.new
@@ -0,0 +1,21 @@
1
+ class User
2
+ def initialize(name)
3
+ @name = name
4
+ end
5
+
6
+ def authenticated?
7
+ if admin? or special_permission?
8
+ true
9
+ else
10
+ raise "not authenticated"
11
+ end
12
+ end
13
+
14
+ def admin?
15
+ @name == 'Bob'
16
+ end
17
+
18
+ def special_permission?
19
+ false
20
+ end
21
+ end
@@ -0,0 +1,7 @@
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ run Opal::Server.new { |s|
5
+ s.main = 'application'
6
+ s.append_path 'app'
7
+ }
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>opal-sprockets demo</title>
5
+
6
+ <%= javascript_include_tag 'application' %>
7
+ </head>
8
+ <body>
9
+ </body>
10
+ </html>
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'opal', :path => '../../opal'
4
+ gem 'sinatra'
@@ -0,0 +1,7 @@
1
+ require 'opal'
2
+
3
+ def alert(msg)
4
+ `alert(msg)`
5
+ end
6
+
7
+ alert "Hi there!"
@@ -0,0 +1,21 @@
1
+ require 'opal'
2
+ require 'sinatra'
3
+
4
+ get '/' do
5
+ <<-EOS
6
+ <!doctype html>
7
+ <html>
8
+ <head>
9
+ <script src="/assets/application.js"></script>
10
+ </head>
11
+ </html>
12
+ EOS
13
+ end
14
+
15
+ map '/assets' do
16
+ env = Opal::Environment.new
17
+ env.append_path 'app'
18
+ run env
19
+ end
20
+
21
+ run Sinatra::Application
@@ -21,7 +21,7 @@ end
21
21
 
22
22
  require 'rack'
23
23
  require 'webrick'
24
- require 'opal-sprockets'
24
+
25
25
  module MSpec
26
26
  module Opal
27
27
  DEFAULT_PATTERN = 'spec/opal/{parser,core,compiler,stdlib}/**/*_spec.rb'
@@ -43,10 +43,11 @@ module MSpec
43
43
 
44
44
  desc 'Build specs to build/specs.js and build/specs.min.js'
45
45
  task :build do
46
+ require 'opal/util'
46
47
  path = './build/specs.js'
47
48
  min_path = './build/specs.min.js'
48
49
  Environment.new.build_specs(path)
49
- min = ::Opal::Builder::Util.uglify File.read(path)
50
+ min = ::Opal::Util.uglify File.read(path)
50
51
  File.open(min_path, 'w') { |f| f << min_path }
51
52
  end
52
53
  end
@@ -61,7 +62,7 @@ module MSpec
61
62
  @port = 9999
62
63
  end
63
64
 
64
- attr_reader :app, :server_pid
65
+ attr_reader :app, :server
65
66
  attr_accessor :port
66
67
 
67
68
  def passed?
@@ -76,12 +77,11 @@ module MSpec
76
77
  rescue => e
77
78
  puts e.message
78
79
  ensure
79
- stop_server if server_pid
80
+ stop_server if server
80
81
  end
81
82
 
82
83
  def stop_server
83
- Process.kill(:SIGINT, server_pid)
84
- Process.wait
84
+ server.kill
85
85
  end
86
86
 
87
87
  def start_phantomjs
@@ -94,7 +94,7 @@ module MSpec
94
94
  end
95
95
 
96
96
  def start_server
97
- @server_pid = fork do
97
+ @server = Thread.new do
98
98
  Rack::Server.start(:app => app, :Port => port, :AccessLog => [],
99
99
  :Logger => WEBrick::Log.new("/dev/null"))
100
100
  end
@@ -139,7 +139,8 @@ module MSpec
139
139
  end
140
140
 
141
141
  def build_min file = "#{basedir}/build/specs.min.js"
142
- build ::Opal::Builder::Util.uglify(specs.to_s), file
142
+ require 'opal/util'
143
+ build ::Opal::Util.uglify(specs.to_s), file
143
144
  end
144
145
 
145
146
  def files
@@ -157,6 +158,26 @@ module MSpec
157
158
  end
158
159
 
159
160
  def rubyspec_paths
161
+ rubyspec_dir = "#{basedir}/rubyspec"
162
+ rubyspec_white_list.map do |path|
163
+ dirname = File.join rubyspec_dir, path
164
+ if File.directory? dirname
165
+ rubyspec_paths_in_dir(dirname, path)
166
+ else
167
+ path
168
+ end
169
+ end
170
+ end
171
+
172
+ def rubyspec_paths_in_dir(dirname, path)
173
+ Dir.entries(dirname).select do |spec|
174
+ spec.end_with? '.rb'
175
+ end.map do |spec|
176
+ File.join path, spec
177
+ end
178
+ end
179
+
180
+ def rubyspec_white_list
160
181
  File.read("#{basedir}/rubyspecs").split("\n").reject do |line|
161
182
  line.empty? || line.start_with?('#')
162
183
  end
@@ -123,11 +123,11 @@ end
123
123
 
124
124
  class PhantomFormatter < BrowserFormatter
125
125
  def green(str)
126
- `console.log('\\033[32m' + str + '\\033[0m')`
126
+ `console.log('\033[32m' + str + '\033[0m')`
127
127
  end
128
128
 
129
129
  def red(str)
130
- `console.log('\\033[31m' + str + '\\033[0m')`
130
+ `console.log('\033[31m' + str + '\033[0m')`
131
131
  end
132
132
 
133
133
  def log(str)
@@ -176,8 +176,9 @@ end
176
176
  module OutputSilencer
177
177
  def silence_stdout
178
178
  original_stdout = $stdout
179
- new_stdout = Object.new
180
- `#{new_stdout}.$puts = function(){}`
179
+ new_stdout = IO.new
180
+ new_stdout.extend IO::Writable
181
+ def new_stdout.write(string) end
181
182
  begin
182
183
  $stdout = new_stdout
183
184
  yield
@@ -1,6 +1,7 @@
1
1
  require 'opal/compiler'
2
2
  require 'opal/builder'
3
3
  require 'opal/erb'
4
+ require 'opal/sprockets'
4
5
  require 'opal/version'
5
6
 
6
7
  # Opal is a ruby to javascript compiler, with a runtime for running
@@ -94,33 +94,5 @@ module Opal
94
94
  def build_erb(path)
95
95
  ::ERB.new(File.read(path)).result binding
96
96
  end
97
-
98
- module Util
99
- extend self
100
-
101
- # Used for uglifying source to minify
102
- def uglify(str)
103
- IO.popen('uglifyjs 2> /dev/null', 'r+') do |i|
104
- i.puts str
105
- i.close_write
106
- return i.read
107
- end
108
- rescue Errno::ENOENT
109
- $stderr.puts '"uglifyjs" command not found (install with: "npm install -g uglify-js")'
110
- nil
111
- end
112
-
113
- # Gzip code to check file size
114
- def gzip(str)
115
- IO.popen('gzip -f 2> /dev/null', 'r+') do |i|
116
- i.puts str
117
- i.close_write
118
- return i.read
119
- end
120
- rescue Errno::ENOENT
121
- $stderr.puts '"gzip" command not found, it is required to produce the .gz version'
122
- nil
123
- end
124
- end
125
97
  end
126
98
  end
@@ -123,7 +123,6 @@ module Opal
123
123
  # PROCESSOR
124
124
 
125
125
  def set_processor_options
126
- require_opal_sprockets
127
126
  processor_options.each do |option|
128
127
  key = option.to_sym
129
128
  next unless options.has_key? key
@@ -160,7 +159,6 @@ module Opal
160
159
  end
161
160
 
162
161
  def server
163
- require_opal_sprockets
164
162
  @server ||= Opal::Server.new do |s|
165
163
  load_paths.each do |path|
166
164
  s.append_path path
@@ -169,18 +167,6 @@ module Opal
169
167
  end
170
168
  end
171
169
 
172
- def require_opal_sprockets
173
- begin
174
- require 'opal-sprockets'
175
- rescue LoadError
176
- $stderr.puts 'Opal executable requires opal-sprockets to be fully functional.'
177
- $stderr.puts 'You can install it with rubygems:'
178
- $stderr.puts ''
179
- $stderr.puts ' gem install opal-sprockets'
180
- exit -1
181
- end
182
- end
183
-
184
170
  ##
185
171
  # OUTPUT
186
172
 
@@ -49,8 +49,10 @@ module Opal
49
49
  # Current case_stmt
50
50
  attr_reader :case_stmt
51
51
 
52
+ # Any content in __END__ special construct
53
+ attr_reader :eof_content
54
+
52
55
  def initialize
53
- @line = 1
54
56
  @indent = ''
55
57
  @unique = 0
56
58
  @options = {}
@@ -60,8 +62,10 @@ module Opal
60
62
  def compile(source, options = {})
61
63
  @source = source
62
64
  @options.update options
65
+ @parser = Parser.new
63
66
 
64
- @sexp = s(:top, Parser.new.parse(@source, self.file) || s(:nil))
67
+ @sexp = s(:top, @parser.parse(@source, self.file) || s(:nil))
68
+ @eof_content = @parser.lexer.eof_content
65
69
 
66
70
  @fragments = process(@sexp).flatten
67
71
 
@@ -85,15 +89,15 @@ module Opal
85
89
  # This is called when a parsing/processing error occurs. This
86
90
  # method simply appends the filename and curent line number onto
87
91
  # the message and raises it.
88
- def error(msg)
89
- raise SyntaxError, "#{msg} :#{file}:#{@line}"
92
+ def error(msg, line = nil)
93
+ raise SyntaxError, "#{msg} :#{file}:#{line}"
90
94
  end
91
95
 
92
96
  # This is called when a parsing/processing warning occurs. This
93
97
  # method simply appends the filename and curent line number onto
94
98
  # the message and issues a warning.
95
- def warning(msg)
96
- warn "#{msg} :#{file}:#{@line}"
99
+ def warning(msg, line = nil)
100
+ warn "#{msg} :#{file}:#{line}"
97
101
  end
98
102
 
99
103
  # Instances of `Scope` can use this to determine the current
@@ -107,9 +111,7 @@ module Opal
107
111
  # returns an array, it must be used incase the internal structure
108
112
  # of sexps does change.
109
113
  def s(*parts)
110
- sexp = Sexp.new(parts)
111
- sexp.line = @line
112
- sexp
114
+ Sexp.new(parts)
113
115
  end
114
116
 
115
117
  def fragment(str, sexp = nil)
@@ -181,7 +183,6 @@ module Opal
181
183
  # and compiling it to fragments.
182
184
  def process(sexp, level = :expr)
183
185
  if handler = handlers[sexp.type]
184
- @line = sexp.line
185
186
  return handler.new(sexp, level, self).compile_to_fragments
186
187
  else
187
188
  raise "Unsupported sexp: #{sexp.type}"
@@ -268,7 +269,7 @@ module Opal
268
269
  sexp
269
270
  else
270
271
  s(:js_return, sexp).tap { |s|
271
- s.line = sexp.line
272
+ s.source = sexp.source
272
273
  }
273
274
  end
274
275
  end
@@ -16,12 +16,15 @@ module Opal
16
16
  # In debug mode we may wish to include the original line as a comment
17
17
  def to_code
18
18
  if @sexp
19
- "/*:#{@sexp.line}*/#{@code}"
19
+ "/*:#{@sexp.line}:#{@sexp.column}*/#{@code}"
20
20
  else
21
21
  @code
22
22
  end
23
23
  end
24
24
 
25
+ # debug:
26
+ # alias code to_code
27
+
25
28
  # inspect the contents of this fragment, f("fooo")
26
29
  def inspect
27
30
  "f(#{@code.inspect})"
@@ -30,5 +33,9 @@ module Opal
30
33
  def line
31
34
  @sexp.line if @sexp
32
35
  end
36
+
37
+ def column
38
+ @sexp.column if @sexp
39
+ end
33
40
  end
34
41
  end
@@ -1,4 +1,4 @@
1
- require 'opal/nodes/array'
1
+ require 'opal/nodes/base'
2
2
 
3
3
  module Opal
4
4
  module Nodes
@@ -123,6 +123,10 @@ module Opal
123
123
  scope.add_scope_ivar name
124
124
  end
125
125
 
126
+ def add_gvar(name)
127
+ scope.add_scope_gvar name
128
+ end
129
+
126
130
  def add_temp(temp)
127
131
  scope.add_scope_temp temp
128
132
  end
@@ -140,6 +140,10 @@ module Opal
140
140
  end
141
141
  end
142
142
 
143
+ add_special :debugger do
144
+ fragment 'debugger'
145
+ end
146
+
143
147
  class DependencyResolver
144
148
  def initialize(compiler, sexp)
145
149
  @compiler = compiler
@@ -174,9 +178,9 @@ module Opal
174
178
  msg = "Cannot handle dynamic require"
175
179
  case @compiler.dynamic_require_severity
176
180
  when :error
177
- @compiler.error msg
181
+ @compiler.error msg, @sexp.line
178
182
  when :warning
179
- @compiler.warning msg
183
+ @compiler.warning msg, @sexp.line
180
184
  end
181
185
  end
182
186