opal 0.8.0.beta1 → 0.8.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +0 -24
  3. data/.jshintrc +51 -0
  4. data/.travis.yml +6 -1
  5. data/CHANGELOG.md +2 -0
  6. data/Gemfile +3 -7
  7. data/README.md +2 -3
  8. data/Rakefile +1 -0
  9. data/lib/mspec/opal/rake_task.rb +1 -1
  10. data/lib/opal/builder.rb +21 -3
  11. data/lib/opal/builder_processors.rb +2 -2
  12. data/lib/opal/cli.rb +8 -5
  13. data/lib/opal/erb.rb +1 -1
  14. data/lib/opal/nodes/call.rb +1 -1
  15. data/lib/opal/nodes/call_special.rb +1 -1
  16. data/lib/opal/nodes/helpers.rb +6 -4
  17. data/lib/opal/nodes/iter.rb +2 -2
  18. data/lib/opal/nodes/singleton_class.rb +2 -1
  19. data/lib/opal/parser/lexer.rb +3 -2
  20. data/lib/opal/path_reader.rb +8 -1
  21. data/lib/opal/paths.rb +23 -16
  22. data/lib/opal/regexp_anchors.rb +5 -0
  23. data/lib/opal/sprockets/erb.rb +1 -1
  24. data/lib/opal/sprockets/processor.rb +21 -35
  25. data/lib/opal/sprockets/source_map_server.rb +5 -5
  26. data/lib/opal/version.rb +3 -1
  27. data/lib/tilt/opal.rb +11 -5
  28. data/opal.gemspec +2 -2
  29. data/opal/corelib/array.rb +196 -4
  30. data/opal/corelib/enumerable.rb +1 -1
  31. data/opal/corelib/enumerator.rb +2 -2
  32. data/opal/corelib/hash.rb +6 -6
  33. data/opal/corelib/kernel.rb +5 -3
  34. data/opal/corelib/module.rb +18 -12
  35. data/opal/corelib/regexp.rb +110 -4
  36. data/opal/corelib/runtime.js +12 -4
  37. data/opal/corelib/string.rb +51 -95
  38. data/opal/corelib/string/inheritance.rb +22 -0
  39. data/opal/corelib/variables.rb +1 -1
  40. data/spec/filters/bugs/array.rb +3 -39
  41. data/spec/filters/bugs/basic_object.rb +20 -0
  42. data/spec/filters/bugs/date.rb +5 -0
  43. data/spec/filters/bugs/enumerable.rb +9 -0
  44. data/spec/filters/bugs/enumerator.rb +0 -7
  45. data/spec/filters/bugs/hash.rb +2 -0
  46. data/spec/filters/bugs/kernel.rb +5 -0
  47. data/spec/filters/bugs/language.rb +14 -0
  48. data/spec/filters/bugs/method.rb +5 -0
  49. data/spec/filters/bugs/module.rb +23 -0
  50. data/spec/filters/bugs/regular_expressions.rb +41 -0
  51. data/spec/filters/bugs/singleton.rb +3 -0
  52. data/spec/filters/bugs/string.rb +2 -9
  53. data/spec/filters/bugs/stringscanner.rb +3 -0
  54. data/spec/filters/bugs/time.rb +19 -0
  55. data/spec/filters/unsupported/module.rb +6 -0
  56. data/spec/filters/unsupported/mutable_strings.rb +8 -0
  57. data/spec/filters/unsupported/regular_expressions.rb +90 -0
  58. data/spec/lib/builder_spec.rb +12 -6
  59. data/spec/lib/cli_spec.rb +2 -2
  60. data/spec/lib/path_reader_spec.rb +12 -0
  61. data/spec/lib/sprockets/server_spec.rb +7 -8
  62. data/spec/lib/tilt/opal_spec.rb +18 -0
  63. data/spec/opal/core/language/regexp_spec.rb +1 -1
  64. data/spec/opal/core/runtime/bridged_classes_spec.rb +48 -1
  65. data/spec/rubyspecs +88 -78
  66. data/stdlib/encoding.rb +3 -0
  67. data/stdlib/native.rb +1 -1
  68. data/stdlib/pp.rb +27 -6
  69. data/stdlib/set.rb +10 -0
  70. data/tasks/linting.rake +18 -0
  71. data/tasks/testing.rake +11 -4
  72. data/{stdlib → vendored-minitest}/minitest.rb +0 -0
  73. data/{stdlib → vendored-minitest}/minitest/assertions.rb +0 -0
  74. data/{stdlib → vendored-minitest}/minitest/autorun.rb +0 -0
  75. data/{stdlib → vendored-minitest}/minitest/benchmark.rb +0 -0
  76. data/{stdlib → vendored-minitest}/minitest/expectations.rb +0 -0
  77. data/{stdlib → vendored-minitest}/minitest/hell.rb +0 -0
  78. data/{stdlib → vendored-minitest}/minitest/mock.rb +0 -0
  79. data/{stdlib → vendored-minitest}/minitest/parallel.rb +0 -0
  80. data/{stdlib → vendored-minitest}/minitest/pride.rb +0 -0
  81. data/{stdlib → vendored-minitest}/minitest/pride_plugin.rb +0 -0
  82. data/{stdlib → vendored-minitest}/minitest/spec.rb +0 -0
  83. data/{stdlib → vendored-minitest}/minitest/test.rb +0 -0
  84. data/{stdlib → vendored-minitest}/minitest/unit.rb +0 -0
  85. data/vendored-minitest/test/unit.rb +23 -0
  86. metadata +31 -29
  87. data/stdlib/test/unit.rb +0 -10
  88. data/tasks/documentation.rake +0 -38
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4a0a405fd05a0fa6b1f6efac707d0317c6d0ca57
4
- data.tar.gz: c57f69d7c54f38d210cc3bfb139c98af5385505b
3
+ metadata.gz: 3afa0a5d5b918de046d4985b97fa8464b5e73014
4
+ data.tar.gz: a0a71fde911085d35f81cf363dd1d6569cb2119f
5
5
  SHA512:
