@@ -9,6 +9,11 @@ import Data.List (intercalate)
9import Language.PureScript.Crash
9import Language.PureScript.Crash
10import Language.PureScript.Names
10import Language.PureScript.Names
12+moduleNameToJs :: ModuleName -> String
13+moduleNameToJs (ModuleName pns) =
14+ let name = intercalate "_" (runProperName `map` pns)
15+ in if nameIsJsBuiltIn name then "$$" ++ name else name
13-- Convert an Ident into a valid Javascript identifier:
18-- Convert an Ident into a valid Javascript identifier:
@@ -19,8 +24,9 @@ import Language.PureScript.Names
19-- * Symbols are prefixed with '$' followed by a symbol name or their ordinal value.
24-- * Symbols are prefixed with '$' followed by a symbol name or their ordinal value.
21identToJs :: Ident -> String
26identToJs :: Ident -> String
22−identToJs (Ident name) | nameIsJsReserved name = "$$" ++ name
27+identToJs (Ident name)
28+ | nameIsJsReserved name || nameIsJsBuiltIn name = "$$" ++ name
23−identToJs (Ident name) = concatMap identCharToString name
29+ | otherwise = concatMap identCharToString name
24identToJs (Op op) = concatMap identCharToString op
30identToJs (Op op) = concatMap identCharToString op
25identToJs (GenIdent _ _) = internalError "GenIdent in identToJs"
31identToJs (GenIdent _ _) = internalError "GenIdent in identToJs"
@@ -65,107 +71,161 @@ identCharToString c = '$' : show (ord c)
66nameIsJsReserved :: String -> Bool
72nameIsJsReserved :: String -> Bool
67nameIsJsReserved name =
73nameIsJsReserved name =
68− name `elem` [ "abstract"
74+ name `elem` jsAnyReserved
128− , "yield" ] || properNameIsJsReserved name
130−moduleNameToJs :: ModuleName -> String
131−moduleNameToJs (ModuleName pns) =
132− let name = intercalate "_" (runProperName `map` pns)
133− in if properNameIsJsReserved name then "$$" ++ name else name
136−-- Checks whether a proper name is reserved in Javascript.
77+-- Checks whether a name matches a built-in value in Javascript.
138−properNameIsJsReserved :: String -> Bool
79+nameIsJsBuiltIn :: String -> Bool
139−properNameIsJsReserved name =
80+nameIsJsBuiltIn name =
140− name `elem` [ "Infinity"
81+ elem name
141− , "NaN"
82+ [ "arguments"
142− , "Object"
83+ , "Array"
143− , "Function"
84+ , "ArrayBuffer"
144− , "Boolean"
85+ , "Boolean"
89+ , "decodeURIComponent"
91+ , "encodeURIComponent"
145− , "Error"
92+ , "Error"
146− , "EvalError"
95+ , "EvalError"
147− , "InternalError"
96+ , "Float32Array"
148− , "RangeError"
116+ , "RangeError"
149− , "ReferenceError"
117+ , "ReferenceError"
150− , "SyntaxError"
124+ , "SyntaxError"
151− , "TypeError"
125+ , "TypeError"
152− , "URIError"
126+ , "Uint16Array"
153− , "Number"
127+ , "Uint32Array"
160− , "Uint8Array"
128+ , "Uint8Array"
161− , "Uint8ClampedArray"
129+ , "Uint8ClampedArray"
162− , "Int16Array"
130+ , "undefined"
163− , "Uint16Array"
131+ , "unescape"
164− , "Int32Array"
132+ , "URIError"
165− , "Uint32Array"
133+ , "WeakMap"
166− , "Float32Array"
134+ , "WeakSet"
167− , "Float64Array"
135+ ]
169− , "DataView"
137+jsAnyReserved :: [String]
170− , "JSON"
138+jsAnyReserved =
171− , "Intl" ]
139+ concat
141+ , jsSometimesReserved
143+ , jsFutureReservedStrict
148+jsKeywords :: [String]
184+jsSometimesReserved :: [String]
185+jsSometimesReserved =
192+jsFutureReserved :: [String]
196+jsFutureReservedStrict :: [String]
197+jsFutureReservedStrict =
206+jsOldReserved :: [String]
226+jsLiterals :: [String]