opal 0.10.0 → 0.11.0.rc1
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/.codeclimate.yml +19 -0
- data/.gitmodules +1 -1
- data/.jshintrc +1 -2
- data/.rspec +1 -2
- data/.travis.yml +28 -18
- data/.yardopts +3 -1
- data/CHANGELOG.md +139 -1
- data/Gemfile +16 -9
- data/HACKING.md +2 -0
- data/README.md +7 -6
- data/Rakefile +1 -1
- data/appveyor.yml +30 -0
- data/benchmark/bm_constant_lookup_big.rb +799 -0
- data/benchmark/bm_constant_lookup_small.rb +59 -0
- data/benchmark/bm_module_definition_big.rb +400 -0
- data/benchmark/bm_module_definition_small.rb +30 -0
- data/benchmark-ips/bm_case.rb +33 -0
- data/benchmark-ips/bm_constants_lookup.rb +13 -0
- data/benchmark-ips/bm_is_number.rb +29 -0
- data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
- data/bin/opal +4 -2
- data/bin/opal-repl +23 -1
- data/docs/compiled_ruby.md +16 -14
- data/docs/faq.md +3 -3
- data/docs/rspec.md +2 -1
- data/docs/unsupported_features.md +6 -4
- data/examples/rack/Gemfile +1 -0
- data/examples/rack/Gemfile.lock +11 -7
- data/examples/rack/app/application.rb +14 -3
- data/examples/rack/app/user.rb +2 -0
- data/examples/rack/config.ru +1 -1
- data/examples/rack/index.html.erb +1 -0
- data/examples/sinatra/Gemfile +1 -1
- data/examples/sinatra/Gemfile.lock +8 -11
- data/examples/sinatra/app/application.rb +2 -0
- data/lib/opal/ast/builder.rb +17 -0
- data/lib/opal/ast/node.rb +30 -0
- data/lib/opal/builder.rb +14 -3
- data/lib/opal/builder_processors.rb +1 -0
- data/lib/opal/cli.rb +45 -59
- data/lib/opal/cli_options.rb +18 -11
- data/lib/opal/cli_runners/applescript.rb +3 -3
- data/lib/opal/cli_runners/nashorn.rb +1 -0
- data/lib/opal/cli_runners/nodejs.rb +4 -1
- data/lib/opal/cli_runners/phantom.js +1 -2
- data/lib/opal/cli_runners/phantomjs.rb +3 -2
- data/lib/opal/cli_runners/server.rb +1 -0
- data/lib/opal/cli_runners.rb +1 -0
- data/lib/opal/compiler.rb +145 -94
- data/lib/opal/config.rb +114 -36
- data/lib/opal/deprecations.rb +18 -0
- data/lib/opal/erb.rb +1 -0
- data/lib/opal/errors.rb +1 -0
- data/lib/opal/fragment.rb +1 -0
- data/lib/opal/hike_path_finder.rb +1 -0
- data/lib/opal/nodes/arglist.rb +2 -1
- data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
- data/lib/opal/nodes/args/kwarg.rb +7 -7
- data/lib/opal/nodes/args/kwoptarg.rb +6 -7
- data/lib/opal/nodes/args/kwrestarg.rb +5 -5
- data/lib/opal/nodes/args/mlhsarg.rb +3 -2
- data/lib/opal/nodes/args/normarg.rb +6 -7
- data/lib/opal/nodes/args/optarg.rb +5 -7
- data/lib/opal/nodes/args/post_args.rb +6 -5
- data/lib/opal/nodes/args/post_kwargs.rb +1 -0
- data/lib/opal/nodes/args/restarg.rb +7 -7
- data/lib/opal/nodes/array.rb +1 -0
- data/lib/opal/nodes/base.rb +24 -3
- data/lib/opal/nodes/call.rb +167 -155
- data/lib/opal/nodes/call_special.rb +31 -217
- data/lib/opal/nodes/case.rb +36 -22
- data/lib/opal/nodes/class.rb +4 -3
- data/lib/opal/nodes/constants.rb +28 -48
- data/lib/opal/nodes/csend.rb +25 -0
- data/lib/opal/nodes/def.rb +57 -17
- data/lib/opal/nodes/defined.rb +170 -60
- data/lib/opal/nodes/definitions.rb +40 -133
- data/lib/opal/nodes/defs.rb +29 -0
- data/lib/opal/nodes/for.rb +52 -25
- data/lib/opal/nodes/hash.rb +12 -35
- data/lib/opal/nodes/helpers.rb +27 -54
- data/lib/opal/nodes/if.rb +21 -32
- data/lib/opal/nodes/inline_args.rb +12 -13
- data/lib/opal/nodes/iter.rb +61 -36
- data/lib/opal/nodes/literal.rb +194 -114
- data/lib/opal/nodes/logic.rb +20 -25
- data/lib/opal/nodes/masgn.rb +20 -18
- data/lib/opal/nodes/module.rb +10 -11
- data/lib/opal/nodes/node_with_args.rb +14 -17
- data/lib/opal/nodes/rescue.rb +37 -70
- data/lib/opal/nodes/runtime_helpers.rb +8 -3
- data/lib/opal/nodes/scope.rb +9 -5
- data/lib/opal/nodes/singleton_class.rb +4 -3
- data/lib/opal/nodes/super.rb +115 -87
- data/lib/opal/nodes/top.rb +7 -2
- data/lib/opal/nodes/variables.rb +46 -35
- data/lib/opal/nodes/while.rb +11 -1
- data/lib/opal/nodes/yield.rb +1 -17
- data/lib/opal/nodes.rb +3 -0
- data/lib/opal/parser.rb +28 -770
- data/lib/opal/path_reader.rb +5 -1
- data/lib/opal/paths.rb +10 -4
- data/lib/opal/regexp_anchors.rb +1 -0
- data/lib/opal/rewriter.rb +60 -0
- data/lib/opal/rewriters/base.rb +60 -0
- data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
- data/lib/opal/rewriters/block_to_iter.rb +17 -0
- data/lib/opal/rewriters/break_finder.rb +34 -0
- data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
- data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
- data/lib/opal/rewriters/js_reserved_words.rb +111 -0
- data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
- data/lib/opal/rewriters/opal_engine_check.rb +42 -0
- data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
- data/lib/opal/server.rb +4 -0
- data/lib/opal/simple_server.rb +100 -0
- data/lib/opal/source_map.rb +1 -1
- data/lib/opal/util.rb +5 -5
- data/lib/opal/version.rb +2 -1
- data/lib/opal.rb +6 -1
- data/lib/tilt/opal.rb +1 -0
- data/opal/README.md +1 -1
- data/opal/corelib/array.rb +137 -83
- data/opal/corelib/basic_object.rb +6 -6
- data/opal/corelib/class.rb +14 -11
- data/opal/corelib/complex.rb +5 -1
- data/opal/corelib/constants.rb +3 -3
- data/opal/corelib/enumerable.rb +129 -11
- data/opal/corelib/error.rb +35 -17
- data/opal/corelib/file.rb +65 -170
- data/opal/corelib/hash.rb +128 -13
- data/opal/corelib/helpers.rb +12 -15
- data/opal/corelib/io.rb +1 -0
- data/opal/corelib/kernel.rb +40 -21
- data/opal/corelib/marshal/read_buffer.rb +1 -1
- data/opal/corelib/method.rb +33 -13
- data/opal/corelib/module.rb +134 -82
- data/opal/corelib/number.rb +141 -25
- data/opal/corelib/numeric.rb +0 -8
- data/opal/corelib/process.rb +44 -4
- data/opal/corelib/random/seedrandom.js.rb +15 -0
- data/opal/corelib/random.rb +117 -0
- data/opal/corelib/range.rb +133 -10
- data/opal/corelib/regexp.rb +37 -9
- data/opal/corelib/runtime.js +604 -394
- data/opal/corelib/string/encoding.rb +51 -7
- data/opal/corelib/string.rb +39 -8
- data/opal/corelib/struct.rb +20 -0
- data/opal/corelib/time.rb +2 -2
- data/opal/corelib/variables.rb +1 -1
- data/opal/opal.rb +1 -0
- data/opal.gemspec +9 -8
- data/spec/filters/bugs/array.rb +5 -1
- data/spec/filters/bugs/basicobject.rb +2 -5
- data/spec/filters/bugs/bigdecimal.rb +8 -22
- data/spec/filters/bugs/class.rb +2 -1
- data/spec/filters/bugs/comparable.rb +5 -0
- data/spec/filters/bugs/date.rb +3 -3
- data/spec/filters/bugs/enumerable.rb +4 -11
- data/spec/filters/bugs/enumerator.rb +2 -4
- data/spec/filters/bugs/exception.rb +16 -2
- data/spec/filters/bugs/file.rb +8 -0
- data/spec/filters/bugs/float.rb +7 -1
- data/spec/filters/bugs/hash.rb +6 -2
- data/spec/filters/bugs/integer.rb +2 -0
- data/spec/filters/bugs/io.rb +8 -0
- data/spec/filters/bugs/kernel.rb +9 -138
- data/spec/filters/bugs/language.rb +89 -174
- data/spec/filters/bugs/marshal.rb +33 -35
- data/spec/filters/bugs/method.rb +0 -24
- data/spec/filters/bugs/module.rb +19 -57
- data/spec/filters/bugs/numeric.rb +0 -119
- data/spec/filters/bugs/pathname.rb +2 -0
- data/spec/filters/bugs/proc.rb +5 -4
- data/spec/filters/bugs/random.rb +7 -0
- data/spec/filters/bugs/range.rb +12 -120
- data/spec/filters/bugs/rational.rb +1 -1
- data/spec/filters/bugs/regexp.rb +2 -40
- data/spec/filters/bugs/set.rb +0 -1
- data/spec/filters/bugs/string.rb +5 -8
- data/spec/filters/bugs/stringscanner.rb +11 -19
- data/spec/filters/bugs/time.rb +7 -1
- data/spec/filters/bugs/unboundmethod.rb +1 -11
- data/spec/filters/unsupported/array.rb +5 -1
- data/spec/filters/unsupported/basicobject.rb +1 -1
- data/spec/filters/unsupported/bignum.rb +4 -1
- data/spec/filters/unsupported/class.rb +1 -1
- data/spec/filters/unsupported/delegator.rb +1 -1
- data/spec/filters/unsupported/enumerable.rb +1 -1
- data/spec/filters/unsupported/enumerator.rb +1 -1
- data/spec/filters/unsupported/file.rb +4 -0
- data/spec/filters/unsupported/fixnum.rb +1 -1
- data/spec/filters/unsupported/float.rb +4 -1
- data/spec/filters/unsupported/freeze.rb +27 -5
- data/spec/filters/unsupported/hash.rb +7 -15
- data/spec/filters/unsupported/integer.rb +1 -1
- data/spec/filters/unsupported/kernel.rb +2 -1
- data/spec/filters/unsupported/language.rb +6 -1
- data/spec/filters/unsupported/marshal.rb +1 -1
- data/spec/filters/unsupported/matchdata.rb +4 -1
- data/spec/filters/unsupported/math.rb +1 -1
- data/spec/filters/unsupported/pathname.rb +1 -1
- data/spec/filters/unsupported/privacy.rb +141 -9
- data/spec/filters/unsupported/proc.rb +1 -1
- data/spec/filters/unsupported/random.rb +4 -0
- data/spec/filters/unsupported/range.rb +7 -0
- data/spec/filters/unsupported/regexp.rb +25 -15
- data/spec/filters/unsupported/set.rb +1 -1
- data/spec/filters/unsupported/singleton.rb +1 -1
- data/spec/filters/unsupported/string.rb +110 -101
- data/spec/filters/unsupported/struct.rb +1 -1
- data/spec/filters/unsupported/symbol.rb +2 -1
- data/spec/filters/unsupported/taint.rb +22 -7
- data/spec/filters/unsupported/thread.rb +1 -1
- data/spec/filters/unsupported/time.rb +1 -1
- data/spec/lib/builder_spec.rb +17 -0
- data/spec/lib/cli_runners/phantomjs_spec.rb +2 -2
- data/spec/lib/cli_spec.rb +37 -8
- data/spec/lib/compiler/call_spec.rb +98 -66
- data/spec/lib/compiler_spec.rb +41 -32
- data/spec/lib/config_spec.rb +97 -0
- data/spec/lib/dependency_resolver_spec.rb +2 -2
- data/spec/lib/deprecations_spec.rb +16 -0
- data/spec/lib/fixtures/source_location_test.rb +7 -0
- data/spec/lib/path_reader_spec.rb +3 -3
- data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
- data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
- data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
- data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
- data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
- data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
- data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
- data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
- data/spec/lib/simple_server_spec.rb +54 -0
- data/spec/lib/spec_helper.rb +88 -4
- data/spec/mspec-opal/formatters.rb +65 -17
- data/spec/mspec-opal/runner.rb +47 -67
- data/spec/opal/core/date_spec.rb +14 -0
- data/spec/opal/core/exception_spec.rb +10 -0
- data/spec/opal/core/hash/internals_spec.rb +10 -10
- data/spec/opal/core/kernel/rand_spec.rb +0 -4
- data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
- data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
- data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
- data/spec/opal/core/language/send_spec.rb +1 -9
- data/spec/opal/core/language/string_spec.rb +8 -8
- data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
- data/spec/opal/core/language_spec.rb +32 -0
- data/spec/opal/core/module/const_get_spec.rb +1 -1
- data/spec/opal/core/runtime/is_a_spec.rb +36 -0
- data/spec/opal/core/runtime/rescue_spec.rb +35 -0
- data/spec/opal/core/runtime_spec.rb +4 -4
- data/spec/opal/core/string_spec.rb +8 -8
- data/spec/opal/core/time_spec.rb +38 -0
- data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
- data/spec/opal/stdlib/json/parse_spec.rb +4 -0
- data/spec/opal/stdlib/native/hash_spec.rb +16 -0
- data/spec/ruby_specs +2 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/support/rewriters_helper.rb +24 -0
- data/stdlib/base64.rb +4 -2
- data/stdlib/bigdecimal/bignumber.js.rb +1 -1
- data/stdlib/date.rb +18 -19
- data/stdlib/json.rb +16 -4
- data/stdlib/nashorn/file.rb +15 -0
- data/stdlib/native.rb +21 -12
- data/stdlib/nodejs/dir.rb +1 -1
- data/stdlib/nodejs/file.rb +49 -20
- data/stdlib/nodejs/io.rb +22 -1
- data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
- data/stdlib/nodejs/kernel.rb +3 -1
- data/stdlib/nodejs/package.json +0 -1
- data/stdlib/nodejs/stacktrace.rb +163 -0
- data/stdlib/nodejs/yaml.rb +2 -1
- data/stdlib/opal/platform.rb +5 -13
- data/stdlib/opal-platform.rb +15 -0
- data/stdlib/pathname.rb +1 -1
- data/stdlib/strscan.rb +15 -1
- data/stdlib/yaml.rb +1 -1
- data/tasks/benchmarking.rake +9 -0
- data/tasks/building.rake +24 -20
- data/tasks/linting.rake +24 -13
- data/tasks/testing/mspec_special_calls.rb +44 -15
- data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
- data/tasks/testing.rake +322 -205
- data/test/nodejs/fixtures/hello.rb +1 -0
- data/test/nodejs/test_file.rb +57 -0
- data/test/nodejs/test_io.rb +18 -0
- data/test/nodejs/test_opal_builder.rb +12 -0
- data/test/opal/unsupported_and_bugs.rb +9 -0
- metadata +131 -242
- data/lib/opal/parser/grammar.rb +0 -6157
- data/lib/opal/parser/grammar.y +0 -2011
- data/lib/opal/parser/keywords.rb +0 -66
- data/lib/opal/parser/lexer.rb +0 -1352
- data/lib/opal/parser/parser_scope.rb +0 -28
- data/lib/opal/parser/sexp.rb +0 -90
- data/lib/opal/sprockets/environment.rb +0 -23
- data/lib/opal/sprockets/erb.rb +0 -23
- data/lib/opal/sprockets/path_reader.rb +0 -36
- data/lib/opal/sprockets/processor.rb +0 -145
- data/lib/opal/sprockets/server.rb +0 -133
- data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
- data/lib/opal/sprockets/source_map_server.rb +0 -115
- data/lib/opal/sprockets.rb +0 -91
- data/spec/filters/bugs/compiler_opal.rb +0 -5
- data/spec/filters/bugs/language_opal.rb +0 -88
- data/spec/filters/unsupported/module.rb +0 -8
- data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
- data/spec/lib/lexer_spec.rb +0 -110
- data/spec/lib/parser/alias_spec.rb +0 -26
- data/spec/lib/parser/and_spec.rb +0 -13
- data/spec/lib/parser/aref_spec.rb +0 -10
- data/spec/lib/parser/attrasgn_spec.rb +0 -28
- data/spec/lib/parser/begin_spec.rb +0 -42
- data/spec/lib/parser/block_spec.rb +0 -12
- data/spec/lib/parser/break_spec.rb +0 -17
- data/spec/lib/parser/call_spec.rb +0 -201
- data/spec/lib/parser/class_spec.rb +0 -35
- data/spec/lib/parser/comments_spec.rb +0 -11
- data/spec/lib/parser/def_spec.rb +0 -109
- data/spec/lib/parser/if_spec.rb +0 -26
- data/spec/lib/parser/iter_spec.rb +0 -59
- data/spec/lib/parser/lambda_spec.rb +0 -219
- data/spec/lib/parser/literal_spec.rb +0 -118
- data/spec/lib/parser/masgn_spec.rb +0 -37
- data/spec/lib/parser/module_spec.rb +0 -27
- data/spec/lib/parser/not_spec.rb +0 -21
- data/spec/lib/parser/op_asgn1_spec.rb +0 -23
- data/spec/lib/parser/op_asgn2_spec.rb +0 -23
- data/spec/lib/parser/op_asgn_spec.rb +0 -17
- data/spec/lib/parser/or_spec.rb +0 -13
- data/spec/lib/parser/return_spec.rb +0 -22
- data/spec/lib/parser/sclass_spec.rb +0 -21
- data/spec/lib/parser/string_spec.rb +0 -286
- data/spec/lib/parser/super_spec.rb +0 -20
- data/spec/lib/parser/unary_spec.rb +0 -52
- data/spec/lib/parser/undef_spec.rb +0 -19
- data/spec/lib/parser/unless_spec.rb +0 -13
- data/spec/lib/parser/variables_spec.rb +0 -116
- data/spec/lib/parser/while_spec.rb +0 -15
- data/spec/lib/parser/yield_spec.rb +0 -20
- data/spec/lib/sprockets/erb_spec.rb +0 -38
- data/spec/lib/sprockets/path_reader_spec.rb +0 -41
- data/spec/lib/sprockets/processor_spec.rb +0 -79
- data/spec/lib/sprockets/server_spec.rb +0 -102
- data/spec/lib/sprockets_spec.rb +0 -32
- data/spec/lib/tilt/opal_spec.rb +0 -37
- data/spec/opal/core/language/block_spec.rb +0 -538
- data/spec/opal/core/language/proc_spec.rb +0 -263
- data/spec/opal/core/language/variables_spec.rb +0 -1366
- data/spec/opal/core/runtime/block_send_spec.rb +0 -28
- data/spec/opal/core/runtime/send_spec.rb +0 -34
- data/spec/support/parser_helpers.rb +0 -37
- data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
- data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
- data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
- data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
- data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
- data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
- data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
- data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
- data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
- data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
- data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
- data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
- data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
- data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
- data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
- /data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
data/lib/opal/cli.rb
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'opal'
|
|
2
|
-
require 'rack'
|
|
3
3
|
require 'opal/builder'
|
|
4
4
|
require 'opal/cli_runners'
|
|
5
5
|
|
|
@@ -9,18 +9,6 @@ module Opal
|
|
|
9
9
|
:output, :requires, :gems, :stubs, :verbose, :port, :preload,
|
|
10
10
|
:filename, :debug, :no_exit, :lib_only
|
|
11
11
|
|
|
12
|
-
def compile?
|
|
13
|
-
@compile
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def sexp?
|
|
17
|
-
@sexp
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def skip_opal_require?
|
|
21
|
-
@skip_opal_require
|
|
22
|
-
end
|
|
23
|
-
|
|
24
12
|
class << self
|
|
25
13
|
attr_accessor :stdout
|
|
26
14
|
end
|
|
@@ -29,8 +17,8 @@ module Opal
|
|
|
29
17
|
options ||= {}
|
|
30
18
|
|
|
31
19
|
# Runner
|
|
32
|
-
@runner_type = options.delete(:runner)
|
|
33
|
-
@port
|
|
20
|
+
@runner_type = options.delete(:runner) || :nodejs
|
|
21
|
+
@port = options.delete(:port) || 3000
|
|
34
22
|
|
|
35
23
|
@options = options
|
|
36
24
|
@compile = !!options.delete(:compile)
|
|
@@ -41,7 +29,6 @@ module Opal
|
|
|
41
29
|
@lib_only = options.delete(:lib_only)
|
|
42
30
|
@argv = options.delete(:argv) || []
|
|
43
31
|
@evals = options.delete(:evals) || []
|
|
44
|
-
@requires = options.delete(:requires) || []
|
|
45
32
|
@load_paths = options.delete(:load_paths) || []
|
|
46
33
|
@gems = options.delete(:gems) || []
|
|
47
34
|
@stubs = options.delete(:stubs) || []
|
|
@@ -50,7 +37,10 @@ module Opal
|
|
|
50
37
|
@verbose = options.fetch(:verbose, false); options.delete(:verbose)
|
|
51
38
|
@debug = options.fetch(:debug, false); options.delete(:debug)
|
|
52
39
|
@filename = options.fetch(:filename) { @file && @file.path }; options.delete(:filename)
|
|
53
|
-
|
|
40
|
+
|
|
41
|
+
@requires = options.delete(:requires) || []
|
|
42
|
+
@requires.unshift('opal') unless options.delete(:skip_opal_require)
|
|
43
|
+
|
|
54
44
|
@compiler_options = Hash[
|
|
55
45
|
*compiler_option_names.map do |option|
|
|
56
46
|
key = option.to_sym
|
|
@@ -60,18 +50,23 @@ module Opal
|
|
|
60
50
|
end.compact.flatten
|
|
61
51
|
]
|
|
62
52
|
|
|
53
|
+
raise ArgumentError, "no libraries to compile" if @lib_only and @requires.length == 0
|
|
63
54
|
raise ArgumentError, "no runnable code provided (evals or file)" if @evals.empty? and @file.nil? and not(@lib_only)
|
|
64
55
|
raise ArgumentError, "can't accept evals or file in `library only` mode" if (@evals.any? or @file) and @lib_only
|
|
65
56
|
raise ArgumentError, "unknown options: #{options.inspect}" unless @options.empty?
|
|
66
57
|
end
|
|
67
58
|
|
|
68
59
|
def run
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
60
|
+
return show_sexp if @sexp
|
|
61
|
+
|
|
62
|
+
compiled_source = builder.to_s
|
|
63
|
+
|
|
64
|
+
File.write @map, builder.source_map if @map
|
|
65
|
+
|
|
66
|
+
return puts compiled_source if @compile
|
|
67
|
+
|
|
68
|
+
runner.run(compiled_source, argv)
|
|
69
|
+
@exit_status = runner.exit_status
|
|
75
70
|
end
|
|
76
71
|
|
|
77
72
|
def runner
|
|
@@ -83,65 +78,51 @@ module Opal
|
|
|
83
78
|
end
|
|
84
79
|
end
|
|
85
80
|
|
|
86
|
-
def run_code
|
|
87
|
-
runner.run(compiled_source, argv)
|
|
88
|
-
@exit_status = runner.exit_status
|
|
89
|
-
end
|
|
90
|
-
|
|
91
81
|
attr_reader :exit_status
|
|
92
82
|
|
|
93
|
-
def
|
|
83
|
+
def builder
|
|
84
|
+
@builder ||= create_builder
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def create_builder
|
|
94
88
|
builder = Opal::Builder.new stubs: stubs, compiler_options: compiler_options
|
|
89
|
+
|
|
90
|
+
# --include
|
|
95
91
|
builder.append_paths(*load_paths)
|
|
92
|
+
|
|
93
|
+
# --gem
|
|
96
94
|
gems.each { |gem_name| builder.use_gem gem_name }
|
|
97
95
|
|
|
98
|
-
|
|
96
|
+
# --require
|
|
97
|
+
requires.each { |required| builder.build(required) }
|
|
99
98
|
|
|
99
|
+
# --preload
|
|
100
100
|
preload.each { |path| builder.build_require(path) }
|
|
101
101
|
|
|
102
|
-
#
|
|
102
|
+
# --verbose
|
|
103
103
|
builder.build_str '$VERBOSE = true', '(flags)' if verbose
|
|
104
|
-
builder.build_str '$DEBUG = true', '(flags)' if debug
|
|
105
104
|
|
|
106
|
-
#
|
|
107
|
-
|
|
108
|
-
builder.build(local_require)
|
|
109
|
-
end
|
|
105
|
+
# --debug
|
|
106
|
+
builder.build_str '$DEBUG = true', '(flags)' if debug
|
|
110
107
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
builder.build_str(contents, filename)
|
|
114
|
-
end
|
|
115
|
-
end
|
|
108
|
+
# --eval / stdin / file
|
|
109
|
+
evals_or_file { |source, filename| builder.build_str(source, filename) }
|
|
116
110
|
|
|
111
|
+
# --no-exit
|
|
117
112
|
builder.build_str 'Kernel.exit', '(exit)' unless no_exit
|
|
118
113
|
|
|
119
114
|
builder
|
|
120
115
|
end
|
|
121
116
|
|
|
122
|
-
def compiled_source
|
|
123
|
-
build.to_s
|
|
124
|
-
end
|
|
125
|
-
|
|
126
|
-
def show_compiled_source
|
|
127
|
-
puts compiled_source
|
|
128
|
-
end
|
|
129
|
-
|
|
130
117
|
def show_sexp
|
|
131
118
|
evals_or_file do |contents, filename|
|
|
132
|
-
|
|
119
|
+
buffer = ::Parser::Source::Buffer.new(filename)
|
|
120
|
+
buffer.source = contents
|
|
121
|
+
sexp = Opal::Parser.default_parser.parse(buffer)
|
|
133
122
|
puts sexp.inspect
|
|
134
123
|
end
|
|
135
124
|
end
|
|
136
125
|
|
|
137
|
-
def show_source_map
|
|
138
|
-
evals_or_file do |contents, filename|
|
|
139
|
-
compiler = Opal::Compiler.new(contents, options.merge(file: filename))
|
|
140
|
-
compiler.compile
|
|
141
|
-
puts compiler.source_map.to_json
|
|
142
|
-
end
|
|
143
|
-
end
|
|
144
|
-
|
|
145
126
|
def compiler_option_names
|
|
146
127
|
%w[
|
|
147
128
|
method_missing
|
|
@@ -150,12 +131,17 @@ module Opal
|
|
|
150
131
|
source_map_enabled
|
|
151
132
|
irb_enabled
|
|
152
133
|
inline_operators
|
|
134
|
+
enable_source_location
|
|
135
|
+
parse_comments
|
|
153
136
|
]
|
|
154
137
|
end
|
|
155
138
|
|
|
156
|
-
# Internal:
|
|
139
|
+
# Internal: Yields a string of source code and the proper filename for either
|
|
157
140
|
# evals, stdin or a filepath.
|
|
158
141
|
def evals_or_file
|
|
142
|
+
# --library
|
|
143
|
+
return if lib_only
|
|
144
|
+
|
|
159
145
|
if evals.any?
|
|
160
146
|
yield evals.join("\n"), '-e'
|
|
161
147
|
else
|
data/lib/opal/cli_options.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'optparse'
|
|
2
3
|
|
|
3
4
|
module Opal
|
|
@@ -76,10 +77,6 @@ module Opal
|
|
|
76
77
|
options[:sexp] = true
|
|
77
78
|
end
|
|
78
79
|
|
|
79
|
-
on('-m', '--map', 'Show sourcemap') do
|
|
80
|
-
options[:map] = true
|
|
81
|
-
end
|
|
82
|
-
|
|
83
80
|
on('-c', '--compile', 'Compile to JavaScript') do
|
|
84
81
|
options[:compile] = true
|
|
85
82
|
end
|
|
@@ -97,10 +94,6 @@ module Opal
|
|
|
97
94
|
options[:no_exit] = true
|
|
98
95
|
end
|
|
99
96
|
|
|
100
|
-
on('-L', '--library', 'Generate only the code of the library. Omit [programfile] and [-e]') do |no_exit|
|
|
101
|
-
options[:lib_only] = true
|
|
102
|
-
end
|
|
103
|
-
|
|
104
97
|
section 'Compilation Options:'
|
|
105
98
|
|
|
106
99
|
on('-M', '--no-method-missing', 'Enable/Disable method missing') do
|
|
@@ -126,19 +119,33 @@ module Opal
|
|
|
126
119
|
options[:dynamic_require_severity] = level.to_sym
|
|
127
120
|
end
|
|
128
121
|
|
|
129
|
-
on('-P', '--
|
|
130
|
-
options[:
|
|
131
|
-
options[:source_map_file] = file if file
|
|
122
|
+
on('-P', '--map FILE', 'Enable/Disable source map') do |file|
|
|
123
|
+
options[:map] = file
|
|
132
124
|
end
|
|
133
125
|
|
|
134
126
|
on('-F', '--file FILE', 'Set filename for compiled code') do |file|
|
|
135
127
|
options[:file] = file
|
|
136
128
|
end
|
|
137
129
|
|
|
130
|
+
on('-L', '--library', 'Compile only required libraries. Omit [programfile] and [-e]. Assumed [-cOE].') do
|
|
131
|
+
options[:lib_only] = true
|
|
132
|
+
options[:no_exit] = true
|
|
133
|
+
options[:compile] = true
|
|
134
|
+
options[:skip_opal_require] = true
|
|
135
|
+
end
|
|
136
|
+
|
|
138
137
|
on("--irb", "Enable IRB var mode") do
|
|
139
138
|
options[:irb] = true
|
|
140
139
|
end
|
|
141
140
|
|
|
141
|
+
on('--enable-source-location', 'Compiles source location for each method definition.') do
|
|
142
|
+
options[:enable_source_location] = true
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
on('--parse-comments', 'Compiles comments for each method definition.') do
|
|
146
|
+
options[:parse_comments] = true
|
|
147
|
+
end
|
|
148
|
+
|
|
142
149
|
separator ''
|
|
143
150
|
end
|
|
144
151
|
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'opal/cli_runners'
|
|
2
3
|
|
|
3
4
|
module Opal
|
|
@@ -22,15 +23,14 @@ module Opal
|
|
|
22
23
|
# tempfile = File.new('opal-applescript-runner.js', 'w') # for debugging
|
|
23
24
|
tempfile.write code
|
|
24
25
|
tempfile.close
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
_successful = system_with_output('osascript', '-l', 'JavaScript', tempfile.path , *argv)
|
|
27
27
|
rescue Errno::ENOENT
|
|
28
28
|
raise MissingAppleScript, 'AppleScript is only available on Mac OS X.'
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
# Let's support fake IO objects like StringIO
|
|
32
32
|
def system_with_output(env, *cmd)
|
|
33
|
-
if (
|
|
33
|
+
if (_io_output = IO.try_convert(output))
|
|
34
34
|
system(env,*cmd)
|
|
35
35
|
@exit_status = $?.exitstatus
|
|
36
36
|
return
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'opal/cli_runners'
|
|
2
3
|
require 'opal/paths'
|
|
4
|
+
require 'shellwords'
|
|
3
5
|
|
|
4
6
|
module Opal
|
|
5
7
|
module CliRunners
|
|
@@ -25,7 +27,8 @@ module Opal
|
|
|
25
27
|
# tempfile = File.new('opal-nodejs-runner.js', 'w') # for debugging
|
|
26
28
|
tempfile.write code
|
|
27
29
|
tempfile.close
|
|
28
|
-
|
|
30
|
+
node_opt = ENV['NODE_OPT'].to_s.shellsplit
|
|
31
|
+
system_with_output({'NODE_PATH' => node_modules}, 'node', *node_opt, tempfile.path, *argv)
|
|
29
32
|
rescue Errno::ENOENT
|
|
30
33
|
raise MissingNodeJS, 'Please install Node.js to be able to run Opal scripts.'
|
|
31
34
|
end
|
|
@@ -6,7 +6,7 @@ page.onConsoleMessage = function(msg) {
|
|
|
6
6
|
system.stdout.write(msg);
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
var opal_code =
|
|
9
|
+
var opal_code = system.stdin.read();
|
|
10
10
|
|
|
11
11
|
/*
|
|
12
12
|
* Exit phantom instance "safely" see - https://github.com/ariya/phantomjs/issues/12697
|
|
@@ -67,4 +67,3 @@ page.setContent("<!doctype html>\n"+
|
|
|
67
67
|
"<head><meta charset='utf-8'/></head><body>"+
|
|
68
68
|
"</body></html>",
|
|
69
69
|
'http://www.example.com');
|
|
70
|
-
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'shellwords'
|
|
2
3
|
|
|
3
4
|
module Opal
|
|
@@ -11,13 +12,13 @@ module Opal
|
|
|
11
12
|
attr_reader :output, :exit_status
|
|
12
13
|
|
|
13
14
|
def run(code, argv)
|
|
14
|
-
|
|
15
|
+
phantomjs_command = [
|
|
15
16
|
'phantomjs',
|
|
16
17
|
SCRIPT_PATH.shellescape,
|
|
17
18
|
*argv.map(&:shellescape)
|
|
18
19
|
].join(' ')
|
|
19
20
|
|
|
20
|
-
|
|
21
|
+
IO.popen(phantomjs_command, 'w', out: output) do |io|
|
|
21
22
|
io.write(code)
|
|
22
23
|
end
|
|
23
24
|
|
data/lib/opal/cli_runners.rb
CHANGED
data/lib/opal/compiler.rb
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
1
2
|
require 'set'
|
|
2
3
|
require 'opal/parser'
|
|
3
4
|
require 'opal/fragment'
|
|
@@ -106,7 +107,7 @@ module Opal
|
|
|
106
107
|
# @!method dynamic_require_severity
|
|
107
108
|
#
|
|
108
109
|
# how to handle dynamic requires (:error, :warning, :ignore)
|
|
109
|
-
compiler_option :dynamic_require_severity, :
|
|
110
|
+
compiler_option :dynamic_require_severity, :ignore, :valid_values => [:error, :warning, :ignore]
|
|
110
111
|
|
|
111
112
|
# @!method requirable?
|
|
112
113
|
#
|
|
@@ -120,6 +121,16 @@ module Opal
|
|
|
120
121
|
|
|
121
122
|
compiler_option :eval, false, as: :eval?
|
|
122
123
|
|
|
124
|
+
# @!method enable_source_location?
|
|
125
|
+
#
|
|
126
|
+
# Adds source_location for every method definition
|
|
127
|
+
compiler_option :enable_source_location, false, :as => :enable_source_location?
|
|
128
|
+
|
|
129
|
+
# @!method parse_comments?
|
|
130
|
+
#
|
|
131
|
+
# Adds comments for every method definition
|
|
132
|
+
compiler_option :parse_comments, false, :as => :parse_comments?
|
|
133
|
+
|
|
123
134
|
# @return [String] The compiled ruby code
|
|
124
135
|
attr_reader :result
|
|
125
136
|
|
|
@@ -135,34 +146,47 @@ module Opal
|
|
|
135
146
|
# Any content in __END__ special construct
|
|
136
147
|
attr_reader :eof_content
|
|
137
148
|
|
|
149
|
+
# Comments from the source code
|
|
150
|
+
attr_reader :comments
|
|
151
|
+
|
|
138
152
|
def initialize(source, options = {})
|
|
139
153
|
@source = source
|
|
140
154
|
@indent = ''
|
|
141
155
|
@unique = 0
|
|
142
156
|
@options = options
|
|
157
|
+
@comments = Hash.new([])
|
|
143
158
|
end
|
|
144
159
|
|
|
145
160
|
# Compile some ruby code to a string.
|
|
146
161
|
#
|
|
147
162
|
# @return [String] javascript code
|
|
148
163
|
def compile
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
parsed = begin
|
|
152
|
-
@parser.parse(@source, self.file)
|
|
153
|
-
rescue => error
|
|
154
|
-
raise SyntaxError, error.message, error.backtrace
|
|
155
|
-
end
|
|
156
|
-
|
|
157
|
-
@sexp = s(:top, parsed || s(:nil))
|
|
158
|
-
@eof_content = @parser.lexer.eof_content
|
|
164
|
+
parse
|
|
159
165
|
|
|
160
166
|
@fragments = process(@sexp).flatten
|
|
161
167
|
|
|
162
168
|
@result = @fragments.map(&:code).join('')
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
def parse
|
|
172
|
+
buffer = ::Parser::Source::Buffer.new(file)
|
|
173
|
+
buffer.source = @source
|
|
174
|
+
|
|
175
|
+
@parser = Opal::Parser.default_parser
|
|
176
|
+
|
|
177
|
+
begin
|
|
178
|
+
if parse_comments?
|
|
179
|
+
sexp, comments = @parser.parse_with_comments(buffer)
|
|
180
|
+
@comments = ::Parser::Source::Comment.associate_locations(sexp, comments)
|
|
181
|
+
else
|
|
182
|
+
sexp = @parser.parse(buffer)
|
|
183
|
+
end
|
|
184
|
+
rescue ::Parser::SyntaxError => error
|
|
185
|
+
raise ::SyntaxError, error.message, error.backtrace
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
@sexp = s(:top, sexp || s(:nil))
|
|
189
|
+
@eof_content = extract_eof_content
|
|
166
190
|
end
|
|
167
191
|
|
|
168
192
|
# Returns a source map that can be used in the browser to map back to
|
|
@@ -217,8 +241,8 @@ module Opal
|
|
|
217
241
|
# Create a new sexp using the given parts. Even though this just
|
|
218
242
|
# returns an array, it must be used incase the internal structure
|
|
219
243
|
# of sexps does change.
|
|
220
|
-
def s(*
|
|
221
|
-
|
|
244
|
+
def s(type, *children)
|
|
245
|
+
::Opal::AST::Node.new(type, children)
|
|
222
246
|
end
|
|
223
247
|
|
|
224
248
|
def fragment(str, scope, sexp = nil)
|
|
@@ -227,8 +251,19 @@ module Opal
|
|
|
227
251
|
|
|
228
252
|
# Used to generate a unique id name per file. These are used
|
|
229
253
|
# mainly to name method bodies for methods that use blocks.
|
|
230
|
-
def unique_temp
|
|
231
|
-
|
|
254
|
+
def unique_temp(name)
|
|
255
|
+
name = name.to_s
|
|
256
|
+
if name && !name.empty?
|
|
257
|
+
name = "_#{name}"
|
|
258
|
+
.gsub('?', '$q')
|
|
259
|
+
.gsub('!', '$B')
|
|
260
|
+
.gsub('=', '$eq')
|
|
261
|
+
.gsub('<', '$lt')
|
|
262
|
+
.gsub('>', '$gt')
|
|
263
|
+
.gsub(/[^\w\$]/, '$')
|
|
264
|
+
end
|
|
265
|
+
unique = (@unique += 1)
|
|
266
|
+
"TMP#{name}_#{unique}"
|
|
232
267
|
end
|
|
233
268
|
|
|
234
269
|
# Use the given helper
|
|
@@ -266,14 +301,14 @@ module Opal
|
|
|
266
301
|
def in_while
|
|
267
302
|
return unless block_given?
|
|
268
303
|
@while_loop = @scope.push_while
|
|
269
|
-
result = yield
|
|
304
|
+
result = indent { yield }
|
|
270
305
|
@scope.pop_while
|
|
271
|
-
|
|
272
306
|
result
|
|
273
307
|
end
|
|
274
308
|
|
|
275
309
|
def in_ensure
|
|
276
310
|
return unless block_given?
|
|
311
|
+
|
|
277
312
|
@in_ensure = true
|
|
278
313
|
result = yield
|
|
279
314
|
@in_ensure = false
|
|
@@ -282,31 +317,7 @@ module Opal
|
|
|
282
317
|
end
|
|
283
318
|
|
|
284
319
|
def in_ensure?
|
|
285
|
-
|
|
286
|
-
end
|
|
287
|
-
|
|
288
|
-
# With a block will detect a break in the sexp processed from within
|
|
289
|
-
# the block (see BreakNode).
|
|
290
|
-
#
|
|
291
|
-
# Without a block (but inside a `#has_break?(&block)` call) returns the
|
|
292
|
-
# current result.
|
|
293
|
-
#
|
|
294
|
-
# Works in conjunction with #has_break!
|
|
295
|
-
#
|
|
296
|
-
# @return [Boolean] whether a block has been detected
|
|
297
|
-
def has_break?
|
|
298
|
-
return @break_detected unless block_given?
|
|
299
|
-
@break_detected = false
|
|
300
|
-
result = yield
|
|
301
|
-
detected = @break_detected
|
|
302
|
-
@break_detected = nil
|
|
303
|
-
detected
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
# Marks the current block has having detected a break, but only from inside
|
|
307
|
-
# a `#has_break?(&block)` block.
|
|
308
|
-
def has_break!
|
|
309
|
-
@break_detected = true if @break_detected == false
|
|
320
|
+
!!@in_ensure
|
|
310
321
|
end
|
|
311
322
|
|
|
312
323
|
def in_case
|
|
@@ -365,69 +376,101 @@ module Opal
|
|
|
365
376
|
return returns s(:nil) unless sexp
|
|
366
377
|
|
|
367
378
|
case sexp.type
|
|
368
|
-
# Undefs go from 1 ruby undef a,b,c to multiple JS Opal.udef() calls, so need to treat them as individual statements
|
|
369
|
-
# and put the return on the last one
|
|
370
379
|
when :undef
|
|
371
|
-
|
|
372
|
-
sexp
|
|
380
|
+
# undef :method_name always returns nil
|
|
381
|
+
returns s(:begin, sexp, s(:nil))
|
|
373
382
|
when :break, :next, :redo
|
|
374
383
|
sexp
|
|
375
384
|
when :yield
|
|
376
|
-
sexp
|
|
377
|
-
sexp
|
|
378
|
-
when :scope
|
|
379
|
-
sexp[1] = returns sexp[1]
|
|
380
|
-
sexp
|
|
381
|
-
when :block
|
|
382
|
-
if sexp.length > 1
|
|
383
|
-
sexp[-1] = returns sexp[-1]
|
|
384
|
-
else
|
|
385
|
-
sexp << returns(s(:nil))
|
|
386
|
-
end
|
|
387
|
-
sexp
|
|
385
|
+
sexp.updated(:returnable_yield, nil)
|
|
388
386
|
when :when
|
|
389
|
-
|
|
390
|
-
sexp
|
|
387
|
+
*when_sexp, then_sexp = *sexp
|
|
388
|
+
sexp.updated(nil,
|
|
389
|
+
[*when_sexp, returns(then_sexp)]
|
|
390
|
+
)
|
|
391
391
|
when :rescue
|
|
392
|
-
|
|
392
|
+
body_sexp, *resbodies, else_sexp = *sexp
|
|
393
393
|
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
sexp[2][2] = returns sexp[2][2]
|
|
397
|
-
else
|
|
398
|
-
sexp[2][2] = returns s(:nil)
|
|
399
|
-
end
|
|
394
|
+
resbodies = resbodies.map do |resbody|
|
|
395
|
+
returns(resbody)
|
|
400
396
|
end
|
|
401
|
-
|
|
397
|
+
|
|
398
|
+
if else_sexp
|
|
399
|
+
else_sexp = returns(else_sexp)
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
sexp.updated(nil, [
|
|
403
|
+
returns(body_sexp),
|
|
404
|
+
*resbodies,
|
|
405
|
+
else_sexp
|
|
406
|
+
])
|
|
407
|
+
when :resbody
|
|
408
|
+
klass, lvar, body = *sexp
|
|
409
|
+
sexp.updated(nil, [klass, lvar, returns(body)])
|
|
402
410
|
when :ensure
|
|
403
|
-
|
|
404
|
-
sexp
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
sexp
|
|
408
|
-
when :
|
|
409
|
-
|
|
410
|
-
|
|
411
|
+
rescue_sexp, ensure_body = *sexp
|
|
412
|
+
sexp = sexp.updated(nil,
|
|
413
|
+
[returns(rescue_sexp), ensure_body]
|
|
414
|
+
)
|
|
415
|
+
s(:js_return, sexp)
|
|
416
|
+
when :begin, :kwbegin
|
|
417
|
+
# Wrapping last expression with s(:js_return, ...)
|
|
418
|
+
*rest, last = *sexp
|
|
419
|
+
sexp.updated(
|
|
420
|
+
nil,
|
|
421
|
+
[*rest, returns(last)]
|
|
422
|
+
)
|
|
423
|
+
when :while, :until, :while_post, :until_post
|
|
411
424
|
sexp
|
|
412
|
-
when :
|
|
413
|
-
# sexp[2] = returns(sexp[2])
|
|
414
|
-
sexp
|
|
415
|
-
when :return, :js_return
|
|
425
|
+
when :return, :js_return, :returnable_yield
|
|
416
426
|
sexp
|
|
417
427
|
when :xstr
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
428
|
+
if sexp.children.any?
|
|
429
|
+
strs = sexp.
|
|
430
|
+
children.
|
|
431
|
+
select { |child| child.type == :str }.
|
|
432
|
+
map { |child| child.children[0] }
|
|
433
|
+
|
|
434
|
+
multiline = strs.any? { |str| str.end_with?(";\n") }
|
|
435
|
+
|
|
436
|
+
first_child, *rest_children = *sexp
|
|
437
|
+
|
|
438
|
+
if multiline
|
|
439
|
+
# xstr starts with interpolation
|
|
440
|
+
# then it must contain js_return inside
|
|
441
|
+
sexp
|
|
442
|
+
else
|
|
443
|
+
if first_child.type == :str
|
|
444
|
+
old_value = first_child.children[0]
|
|
445
|
+
if old_value.include?('return')
|
|
446
|
+
# 'return' is already there
|
|
447
|
+
sexp
|
|
448
|
+
else
|
|
449
|
+
first_child = s(:js_return, first_child)
|
|
450
|
+
sexp.updated(nil, [first_child, *rest_children])
|
|
451
|
+
end
|
|
452
|
+
else
|
|
453
|
+
s(:js_return, sexp)
|
|
454
|
+
end
|
|
455
|
+
end
|
|
456
|
+
else
|
|
457
|
+
returns s(:str, '')
|
|
458
|
+
end
|
|
423
459
|
when :if
|
|
424
|
-
|
|
425
|
-
sexp
|
|
426
|
-
|
|
460
|
+
cond, true_body, false_body = *sexp
|
|
461
|
+
sexp.updated(
|
|
462
|
+
nil, [
|
|
463
|
+
cond,
|
|
464
|
+
returns(true_body),
|
|
465
|
+
returns(false_body)
|
|
466
|
+
]
|
|
467
|
+
)
|
|
427
468
|
else
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
469
|
+
s(:js_return, sexp).updated(
|
|
470
|
+
nil,
|
|
471
|
+
nil,
|
|
472
|
+
location: sexp.loc
|
|
473
|
+
)
|
|
431
474
|
end
|
|
432
475
|
end
|
|
433
476
|
|
|
@@ -441,5 +484,13 @@ module Opal
|
|
|
441
484
|
fragment("false", scope, sexp)
|
|
442
485
|
end
|
|
443
486
|
end
|
|
487
|
+
|
|
488
|
+
# Extracts all the content after __END__ directive
|
|
489
|
+
#
|
|
490
|
+
# @return [String, nil]
|
|
491
|
+
def extract_eof_content
|
|
492
|
+
matches = @source.match(/\n__END__\n?([\w\s]*)/)
|
|
493
|
+
matches && matches[1]
|
|
494
|
+
end
|
|
444
495
|
end
|
|
445
496
|
end
|