6
- metadata.gz: a2e4b8e88e96a05e3f5a284624571b6e8232594782cc72189ed48835d30ab3cd32ca0ab9d40e3cc93e2978fd1a1c0c4750408f8a57bf55a8aba07eee80278d50
7
- data.tar.gz: 902b292438b1fe4893f45a52c3dc31429aa9eebefda5914cd18705c863d6e308ab36ea1323320ba2b9374f6360037a5a55dd9425488b7155b5aab97517a59324
6
+ metadata.gz: a64a3b104c5b74e7fece49e701449e0bc69d55883848622e5697cd69aa228203ad78ca8d692af4da0d81bc3b950b31cfbbb053c99a2ccfa0fe7048aded6787c1
7
+ data.tar.gz: c1f7ca3700b01bac88d7c401d7d2affe59985738415a9dd82aebf2217943d81d61a50e37827f1114a727bf30b33e4a511ffad3ab7e8b606cc1c466023c10ddd8
data/.gitmodules CHANGED
@@ -1,30 +1,6 @@
1
1
  [submodule "spec/corelib"]
2
2
  path = spec/corelib
3
3
  url = https://github.com/opal/rubyspec
4
- [submodule "spec/stdlib/rubysl-singleton"]
5
- path = spec/stdlib/rubysl-singleton
6
- url = https://github.com/rubysl/rubysl-singleton
7
- [submodule "spec/stdlib/rubysl-observer"]
8
- path = spec/stdlib/rubysl-observer
9
- url = https://github.com/rubysl/rubysl-observer
10
- [submodule "spec/stdlib/rubysl-strscan"]
11
- path = spec/stdlib/rubysl-strscan
12
- url = https://github.com/rubysl/rubysl-strscan
13
- [submodule "spec/stdlib/rubysl-delegate"]
14
- path = spec/stdlib/rubysl-delegate
15
- url = https://github.com/rubysl/rubysl-delegate
16
- [submodule "spec/stdlib/rubysl-erb"]
17
- path = spec/stdlib/rubysl-erb
18
- url = https://github.com/rubysl/rubysl-erb
19
- [submodule "spec/stdlib/rubysl-set"]
20
- path = spec/stdlib/rubysl-set
21
- url = https://github.com/rubysl/rubysl-set
22
- [submodule "spec/stdlib/rubysl-pathname"]
23
- path = spec/stdlib/rubysl-pathname
24
- url = https://github.com/rubysl/rubysl-pathname
25
- [submodule "spec/stdlib/rubysl-date"]
26
- path = spec/stdlib/rubysl-date
27
- url = https://github.com/rubysl/rubysl-date
28
4
  [submodule "test/cruby"]
