Module: Opal::Nodes::Helpers
- Included in:
- Base
- Defined in:
- opal/lib/opal/nodes/helpers.rb
Constant Summary
- ES51_RESERVED_WORD =
Reserved javascript keywords - we cannot create variables with the same name (ref: http://stackoverflow.com/a/9337272/601782)
/#{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}/
- ES3_RESERVED_WORD_EXCLUSIVE =
ES3 reserved words that aren’t ES5.1 reserved words
/#{REGEXP_START}(?:int|byte|char|goto|long|final|float|short|double|native|throws|boolean|abstract|volatile|transient|synchronized)#{REGEXP_END}/
- IMMUTABLE_PROPS =
Immutable properties of the global object
/#{REGEXP_START}(?:NaN|Infinity|undefined)#{REGEXP_END}/
- BASIC_IDENTIFIER_RULES =
Doesn't take in account utf8
/#{REGEXP_START}[$_a-z][$_a-z\d]*#{REGEXP_END}/i
Instance Method Summary collapse
- #current_indent ⇒ Object
- #empty_line ⇒ Object
- #indent(&block) ⇒ Object
- #js_falsy(sexp) ⇒ Object
- #js_truthy(sexp) ⇒ Object
- #js_truthy_optimize(sexp) ⇒ Object
- #line(*strs) ⇒ Object
-
#lvar_to_js(var) ⇒ Object
Converts a ruby lvar/arg name to a js identifier.
-
#mid_to_jsid(mid) ⇒ Object
Converts a ruby method name into its javascript equivalent for a method/function call.
- #property(name) ⇒ Object
- #valid_name?(name) ⇒ Boolean
- #variable(name) ⇒ Object
Instance Method Details
#current_indent ⇒ Object
62 63 64 |
# File 'opal/lib/opal/nodes/helpers.rb', line 62 def current_indent compiler.parser_indent end |
#empty_line ⇒ Object
71 72 73 |
# File 'opal/lib/opal/nodes/helpers.rb', line 71 def empty_line push "\n" end |
#indent(&block) ⇒ Object
58 59 60 |
# File 'opal/lib/opal/nodes/helpers.rb', line 58 def indent(&block) compiler.indent(&block) end |
#js_falsy(sexp) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 |
# File 'opal/lib/opal/nodes/helpers.rb', line 85 def js_falsy(sexp) if sexp.type == :call mid = sexp[2] if mid == :block_given? scope.uses_block! return "#{scope.block_name} === nil" end end with_temp do |tmp| [fragment("((#{tmp} = "), expr(sexp), fragment(") === nil || (#{tmp}.$$is_boolean && #{tmp} == false))")] end end |
#js_truthy(sexp) ⇒ Object
75 76 77 78 79 80 81 82 83 |
# File 'opal/lib/opal/nodes/helpers.rb', line 75 def js_truthy(sexp) if optimize = js_truthy_optimize(sexp) return optimize end with_temp do |tmp| [fragment("((#{tmp} = "), expr(sexp), fragment(") !== nil && (!#{tmp}.$$is_boolean || #{tmp} == true))")] end end |
#js_truthy_optimize(sexp) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
# File 'opal/lib/opal/nodes/helpers.rb', line 99 def js_truthy_optimize(sexp) if sexp.type == :call mid = sexp[2] if mid == :block_given? expr(sexp) elsif Compiler::COMPARE.include? mid.to_s expr(sexp) elsif mid == :==" expr(sexp) end elsif [:lvar, :self].include? sexp.type [expr(sexp.dup), fragment(" !== false && "), expr(sexp.dup), fragment(" !== nil")] end end |
#line(*strs) ⇒ Object
66 67 68 69 |
# File 'opal/lib/opal/nodes/helpers.rb', line 66 def line(*strs) push "\n#{current_indent}" push(*strs) end |
#lvar_to_js(var) ⇒ Object
Converts a ruby lvar/arg name to a js identifier. Not all ruby names are valid in javascript. A $ suffix is added to non-valid names. varibales
40 41 42 43 |
# File 'opal/lib/opal/nodes/helpers.rb', line 40 def lvar_to_js(var) var = "#{var}$" unless valid_name? var.to_s var.to_sym end |
#mid_to_jsid(mid) ⇒ Object
Converts a ruby method name into its javascript equivalent for a method/function call. All ruby method names get prefixed with a '$', and if the name is a valid javascript identifier, it will have a '.' prefix (for dot-calling), otherwise it will be wrapped in brackets to use reference notation calling.
50 51 52 53 54 55 56 |
# File 'opal/lib/opal/nodes/helpers.rb', line 50 def mid_to_jsid(mid) if /\=|\+|\-|\*|\/|\!|\?|\<|\>|\&|\||\^|\%|\~|\[/ =~ mid.to_s "['$#{mid}']" else '.$' + mid end end |
#property(name) ⇒ Object
21 22 23 |
# File 'opal/lib/opal/nodes/helpers.rb', line 21 def property(name) valid_name?(name) ? ".#{name}" : "[#{name.inspect}]" end |
#valid_name?(name) ⇒ Boolean
25 26 27 28 29 30 31 |
# File 'opal/lib/opal/nodes/helpers.rb', line 25 def valid_name?(name) BASIC_IDENTIFIER_RULES =~ name and not( ES51_RESERVED_WORD =~ name or ES3_RESERVED_WORD_EXCLUSIVE =~ name or IMMUTABLE_PROPS =~ name ) end |
#variable(name) ⇒ Object
33 34 35 |
# File 'opal/lib/opal/nodes/helpers.rb', line 33 def variable(name) valid_name?(name.to_s) ? name : "#{name}$" end |