@@ -3,31 +3,40 @@ module Nodes
3
3
module Helpers
4
4
5
5
# Reserved javascript keywords - we cannot create variables with the
6
- # same name
7
- RESERVED = %w[
8
- arguments break case catch char class const continue debugger default
9
- delete do else enum export extends false finally for function if import
10
- in instanceof let native new return static switch super this throw try
11
- true typeof var void while with undefined
12
- ]
6
+ # 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)$/
8
+
9
+ # 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)$/
11
+
12
+ # Immutable properties of the global object
13
+ IMMUTABLE_PROPS = /^(?:NaN|Infinity|undefined)$/
14
+
15
+ # Doesn't take in account utf8
16
+ BASIC_IDENTIFIER_RULES = /^[$_a-z][$_a-z\d ]*$/i
17
+
13
18
14
19
def property ( name )
15
- reserved ?( name ) ? "[' #{ name } '] " : ". #{ name } "
20
+ valid_name ?( name ) ? ". #{ name } " : "[ #{ name . inspect } ] "
16
21
end
17
22
18
- def reserved? ( name )
19
- RESERVED . include? name
23
+ def valid_name? ( name )
24
+ BASIC_IDENTIFIER_RULES =~ name and not(
25
+ ES51_RESERVED_WORD =~ name or
26
+ ES3_RESERVED_WORD_EXCLUSIVE =~ name or
27
+ IMMUTABLE_PROPS =~ name
28
+ )
20
29
end
21
30
22
31
def variable ( name )
23
- reserved ?( name . to_s ) ? "#{ name } $" : name
32
+ valid_name ?( name . to_s ) ? name : "#{ name } $"
24
33
end
25
34
26
35
# Converts a ruby lvar/arg name to a js identifier. Not all ruby names
27
36
# are valid in javascript. A $ suffix is added to non-valid names.
28
37
# varibales
29
38
def lvar_to_js ( var )
30
- var = "#{ var } $" if RESERVED . include ? var . to_s
39
+ var = "#{ var } $" unless valid_name ? var . to_s
31
40
var . to_sym
32
41
end
33
42
0 commit comments