29
5
  path = test/cruby
30
6
  url = https://github.com/ruby/ruby.git
data/.jshintrc ADDED
@@ -0,0 +1,51 @@
1
+ {
2
+ // http://jshint.com/docs/options
3
+
4
+ "curly" : true, // Require curly braces around blocks in loops and conditionals
5
+ "eqeqeq" : true, // Prohibit the use of == and != in favor of === and !==
6
+ "es3" : true, // Adhere to ECMAScript 3 specification
7
+ "forin" : true, // Require all for in loops to filter object's items (hasOwnProperty)
8
+ "latedef" : true, // Prohibit the use of a variable before it was defined
9
+ "noarg" : true, // Prohibit the use of arguments.caller and arguments.callee
10
+ "nonbsp" : true, // Warn about "non-breaking whitespace" characters
11
+ "undef" : true, // Prohibit the use of explicitly undeclared variables
12
+ "unused" : true, // Warn when you define and never use your variables
13
+
14
+ "globals": {
15
+ "Opal": true,
16
+ "OpalNode": true,
17
+ "callPhantom": true,
18
+ "JSON": true
19
+ },
20
+
21
+ "browser": true,
22
+ "node": true,
23
+
24
+ // Currently the following checks are failing:
25
+
26
+ "-W003": false, // 'variable' was used before it was defined
27
+ "-W004": false, // 'variable' is already defined
28
+ "-W018": false, // Confusing use of '!'
29
+ "-W021": false, // '$ClassName' is a function
30
+ "-W024": false, // Expected an identifier and instead saw 'eval' (a reserved word)
31
+ "-W027": false, // Unreachable ';' after 'return'
32
+ "-W032": false, // Unnecessary semicolon
33
+ "-W030": false, // Expected an assignment or function call and instead saw an expression
34
+ "-W033": false, // Missing semicolon
35
+ "-W038": false, // 'variable' used out of scope
36
+ "-W041": false, // Use '===' to compare with 'true'
37
+ "-W049": false, // Unexpected escaped character '<' in regular expression
38
+ "-W053": false, // Do not use String as a constructor
39
+ "-W058": false, // Missing '()' invoking a constructor
40
+ "-W061": false, // eval can be harmful
41
+ "-W065": false, // Missing radix parameter
42
+ "-W069": false, // ['prop'] is better written in dot notation
43
+ "-W080": false, // It's not necessary to initialize 'result' to 'undefined'
44
+ "-W083": false, // Don't make functions within a loop
45
+ "-W086": false, // Expected a 'break' statement before 'case'
46
+ "-W089": false, // The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype
47
+ "-W093": false, // Did you mean to return a conditional instead of an assignment?
48
+ "-W098": false, // 'variable' is defined but never used
49
+ "-W116": false, // Expected '===' and instead saw '=='
50
+ "-W120": false // You might be leaking a variable ($ClassName) here
51
+ }
data/.travis.yml CHANGED
@@ -13,7 +13,7 @@ matrix:
13
13
  env: RUN=default TZ="/usr/share/zoneinfo/Pacific/Fiji"
14
14
 
15
15
  - rvm: 2.2
16
- env: RUN=default SPROCKETS_VERSION="~> 2.12.3"
16
+ env: RUN=rspec TILT_VERSION=2.0.1
17
17
 
18
18
  - rvm: 2.1
19
19
  env: RUN=rspec
@@ -33,6 +33,11 @@ matrix:
33
33
  - rvm: jruby-head
34
34
  env: RUN=rspec
35
35
 
36
+ - rvm: 2.2
37
+ script:
38
+ - npm install -g jshint
39
+ - bundle exec rake lint
40
+
36
41
  allow_failures:
37
42
  - rvm: 1.8.7
38
43
  - rvm: 1.9.3
