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)
/^(?: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)$/
- ES3_RESERVED_WORD_EXCLUSIVE =
ES3 reserved words that aren’t ES5.1 reserved words
/^(?:int|byte|char|goto|long|final|float|short|double|native|throws|boolean|abstract|volatile|transient|synchronized)$/
- IMMUTABLE_PROPS =
Immutable properties of the global object
/^(?:NaN|Infinity|undefined)$/
- BASIC_IDENTIFIER_RULES =
Doesn't take in account utf8
/^[$_a-z][$_a-z\d]*$/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
60 61 62 |
# File 'opal/lib/opal/nodes/helpers.rb', line 60 def current_indent compiler.parser_indent end |
#empty_line ⇒ Object
69 70 71 |
# File 'opal/lib/opal/nodes/helpers.rb', line 69 def empty_line push "\n" end |
#indent(&block) ⇒ Object
56 57 58 |
# File 'opal/lib/opal/nodes/helpers.rb', line 56 def indent(&block) compiler.indent(&block) end |
#js_falsy(sexp) ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'opal/lib/opal/nodes/helpers.rb', line 83 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
73 74 75 76 77 78 79 80 81 |
# File 'opal/lib/opal/nodes/helpers.rb', line 73 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
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'opal/lib/opal/nodes/helpers.rb', line 97 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
64 65 66 67 |
# File 'opal/lib/opal/nodes/helpers.rb', line 64 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
38 39 40 41 |
# File 'opal/lib/opal/nodes/helpers.rb', line 38 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.
48 49 50 51 52 53 54 |
# File 'opal/lib/opal/nodes/helpers.rb', line 48 def mid_to_jsid(mid) if /\=|\+|\-|\*|\/|\!|\?|\<|\>|\&|\||\^|\%|\~|\[/ =~ mid.to_s "['$#{mid}']" else '.$' + mid end end |
#property(name) ⇒ Object
19 20 21 |
# File 'opal/lib/opal/nodes/helpers.rb', line 19 def property(name) valid_name?(name) ? ".#{name}" : "[#{name.inspect}]" end |
#valid_name?(name) ⇒ Boolean
23 24 25 26 27 28 29 |
# File 'opal/lib/opal/nodes/helpers.rb', line 23 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
31 32 33 |
# File 'opal/lib/opal/nodes/helpers.rb', line 31 def variable(name) valid_name?(name.to_s) ? name : "#{name}$" end |