opal 0.5.5 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +40 -9
- data/CHANGELOG.md +349 -0
- data/Gemfile +7 -8
- data/README.md +25 -3
- data/Rakefile +4 -2
- data/bin/opal +1 -1
- data/examples/rack/Gemfile +3 -0
- data/examples/rack/app/application.rb +13 -0
- data/examples/rack/app/user.rb +21 -0
- data/examples/rack/config.ru +7 -0
- data/examples/rack/index.html.erb +10 -0
- data/examples/sinatra/Gemfile +4 -0
- data/examples/sinatra/app/application.rb +7 -0
- data/examples/sinatra/config.ru +21 -0
- data/lib/mspec/opal/rake_task.rb +29 -8
- data/lib/mspec/opal/runner.rb +5 -4
- data/lib/opal.rb +1 -0
- data/lib/opal/builder.rb +0 -28
- data/lib/opal/cli.rb +0 -14
- data/lib/opal/compiler.rb +12 -11
- data/lib/opal/fragment.rb +8 -1
- data/lib/opal/nodes/array.rb +1 -1
- data/lib/opal/nodes/base.rb +4 -0
- data/lib/opal/nodes/call.rb +6 -2
- data/lib/opal/nodes/call_special.rb +1 -1
- data/lib/opal/nodes/class.rb +2 -2
- data/lib/opal/nodes/constants.rb +3 -1
- data/lib/opal/nodes/helpers.rb +23 -14
- data/lib/opal/nodes/if.rb +16 -9
- data/lib/opal/nodes/literal.rb +37 -5
- data/lib/opal/nodes/logic.rb +7 -1
- data/lib/opal/nodes/module.rb +2 -2
- data/lib/opal/nodes/scope.rb +13 -2
- data/lib/opal/nodes/top.rb +9 -0
- data/lib/opal/nodes/variables.rb +5 -2
- data/lib/opal/parser.rb +306 -71
- data/lib/opal/parser/grammar.rb +2667 -2775
- data/lib/opal/parser/grammar.y +177 -233
- data/lib/opal/parser/lexer.rb +511 -427
- data/lib/opal/parser/sexp.rb +15 -3
- data/lib/opal/source_map.rb +8 -4
- data/lib/opal/sprockets.rb +4 -0
- data/lib/opal/sprockets/cache_key_fix.rb +17 -0
- data/lib/opal/sprockets/environment.rb +21 -0
- data/lib/opal/sprockets/erb.rb +30 -0
- data/lib/opal/sprockets/processor.rb +127 -0
- data/lib/opal/sprockets/server.rb +166 -0
- data/lib/opal/util.rb +29 -0
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +1 -1
- data/opal/corelib/array.rb +106 -187
- data/opal/corelib/array/inheritance.rb +113 -0
- data/opal/corelib/basic_object.rb +6 -2
- data/opal/corelib/boolean.rb +4 -0
- data/opal/corelib/class.rb +2 -0
- data/opal/corelib/complex.rb +3 -0
- data/opal/corelib/enumerable.rb +75 -8
- data/opal/corelib/enumerator.rb +2 -0
- data/opal/corelib/error.rb +23 -23
- data/opal/corelib/hash.rb +5 -5
- data/opal/corelib/helpers.rb +51 -16
- data/opal/corelib/io.rb +7 -24
- data/opal/corelib/kernel.rb +23 -11
- data/opal/corelib/module.rb +44 -47
- data/opal/corelib/nil_class.rb +4 -0
- data/opal/corelib/numeric.rb +101 -15
- data/opal/corelib/range.rb +2 -0
- data/opal/corelib/rational.rb +3 -0
- data/opal/corelib/regexp.rb +36 -17
- data/opal/corelib/runtime.js +22 -7
- data/opal/corelib/string.rb +213 -110
- data/opal/corelib/string/inheritance.rb +78 -0
- data/opal/corelib/struct.rb +8 -0
- data/opal/corelib/time.rb +54 -42
- data/opal/corelib/variables.rb +24 -0
- data/opal/opal.rb +5 -27
- data/spec/cli/compiler_spec.rb +136 -0
- data/spec/cli/dependency_resolver_spec.rb +40 -0
- data/spec/cli/lexer_spec.rb +110 -0
- data/spec/cli/parser/alias_spec.rb +26 -0
- data/spec/cli/parser/and_spec.rb +13 -0
- data/spec/cli/parser/attrasgn_spec.rb +28 -0
- data/spec/cli/parser/begin_spec.rb +42 -0
- data/spec/cli/parser/block_spec.rb +12 -0
- data/spec/cli/parser/break_spec.rb +17 -0
- data/spec/cli/parser/call_spec.rb +139 -0
- data/spec/cli/parser/class_spec.rb +35 -0
- data/spec/cli/parser/comments_spec.rb +11 -0
- data/spec/cli/parser/def_spec.rb +61 -0
- data/spec/cli/parser/if_spec.rb +26 -0
- data/spec/cli/parser/iter_spec.rb +59 -0
- data/spec/cli/parser/lambda_spec.rb +64 -0
- data/spec/cli/parser/literal_spec.rb +113 -0
- data/spec/cli/parser/masgn_spec.rb +37 -0
- data/spec/cli/parser/module_spec.rb +27 -0
- data/spec/cli/parser/not_spec.rb +27 -0
- data/spec/cli/parser/op_asgn1_spec.rb +23 -0
- data/spec/cli/parser/op_asgn2_spec.rb +23 -0
- data/spec/cli/parser/or_spec.rb +13 -0
- data/spec/cli/parser/return_spec.rb +17 -0
- data/spec/cli/parser/sclass_spec.rb +21 -0
- data/spec/cli/parser/string_spec.rb +269 -0
- data/spec/cli/parser/super_spec.rb +20 -0
- data/spec/cli/parser/undef_spec.rb +15 -0
- data/spec/cli/parser/unless_spec.rb +13 -0
- data/spec/cli/parser/variables_spec.rb +92 -0
- data/spec/cli/parser/while_spec.rb +15 -0
- data/spec/cli/parser/yield_spec.rb +20 -0
- data/spec/cli/spec_helper.rb +31 -11
- data/spec/opal/core/array/set_range_to_array_spec.rb +7 -0
- data/spec/opal/core/date_spec.rb +122 -0
- data/spec/opal/core/language/predefined_spec.rb +1 -1
- data/spec/opal/core/runtime/operator_call_spec.rb +13 -0
- data/spec/opal/core/runtime/truthy_spec.rb +23 -0
- data/spec/opal/filters/bugs/array.rb +96 -87
- data/spec/opal/filters/bugs/basic_object.rb +9 -0
- data/spec/opal/filters/bugs/class.rb +16 -0
- data/spec/opal/filters/bugs/enumerable.rb +54 -0
- data/spec/opal/filters/bugs/language.rb +37 -3
- data/spec/opal/filters/bugs/math.rb +93 -0
- data/spec/opal/filters/bugs/nil.rb +7 -0
- data/spec/opal/filters/bugs/numeric.rb +19 -0
- data/spec/opal/filters/bugs/opal.rb +12 -0
- data/spec/opal/filters/bugs/regexp.rb +0 -2
- data/spec/opal/filters/bugs/string.rb +317 -19
- data/spec/opal/filters/bugs/struct.rb +29 -0
- data/spec/opal/filters/bugs/time.rb +130 -9
- data/spec/opal/filters/unsupported/encoding.rb +52 -4
- data/spec/opal/filters/unsupported/enumerator.rb +0 -3
- data/spec/opal/filters/unsupported/integer_size.rb +7 -0
- data/spec/opal/filters/unsupported/method_added.rb +10 -0
- data/spec/opal/filters/unsupported/mutable_strings.rb +299 -1
- data/spec/opal/filters/unsupported/private_constants.rb +30 -0
- data/spec/opal/filters/unsupported/private_methods.rb +16 -0
- data/spec/opal/filters/unsupported/random.rb +4 -0
- data/spec/opal/filters/unsupported/tainted.rb +53 -0
- data/spec/opal/filters/unsupported/trusted.rb +5 -0
- data/spec/opal/rubyspecs +167 -234
- data/spec/opal/spec_helper.rb +3 -0
- data/spec/opal/stdlib/promise/error_spec.rb +15 -0
- data/spec/opal/stdlib/promise/rescue_spec.rb +35 -0
- data/spec/opal/stdlib/promise/then_spec.rb +54 -0
- data/spec/opal/stdlib/promise/trace_spec.rb +35 -0
- data/spec/opal/stdlib/promise/value_spec.rb +15 -0
- data/spec/opal/stdlib/promise/when_spec.rb +34 -0
- data/stdlib/base64.rb +152 -0
- data/stdlib/date.rb +82 -49
- data/{opal/corelib → stdlib}/encoding.rb +3 -1
- data/stdlib/erb.rb +0 -1
- data/stdlib/json.rb +10 -26
- data/stdlib/math.rb +370 -0
- data/stdlib/native.rb +40 -33
- data/stdlib/opal-parser.rb +7 -4
- data/stdlib/promise.rb +292 -0
- data/stdlib/strscan.rb +1 -1
- data/stdlib/template.rb +1 -3
- data/stdlib/time.rb +9 -0
- metadata +143 -204
- data/doc/compiler.md +0 -42
- data/doc/compiler_options.md +0 -5
- data/doc/examples/node_http_server.rb +0 -49
- data/doc/external_libraries.md +0 -9
- data/doc/generated_javascript.md +0 -272
- data/doc/home.md +0 -17
- data/doc/method_missing.md +0 -58
- data/doc/static_applications.md +0 -60
- data/doc/using_ruby_from_javascript.md +0 -18
- data/doc/using_sprockets.md +0 -65
- data/spec/opal/core/numeric/abs_spec.rb +0 -12
- data/spec/opal/core/numeric/downto_spec.rb +0 -19
- data/spec/opal/core/numeric/equal_value_spec.rb +0 -9
- data/spec/opal/core/numeric/even_spec.rb +0 -21
- data/spec/opal/core/numeric/magnitude_spec.rb +0 -12
- data/spec/opal/core/numeric/odd_spec.rb +0 -21
- data/spec/opal/core/string/chop_spec.rb +0 -10
- data/spec/opal/core/string/chr_spec.rb +0 -13
- data/spec/opal/core/string/clone_spec.rb +0 -8
- data/spec/opal/core/string/comparison_spec.rb +0 -13
- data/spec/opal/core/string/dup_spec.rb +0 -8
- data/spec/opal/core/string/element_reference_spec.rb +0 -96
- data/spec/opal/core/string/fixtures/classes.rb +0 -49
- data/spec/opal/core/string/format_spec.rb +0 -9
- data/spec/opal/core/string/freeze_spec.rb +0 -15
- data/spec/opal/core/string/gsub_spec.rb +0 -31
- data/spec/opal/core/string/lines_spec.rb +0 -9
- data/spec/opal/core/string/ljust_spec.rb +0 -32
- data/spec/opal/core/string/lstrip_spec.rb +0 -7
- data/spec/opal/core/string/match_spec.rb +0 -49
- data/spec/opal/core/string/next_spec.rb +0 -10
- data/spec/opal/core/string/ord_spec.rb +0 -9
- data/spec/opal/core/string/partition_spec.rb +0 -10
- data/spec/opal/core/string/rindex_spec.rb +0 -50
- data/spec/opal/core/string/rjust_spec.rb +0 -32
- data/spec/opal/core/string/rstrip_spec.rb +0 -7
- data/spec/opal/core/string/scan_spec.rb +0 -66
- data/spec/opal/core/string/slice_spec.rb +0 -74
- data/spec/opal/core/string/split_spec.rb +0 -5
- data/spec/opal/core/string/strip_spec.rb +0 -6
- data/spec/opal/core/string/sub_spec.rb +0 -38
- data/spec/opal/core/string/succ_spec.rb +0 -10
- data/spec/opal/core/string/sum_spec.rb +0 -5
- data/spec/opal/core/string/to_f_spec.rb +0 -14
- data/spec/opal/core/string/to_i_spec.rb +0 -25
- data/spec/opal/core/string/tr_s_spec.rb +0 -31
- data/spec/opal/core/string/tr_spec.rb +0 -31
- data/spec/opal/filters/bugs/parser.rb +0 -10
- data/spec/opal/filters/unsupported/immutable_strings.rb +0 -24
- data/spec/opal/filters/unsupported/string_subclasses.rb +0 -8
- data/spec/opal/parser/alias_spec.rb +0 -26
- data/spec/opal/parser/and_spec.rb +0 -13
- data/spec/opal/parser/array_spec.rb +0 -22
- data/spec/opal/parser/attrasgn_spec.rb +0 -28
- data/spec/opal/parser/begin_spec.rb +0 -42
- data/spec/opal/parser/block_spec.rb +0 -12
- data/spec/opal/parser/break_spec.rb +0 -17
- data/spec/opal/parser/call_spec.rb +0 -131
- data/spec/opal/parser/class_spec.rb +0 -35
- data/spec/opal/parser/const_spec.rb +0 -13
- data/spec/opal/parser/cvar_spec.rb +0 -11
- data/spec/opal/parser/def_spec.rb +0 -61
- data/spec/opal/parser/false_spec.rb +0 -17
- data/spec/opal/parser/file_spec.rb +0 -7
- data/spec/opal/parser/gvar_spec.rb +0 -13
- data/spec/opal/parser/hash_spec.rb +0 -17
- data/spec/opal/parser/heredoc_spec.rb +0 -30
- data/spec/opal/parser/iasgn_spec.rb +0 -9
- data/spec/opal/parser/if_spec.rb +0 -26
- data/spec/opal/parser/int_spec.rb +0 -13
- data/spec/opal/parser/iter_spec.rb +0 -59
- data/spec/opal/parser/ivar_spec.rb +0 -9
- data/spec/opal/parser/lambda_spec.rb +0 -64
- data/spec/opal/parser/lasgn_spec.rb +0 -8
- data/spec/opal/parser/line_spec.rb +0 -8
- data/spec/opal/parser/lvar_spec.rb +0 -38
- data/spec/opal/parser/masgn_spec.rb +0 -37
- data/spec/opal/parser/module_spec.rb +0 -27
- data/spec/opal/parser/nil_spec.rb +0 -17
- data/spec/opal/parser/not_spec.rb +0 -27
- data/spec/opal/parser/nth_ref_spec.rb +0 -13
- data/spec/opal/parser/op_asgn1_spec.rb +0 -23
- data/spec/opal/parser/op_asgn2_spec.rb +0 -23
- data/spec/opal/parser/or_spec.rb +0 -13
- data/spec/opal/parser/parse_spec.rb +0 -66
- data/spec/opal/parser/regexp_spec.rb +0 -16
- data/spec/opal/parser/return_spec.rb +0 -17
- data/spec/opal/parser/sclass_spec.rb +0 -21
- data/spec/opal/parser/self_spec.rb +0 -17
- data/spec/opal/parser/str_spec.rb +0 -107
- data/spec/opal/parser/string_spec.rb +0 -8
- data/spec/opal/parser/super_spec.rb +0 -20
- data/spec/opal/parser/true_spec.rb +0 -17
- data/spec/opal/parser/undef_spec.rb +0 -15
- data/spec/opal/parser/unless_spec.rb +0 -13
- data/spec/opal/parser/while_spec.rb +0 -15
- data/spec/opal/parser/xstr_spec.rb +0 -116
- 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::
|
35
|
-
gzp = Opal::
|
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
@@ -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,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
|
data/lib/mspec/opal/rake_task.rb
CHANGED
@@ -21,7 +21,7 @@ end
|
|
21
21
|
|
22
22
|
require 'rack'
|
23
23
|
require 'webrick'
|
24
|
-
|
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::
|
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, :
|
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
|
80
|
+
stop_server if server
|
80
81
|
end
|
81
82
|
|
82
83
|
def stop_server
|
83
|
-
|
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
|
-
@
|
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
|
-
|
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
|
data/lib/mspec/opal/runner.rb
CHANGED
@@ -123,11 +123,11 @@ end
|
|
123
123
|
|
124
124
|
class PhantomFormatter < BrowserFormatter
|
125
125
|
def green(str)
|
126
|
-
`console.log('
|
126
|
+
`console.log('\033[32m' + str + '\033[0m')`
|
127
127
|
end
|
128
128
|
|
129
129
|
def red(str)
|
130
|
-
`console.log('
|
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 =
|
180
|
-
|
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
|
data/lib/opal.rb
CHANGED
data/lib/opal/builder.rb
CHANGED
@@ -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
|
data/lib/opal/cli.rb
CHANGED
@@ -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
|
|
data/lib/opal/compiler.rb
CHANGED
@@ -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,
|
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}:#{
|
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}:#{
|
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
|
-
|
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.
|
272
|
+
s.source = sexp.source
|
272
273
|
}
|
273
274
|
end
|
274
275
|
end
|
data/lib/opal/fragment.rb
CHANGED
@@ -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
|
data/lib/opal/nodes/array.rb
CHANGED
data/lib/opal/nodes/base.rb
CHANGED
data/lib/opal/nodes/call.rb
CHANGED
@@ -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
|
|