Skip to main content

rquickjs_core/value/atom/
predefined.rs

1use crate::qjs;
2
3/// A collection of atoms which are predefined in quickjs.
4///
5/// Using these over [`Atom::from_str`](crate::Atom::from_str) can be more performant as these don't need to be looked up
6/// in a hashmap.
7#[derive(Clone, Copy, Eq, PartialEq, Hash, Debug)]
8#[repr(u32)]
9#[allow(clippy::unnecessary_cast)]
10pub enum PredefinedAtom {
11    /// "null"
12    Null = qjs::JS_ATOM_null as u32, // must be first
13    /// "false"
14    False = qjs::JS_ATOM_false as u32,
15    /// "true"
16    True = qjs::JS_ATOM_true as u32,
17    /// "if"
18    If = qjs::JS_ATOM_if as u32,
19    /// "else"
20    Else = qjs::JS_ATOM_else as u32,
21    /// "return"
22    Return = qjs::JS_ATOM_return as u32,
23    /// "var"
24    Var = qjs::JS_ATOM_var as u32,
25    /// "this"
26    This = qjs::JS_ATOM_this as u32,
27    /// "delete"
28    Delete = qjs::JS_ATOM_delete as u32,
29    /// "void"
30    Void = qjs::JS_ATOM_void as u32,
31    /// "typeof"
32    Typeof = qjs::JS_ATOM_typeof as u32,
33    /// "new"
34    New = qjs::JS_ATOM_new as u32,
35    /// "in"
36    In = qjs::JS_ATOM_in as u32,
37    /// "instanceof"
38    Instanceof = qjs::JS_ATOM_instanceof as u32,
39    /// "do"
40    Do = qjs::JS_ATOM_do as u32,
41    /// "while"
42    While = qjs::JS_ATOM_while as u32,
43    /// "for"
44    For = qjs::JS_ATOM_for as u32,
45    /// "break"
46    Break = qjs::JS_ATOM_break as u32,
47    /// "continue"
48    Continue = qjs::JS_ATOM_continue as u32,
49    /// "switch"
50    Switch = qjs::JS_ATOM_switch as u32,
51    /// "case"
52    Case = qjs::JS_ATOM_case as u32,
53    /// "default"
54    Default = qjs::JS_ATOM_default as u32,
55    /// "throw"
56    Throw = qjs::JS_ATOM_throw as u32,
57    /// "try"
58    Try = qjs::JS_ATOM_try as u32,
59    /// "catch"
60    Catch = qjs::JS_ATOM_catch as u32,
61    /// "finally"
62    Finally = qjs::JS_ATOM_finally as u32,
63    /// "function"
64    FunctionKw = qjs::JS_ATOM_function as u32,
65    /// "debugger"
66    Debugger = qjs::JS_ATOM_debugger as u32,
67    /// "with"
68    With = qjs::JS_ATOM_with as u32,
69    /// "class"
70    Class = qjs::JS_ATOM_class as u32,
71    /// "const"
72    Const = qjs::JS_ATOM_const as u32,
73    /// "enum"
74    Enum = qjs::JS_ATOM_enum as u32,
75    /// "export"
76    Export = qjs::JS_ATOM_export as u32,
77    /// "extends"
78    Extends = qjs::JS_ATOM_extends as u32,
79    /// "import"
80    Import = qjs::JS_ATOM_import as u32,
81    /// "super"
82    Super = qjs::JS_ATOM_super as u32,
83    /// "implements"
84    Implements = qjs::JS_ATOM_implements as u32,
85    /// "interface"
86    Interface = qjs::JS_ATOM_interface as u32,
87    /// "let"
88    Let = qjs::JS_ATOM_let as u32,
89    /// "package"
90    Package = qjs::JS_ATOM_package as u32,
91    /// "private"
92    Private = qjs::JS_ATOM_private as u32,
93    /// "protected"
94    Protected = qjs::JS_ATOM_protected as u32,
95    /// "public"
96    Public = qjs::JS_ATOM_public as u32,
97    /// "static"
98    Static = qjs::JS_ATOM_static as u32,
99    /// "yield"
100    Yield = qjs::JS_ATOM_yield as u32,
101    /// "await"
102    Await = qjs::JS_ATOM_await as u32,
103
104    /// ""
105    Empty = qjs::JS_ATOM_empty_string as u32,
106    /// "length"
107    Length = qjs::JS_ATOM_length as u32,
108    /// "message"
109    Message = qjs::JS_ATOM_message as u32,
110    /// "errors"
111    Errors = qjs::JS_ATOM_errors as u32,
112    /// "stack"
113    Stack = qjs::JS_ATOM_stack as u32,
114    /// "name"
115    Name = qjs::JS_ATOM_name as u32,
116    /// "toString"
117    ToString = qjs::JS_ATOM_toString as u32,
118    /// "toLocaleString"
119    ToLocaleString = qjs::JS_ATOM_toLocaleString as u32,
120    /// "valueOf"
121    ValueOf = qjs::JS_ATOM_valueOf as u32,
122    /// "eval"
123    Eval = qjs::JS_ATOM_eval as u32,
124    /// "prototype"
125    Prototype = qjs::JS_ATOM_prototype as u32,
126    /// "constructor"
127    Constructor = qjs::JS_ATOM_constructor as u32,
128    /// "configurable"
129    Configurable = qjs::JS_ATOM_configurable as u32,
130    /// "writable"
131    Writable = qjs::JS_ATOM_writable as u32,
132    /// "enumerable"
133    Enumerable = qjs::JS_ATOM_enumerable as u32,
134    /// "value"
135    Value = qjs::JS_ATOM_value as u32,
136    /// "get"
137    Getter = qjs::JS_ATOM_get as u32,
138    /// "set"
139    Setter = qjs::JS_ATOM_set as u32,
140    /// "of"
141    Of = qjs::JS_ATOM_of as u32,
142    /// "__proto__"
143    UnderscoreProto = qjs::JS_ATOM___proto__ as u32,
144    /// "undefined"
145    Undefined = qjs::JS_ATOM_undefined as u32,
146    /// "number"
147    NumberLower = qjs::JS_ATOM_number as u32,
148    /// "boolean"
149    BooleanLower = qjs::JS_ATOM_boolean as u32,
150    /// "string"
151    StringLower = qjs::JS_ATOM_string as u32,
152    /// "object"
153    ObjectLower = qjs::JS_ATOM_object as u32,
154    /// "symbol"
155    SymbolLower = qjs::JS_ATOM_symbol as u32,
156    /// "integer"
157    Integer = qjs::JS_ATOM_integer as u32,
158    /// "unknown"
159    Unknown = qjs::JS_ATOM_unknown as u32,
160    /// "arguments"
161    ArgumentsLower = qjs::JS_ATOM_arguments as u32,
162    /// "callee"
163    Callee = qjs::JS_ATOM_callee as u32,
164    /// "caller"
165    Caller = qjs::JS_ATOM_caller as u32,
166    /// "lastIndex"
167    LastIndex = qjs::JS_ATOM_lastIndex as u32,
168    /// "target"
169    Target = qjs::JS_ATOM_target as u32,
170    /// "index"
171    Index = qjs::JS_ATOM_index as u32,
172    /// "input"
173    Input = qjs::JS_ATOM_input as u32,
174    /// "defineProperties"
175    DefineProperties = qjs::JS_ATOM_defineProperties as u32,
176    /// "apply"
177    Apply = qjs::JS_ATOM_apply as u32,
178    /// "join"
179    Join = qjs::JS_ATOM_join as u32,
180    /// "concat"
181    Concat = qjs::JS_ATOM_concat as u32,
182    /// "split"
183    Split = qjs::JS_ATOM_split as u32,
184    /// "construct"
185    Construct = qjs::JS_ATOM_construct as u32,
186    /// "getPrototypeOf"
187    GetPrototypeOf = qjs::JS_ATOM_getPrototypeOf as u32,
188    /// "setPrototypeOf"
189    SetPrototypeOf = qjs::JS_ATOM_setPrototypeOf as u32,
190    /// "isExtensible"
191    IsExtensible = qjs::JS_ATOM_isExtensible as u32,
192    /// "preventExtensions"
193    PreventExtensions = qjs::JS_ATOM_preventExtensions as u32,
194    /// "has"
195    Has = qjs::JS_ATOM_has as u32,
196    /// "deleteProperty"
197    DeleteProperty = qjs::JS_ATOM_deleteProperty as u32,
198    /// "defineProperty"
199    DefineProperty = qjs::JS_ATOM_defineProperty as u32,
200    /// "getOwnPropertyDescriptor"
201    GetOwnPropertyDescriptor = qjs::JS_ATOM_getOwnPropertyDescriptor as u32,
202    /// "ownKeys"
203    OwnKeys = qjs::JS_ATOM_ownKeys as u32,
204    /// "add"
205    Add = qjs::JS_ATOM_add as u32,
206    /// "done"
207    Done = qjs::JS_ATOM_done as u32,
208    /// "next"
209    Next = qjs::JS_ATOM_next as u32,
210    /// "values"
211    Values = qjs::JS_ATOM_values as u32,
212    /// "source"
213    Source = qjs::JS_ATOM_source as u32,
214    /// "flags"
215    Flags = qjs::JS_ATOM_flags as u32,
216    /// "global"
217    Global = qjs::JS_ATOM_global as u32,
218    /// "unicode"
219    Unicode = qjs::JS_ATOM_unicode as u32,
220    /// "raw"
221    Raw = qjs::JS_ATOM_raw as u32,
222    /// "new.target"
223    NewTarget = qjs::JS_ATOM_new_target as u32,
224    /// "this.active_func"
225    ThisActiveFunc = qjs::JS_ATOM_this_active_func as u32,
226    /// "\<home_object\>"
227    HomeObject = qjs::JS_ATOM_home_object as u32,
228    /// "\<computed_field\>"
229    ComputedField = qjs::JS_ATOM_computed_field as u32,
230    /// "\<static_computed_field\>"
231    StaticComputedField = qjs::JS_ATOM_static_computed_field as u32, // must come after computed_fields
232    /// "\<class_fields_init\>"
233    ClassFieldsInit = qjs::JS_ATOM_class_fields_init as u32,
234    /// "\<brand\>"
235    Brand = qjs::JS_ATOM_brand as u32,
236    /// "#constructor"
237    HashConstructor = qjs::JS_ATOM_hash_constructor as u32,
238    /// "as"
239    As = qjs::JS_ATOM_as as u32,
240    /// "from"
241    From = qjs::JS_ATOM_from as u32,
242    /// "meta"
243    Meta = qjs::JS_ATOM_meta as u32,
244    /// "*default*"
245    StarDefault = qjs::JS_ATOM__default_ as u32,
246    /// "*"
247    Star = qjs::JS_ATOM__star_ as u32,
248    /// "Module"
249    Module = qjs::JS_ATOM_Module as u32,
250    /// "then"
251    Then = qjs::JS_ATOM_then as u32,
252    /// "resolve"
253    Resolve = qjs::JS_ATOM_resolve as u32,
254    /// "reject"
255    Reject = qjs::JS_ATOM_reject as u32,
256    /// "promise"
257    PromiseLower = qjs::JS_ATOM_promise as u32,
258    /// "proxy"
259    ProxyLower = qjs::JS_ATOM_proxy as u32,
260    /// "revoke"
261    Revoke = qjs::JS_ATOM_revoke as u32,
262    /// "async"
263    Async = qjs::JS_ATOM_async as u32,
264    /// "exec"
265    Exec = qjs::JS_ATOM_exec as u32,
266    /// "groups"
267    Groups = qjs::JS_ATOM_groups as u32,
268    /// "status"
269    Status = qjs::JS_ATOM_status as u32,
270    /// "reason"
271    Reason = qjs::JS_ATOM_reason as u32,
272    /// "globalThis"
273    GlobalThis = qjs::JS_ATOM_globalThis as u32,
274    /// "bigint"
275    Bigint = qjs::JS_ATOM_bigint as u32,
276    /// "toJSON"
277    ToJSON = qjs::JS_ATOM_toJSON as u32,
278    /// "toJSON"
279    MaxByteLength = qjs::JS_ATOM_maxByteLength as u32,
280    /// "Object"
281    Object = qjs::JS_ATOM_Object as u32,
282    /// "Array"
283    Array = qjs::JS_ATOM_Array as u32,
284    /// "Error"
285    Error = qjs::JS_ATOM_Error as u32,
286    /// "Number"
287    Number = qjs::JS_ATOM_Number as u32,
288    /// "String"
289    String = qjs::JS_ATOM_String as u32,
290    /// "Boolean"
291    Boolean = qjs::JS_ATOM_Boolean as u32,
292    /// "Symbol"
293    Symbol = qjs::JS_ATOM_Symbol as u32,
294    /// "Arguments"
295    Arguments = qjs::JS_ATOM_Arguments as u32,
296    /// "Math"
297    Math = qjs::JS_ATOM_Math as u32,
298    /// "JSON"
299    JSON = qjs::JS_ATOM_JSON as u32,
300    /// "Date"
301    Date = qjs::JS_ATOM_Date as u32,
302    /// "Function"
303    Function = qjs::JS_ATOM_Function as u32,
304    /// "GeneratorFunction"
305    GeneratorFunction = qjs::JS_ATOM_GeneratorFunction as u32,
306    /// "ForInIterator"
307    ForInIterator = qjs::JS_ATOM_ForInIterator as u32,
308    /// "Iterator"
309    Iterator = qjs::JS_ATOM_Iterator as u32,
310    /// "RegExp"
311    RegExp = qjs::JS_ATOM_RegExp as u32,
312    /// "ArrayBuffer"
313    ArrayBuffer = qjs::JS_ATOM_ArrayBuffer as u32,
314    /// "SharedArrayBuffer"
315    SharedArrayBuffer = qjs::JS_ATOM_SharedArrayBuffer as u32,
316    /// "Uint8ClampedArray"
317    Uint8ClampedArray = qjs::JS_ATOM_Uint8ClampedArray as u32,
318    /// "Int8Array"
319    Int8Array = qjs::JS_ATOM_Int8Array as u32,
320    /// "Uint8Array"
321    Uint8Array = qjs::JS_ATOM_Uint8Array as u32,
322    /// "Int16Array"
323    Int16Array = qjs::JS_ATOM_Int16Array as u32,
324    /// "Uint16Array"
325    Uint16Array = qjs::JS_ATOM_Uint16Array as u32,
326    /// "Int32Array"
327    Int32Array = qjs::JS_ATOM_Int32Array as u32,
328    /// "Uint32Array"
329    Uint32Array = qjs::JS_ATOM_Uint32Array as u32,
330    /// "BigInt64Array"
331    BigInt64Array = qjs::JS_ATOM_BigInt64Array as u32,
332    /// "BigUint64Array"
333    BigUint64Array = qjs::JS_ATOM_BigUint64Array as u32,
334    /// "Float16Array"
335    #[cfg(feature = "half")]
336    Float16Array = qjs::JS_ATOM_Float16Array as u32,
337    /// "Float32Array"
338    Float32Array = qjs::JS_ATOM_Float32Array as u32,
339    /// "Float64Array"
340    Float64Array = qjs::JS_ATOM_Float64Array as u32,
341    /// "DataView"
342    DataView = qjs::JS_ATOM_DataView as u32,
343    /// "BigInt"
344    BigInt = qjs::JS_ATOM_BigInt as u32,
345    /// "Map"
346    Map = qjs::JS_ATOM_Map as u32,
347    /// "Set"
348    Set = qjs::JS_ATOM_Set as u32,
349    /// "WeakMap"
350    WeakMap = qjs::JS_ATOM_WeakMap as u32,
351    /// "WeakSet"
352    WeakSet = qjs::JS_ATOM_WeakSet as u32,
353    /// "Map Iterator"
354    MapIterator = qjs::JS_ATOM_Map_Iterator as u32,
355    /// "Set Iterator"
356    SetIterator = qjs::JS_ATOM_Set_Iterator as u32,
357    /// "Array Iterator"
358    ArrayIterator = qjs::JS_ATOM_Array_Iterator as u32,
359    /// "String Iterator"
360    StringIterator = qjs::JS_ATOM_String_Iterator as u32,
361    /// "RegExp String Iterator"
362    RegExpStringIterator = qjs::JS_ATOM_RegExp_String_Iterator as u32,
363    /// "Generator"
364    Generator = qjs::JS_ATOM_Generator as u32,
365    /// "Proxy"
366    Proxy = qjs::JS_ATOM_Proxy as u32,
367    /// "Promise"
368    Promise = qjs::JS_ATOM_Promise as u32,
369    /// "PromiseResolveFunction"
370    PromiseResolveFunction = qjs::JS_ATOM_PromiseResolveFunction as u32,
371    /// "PromiseRejectFunction"
372    PromiseRejectFunction = qjs::JS_ATOM_PromiseRejectFunction as u32,
373    /// "AsyncFunction"
374    AsyncFunction = qjs::JS_ATOM_AsyncFunction as u32,
375    /// "AsyncFunctionResolve"
376    AsyncFunctionResolve = qjs::JS_ATOM_AsyncFunctionResolve as u32,
377    /// "AsyncFunctionReject"
378    AsyncFunctionReject = qjs::JS_ATOM_AsyncFunctionReject as u32,
379    /// "AsyncGeneratorFunction"
380    AsyncGeneratorFunction = qjs::JS_ATOM_AsyncGeneratorFunction as u32,
381    /// "AsyncGenerator"
382    AsyncGenerator = qjs::JS_ATOM_AsyncGenerator as u32,
383    /// "EvalError"
384    EvalError = qjs::JS_ATOM_EvalError as u32,
385    /// "RangeError"
386    RangeError = qjs::JS_ATOM_RangeError as u32,
387    /// "ReferenceError"
388    ReferenceError = qjs::JS_ATOM_ReferenceError as u32,
389    /// "SyntaxError"
390    SyntaxError = qjs::JS_ATOM_SyntaxError as u32,
391    /// "TypeError"
392    TypeError = qjs::JS_ATOM_TypeError as u32,
393    /// "URIError"
394    URIError = qjs::JS_ATOM_URIError as u32,
395    /// "InternalError"
396    InternalError = qjs::JS_ATOM_InternalError as u32,
397    /// "DOMException"
398    DOMException = qjs::JS_ATOM_DOMException as u32,
399    /// "Symbol.asyncIterator"
400    SymbolAsyncIterator = qjs::JS_ATOM_Symbol_asyncIterator as u32,
401    /// "Symbol.iterator"
402    SymbolIterator = qjs::JS_ATOM_Symbol_iterator as u32,
403    /// "Symbol.match"
404    SymbolMatch = qjs::JS_ATOM_Symbol_match as u32,
405    /// "Symbol.matchAll"
406    SymbolMatchAll = qjs::JS_ATOM_Symbol_matchAll as u32,
407    /// "Symbol.replace"
408    SymbolReplace = qjs::JS_ATOM_Symbol_replace as u32,
409    /// "Symbol.search"
410    SymbolSearch = qjs::JS_ATOM_Symbol_search as u32,
411    /// "Symbol.split"
412    SymbolSplit = qjs::JS_ATOM_Symbol_split as u32,
413    /// "Symbol.toPrimitive"
414    SymbolToPrimitive = qjs::JS_ATOM_Symbol_toPrimitive as u32,
415    /// "Symbol.toStringTag"
416    SymbolToStringTag = qjs::JS_ATOM_Symbol_toStringTag as u32,
417    /// "Symbol.isConcatSpreadable"
418    SymbolIsConcatSpreadable = qjs::JS_ATOM_Symbol_isConcatSpreadable as u32,
419    /// "Symbol.hasInstance"
420    SymbolHasInstance = qjs::JS_ATOM_Symbol_hasInstance as u32,
421    /// "Symbol.species"
422    SymbolSpecies = qjs::JS_ATOM_Symbol_species as u32,
423    /// "Symbol.unscopables"
424    SymbolUnscopables = qjs::JS_ATOM_Symbol_unscopables as u32,
425}
426
427impl PredefinedAtom {
428    pub const fn is_symbol(self) -> bool {
429        matches!(
430            self,
431            PredefinedAtom::SymbolAsyncIterator
432                | PredefinedAtom::SymbolIterator
433                | PredefinedAtom::SymbolMatch
434                | PredefinedAtom::SymbolMatchAll
435                | PredefinedAtom::SymbolReplace
436                | PredefinedAtom::SymbolSearch
437                | PredefinedAtom::SymbolSplit
438                | PredefinedAtom::SymbolToStringTag
439                | PredefinedAtom::SymbolIsConcatSpreadable
440                | PredefinedAtom::SymbolHasInstance
441                | PredefinedAtom::SymbolSpecies
442                | PredefinedAtom::SymbolUnscopables
443        )
444    }
445
446    pub const fn to_str(self) -> &'static str {
447        match self {
448            PredefinedAtom::Null => "null",
449            PredefinedAtom::False => "false",
450            PredefinedAtom::True => "true",
451            PredefinedAtom::If => "if",
452            PredefinedAtom::Else => "else",
453            PredefinedAtom::Return => "return",
454            PredefinedAtom::Var => "var",
455            PredefinedAtom::This => "this",
456            PredefinedAtom::Delete => "delete",
457            PredefinedAtom::Void => "void",
458            PredefinedAtom::Typeof => "typeof",
459            PredefinedAtom::New => "new",
460            PredefinedAtom::In => "in",
461            PredefinedAtom::Instanceof => "instanceof",
462            PredefinedAtom::Do => "do",
463            PredefinedAtom::While => "while",
464            PredefinedAtom::For => "for",
465            PredefinedAtom::Break => "break",
466            PredefinedAtom::Continue => "continue",
467            PredefinedAtom::Switch => "switch",
468            PredefinedAtom::Case => "case",
469            PredefinedAtom::Default => "default",
470            PredefinedAtom::Throw => "throw",
471            PredefinedAtom::Try => "try",
472            PredefinedAtom::Catch => "catch",
473            PredefinedAtom::Finally => "finally",
474            PredefinedAtom::FunctionKw => "function",
475            PredefinedAtom::Debugger => "debugger",
476            PredefinedAtom::With => "with",
477            PredefinedAtom::Class => "class",
478            PredefinedAtom::Const => "const",
479            PredefinedAtom::Enum => "enum",
480            PredefinedAtom::Export => "export",
481            PredefinedAtom::Extends => "extends",
482            PredefinedAtom::Import => "import",
483            PredefinedAtom::Super => "super",
484            PredefinedAtom::Implements => "implements",
485            PredefinedAtom::Interface => "interface",
486            PredefinedAtom::Let => "let",
487            PredefinedAtom::Package => "package",
488            PredefinedAtom::Private => "private",
489            PredefinedAtom::Protected => "protected",
490            PredefinedAtom::Public => "public",
491            PredefinedAtom::Static => "static",
492            PredefinedAtom::Yield => "yield",
493            PredefinedAtom::Await => "await",
494            PredefinedAtom::Empty => "",
495            PredefinedAtom::Length => "length",
496            PredefinedAtom::Message => "message",
497            PredefinedAtom::Errors => "errors",
498            PredefinedAtom::Stack => "stack",
499            PredefinedAtom::Name => "name",
500            PredefinedAtom::ToString => "toString",
501            PredefinedAtom::ToLocaleString => "toLocaleString",
502            PredefinedAtom::ValueOf => "valueOf",
503            PredefinedAtom::Eval => "eval",
504            PredefinedAtom::Prototype => "prototype",
505            PredefinedAtom::Constructor => "constructor",
506            PredefinedAtom::Configurable => "configurable",
507            PredefinedAtom::Writable => "writable",
508            PredefinedAtom::Enumerable => "enumerable",
509            PredefinedAtom::Value => "value",
510            PredefinedAtom::Getter => "get",
511            PredefinedAtom::Setter => "set",
512            PredefinedAtom::Of => "of",
513            PredefinedAtom::UnderscoreProto => "__proto__",
514            PredefinedAtom::Undefined => "undefined",
515            PredefinedAtom::NumberLower => "number",
516            PredefinedAtom::BooleanLower => "boolean",
517            PredefinedAtom::StringLower => "string",
518            PredefinedAtom::ObjectLower => "object",
519            PredefinedAtom::SymbolLower => "symbol",
520            PredefinedAtom::Integer => "integer",
521            PredefinedAtom::Unknown => "unknown",
522            PredefinedAtom::ArgumentsLower => "arguments",
523            PredefinedAtom::Callee => "callee",
524            PredefinedAtom::Caller => "caller",
525            PredefinedAtom::LastIndex => "lastIndex",
526            PredefinedAtom::Target => "target",
527            PredefinedAtom::Index => "index",
528            PredefinedAtom::Input => "input",
529            PredefinedAtom::DefineProperties => "defineProperties",
530            PredefinedAtom::Apply => "apply",
531            PredefinedAtom::Join => "join",
532            PredefinedAtom::Concat => "concat",
533            PredefinedAtom::Split => "split",
534            PredefinedAtom::Construct => "construct",
535            PredefinedAtom::GetPrototypeOf => "getPrototypeOf",
536            PredefinedAtom::SetPrototypeOf => "setPrototypeOf",
537            PredefinedAtom::IsExtensible => "isExtensible",
538            PredefinedAtom::PreventExtensions => "preventExtensions",
539            PredefinedAtom::Has => "has",
540            PredefinedAtom::DeleteProperty => "deleteProperty",
541            PredefinedAtom::DefineProperty => "defineProperty",
542            PredefinedAtom::GetOwnPropertyDescriptor => "getOwnPropertyDescriptor",
543            PredefinedAtom::OwnKeys => "ownKeys",
544            PredefinedAtom::Add => "add",
545            PredefinedAtom::Done => "done",
546            PredefinedAtom::Next => "next",
547            PredefinedAtom::Values => "values",
548            PredefinedAtom::Source => "source",
549            PredefinedAtom::Flags => "flags",
550            PredefinedAtom::Global => "global",
551            PredefinedAtom::Unicode => "unicode",
552            PredefinedAtom::Raw => "raw",
553            PredefinedAtom::NewTarget => "new.target",
554            PredefinedAtom::ThisActiveFunc => "this.active_func",
555            PredefinedAtom::HomeObject => "<home_object>",
556            PredefinedAtom::ComputedField => "<computed_field>",
557            PredefinedAtom::StaticComputedField => "<static_computed_field>",
558            PredefinedAtom::ClassFieldsInit => "<class_fields_init>",
559            PredefinedAtom::Brand => "<brand>",
560            PredefinedAtom::HashConstructor => "#constructor",
561            PredefinedAtom::As => "as",
562            PredefinedAtom::From => "from",
563            PredefinedAtom::Meta => "meta",
564            PredefinedAtom::StarDefault => "*default*",
565            PredefinedAtom::Star => "*",
566            PredefinedAtom::Module => "Module",
567            PredefinedAtom::Then => "then",
568            PredefinedAtom::Resolve => "resolve",
569            PredefinedAtom::Reject => "reject",
570            PredefinedAtom::PromiseLower => "promise",
571            PredefinedAtom::ProxyLower => "proxy",
572            PredefinedAtom::Revoke => "revoke",
573            PredefinedAtom::Async => "async",
574            PredefinedAtom::Exec => "exec",
575            PredefinedAtom::Groups => "groups",
576            PredefinedAtom::Status => "status",
577            PredefinedAtom::Reason => "reason",
578            PredefinedAtom::GlobalThis => "globalThis",
579            PredefinedAtom::Bigint => "bigint",
580            PredefinedAtom::ToJSON => "toJSON",
581            PredefinedAtom::MaxByteLength => "maxByteLength",
582            PredefinedAtom::Object => "Object",
583            PredefinedAtom::Array => "Array",
584            PredefinedAtom::Error => "Error",
585            PredefinedAtom::Number => "Number",
586            PredefinedAtom::String => "String",
587            PredefinedAtom::Boolean => "Boolean",
588            PredefinedAtom::Symbol => "Symbol",
589            PredefinedAtom::Arguments => "Arguments",
590            PredefinedAtom::Math => "Math",
591            PredefinedAtom::JSON => "JSON",
592            PredefinedAtom::Date => "Date",
593            PredefinedAtom::Function => "Function",
594            PredefinedAtom::GeneratorFunction => "GeneratorFunction",
595            PredefinedAtom::ForInIterator => "ForInIterator",
596            PredefinedAtom::Iterator => "Iterator",
597            PredefinedAtom::RegExp => "RegExp",
598            PredefinedAtom::ArrayBuffer => "ArrayBuffer",
599            PredefinedAtom::SharedArrayBuffer => "SharedArrayBuffer",
600            PredefinedAtom::Uint8ClampedArray => "Uint8ClampedArray",
601            PredefinedAtom::Int8Array => "Int8Array",
602            PredefinedAtom::Uint8Array => "Uint8Array",
603            PredefinedAtom::Int16Array => "Int16Array",
604            PredefinedAtom::Uint16Array => "Uint16Array",
605            PredefinedAtom::Int32Array => "Int32Array",
606            PredefinedAtom::Uint32Array => "Uint32Array",
607            PredefinedAtom::BigInt64Array => "BigInt64Array",
608            PredefinedAtom::BigUint64Array => "BigUint64Array",
609            #[cfg(feature = "half")]
610            PredefinedAtom::Float16Array => "Float16Array",
611            PredefinedAtom::Float32Array => "Float32Array",
612            PredefinedAtom::Float64Array => "Float64Array",
613            PredefinedAtom::DataView => "DataView",
614            PredefinedAtom::BigInt => "BigInt",
615            PredefinedAtom::Map => "Map",
616            PredefinedAtom::Set => "Set",
617            PredefinedAtom::WeakMap => "WeakMap",
618            PredefinedAtom::WeakSet => "WeakSet",
619            PredefinedAtom::MapIterator => "Map Iterator",
620            PredefinedAtom::SetIterator => "Set Iterator",
621            PredefinedAtom::ArrayIterator => "Array Iterator",
622            PredefinedAtom::StringIterator => "String Iterator",
623            PredefinedAtom::RegExpStringIterator => "RegExp String Iterator",
624            PredefinedAtom::Generator => "Generator",
625            PredefinedAtom::Proxy => "Proxy",
626            PredefinedAtom::Promise => "Promise",
627            PredefinedAtom::PromiseResolveFunction => "PromiseResolveFunction",
628            PredefinedAtom::PromiseRejectFunction => "PromiseRejectFunction",
629            PredefinedAtom::AsyncFunction => "AsyncFunction",
630            PredefinedAtom::AsyncFunctionResolve => "AsyncFunctionResolve",
631            PredefinedAtom::AsyncFunctionReject => "AsyncFunctionReject",
632            PredefinedAtom::AsyncGeneratorFunction => "AsyncGeneratorFunction",
633            PredefinedAtom::AsyncGenerator => "AsyncGenerator",
634            PredefinedAtom::EvalError => "EvalError",
635            PredefinedAtom::RangeError => "RangeError",
636            PredefinedAtom::ReferenceError => "ReferenceError",
637            PredefinedAtom::SyntaxError => "SyntaxError",
638            PredefinedAtom::TypeError => "TypeError",
639            PredefinedAtom::URIError => "URIError",
640            PredefinedAtom::InternalError => "InternalError",
641            PredefinedAtom::DOMException => "DOMException",
642            PredefinedAtom::SymbolAsyncIterator => "Symbol.asyncIterator",
643            PredefinedAtom::SymbolIterator => "Symbol.iterator",
644            PredefinedAtom::SymbolMatch => "Symbol.match",
645            PredefinedAtom::SymbolMatchAll => "Symbol.matchAll",
646            PredefinedAtom::SymbolReplace => "Symbol.replace",
647            PredefinedAtom::SymbolSearch => "Symbol.search",
648            PredefinedAtom::SymbolSplit => "Symbol.split",
649            PredefinedAtom::SymbolToPrimitive => "Symbol.toPrimitive",
650            PredefinedAtom::SymbolToStringTag => "Symbol.toStringTag",
651            PredefinedAtom::SymbolIsConcatSpreadable => "Symbol.isConcatSpreadable",
652            PredefinedAtom::SymbolHasInstance => "Symbol.hasInstance",
653            PredefinedAtom::SymbolSpecies => "Symbol.species",
654            PredefinedAtom::SymbolUnscopables => "Symbol.unscopables",
655        }
656    }
657}
658
659#[cfg(test)]
660mod test {
661    use crate::{Atom, Context, IntoAtom, Runtime};
662
663    use super::PredefinedAtom;
664    #[test]
665    fn string_correct() {
666        static ALL_PREDEFS: &[PredefinedAtom] = &[
667            PredefinedAtom::Null,
668            PredefinedAtom::False,
669            PredefinedAtom::True,
670            PredefinedAtom::If,
671            PredefinedAtom::Else,
672            PredefinedAtom::Return,
673            PredefinedAtom::Var,
674            PredefinedAtom::This,
675            PredefinedAtom::Delete,
676            PredefinedAtom::Void,
677            PredefinedAtom::Typeof,
678            PredefinedAtom::New,
679            PredefinedAtom::In,
680            PredefinedAtom::Instanceof,
681            PredefinedAtom::Do,
682            PredefinedAtom::While,
683            PredefinedAtom::For,
684            PredefinedAtom::Break,
685            PredefinedAtom::Continue,
686            PredefinedAtom::Switch,
687            PredefinedAtom::Case,
688            PredefinedAtom::Default,
689            PredefinedAtom::Throw,
690            PredefinedAtom::Try,
691            PredefinedAtom::Catch,
692            PredefinedAtom::Finally,
693            PredefinedAtom::FunctionKw,
694            PredefinedAtom::Debugger,
695            PredefinedAtom::With,
696            PredefinedAtom::Class,
697            PredefinedAtom::Const,
698            PredefinedAtom::Enum,
699            PredefinedAtom::Export,
700            PredefinedAtom::Extends,
701            PredefinedAtom::Import,
702            PredefinedAtom::Super,
703            PredefinedAtom::Implements,
704            PredefinedAtom::Interface,
705            PredefinedAtom::Let,
706            PredefinedAtom::Package,
707            PredefinedAtom::Private,
708            PredefinedAtom::Protected,
709            PredefinedAtom::Public,
710            PredefinedAtom::Static,
711            PredefinedAtom::Yield,
712            PredefinedAtom::Await,
713            PredefinedAtom::Empty,
714            PredefinedAtom::Length,
715            PredefinedAtom::Message,
716            PredefinedAtom::Errors,
717            PredefinedAtom::Stack,
718            PredefinedAtom::Name,
719            PredefinedAtom::ToString,
720            PredefinedAtom::ToLocaleString,
721            PredefinedAtom::ValueOf,
722            PredefinedAtom::Eval,
723            PredefinedAtom::Prototype,
724            PredefinedAtom::Constructor,
725            PredefinedAtom::Configurable,
726            PredefinedAtom::Writable,
727            PredefinedAtom::Enumerable,
728            PredefinedAtom::Value,
729            PredefinedAtom::Getter,
730            PredefinedAtom::Setter,
731            PredefinedAtom::Of,
732            PredefinedAtom::UnderscoreProto,
733            PredefinedAtom::Undefined,
734            PredefinedAtom::NumberLower,
735            PredefinedAtom::BooleanLower,
736            PredefinedAtom::StringLower,
737            PredefinedAtom::ObjectLower,
738            PredefinedAtom::SymbolLower,
739            PredefinedAtom::Integer,
740            PredefinedAtom::Unknown,
741            PredefinedAtom::ArgumentsLower,
742            PredefinedAtom::Callee,
743            PredefinedAtom::Caller,
744            PredefinedAtom::LastIndex,
745            PredefinedAtom::Target,
746            PredefinedAtom::Index,
747            PredefinedAtom::Input,
748            PredefinedAtom::DefineProperties,
749            PredefinedAtom::Apply,
750            PredefinedAtom::Join,
751            PredefinedAtom::Concat,
752            PredefinedAtom::Split,
753            PredefinedAtom::Construct,
754            PredefinedAtom::GetPrototypeOf,
755            PredefinedAtom::SetPrototypeOf,
756            PredefinedAtom::IsExtensible,
757            PredefinedAtom::PreventExtensions,
758            PredefinedAtom::Has,
759            PredefinedAtom::DeleteProperty,
760            PredefinedAtom::DefineProperty,
761            PredefinedAtom::GetOwnPropertyDescriptor,
762            PredefinedAtom::OwnKeys,
763            PredefinedAtom::Add,
764            PredefinedAtom::Done,
765            PredefinedAtom::Next,
766            PredefinedAtom::Values,
767            PredefinedAtom::Source,
768            PredefinedAtom::Flags,
769            PredefinedAtom::Global,
770            PredefinedAtom::Unicode,
771            PredefinedAtom::Raw,
772            PredefinedAtom::NewTarget,
773            PredefinedAtom::ThisActiveFunc,
774            PredefinedAtom::HomeObject,
775            PredefinedAtom::ComputedField,
776            PredefinedAtom::StaticComputedField,
777            PredefinedAtom::ClassFieldsInit,
778            PredefinedAtom::Brand,
779            PredefinedAtom::HashConstructor,
780            PredefinedAtom::As,
781            PredefinedAtom::From,
782            PredefinedAtom::Meta,
783            PredefinedAtom::StarDefault,
784            PredefinedAtom::Star,
785            PredefinedAtom::Module,
786            PredefinedAtom::Then,
787            PredefinedAtom::Resolve,
788            PredefinedAtom::Reject,
789            PredefinedAtom::PromiseLower,
790            PredefinedAtom::ProxyLower,
791            PredefinedAtom::Revoke,
792            PredefinedAtom::Async,
793            PredefinedAtom::Exec,
794            PredefinedAtom::Groups,
795            PredefinedAtom::Status,
796            PredefinedAtom::Reason,
797            PredefinedAtom::GlobalThis,
798            PredefinedAtom::Bigint,
799            PredefinedAtom::ToJSON,
800            PredefinedAtom::Object,
801            PredefinedAtom::Array,
802            PredefinedAtom::Error,
803            PredefinedAtom::Number,
804            PredefinedAtom::String,
805            PredefinedAtom::Boolean,
806            PredefinedAtom::Symbol,
807            PredefinedAtom::Arguments,
808            PredefinedAtom::Math,
809            PredefinedAtom::JSON,
810            PredefinedAtom::Date,
811            PredefinedAtom::Function,
812            PredefinedAtom::GeneratorFunction,
813            PredefinedAtom::ForInIterator,
814            PredefinedAtom::RegExp,
815            PredefinedAtom::ArrayBuffer,
816            PredefinedAtom::SharedArrayBuffer,
817            PredefinedAtom::Uint8ClampedArray,
818            PredefinedAtom::Int8Array,
819            PredefinedAtom::Uint8Array,
820            PredefinedAtom::Int16Array,
821            PredefinedAtom::Uint16Array,
822            PredefinedAtom::Int32Array,
823            PredefinedAtom::Uint32Array,
824            PredefinedAtom::BigInt64Array,
825            PredefinedAtom::BigUint64Array,
826            PredefinedAtom::Float32Array,
827            PredefinedAtom::Float64Array,
828            PredefinedAtom::DataView,
829            PredefinedAtom::BigInt,
830            PredefinedAtom::Map,
831            PredefinedAtom::Set,
832            PredefinedAtom::WeakMap,
833            PredefinedAtom::WeakSet,
834            PredefinedAtom::MapIterator,
835            PredefinedAtom::SetIterator,
836            PredefinedAtom::ArrayIterator,
837            PredefinedAtom::StringIterator,
838            PredefinedAtom::RegExpStringIterator,
839            PredefinedAtom::Generator,
840            PredefinedAtom::Proxy,
841            PredefinedAtom::Promise,
842            PredefinedAtom::PromiseResolveFunction,
843            PredefinedAtom::PromiseRejectFunction,
844            PredefinedAtom::AsyncFunction,
845            PredefinedAtom::AsyncFunctionResolve,
846            PredefinedAtom::AsyncFunctionReject,
847            PredefinedAtom::AsyncGeneratorFunction,
848            PredefinedAtom::AsyncGenerator,
849            PredefinedAtom::EvalError,
850            PredefinedAtom::RangeError,
851            PredefinedAtom::ReferenceError,
852            PredefinedAtom::SyntaxError,
853            PredefinedAtom::TypeError,
854            PredefinedAtom::URIError,
855            PredefinedAtom::InternalError,
856            PredefinedAtom::DOMException,
857            PredefinedAtom::SymbolAsyncIterator,
858            PredefinedAtom::SymbolIterator,
859            PredefinedAtom::SymbolMatch,
860            PredefinedAtom::SymbolMatchAll,
861            PredefinedAtom::SymbolReplace,
862            PredefinedAtom::SymbolSearch,
863            PredefinedAtom::SymbolSplit,
864            PredefinedAtom::SymbolToStringTag,
865            PredefinedAtom::SymbolIsConcatSpreadable,
866            PredefinedAtom::SymbolHasInstance,
867            PredefinedAtom::SymbolSpecies,
868            PredefinedAtom::SymbolUnscopables,
869        ];
870
871        let rt = Runtime::new().unwrap();
872        let context = Context::full(&rt).unwrap();
873        context.with(|ctx| {
874            for predef in ALL_PREDEFS {
875                let atom = predef.into_atom(&ctx).unwrap();
876                assert_eq!(atom.to_string().unwrap().as_str(), predef.to_str());
877
878                // the string of a symbol doesn't convert to the same atom.
879                if predef.is_symbol() {
880                    continue;
881                }
882
883                let from_str = Atom::from_str(ctx.clone(), predef.to_str()).unwrap();
884                assert_eq!(
885                    atom,
886                    from_str,
887                    "Atom `{}` from str and from redefined not equal",
888                    predef.to_str()
889                )
890            }
891        })
892    }
893}