data/CHANGELOG.md CHANGED
@@ -1,5 +1,7 @@
1
1
  ## edge (upcoming 0.8.0)
2
2
 
3
+ * Removed minitest from stdlib. It's not part of MRI and it never belonged there, checkout the opal-minitest gem instead.
4
+
3
5
  * Parser: Allow trailing comma in paren arglists, after normal args as
4
6
  well as assoc args.
5
7
 
data/Gemfile CHANGED
@@ -9,15 +9,14 @@ gem 'json', '< 1.8.1' if RUBY_VERSION.to_f == 2.1 and RUBY_ENGINE == 'ruby'
9
9
  gem 'rubysl', :platform => :rbx
10
10
  gem 'thin', platform: :mri
11
11
 
12
- # Uncomment to try with sprockets 3.0:
13
- #
14
- # gem 'sprockets', '~> 3.0.0.beta'
15
-
16
12
  group :repl do
17
13
  gem 'therubyracer', :platform => :mri, :require => 'v8'
18
14
  gem 'therubyrhino', :platform => :jruby
19
15
  end
20
16
 
17
+ tilt_version = ENV['TILT_VERSION']
18
+ gem 'tilt', tilt_version if tilt_version
19
+
21
20
  unless ENV['CI']
22
21
  gem 'rb-fsevent'
23
22
  gem 'guard', require: false
@@ -25,6 +24,3 @@ unless ENV['CI']
25
24
  end
26
25
 
27
26
  gem 'mspec', github: 'rubyspec/mspec'
28
-
29
- sprockets_version = ENV['SPROCKETS_VERSION']
30
- gem 'sprockets', sprockets_version if sprockets_version
data/README.md CHANGED
@@ -7,9 +7,8 @@
7
7
  Opal is a ruby to javascript source-to-source compiler. It also has an
8
8
  implementation of the ruby corelib.
9
9
 
