opal 0.6.3 → 0.7.0.beta1
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 +4 -4
- data/.gitignore +0 -1
- data/.spectator +2 -0
- data/.spectator-mspec +3 -0
- data/.travis.yml +8 -11
- data/CHANGELOG.md +33 -0
- data/CONTRIBUTING.md +8 -43
- data/Gemfile +15 -4
- data/Guardfile +77 -0
- data/README.md +15 -9
- data/Rakefile +36 -12
- data/benchmarks/operators.rb +11 -0
- data/bin/opal +10 -13
- data/bin/opal-build +4 -4
- data/bin/opal-mspec +10 -0
- data/bin/opal-repl +4 -3
- data/examples/sinatra/Gemfile +1 -1
- data/examples/sinatra/config.ru +3 -3
- data/lib/mspec/opal/main.rb.erb +2 -2
- data/lib/mspec/opal/rake_task.rb +31 -24
- data/lib/mspec/opal/runner.rb +18 -1
- data/lib/mspec/opal/sprockets.js +17 -0
- data/lib/opal.rb +1 -34
- data/lib/opal/builder.rb +92 -58
- data/lib/opal/builder_processors.rb +165 -0
- data/lib/opal/cli.rb +85 -144
- data/lib/opal/cli_options.rb +136 -90
- data/lib/opal/cli_runners.rb +10 -0
- data/lib/opal/cli_runners/nodejs.rb +56 -0
- data/lib/opal/cli_runners/phantom.js +35 -0
- data/lib/opal/cli_runners/phantomjs.rb +28 -0
- data/lib/opal/cli_runners/server.rb +54 -0
- data/lib/opal/compiler.rb +35 -16
- data/lib/opal/erb.rb +29 -15
- data/lib/opal/hike_path_finder.rb +18 -0
- data/lib/opal/nodes.rb +1 -0
- data/lib/opal/nodes/call.rb +107 -26
- data/lib/opal/nodes/call_special.rb +31 -6
- data/lib/opal/nodes/class.rb +2 -2
- data/lib/opal/nodes/constants.rb +5 -20
- data/lib/opal/nodes/def.rb +4 -4
- data/lib/opal/nodes/defined.rb +3 -3
- data/lib/opal/nodes/definitions.rb +1 -1
- data/lib/opal/nodes/for.rb +35 -0
- data/lib/opal/nodes/helpers.rb +2 -2
- data/lib/opal/nodes/iter.rb +3 -3
- data/lib/opal/nodes/literal.rb +10 -2
- data/lib/opal/nodes/masgn.rb +2 -2
- data/lib/opal/nodes/module.rb +2 -2
- data/lib/opal/nodes/scope.rb +1 -0
- data/lib/opal/nodes/singleton_class.rb +2 -2
- data/lib/opal/nodes/super.rb +2 -2
- data/lib/opal/nodes/top.rb +30 -3
- data/lib/opal/parser.rb +15 -1
- data/lib/opal/parser/grammar.rb +2571 -2452
- data/lib/opal/parser/grammar.y +37 -5
- data/lib/opal/parser/keywords.rb +2 -0
- data/lib/opal/parser/lexer.rb +21 -11
- data/lib/opal/path_reader.rb +28 -0
- data/lib/opal/paths.rb +38 -0
- data/lib/opal/source_map.rb +32 -15
- data/lib/opal/sprockets/environment.rb +9 -2
- data/lib/opal/sprockets/erb.rb +1 -2
- data/lib/opal/sprockets/path_reader.rb +34 -0
- data/lib/opal/sprockets/processor.rb +40 -39
- data/lib/opal/sprockets/server.rb +47 -33
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +10 -5
- data/opal/README.md +6 -0
- data/opal/corelib/array.rb +36 -4
- data/opal/corelib/array/inheritance.rb +6 -6
- data/opal/corelib/basic_object.rb +9 -9
- data/opal/corelib/boolean.rb +1 -1
- data/opal/corelib/class.rb +12 -12
- data/opal/corelib/dir.rb +20 -0
- data/opal/corelib/enumerable.rb +42 -42
- data/opal/corelib/enumerator.rb +1 -1
- data/opal/corelib/error.rb +2 -2
- data/opal/corelib/file.rb +56 -0
- data/opal/corelib/hash.rb +5 -5
- data/opal/corelib/helpers.rb +3 -3
- data/opal/corelib/io.rb +13 -10
- data/opal/corelib/kernel.rb +44 -68
- data/opal/corelib/method.rb +1 -1
- data/opal/corelib/module.rb +89 -114
- data/opal/corelib/nil_class.rb +1 -1
- data/opal/corelib/numeric.rb +27 -23
- data/opal/corelib/proc.rb +5 -5
- data/opal/corelib/range.rb +8 -4
- data/opal/corelib/regexp.rb +5 -5
- data/opal/corelib/runtime.js +589 -272
- data/opal/corelib/string.rb +52 -37
- data/opal/corelib/string/inheritance.rb +5 -5
- data/opal/corelib/time.rb +102 -52
- data/opal/corelib/variables.rb +3 -3
- data/opal/opal.rb +2 -0
- data/package.json +9 -0
- data/spec/filters/bugs/array.rb +0 -6
- data/spec/filters/bugs/language.rb +4 -0
- data/spec/filters/bugs/numeric.rb +7 -6
- data/spec/filters/bugs/opal.rb +2 -0
- data/spec/filters/bugs/regexp.rb +4 -0
- data/spec/filters/bugs/string.rb +0 -7
- data/spec/filters/bugs/stringscanner.rb +4 -1
- data/spec/filters/unsupported/private_methods.rb +2 -0
- data/spec/lib/builder_processors_spec.rb +27 -0
- data/spec/lib/builder_spec.rb +66 -0
- data/spec/{cli → lib}/cli_spec.rb +60 -5
- data/spec/{cli → lib}/compiler_spec.rb +66 -5
- data/spec/{cli → lib}/dependency_resolver_spec.rb +1 -1
- data/spec/lib/fixtures/no_requires.rb +1 -0
- data/spec/{cli → lib}/fixtures/opal_file.rb +0 -0
- data/spec/lib/fixtures/require_tree_test.rb +3 -0
- data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
- data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
- data/spec/lib/fixtures/requires.rb +7 -0
- data/spec/{cli → lib}/fixtures/sprockets_file.js.rb +0 -0
- data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
- data/spec/lib/hike_path_finder_spec.rb +23 -0
- data/spec/{cli → lib}/lexer_spec.rb +1 -1
- data/spec/{cli → lib}/parser/alias_spec.rb +1 -1
- data/spec/{cli → lib}/parser/and_spec.rb +1 -1
- data/spec/{cli → lib}/parser/attrasgn_spec.rb +1 -1
- data/spec/{cli → lib}/parser/begin_spec.rb +1 -1
- data/spec/{cli → lib}/parser/block_spec.rb +1 -1
- data/spec/{cli → lib}/parser/break_spec.rb +1 -1
- data/spec/{cli → lib}/parser/call_spec.rb +1 -1
- data/spec/{cli → lib}/parser/class_spec.rb +1 -1
- data/spec/{cli → lib}/parser/comments_spec.rb +1 -1
- data/spec/{cli → lib}/parser/def_spec.rb +1 -1
- data/spec/{cli → lib}/parser/if_spec.rb +1 -1
- data/spec/{cli → lib}/parser/iter_spec.rb +1 -1
- data/spec/{cli → lib}/parser/lambda_spec.rb +1 -1
- data/spec/{cli → lib}/parser/literal_spec.rb +1 -1
- data/spec/{cli → lib}/parser/masgn_spec.rb +1 -1
- data/spec/{cli → lib}/parser/module_spec.rb +1 -1
- data/spec/{cli → lib}/parser/not_spec.rb +1 -1
- data/spec/{cli → lib}/parser/op_asgn1_spec.rb +1 -1
- data/spec/{cli → lib}/parser/op_asgn2_spec.rb +1 -1
- data/spec/{cli → lib}/parser/or_spec.rb +1 -1
- data/spec/{cli → lib}/parser/return_spec.rb +1 -1
- data/spec/{cli → lib}/parser/sclass_spec.rb +1 -1
- data/spec/{cli → lib}/parser/string_spec.rb +8 -1
- data/spec/{cli → lib}/parser/super_spec.rb +1 -1
- data/spec/lib/parser/unary_spec.rb +48 -0
- data/spec/{cli → lib}/parser/undef_spec.rb +1 -1
- data/spec/{cli → lib}/parser/unless_spec.rb +1 -1
- data/spec/{cli → lib}/parser/variables_spec.rb +1 -1
- data/spec/{cli → lib}/parser/while_spec.rb +1 -1
- data/spec/{cli → lib}/parser/yield_spec.rb +1 -1
- data/spec/lib/path_reader_spec.rb +24 -0
- data/spec/lib/shared/path_finder_shared.rb +19 -0
- data/spec/lib/shared/path_reader_shared.rb +31 -0
- data/spec/lib/spec_helper.rb +9 -0
- data/spec/lib/sprockets/environment_spec.rb +30 -0
- data/spec/{cli → lib}/sprockets/erb_spec.rb +1 -1
- data/spec/lib/sprockets/path_reader_spec.rb +25 -0
- data/spec/{cli → lib}/sprockets/processor_spec.rb +9 -2
- data/spec/lib/sprockets/server_spec.rb +20 -0
- data/spec/opal/compiler/irb_spec.rb +11 -11
- data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
- data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
- data/spec/opal/core/kernel/require_tree_spec.rb +7 -0
- data/spec/opal/core/kernel/respond_to_spec.rb +2 -2
- data/spec/opal/core/runtime/method_missing_spec.rb +19 -0
- data/spec/opal/core/source_map_spec.rb +2 -2
- data/spec/opal/core/string_spec.rb +11 -0
- data/spec/opal/stdlib/erb/erb_spec.rb +0 -1
- data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
- data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
- data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
- data/spec/rubyspecs +54 -11
- data/spec/spec_helper.rb +18 -3
- data/spec/support/mspec_rspec_adapter.rb +33 -0
- data/spec/{cli/spec_helper.rb → support/parser_helpers.rb} +10 -10
- data/stdlib/README.md +3 -0
- data/stdlib/benchmark.rb +10 -0
- data/stdlib/date.rb +2 -2
- data/stdlib/dir.rb +1 -5
- data/stdlib/file.rb +1 -7
- data/stdlib/json.rb +10 -1
- data/stdlib/native.rb +5 -5
- data/stdlib/nodejs.rb +5 -0
- data/stdlib/nodejs/dir.rb +13 -0
- data/stdlib/nodejs/file.rb +98 -0
- data/stdlib/nodejs/fileutils.rb +26 -0
- data/stdlib/nodejs/io.rb +2 -0
- data/stdlib/nodejs/irb.rb +45 -0
- data/stdlib/nodejs/process.rb +16 -0
- data/stdlib/nodejs/require.rb +32 -0
- data/stdlib/nodejs/rubygems.rb +68 -0
- data/stdlib/nodejs/runtime.rb +25 -0
- data/stdlib/nodejs/yaml.rb +11 -0
- data/stdlib/opal-parser.rb +1 -2
- data/stdlib/opal-source-maps.rb +2 -0
- data/stdlib/phantomjs.rb +8 -0
- data/stdlib/process.rb +10 -0
- data/stdlib/promise.rb +12 -4
- data/stdlib/set.rb +27 -0
- data/stdlib/source_map.rb +5 -63
- data/stdlib/source_map/map.rb +220 -0
- data/stdlib/source_map/mapping.rb +26 -0
- data/stdlib/source_map/offset.rb +88 -0
- data/stdlib/source_map/version.rb +3 -0
- data/stdlib/source_map/vlq.rb +77 -101
- data/stdlib/sourcemap.rb +1 -0
- data/stdlib/strscan.rb +7 -1
- data/stdlib/template.rb +1 -1
- data/stdlib/thread.rb +147 -7
- metadata +238 -104
- data/lib/mspec/opal/mspec_fixes.rb +0 -87
- data/spec/cli/sprockets/environment_spec.rb +0 -14
- data/spec/filters/bugs/symbol.rb +0 -5
- data/spec/opal/core/kernel/warn_spec.rb +0 -83
- data/spec/opal/core/language/numbers_spec.rb +0 -60
- data/stdlib/opal-source-maps.js.erb +0 -2
- data/stdlib/source_map/generator.rb +0 -251
- data/stdlib/source_map/parser.rb +0 -102
data/lib/opal/parser/grammar.y
CHANGED
|
@@ -470,11 +470,19 @@ rule
|
|
|
470
470
|
result = new_binary_call(val[0], val[1], val[2])
|
|
471
471
|
}
|
|
472
472
|
| '-@NUM' tINTEGER tPOW arg
|
|
473
|
+
{
|
|
474
|
+
result = new_call new_binary_call(new_int(val[1]), val[2], val[3]), [:"-@", []], []
|
|
475
|
+
}
|
|
473
476
|
| '-@NUM' tFLOAT tPOW arg
|
|
477
|
+
{
|
|
478
|
+
result = new_call new_binary_call(new_float(val[1]), val[2], val[3]), [:"-@", []], []
|
|
479
|
+
}
|
|
474
480
|
| tUPLUS arg
|
|
475
481
|
{
|
|
476
482
|
result = new_call val[1], [:"+@", []], []
|
|
477
|
-
|
|
483
|
+
if [:int, :float].include? val[1].type
|
|
484
|
+
result = val[1]
|
|
485
|
+
end
|
|
478
486
|
}
|
|
479
487
|
| tUMINUS arg
|
|
480
488
|
{
|
|
@@ -843,15 +851,19 @@ rule
|
|
|
843
851
|
{
|
|
844
852
|
result = s(:case, nil, val[3])
|
|
845
853
|
}
|
|
846
|
-
| kFOR
|
|
854
|
+
| kFOR for_var kIN
|
|
847
855
|
{
|
|
848
|
-
|
|
856
|
+
lexer.cond_push 1
|
|
857
|
+
result = lexer.line
|
|
849
858
|
}
|
|
850
859
|
expr_value do
|
|
851
860
|
{
|
|
852
|
-
|
|
861
|
+
lexer.cond_pop
|
|
853
862
|
}
|
|
854
863
|
compstmt kEND
|
|
864
|
+
{
|
|
865
|
+
result = s(:for, val[4], val[1], val[7])
|
|
866
|
+
}
|
|
855
867
|
| kCLASS cpath superclass
|
|
856
868
|
{
|
|
857
869
|
# ...
|
|
@@ -1130,7 +1142,7 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
|
1130
1142
|
{
|
|
1131
1143
|
part = s(:when, s(:array, *val[2]), val[4])
|
|
1132
1144
|
result = [part]
|
|
1133
|
-
result.push
|
|
1145
|
+
result.push(*val[5]) if val[5]
|
|
1134
1146
|
}
|
|
1135
1147
|
|
|
1136
1148
|
cases: opt_else
|
|
@@ -1184,6 +1196,9 @@ opt_block_args_tail: tCOMMA block_args_tail
|
|
|
1184
1196
|
|
|
1185
1197
|
string: string1
|
|
1186
1198
|
| string string1
|
|
1199
|
+
{
|
|
1200
|
+
result = str_append val[0], val[1]
|
|
1201
|
+
}
|
|
1187
1202
|
|
|
1188
1203
|
string1: tSTRING_BEG string_contents tSTRING_END
|
|
1189
1204
|
{
|
|
@@ -1343,7 +1358,21 @@ xstring_contents: none
|
|
|
1343
1358
|
result = new_float(val[0])
|
|
1344
1359
|
}
|
|
1345
1360
|
| '-@NUM' tINTEGER =tLOWEST
|
|
1361
|
+
{
|
|
1362
|
+
result = negate_num(new_int(val[1]))
|
|
1363
|
+
}
|
|
1346
1364
|
| '-@NUM' tFLOAT =tLOWEST
|
|
1365
|
+
{
|
|
1366
|
+
result = negate_num(new_float(val[1]))
|
|
1367
|
+
}
|
|
1368
|
+
| '+@NUM' tINTEGER =tLOWEST
|
|
1369
|
+
{
|
|
1370
|
+
result = new_int(val[1])
|
|
1371
|
+
}
|
|
1372
|
+
| '+@NUM' tFLOAT =tLOWEST
|
|
1373
|
+
{
|
|
1374
|
+
result = new_float(val[1])
|
|
1375
|
+
}
|
|
1347
1376
|
|
|
1348
1377
|
variable: tIDENTIFIER
|
|
1349
1378
|
{
|
|
@@ -1499,6 +1528,9 @@ xstring_contents: none
|
|
|
1499
1528
|
result = val[1]
|
|
1500
1529
|
}
|
|
1501
1530
|
|
|
1531
|
+
for_var: lhs
|
|
1532
|
+
| mlhs
|
|
1533
|
+
|
|
1502
1534
|
f_marg: f_norm_arg
|
|
1503
1535
|
{
|
|
1504
1536
|
result = s(:lasgn, val[0])
|
data/lib/opal/parser/keywords.rb
CHANGED
|
@@ -28,7 +28,9 @@ module Opal
|
|
|
28
28
|
["end", [:kEND, :kEND], :expr_end],
|
|
29
29
|
["ensure", [:kENSURE, :kENSURE], :expr_beg],
|
|
30
30
|
["false", [:kFALSE, :kFALSE], :expr_end],
|
|
31
|
+
["for", [:kFOR, :kFOR], :expr_beg],
|
|
31
32
|
["if", [:kIF, :kIF_MOD], :expr_beg],
|
|
33
|
+
["in", [:kIN, :kIN], :expr_beg],
|
|
32
34
|
["module", [:kMODULE, :kMODULE], :expr_beg],
|
|
33
35
|
["nil", [:kNIL, :kNIL], :expr_end],
|
|
34
36
|
["next", [:kNEXT, :kNEXT], :expr_mid],
|
data/lib/opal/parser/lexer.rb
CHANGED
|
@@ -21,7 +21,7 @@ module Opal
|
|
|
21
21
|
STR_SSYM = STR_FUNC_SYMBOL
|
|
22
22
|
STR_DSYM = STR_FUNC_SYMBOL | STR_FUNC_EXPAND
|
|
23
23
|
|
|
24
|
-
attr_reader :line
|
|
24
|
+
attr_reader :line, :column
|
|
25
25
|
attr_reader :scope
|
|
26
26
|
attr_reader :eof_content
|
|
27
27
|
|
|
@@ -43,6 +43,9 @@ module Opal
|
|
|
43
43
|
|
|
44
44
|
@scanner = StringScanner.new(source)
|
|
45
45
|
@scanner_stack = [@scanner]
|
|
46
|
+
|
|
47
|
+
@case_stmt = nil
|
|
48
|
+
@start_of_lambda = nil
|
|
46
49
|
end
|
|
47
50
|
|
|
48
51
|
def has_local?(local)
|
|
@@ -173,21 +176,24 @@ module Opal
|
|
|
173
176
|
def process_numeric
|
|
174
177
|
@lex_state = :expr_end
|
|
175
178
|
|
|
176
|
-
if scan(/
|
|
177
|
-
self.yylval = scanner.matched.to_i(2)
|
|
178
|
-
return :tINTEGER
|
|
179
|
-
elsif scan(/0o?([0-7]|_)+/)
|
|
180
|
-
self.yylval = scanner.matched.to_i(8)
|
|
181
|
-
return :tINTEGER
|
|
182
|
-
elsif scan(/[\d_]+\.[\d_]+\b|[\d_]+(\.[\d_]+)?[eE][-+]?[\d_]+\b/)
|
|
179
|
+
if scan(/[\d_]+\.[\d_]+\b|[\d_]+(\.[\d_]+)?[eE][-+]?[\d_]+\b/) # FLOATS
|
|
183
180
|
self.yylval = scanner.matched.gsub(/_/, '').to_f
|
|
184
181
|
return :tFLOAT
|
|
185
|
-
elsif scan(/[\d_]
|
|
182
|
+
elsif scan(/([^0][\d_]*|0)\b/) # BASE 10
|
|
186
183
|
self.yylval = scanner.matched.gsub(/_/, '').to_i
|
|
187
184
|
return :tINTEGER
|
|
188
|
-
elsif scan(/0
|
|
185
|
+
elsif scan(/0[bB](0|1|_)+/) # BASE 2
|
|
186
|
+
self.yylval = scanner.matched.to_i(2)
|
|
187
|
+
return :tINTEGER
|
|
188
|
+
elsif scan(/0[xX](\d|[a-f]|[A-F]|_)+/) # BASE 16
|
|
189
189
|
self.yylval = scanner.matched.to_i(16)
|
|
190
190
|
return :tINTEGER
|
|
191
|
+
elsif scan(/0[oO]?([0-7]|_)+/) # BASE 8
|
|
192
|
+
self.yylval = scanner.matched.to_i(8)
|
|
193
|
+
return :tINTEGER
|
|
194
|
+
elsif scan(/0[dD]([0-9]|_)+/) # BASE 10
|
|
195
|
+
self.yylval = scanner.matched.gsub(/_/, '').to_i
|
|
196
|
+
return :tINTEGER
|
|
191
197
|
else
|
|
192
198
|
raise "Lexing error on numeric type: `#{scanner.peek 5}`"
|
|
193
199
|
end
|
|
@@ -1057,7 +1063,11 @@ module Opal
|
|
|
1057
1063
|
if beg?
|
|
1058
1064
|
@lex_state = :expr_mid
|
|
1059
1065
|
self.yylval = matched
|
|
1060
|
-
|
|
1066
|
+
if scanner.peek(1) =~ /\d/ and
|
|
1067
|
+
return utype == :tUMINUS ? '-@NUM' : '+@NUM'
|
|
1068
|
+
else
|
|
1069
|
+
return utype
|
|
1070
|
+
end
|
|
1061
1071
|
elsif after_operator?
|
|
1062
1072
|
@lex_state = :expr_arg
|
|
1063
1073
|
if scan(/@/)
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'opal/hike_path_finder'
|
|
2
|
+
|
|
3
|
+
module Opal
|
|
4
|
+
class PathReader
|
|
5
|
+
def initialize(file_finder = HikePathFinder.new)
|
|
6
|
+
@file_finder = file_finder
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def read(path)
|
|
10
|
+
full_path = expand(path)
|
|
11
|
+
return nil if full_path.nil?
|
|
12
|
+
File.read(full_path)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def expand(path)
|
|
16
|
+
file_finder.find(path)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def paths
|
|
20
|
+
file_finder.paths
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
attr_reader :file_finder
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/opal/paths.rb
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
module Opal
|
|
2
|
+
def self.gem_dir
|
|
3
|
+
File.expand_path('../..', __FILE__.untaint)
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
def self.core_dir
|
|
7
|
+
File.expand_path('../../../opal', __FILE__.untaint)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def self.std_dir
|
|
11
|
+
File.expand_path('../../../stdlib', __FILE__.untaint)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Add a file path to opals load path. Any gem containing ruby code that Opal
|
|
15
|
+
# has access to should add a load path through this method. Load paths added
|
|
16
|
+
# here should only be paths which contain code targeted at being compiled by
|
|
17
|
+
# Opal.
|
|
18
|
+
def self.append_path(path)
|
|
19
|
+
paths << path
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def self.use_gem(gem_name, include_dependecies = true)
|
|
23
|
+
spec = Gem::Specification.find_by_name(gem_name)
|
|
24
|
+
|
|
25
|
+
spec.runtime_dependencies.each do |dependency|
|
|
26
|
+
use_gem dependency.name
|
|
27
|
+
end if include_dependecies
|
|
28
|
+
|
|
29
|
+
spec.require_paths.each do |path|
|
|
30
|
+
Opal.append_path File.join(spec.gem_dir, path)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Private, don't add to these directly (use .append_path instead).
|
|
35
|
+
def self.paths
|
|
36
|
+
@paths ||= [core_dir.untaint, std_dir.untaint, gem_dir.untaint]
|
|
37
|
+
end
|
|
38
|
+
end
|
data/lib/opal/source_map.rb
CHANGED
|
@@ -12,29 +12,46 @@ module Opal
|
|
|
12
12
|
end
|
|
13
13
|
|
|
14
14
|
def map
|
|
15
|
-
@map ||=
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
15
|
+
@map ||= begin
|
|
16
|
+
source_file = file+'.rb'
|
|
17
|
+
generated_line, generated_column = 1, 0
|
|
18
|
+
|
|
19
|
+
mappings = @fragments.map do |fragment|
|
|
20
|
+
mapping = nil
|
|
21
|
+
source_line = fragment.line
|
|
22
|
+
source_column = fragment.column
|
|
23
|
+
source_code = fragment.code
|
|
24
|
+
|
|
25
|
+
if source_line and source_column
|
|
26
|
+
source_offset = ::SourceMap::Offset.new(source_line, source_column)
|
|
27
|
+
generated_offset = ::SourceMap::Offset.new(generated_line, generated_column)
|
|
28
|
+
|
|
29
|
+
mapping = ::SourceMap::Mapping.new(
|
|
30
|
+
source_file,
|
|
31
|
+
generated_offset,
|
|
32
|
+
source_offset
|
|
26
33
|
)
|
|
27
34
|
end
|
|
28
35
|
|
|
29
|
-
new_lines =
|
|
30
|
-
|
|
36
|
+
new_lines = source_code.count "\n"
|
|
37
|
+
generated_line += new_lines
|
|
31
38
|
|
|
32
39
|
if new_lines > 0
|
|
33
|
-
|
|
40
|
+
generated_column = source_code.size - (source_code.rindex("\n") + 1)
|
|
34
41
|
else
|
|
35
|
-
|
|
42
|
+
generated_column += source_code.size
|
|
36
43
|
end
|
|
44
|
+
|
|
45
|
+
mapping
|
|
37
46
|
end
|
|
47
|
+
|
|
48
|
+
# Ensure mappings isn't empty: https://github.com/maccman/sourcemap/issues/11
|
|
49
|
+
unless mappings.any?
|
|
50
|
+
zero_offset = ::SourceMap::Offset.new(0,0)
|
|
51
|
+
mappings = [::SourceMap::Mapping.new(source_file,zero_offset,zero_offset)]
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
::SourceMap::Map.new(mappings.compact)
|
|
38
55
|
end
|
|
39
56
|
end
|
|
40
57
|
|
|
@@ -20,11 +20,18 @@ module Opal
|
|
|
20
20
|
class Environment < ::Sprockets::Environment
|
|
21
21
|
def initialize *args
|
|
22
22
|
super
|
|
23
|
-
|
|
23
|
+
append_opal_paths
|
|
24
24
|
end
|
|
25
25
|
|
|
26
26
|
def use_gem gem_name
|
|
27
|
-
|
|
27
|
+
Opal.use_gem gem_name
|
|
28
|
+
append_opal_paths
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
def append_opal_paths
|
|
34
|
+
Opal.paths.each { |p| append_path p }
|
|
28
35
|
end
|
|
29
36
|
end
|
|
30
37
|
end
|
data/lib/opal/sprockets/erb.rb
CHANGED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
module Opal
|
|
2
|
+
module Sprockets
|
|
3
|
+
|
|
4
|
+
class PathReader
|
|
5
|
+
def initialize(env, context)
|
|
6
|
+
@env ||= env
|
|
7
|
+
@context ||= context
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def read path
|
|
11
|
+
if path.end_with? '.js'
|
|
12
|
+
context.depend_on_asset(path)
|
|
13
|
+
env[path].to_s
|
|
14
|
+
else
|
|
15
|
+
context.depend_on(path)
|
|
16
|
+
File.read(expand(path))
|
|
17
|
+
end
|
|
18
|
+
rescue ::Sprockets::FileNotFound
|
|
19
|
+
nil
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def expand path
|
|
23
|
+
env.resolve(path)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def paths
|
|
27
|
+
env.paths
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
attr_reader :env, :context
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
require 'set'
|
|
2
|
+
require 'tilt'
|
|
2
3
|
require 'sprockets'
|
|
3
4
|
require 'opal/version'
|
|
5
|
+
require 'opal/builder'
|
|
6
|
+
require 'opal/sprockets/path_reader'
|
|
4
7
|
|
|
5
8
|
$OPAL_SOURCE_MAPS = {}
|
|
6
9
|
|
|
@@ -11,12 +14,12 @@ module Opal
|
|
|
11
14
|
# which effect how certain ruby features are handled:
|
|
12
15
|
#
|
|
13
16
|
# * method_missing_enabled [true by default]
|
|
14
|
-
# * optimized_operators_enabled [true by default]
|
|
15
17
|
# * arity_check_enabled [false by default]
|
|
16
18
|
# * const_missing_enabled [true by default]
|
|
17
|
-
# * dynamic_require_severity [
|
|
19
|
+
# * dynamic_require_severity [:error by default]
|
|
18
20
|
# * source_map_enabled [true by default]
|
|
19
21
|
# * irb_enabled [false by default]
|
|
22
|
+
# * inline_operators_enabled [false by default]
|
|
20
23
|
#
|
|
21
24
|
class Processor < Tilt::Template
|
|
22
25
|
# vvv BOILERPLATE vvv
|
|
@@ -46,6 +49,9 @@ module Opal
|
|
|
46
49
|
attr_accessor :dynamic_require_severity
|
|
47
50
|
attr_accessor :source_map_enabled
|
|
48
51
|
attr_accessor :irb_enabled
|
|
52
|
+
attr_accessor :inline_operators_enabled
|
|
53
|
+
|
|
54
|
+
attr_accessor :source_map_register
|
|
49
55
|
end
|
|
50
56
|
|
|
51
57
|
self.method_missing_enabled = true
|
|
@@ -55,63 +61,58 @@ module Opal
|
|
|
55
61
|
self.source_map_enabled = true
|
|
56
62
|
self.irb_enabled = false
|
|
57
63
|
|
|
58
|
-
|
|
59
|
-
stubbed_files << name.to_s
|
|
60
|
-
end
|
|
64
|
+
self.source_map_register = $OPAL_SOURCE_MAPS
|
|
61
65
|
|
|
62
|
-
def self.stubbed_files
|
|
63
|
-
@stubbed_files ||= Set.new
|
|
64
|
-
end
|
|
65
66
|
|
|
66
67
|
def evaluate(context, locals, &block)
|
|
67
|
-
|
|
68
|
-
:method_missing => self.class.method_missing_enabled,
|
|
69
|
-
:arity_check => self.class.arity_check_enabled,
|
|
70
|
-
:const_missing => self.class.const_missing_enabled,
|
|
71
|
-
:dynamic_require_severity => self.class.dynamic_require_severity,
|
|
72
|
-
:irb => self.class.irb_enabled,
|
|
73
|
-
:file => context.logical_path,
|
|
74
|
-
}
|
|
68
|
+
return Opal.compile data unless context.is_a? ::Sprockets::Context
|
|
75
69
|
|
|
76
|
-
|
|
77
|
-
|
|
70
|
+
path = context.logical_path
|
|
71
|
+
prerequired = []
|
|
78
72
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
path = find_opal_require context.environment, r
|
|
82
|
-
context.require_asset path
|
|
83
|
-
end
|
|
73
|
+
builder = self.class.new_builder(context)
|
|
74
|
+
result = builder.build_str(data, path, :prerequired => prerequired)
|
|
84
75
|
|
|
85
76
|
if self.class.source_map_enabled
|
|
86
|
-
|
|
87
|
-
"#{result}\n//# sourceMappingURL=#{
|
|
77
|
+
register_source_map(context.logical_path, result.source_map.to_s)
|
|
78
|
+
"#{result.to_s}\n//# sourceMappingURL=#{context.logical_path}.map\n"
|
|
88
79
|
else
|
|
89
|
-
result
|
|
80
|
+
result.to_s
|
|
90
81
|
end
|
|
91
82
|
end
|
|
92
83
|
|
|
93
|
-
def
|
|
94
|
-
|
|
84
|
+
def register_source_map path, map_contents
|
|
85
|
+
self.class.source_map_register[path] = map_contents
|
|
95
86
|
end
|
|
96
87
|
|
|
97
|
-
def
|
|
98
|
-
|
|
88
|
+
def self.stubbed_files
|
|
89
|
+
@stubbed_files ||= []
|
|
99
90
|
end
|
|
100
91
|
|
|
101
|
-
def
|
|
102
|
-
|
|
92
|
+
def self.stub_file(name)
|
|
93
|
+
stubbed_files << name.to_s
|
|
103
94
|
end
|
|
104
95
|
|
|
105
|
-
def
|
|
106
|
-
self.class.stubbed_files
|
|
96
|
+
def stubbed_files
|
|
97
|
+
self.class.stubbed_files
|
|
107
98
|
end
|
|
108
99
|
|
|
109
|
-
def
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
100
|
+
def self.new_builder(context)
|
|
101
|
+
compiler_options = {
|
|
102
|
+
:method_missing => method_missing_enabled,
|
|
103
|
+
:arity_check => arity_check_enabled,
|
|
104
|
+
:const_missing => const_missing_enabled,
|
|
105
|
+
:dynamic_require_severity => dynamic_require_severity,
|
|
106
|
+
:irb => irb_enabled,
|
|
107
|
+
:inline_operators => inline_operators_enabled
|
|
108
|
+
}
|
|
113
109
|
|
|
114
|
-
|
|
110
|
+
path_reader = ::Opal::Sprockets::PathReader.new(context.environment, context)
|
|
111
|
+
return Builder.new(
|
|
112
|
+
compiler_options: compiler_options,
|
|
113
|
+
stubs: stubbed_files,
|
|
114
|
+
path_reader: path_reader
|
|
115
|
+
)
|
|
115
116
|
end
|
|
116
117
|
end
|
|
117
118
|
end
|