10
- Opal is [hosted on github](http://github.com/opal/opal), and there
11
- is a Freenode IRC channel at [#opal](http://webchat.freenode.net/?channels=opal),
12
- ask questions on [stackoverflow (tag #opalrb)](http://stackoverflow.com/questions/ask?tags=opalrb).
10
+ Opal is [hosted on github](http://github.com/opal/opal). Chat is available on *Gitter* at [opal/opal](https://gitter.im/opal/opal) and the Freenode IRC channel at [#opal](http://webchat.freenode.net/?channels=opal).
11
+ Ask questions on [stackoverflow (tag #opalrb)](http://stackoverflow.com/questions/ask?tags=opalrb). Get the [Opalist newsletter](http://opalist.co) for updates and community news.
13
12
 
14
13
  [![Inline docs](http://inch-ci.org/github/opal/opal.svg?branch=master&style=flat)](http://opalrb.org/docs/api)
15
14
  [![Gitter chat](http://img.shields.io/badge/gitter-opal%2Fopal-009966.svg?style=flat)](https://gitter.im/opal/opal)
data/Rakefile CHANGED
@@ -9,5 +9,6 @@ import 'tasks/github.rake'
9
9
  import 'tasks/documenting.rake'
10
10
  import 'tasks/testing.rake'
11
11
  import 'tasks/building.rake'
12
+ import 'tasks/linting.rake'
12
13
 
13
14
  task :default => [:rspec, :mspec_node, :cruby_tests]
@@ -163,7 +163,7 @@ module MSpec
163
163
 
164
164
  def paths_from_glob pattern
165
165
  Dir.glob(File.expand_path(pattern)).map do |s|
166
- s.sub(/^#{basedir}\//, '').sub(/\.rb$/, '')
166
+ s.sub(/\A#{basedir}\//, '').sub(/\.rb\z/, '')
167
167
  end
168
168
  end
169
169
 
data/lib/opal/builder.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'opal/path_reader'
2
2
  require 'opal/builder_processors'
3
+ require 'opal/paths'
3
4
  require 'set'
4
5
 
5
6
  module Opal
@@ -42,13 +43,24 @@ module Opal
42
43
  processed << asset
43
44
  self
44
45
  rescue MissingRequire => error
45
- raise error, "A file required by #{filename.inspect} wasn't found.\n#{error.message}"
46
+ raise error, "A file required by #{filename.inspect} wasn't found.\n#{error.message}", error.backtrace
46
47
  end
47
48
 
48
49
  def build_require(path, options = {})
49
50
  process_require(path, options)
50
51
  end
51
52
 
53
+ def initialize_copy(other)
54
+ super
55
+ @stubs = other.stubs.dup
56
+ @preload = other.preload.dup
57
+ @processors = other.processors.dup
58
+ @path_reader = other.path_reader.dup
59
+ @prerequired = other.prerequired.dup
60
+ @compiler_options = other.compiler_options.dup
61
+ @processed = other.processed.dup
62
+ end
63
+
52
64
  def to_s
53
65
  processed.map(&:to_s).join("\n")
54
66
  end
@@ -57,6 +69,12 @@ module Opal
57
69
  processed.map(&:source_map).reduce(:+).as_json.to_json
58
70
  end
59
71
 
72
+ def append_paths(*paths)
73
+ path_reader.append_paths(*paths)
74
+ end
75
+
76
+ include UseGem
77
+
60
78
  attr_reader :processed
61
79
 
62
80
  attr_accessor :processors, :default_processor, :path_reader,
@@ -84,7 +102,7 @@ module Opal
84
102
  globs = extensions.map { |ext| File.join base, tree, '**', "*.#{ext}" }
85
103
 
86
104
  Dir[*globs].map do |file|
87
- Pathname(file).relative_path_from(Pathname(base)).to_s.gsub(/(\.js)?(\.(?:#{extensions.join '|'}))$/, '')
105
+ Pathname(file).relative_path_from(Pathname(base)).to_s.gsub(/(\.js)?(\.(?:#{extensions.join '|'}))#{REGEXP_END}/, '')
88
106
  end
89
107
  end
90
108
  end
@@ -101,7 +119,7 @@ module Opal
101
119
  end
102
120
 
103
121
  def process_require(filename, options)
104
- filename.gsub!(/\.(rb|js|opal)$/, '')
122
+ filename.gsub!(/\.(rb|js|opal)#{REGEXP_END}/, '')
105
123
  return if prerequired.include?(filename)
106
124
  return if already_processed.include?(filename)
107
125
  already_processed << filename
@@ -27,7 +27,7 @@ module Opal
27
27
  matches = extensions.join('|')
28
28
  matches = "(#{matches})" if extensions.size == 1
29
29
 
30
- @match_regexp = Regexp.new "\\.#{matches}$"
30
+ @match_regexp = Regexp.new "\\.#{matches}#{REGEXP_END}"
31
31
  end
32
32
 
33
33
  def self.extensions
@@ -87,7 +87,7 @@ module Opal
87
87
 
88
88
  def compiled
89
89
  @compiled ||= begin
90
- compiler = compiler_for(@source, file: @filename.gsub(/\.(rb|js|opal)$/, ''))
90
+ compiler = compiler_for(@source, file: @filename.gsub(/\.(rb|js|opal)#{REGEXP_END}/, ''))
91
91
  compiler.compile
92
92
  compiler
93
93
  end
data/lib/opal/cli.rb CHANGED
@@ -87,11 +87,10 @@ module Opal
87
87
 
88
88
  attr_reader :exit_status
89
89
 
90
- def compiled_source
91
- Opal.paths.concat load_paths
92
- gems.each { |gem_name| Opal.use_gem gem_name }
93
-
90
+ def build
94
91
  builder = Opal::Builder.new stubs: stubs, compiler_options: compiler_options
92
+ builder.append_paths(*load_paths)
93
+ gems.each { |gem_name| builder.use_gem gem_name }
95
94
 
96
95
  builder.build 'opal' unless skip_opal_require?
97
96
 
@@ -116,7 +115,11 @@ module Opal
116
115
 
117
116
  builder.build_str 'Kernel.exit', '(exit)' unless no_exit
118
117
 
119
- builder.to_s
118
+ builder
119
+ end
120
+
121
+ def compiled_source
122
+ build.to_s
120
123
  end
121
124
 
122
125
  def show_compiled_source
data/lib/opal/erb.rb CHANGED
@@ -76,7 +76,7 @@ module Opal
76
76
  end
77
77
 
78
78
  def wrap_compiled(result)
79
- path = @file_name.sub(/\.opalerb$/, '')
79
+ path = @file_name.sub(/\.opalerb#{REGEXP_END}/, '')
80
80
  result = "Template.new('#{path}') do |output_buffer|\noutput_buffer.append(\"#{result}\")\noutput_buffer.join\nend\n"
81
81
  end
82
82
  end
@@ -90,7 +90,7 @@ module Opal
90
90
  end
91
91
 
92
92
  def attr_assignment?
93
- @assignment ||= meth.to_s =~ /^[\da-z]+\=$/i
93
+ @assignment ||= meth.to_s =~ /#{REGEXP_START}[\da-z]+\=#{REGEXP_END}/i
94
94
  end
95
95
 
96
96
  # Used to generate the code to use this sexp as an ivar var reference
@@ -12,7 +12,7 @@ module Opal
12
12
 
13
13
  def default_compile
14
14
  # Skip, for now, if the method has square brackets: []=
15
- return super if meth.to_s !~ /^\w+=$/
15
+ return super if meth.to_s !~ /#{REGEXP_START}\w+=#{REGEXP_END}/
16
16
 
17
17
  with_temp do |args_tmp|
18
18
  with_temp do |recv_tmp|
@@ -1,19 +1,21 @@
1
+ require 'opal/regexp_anchors'
2
+
1
3
  module Opal
2
4
  module Nodes
3
5
  module Helpers
4
6
 
5
7
  # Reserved javascript keywords - we cannot create variables with the
6
8
  # same name (ref: http://stackoverflow.com/a/9337272/601782)
7
- ES51_RESERVED_WORD = /^(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)$/
9
+ ES51_RESERVED_WORD = /#{REGEXP_START}(?:do|if|in|for|let|new|try|var|case|else|enum|eval|false|null|this|true|void|with|break|catch|class|const|super|throw|while|yield|delete|export|import|public|return|static|switch|typeof|default|extends|finally|package|private|continue|debugger|function|arguments|interface|protected|implements|instanceof)#{REGEXP_END}/
8
10
 
9
11
  # ES3 reserved words that aren’t ES5.1 reserved words
10
- ES3_RESERVED_WORD_EXCLUSIVE = /^(?:int|byte|char|goto|long|final|float|short|double|native|throws|boolean|abstract|volatile|transient|synchronized)$/
12
+ ES3_RESERVED_WORD_EXCLUSIVE = /#{REGEXP_START}(?:int|byte|char|goto|long|final|float|short|double|native|throws|boolean|abstract|volatile|transient|synchronized)#{REGEXP_END}/
11
13
 
12
14
  # Immutable properties of the global object
13
- IMMUTABLE_PROPS = /^(?:NaN|Infinity|undefined)$/
15
+ IMMUTABLE_PROPS = /#{REGEXP_START}(?:NaN|Infinity|undefined)#{REGEXP_END}/
14
16
 
15
17
  # Doesn't take in account utf8
16
- BASIC_IDENTIFIER_RULES = /^[$_a-z][$_a-z\d]*$/i
18
+ BASIC_IDENTIFIER_RULES = /#{REGEXP_START}[$_a-z][$_a-z\d]*#{REGEXP_END}/i
17
19
 
18
20
 
19
21
  def property(name)
@@ -67,7 +67,7 @@ module Opal
67
67
  elsif arg.type == :array
68
68
  arg[1..-1].each_with_index do |_arg, _idx|
69
69
  _arg = variable(_arg[1])
70
- push "#{_arg} = #{params[idx]}[#{_idx}];"
70
+ push "var #{_arg} = #{params[idx]}[#{_idx}];"
71
71
  end
72
72
  else
73
73
  raise "Bad block arg type"
@@ -115,7 +115,7 @@ module Opal
115
115
  sexp.each do |arg|
116
116
  if arg[0] == :lasgn
117
117
  ref = variable(arg[1])
118
- scope.add_arg ref
118
+ self.add_arg ref
119
119
  result << ref
120
120
  elsif arg[0] == :array
121
121
  result << scope.next_temp
@@ -14,8 +14,9 @@ module Opal
14
14
  add_temp '$scope = self.$$scope'
15
15
  add_temp 'def = self.$$proto'
16
16
 
17
+ body_stmt = stmt(compiler.returns(body))
17
18
  line scope.to_vars
18
- line stmt(compiler.returns(body))
19
+ line body_stmt
19
20
  end
20
21
 
21
22
  line "})(", recv(object), ".$singleton_class())"
@@ -1,3 +1,4 @@
1
+ require 'opal/regexp_anchors'
1
2
  require 'strscan'
2
3
  require 'opal/parser/keywords'
3
4
 
@@ -558,7 +559,7 @@ module Opal
558
559
  matched += scanner.matched
559
560
  end
560
561
 
561
- elsif matched =~ /^[A-Z]/
562
+ elsif matched =~ /#{REGEXP_START}[A-Z]/
562
563
  result = :tCONSTANT
563
564
  else
564
565
  result = :tIDENTIFIER
@@ -627,7 +628,7 @@ module Opal
627
628
  @lex_state = :expr_end
628
629
  end
629
630
 
630
- return matched =~ /^[A-Z]/ ? :tCONSTANT : :tIDENTIFIER
631
+ return matched =~ /#{REGEXP_START}[A-Z]/ ? :tCONSTANT : :tIDENTIFIER
631
632
  end
632
633
 
633
634
  # Does the heavy lifting for `next_token`.
@@ -13,13 +13,20 @@ module Opal
13
13
  end
14
14
 
15
15
  def expand(path)
16
- file_finder.find(path)
16
+ if Pathname.new(path).absolute? || path =~ %r{\A\.?\.#{File::SEPARATOR}}
17
+ path
18
+ else
19
+ file_finder.find(path)
20
+ end
17
21
  end
18
22
 
19
23
  def paths
20
24
  file_finder.paths
21
25
  end
22
26
 
27
+ def append_paths(*paths)
28
+ file_finder.append_paths(*paths)
29
+ end
23
30
 
24
31
  private
25
32
 
data/lib/opal/paths.rb CHANGED
@@ -16,31 +16,38 @@ module Opal
16
16
  # here should only be paths which contain code targeted at being compiled by
17
17
  # Opal.
18
18
  def self.append_path(path)
19
- paths << path
19
+ append_paths(path)
20
+ end
21
+ def self.append_paths(*paths)
22
+ self.paths.concat(paths)
20
23
  end
21
24
 
22
- def self.use_gem(gem_name, include_dependencies = true)
23
- require_paths_for_gem(gem_name, include_dependencies).each do |path|
24
- append_path path
25
+ module UseGem
26
+ def use_gem(gem_name, include_dependencies = true)
27
+ append_paths(*require_paths_for_gem(gem_name, include_dependencies))
25
28
  end
26
- end
29
+
30
+ private
27
31
 
28
- def self.require_paths_for_gem(gem_name, include_dependencies)
29
- paths = []
30
- spec = Gem::Specification.find_by_name(gem_name)
32
+ def require_paths_for_gem(gem_name, include_dependencies)
33
+ paths = []
34
+ spec = Gem::Specification.find_by_name(gem_name)
31
35
 
32
- spec.runtime_dependencies.each do |dependency|
33
- paths += require_paths_for_gem(dependency.name, include_dependencies)
34
- end if include_dependencies
36
+ spec.runtime_dependencies.each do |dependency|
37
+ paths += require_paths_for_gem(dependency.name, include_dependencies)
38
+ end if include_dependencies
35
39
 
36
- gem_dir = spec.gem_dir
37
- spec.require_paths.map do |path|
38
- paths << File.join(gem_dir, path)
39
- end
40
+ gem_dir = spec.gem_dir
41
+ spec.require_paths.map do |path|
42
+ paths << File.join(gem_dir, path)
43
+ end
40
44
 
41
- paths
45
+ paths
46
+ end
42
47
  end
43
48
 
49
+ extend UseGem
50
+
44
51
  # Private, don't add to these directly (use .append_path instead).
45
52
  def self.paths
46
53
  @paths ||= [core_dir.untaint, std_dir.untaint, gem_dir.untaint]