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    /// "Symbol.asyncIterator"
398    SymbolAsyncIterator = qjs::JS_ATOM_Symbol_asyncIterator as u32,
399    /// "Symbol.iterator"
400    SymbolIterator = qjs::JS_ATOM_Symbol_iterator as u32,
401    /// "Symbol.match"
402    SymbolMatch = qjs::JS_ATOM_Symbol_match as u32,
403    /// "Symbol.matchAll"
404    SymbolMatchAll = qjs::JS_ATOM_Symbol_matchAll as u32,
405    /// "Symbol.replace"
406    SymbolReplace = qjs::JS_ATOM_Symbol_replace as u32,
407    /// "Symbol.search"
408    SymbolSearch = qjs::JS_ATOM_Symbol_search as u32,
409    /// "Symbol.split"
410    SymbolSplit = qjs::JS_ATOM_Symbol_split as u32,
411    /// "Symbol.toPrimitive"
412    SymbolToPrimitive = qjs::JS_ATOM_Symbol_toPrimitive as u32,
413    /// "Symbol.toStringTag"
414    SymbolToStringTag = qjs::JS_ATOM_Symbol_toStringTag as u32,
415    /// "Symbol.isConcatSpreadable"
416    SymbolIsConcatSpreadable = qjs::JS_ATOM_Symbol_isConcatSpreadable as u32,
417    /// "Symbol.hasInstance"
418    SymbolHasInstance = qjs::JS_ATOM_Symbol_hasInstance as u32,
419    /// "Symbol.species"
420    SymbolSpecies = qjs::JS_ATOM_Symbol_species as u32,
421    /// "Symbol.unscopables"
422    SymbolUnscopables = qjs::JS_ATOM_Symbol_unscopables as u32,
423}
424
425impl PredefinedAtom {
426    pub const fn is_symbol(self) -> bool {
427        matches!(
428            self,
429            PredefinedAtom::SymbolAsyncIterator
430                | PredefinedAtom::SymbolIterator
431                | PredefinedAtom::SymbolMatch
432                | PredefinedAtom::SymbolMatchAll
433                | PredefinedAtom::SymbolReplace
434                | PredefinedAtom::SymbolSearch
435                | PredefinedAtom::SymbolSplit
436                | PredefinedAtom::SymbolToStringTag
437                | PredefinedAtom::SymbolIsConcatSpreadable
438                | PredefinedAtom::SymbolHasInstance
439                | PredefinedAtom::SymbolSpecies
440                | PredefinedAtom::SymbolUnscopables
441        )
442    }
443
444    pub const fn to_str(self) -> &'static str {
445        match self {
446            PredefinedAtom::Null => "null",
447            PredefinedAtom::False => "false",
448            PredefinedAtom::True => "true",
449            PredefinedAtom::If => "if",
450            PredefinedAtom::Else => "else",
451            PredefinedAtom::Return => "return",
452            PredefinedAtom::Var => "var",
453            PredefinedAtom::This => "this",
454            PredefinedAtom::Delete => "delete",
455            PredefinedAtom::Void => "void",
456            PredefinedAtom::Typeof => "typeof",
457            PredefinedAtom::New => "new",
458            PredefinedAtom::In => "in",
459            PredefinedAtom::Instanceof => "instanceof",
460            PredefinedAtom::Do => "do",
461            PredefinedAtom::While => "while",
462            PredefinedAtom::For => "for",
463            PredefinedAtom::Break => "break",
464            PredefinedAtom::Continue => "continue",
465            PredefinedAtom::Switch => "switch",
466            PredefinedAtom::Case => "case",
467            PredefinedAtom::Default => "default",
468            PredefinedAtom::Throw => "throw",
469            PredefinedAtom::Try => "try",
470            PredefinedAtom::Catch => "catch",
471            PredefinedAtom::Finally => "finally",
472            PredefinedAtom::FunctionKw => "function",
473            PredefinedAtom::Debugger => "debugger",
474            PredefinedAtom::With => "with",
475            PredefinedAtom::Class => "class",
476            PredefinedAtom::Const => "const",
477            PredefinedAtom::Enum => "enum",
478            PredefinedAtom::Export => "export",
479            PredefinedAtom::Extends => "extends",
480            PredefinedAtom::Import => "import",
481            PredefinedAtom::Super => "super",
482            PredefinedAtom::Implements => "implements",
483            PredefinedAtom::Interface => "interface",
484            PredefinedAtom::Let => "let",
485            PredefinedAtom::Package => "package",
486            PredefinedAtom::Private => "private",
487            PredefinedAtom::Protected => "protected",
488            PredefinedAtom::Public => "public",
489            PredefinedAtom::Static => "static",
490            PredefinedAtom::Yield => "yield",
491            PredefinedAtom::Await => "await",
492            PredefinedAtom::Empty => "",
493            PredefinedAtom::Length => "length",
494            PredefinedAtom::Message => "message",
495            PredefinedAtom::Errors => "errors",
496            PredefinedAtom::Stack => "stack",
497            PredefinedAtom::Name => "name",
498            PredefinedAtom::ToString => "toString",
499            PredefinedAtom::ToLocaleString => "toLocaleString",
500            PredefinedAtom::ValueOf => "valueOf",
501            PredefinedAtom::Eval => "eval",
502            PredefinedAtom::Prototype => "prototype",
503            PredefinedAtom::Constructor => "constructor",
504            PredefinedAtom::Configurable => "configurable",
505            PredefinedAtom::Writable => "writable",
506            PredefinedAtom::Enumerable => "enumerable",
507            PredefinedAtom::Value => "value",
508            PredefinedAtom::Getter => "get",
509            PredefinedAtom::Setter => "set",
510            PredefinedAtom::Of => "of",
511            PredefinedAtom::UnderscoreProto => "__proto__",
512            PredefinedAtom::Undefined => "undefined",
513            PredefinedAtom::NumberLower => "number",
514            PredefinedAtom::BooleanLower => "boolean",
515            PredefinedAtom::StringLower => "string",
516            PredefinedAtom::ObjectLower => "object",
517            PredefinedAtom::SymbolLower => "symbol",
518            PredefinedAtom::Integer => "integer",
519            PredefinedAtom::Unknown => "unknown",
520            PredefinedAtom::ArgumentsLower => "arguments",
521            PredefinedAtom::Callee => "callee",
522            PredefinedAtom::Caller => "caller",
523            PredefinedAtom::LastIndex => "lastIndex",
524            PredefinedAtom::Target => "target",
525            PredefinedAtom::Index => "index",
526            PredefinedAtom::Input => "input",
527            PredefinedAtom::DefineProperties => "defineProperties",
528            PredefinedAtom::Apply => "apply",
529            PredefinedAtom::Join => "join",
530            PredefinedAtom::Concat => "concat",
531            PredefinedAtom::Split => "split",
532            PredefinedAtom::Construct => "construct",
533            PredefinedAtom::GetPrototypeOf => "getPrototypeOf",
534            PredefinedAtom::SetPrototypeOf => "setPrototypeOf",
535            PredefinedAtom::IsExtensible => "isExtensible",
536            PredefinedAtom::PreventExtensions => "preventExtensions",
537            PredefinedAtom::Has => "has",
538            PredefinedAtom::DeleteProperty => "deleteProperty",
539            PredefinedAtom::DefineProperty => "defineProperty",
540            PredefinedAtom::GetOwnPropertyDescriptor => "getOwnPropertyDescriptor",
541            PredefinedAtom::OwnKeys => "ownKeys",
542            PredefinedAtom::Add => "add",
543            PredefinedAtom::Done => "done",
544            PredefinedAtom::Next => "next",
545            PredefinedAtom::Values => "values",
546            PredefinedAtom::Source => "source",
547            PredefinedAtom::Flags => "flags",
548            PredefinedAtom::Global => "global",
549            PredefinedAtom::Unicode => "unicode",
550            PredefinedAtom::Raw => "raw",
551            PredefinedAtom::NewTarget => "new.target",
552            PredefinedAtom::ThisActiveFunc => "this.active_func",
553            PredefinedAtom::HomeObject => "<home_object>",
554            PredefinedAtom::ComputedField => "<computed_field>",
555            PredefinedAtom::StaticComputedField => "<static_computed_field>",
556            PredefinedAtom::ClassFieldsInit => "<class_fields_init>",
557            PredefinedAtom::Brand => "<brand>",
558            PredefinedAtom::HashConstructor => "#constructor",
559            PredefinedAtom::As => "as",
560            PredefinedAtom::From => "from",
561            PredefinedAtom::Meta => "meta",
562            PredefinedAtom::StarDefault => "*default*",
563            PredefinedAtom::Star => "*",
564            PredefinedAtom::Module => "Module",
565            PredefinedAtom::Then => "then",
566            PredefinedAtom::Resolve => "resolve",
567            PredefinedAtom::Reject => "reject",
568            PredefinedAtom::PromiseLower => "promise",
569            PredefinedAtom::ProxyLower => "proxy",
570            PredefinedAtom::Revoke => "revoke",
571            PredefinedAtom::Async => "async",
572            PredefinedAtom::Exec => "exec",
573            PredefinedAtom::Groups => "groups",
574            PredefinedAtom::Status => "status",
575            PredefinedAtom::Reason => "reason",
576            PredefinedAtom::GlobalThis => "globalThis",
577            PredefinedAtom::Bigint => "bigint",
578            PredefinedAtom::ToJSON => "toJSON",
579            PredefinedAtom::MaxByteLength => "maxByteLength",
580            PredefinedAtom::Object => "Object",
581            PredefinedAtom::Array => "Array",
582            PredefinedAtom::Error => "Error",
583            PredefinedAtom::Number => "Number",
584            PredefinedAtom::String => "String",
585            PredefinedAtom::Boolean => "Boolean",
586            PredefinedAtom::Symbol => "Symbol",
587            PredefinedAtom::Arguments => "Arguments",
588            PredefinedAtom::Math => "Math",
589            PredefinedAtom::JSON => "JSON",
590            PredefinedAtom::Date => "Date",
591            PredefinedAtom::Function => "Function",
592            PredefinedAtom::GeneratorFunction => "GeneratorFunction",
593            PredefinedAtom::ForInIterator => "ForInIterator",
594            PredefinedAtom::Iterator => "Iterator",
595            PredefinedAtom::RegExp => "RegExp",
596            PredefinedAtom::ArrayBuffer => "ArrayBuffer",
597            PredefinedAtom::SharedArrayBuffer => "SharedArrayBuffer",
598            PredefinedAtom::Uint8ClampedArray => "Uint8ClampedArray",
599            PredefinedAtom::Int8Array => "Int8Array",
600            PredefinedAtom::Uint8Array => "Uint8Array",
601            PredefinedAtom::Int16Array => "Int16Array",
602            PredefinedAtom::Uint16Array => "Uint16Array",
603            PredefinedAtom::Int32Array => "Int32Array",
604            PredefinedAtom::Uint32Array => "Uint32Array",
605            PredefinedAtom::BigInt64Array => "BigInt64Array",
606            PredefinedAtom::BigUint64Array => "BigUint64Array",
607            #[cfg(feature = "half")]
608            PredefinedAtom::Float16Array => "Float16Array",
609            PredefinedAtom::Float32Array => "Float32Array",
610            PredefinedAtom::Float64Array => "Float64Array",
611            PredefinedAtom::DataView => "DataView",
612            PredefinedAtom::BigInt => "BigInt",
613            PredefinedAtom::Map => "Map",
614            PredefinedAtom::Set => "Set",
615            PredefinedAtom::WeakMap => "WeakMap",
616            PredefinedAtom::WeakSet => "WeakSet",
617            PredefinedAtom::MapIterator => "Map Iterator",
618            PredefinedAtom::SetIterator => "Set Iterator",
619            PredefinedAtom::ArrayIterator => "Array Iterator",
620            PredefinedAtom::StringIterator => "String Iterator",
621            PredefinedAtom::RegExpStringIterator => "RegExp String Iterator",
622            PredefinedAtom::Generator => "Generator",
623            PredefinedAtom::Proxy => "Proxy",
624            PredefinedAtom::Promise => "Promise",
625            PredefinedAtom::PromiseResolveFunction => "PromiseResolveFunction",
626            PredefinedAtom::PromiseRejectFunction => "PromiseRejectFunction",
627            PredefinedAtom::AsyncFunction => "AsyncFunction",
628            PredefinedAtom::AsyncFunctionResolve => "AsyncFunctionResolve",
629            PredefinedAtom::AsyncFunctionReject => "AsyncFunctionReject",
630            PredefinedAtom::AsyncGeneratorFunction => "AsyncGeneratorFunction",
631            PredefinedAtom::AsyncGenerator => "AsyncGenerator",
632            PredefinedAtom::EvalError => "EvalError",
633            PredefinedAtom::RangeError => "RangeError",
634            PredefinedAtom::ReferenceError => "ReferenceError",
635            PredefinedAtom::SyntaxError => "SyntaxError",
636            PredefinedAtom::TypeError => "TypeError",
637            PredefinedAtom::URIError => "URIError",
638            PredefinedAtom::InternalError => "InternalError",
639            PredefinedAtom::SymbolAsyncIterator => "Symbol.asyncIterator",
640            PredefinedAtom::SymbolIterator => "Symbol.iterator",
641            PredefinedAtom::SymbolMatch => "Symbol.match",
642            PredefinedAtom::SymbolMatchAll => "Symbol.matchAll",
643            PredefinedAtom::SymbolReplace => "Symbol.replace",
644            PredefinedAtom::SymbolSearch => "Symbol.search",
645            PredefinedAtom::SymbolSplit => "Symbol.split",
646            PredefinedAtom::SymbolToPrimitive => "Symbol.toPrimitive",
647            PredefinedAtom::SymbolToStringTag => "Symbol.toStringTag",
648            PredefinedAtom::SymbolIsConcatSpreadable => "Symbol.isConcatSpreadable",
649            PredefinedAtom::SymbolHasInstance => "Symbol.hasInstance",
650            PredefinedAtom::SymbolSpecies => "Symbol.species",
651            PredefinedAtom::SymbolUnscopables => "Symbol.unscopables",
652        }
653    }
654}
655
656#[cfg(test)]
657mod test {
658    use crate::{Atom, Context, IntoAtom, Runtime};
659
660    use super::PredefinedAtom;
661    #[test]
662    fn string_correct() {
663        static ALL_PREDEFS: &[PredefinedAtom] = &[
664            PredefinedAtom::Null,
665            PredefinedAtom::False,
666            PredefinedAtom::True,
667            PredefinedAtom::If,
668            PredefinedAtom::Else,
669            PredefinedAtom::Return,
670            PredefinedAtom::Var,
671            PredefinedAtom::This,
672            PredefinedAtom::Delete,
673            PredefinedAtom::Void,
674            PredefinedAtom::Typeof,
675            PredefinedAtom::New,
676            PredefinedAtom::In,
677            PredefinedAtom::Instanceof,
678            PredefinedAtom::Do,
679            PredefinedAtom::While,
680            PredefinedAtom::For,
681            PredefinedAtom::Break,
682            PredefinedAtom::Continue,
683            PredefinedAtom::Switch,
684            PredefinedAtom::Case,
685            PredefinedAtom::Default,
686            PredefinedAtom::Throw,
687            PredefinedAtom::Try,
688            PredefinedAtom::Catch,
689            PredefinedAtom::Finally,
690            PredefinedAtom::FunctionKw,
691            PredefinedAtom::Debugger,
692            PredefinedAtom::With,
693            PredefinedAtom::Class,
694            PredefinedAtom::Const,
695            PredefinedAtom::Enum,
696            PredefinedAtom::Export,
697            PredefinedAtom::Extends,
698            PredefinedAtom::Import,
699            PredefinedAtom::Super,
700            PredefinedAtom::Implements,
701            PredefinedAtom::Interface,
702            PredefinedAtom::Let,
703            PredefinedAtom::Package,
704            PredefinedAtom::Private,
705            PredefinedAtom::Protected,
706            PredefinedAtom::Public,
707            PredefinedAtom::Static,
708            PredefinedAtom::Yield,
709            PredefinedAtom::Await,
710            PredefinedAtom::Empty,
711            PredefinedAtom::Length,
712            PredefinedAtom::Message,
713            PredefinedAtom::Errors,
714            PredefinedAtom::Stack,
715            PredefinedAtom::Name,
716            PredefinedAtom::ToString,
717            PredefinedAtom::ToLocaleString,
718            PredefinedAtom::ValueOf,
719            PredefinedAtom::Eval,
720            PredefinedAtom::Prototype,
721            PredefinedAtom::Constructor,
722            PredefinedAtom::Configurable,
723            PredefinedAtom::Writable,
724            PredefinedAtom::Enumerable,
725            PredefinedAtom::Value,
726            PredefinedAtom::Getter,
727            PredefinedAtom::Setter,
728            PredefinedAtom::Of,
729            PredefinedAtom::UnderscoreProto,
730            PredefinedAtom::Undefined,
731            PredefinedAtom::NumberLower,
732            PredefinedAtom::BooleanLower,
733            PredefinedAtom::StringLower,
734            PredefinedAtom::ObjectLower,
735            PredefinedAtom::SymbolLower,
736            PredefinedAtom::Integer,
737            PredefinedAtom::Unknown,
738            PredefinedAtom::ArgumentsLower,
739            PredefinedAtom::Callee,
740            PredefinedAtom::Caller,
741            PredefinedAtom::LastIndex,
742            PredefinedAtom::Target,
743            PredefinedAtom::Index,
744            PredefinedAtom::Input,
745            PredefinedAtom::DefineProperties,
746            PredefinedAtom::Apply,
747            PredefinedAtom::Join,
748            PredefinedAtom::Concat,
749            PredefinedAtom::Split,
750            PredefinedAtom::Construct,
751            PredefinedAtom::GetPrototypeOf,
752            PredefinedAtom::SetPrototypeOf,
753            PredefinedAtom::IsExtensible,
754            PredefinedAtom::PreventExtensions,
755            PredefinedAtom::Has,
756            PredefinedAtom::DeleteProperty,
757            PredefinedAtom::DefineProperty,
758            PredefinedAtom::GetOwnPropertyDescriptor,
759            PredefinedAtom::OwnKeys,
760            PredefinedAtom::Add,
761            PredefinedAtom::Done,
762            PredefinedAtom::Next,
763            PredefinedAtom::Values,
764            PredefinedAtom::Source,
765            PredefinedAtom::Flags,
766            PredefinedAtom::Global,
767            PredefinedAtom::Unicode,
768            PredefinedAtom::Raw,
769            PredefinedAtom::NewTarget,
770            PredefinedAtom::ThisActiveFunc,
771            PredefinedAtom::HomeObject,
772            PredefinedAtom::ComputedField,
773            PredefinedAtom::StaticComputedField,
774            PredefinedAtom::ClassFieldsInit,
775            PredefinedAtom::Brand,
776            PredefinedAtom::HashConstructor,
777            PredefinedAtom::As,
778            PredefinedAtom::From,
779            PredefinedAtom::Meta,
780            PredefinedAtom::StarDefault,
781            PredefinedAtom::Star,
782            PredefinedAtom::Module,
783            PredefinedAtom::Then,
784            PredefinedAtom::Resolve,
785            PredefinedAtom::Reject,
786            PredefinedAtom::PromiseLower,
787            PredefinedAtom::ProxyLower,
788            PredefinedAtom::Revoke,
789            PredefinedAtom::Async,
790            PredefinedAtom::Exec,
791            PredefinedAtom::Groups,
792            PredefinedAtom::Status,
793            PredefinedAtom::Reason,
794            PredefinedAtom::GlobalThis,
795            PredefinedAtom::Bigint,
796            PredefinedAtom::ToJSON,
797            PredefinedAtom::Object,
798            PredefinedAtom::Array,
799            PredefinedAtom::Error,
800            PredefinedAtom::Number,
801            PredefinedAtom::String,
802            PredefinedAtom::Boolean,
803            PredefinedAtom::Symbol,
804            PredefinedAtom::Arguments,
805            PredefinedAtom::Math,
806            PredefinedAtom::JSON,
807            PredefinedAtom::Date,
808            PredefinedAtom::Function,
809            PredefinedAtom::GeneratorFunction,
810            PredefinedAtom::ForInIterator,
811            PredefinedAtom::RegExp,
812            PredefinedAtom::ArrayBuffer,
813            PredefinedAtom::SharedArrayBuffer,
814            PredefinedAtom::Uint8ClampedArray,
815            PredefinedAtom::Int8Array,
816            PredefinedAtom::Uint8Array,
817            PredefinedAtom::Int16Array,
818            PredefinedAtom::Uint16Array,
819            PredefinedAtom::Int32Array,
820            PredefinedAtom::Uint32Array,
821            PredefinedAtom::BigInt64Array,
822            PredefinedAtom::BigUint64Array,
823            PredefinedAtom::Float32Array,
824            PredefinedAtom::Float64Array,
825            PredefinedAtom::DataView,
826            PredefinedAtom::BigInt,
827            PredefinedAtom::Map,
828            PredefinedAtom::Set,
829            PredefinedAtom::WeakMap,
830            PredefinedAtom::WeakSet,
831            PredefinedAtom::MapIterator,
832            PredefinedAtom::SetIterator,
833            PredefinedAtom::ArrayIterator,
834            PredefinedAtom::StringIterator,
835            PredefinedAtom::RegExpStringIterator,
836            PredefinedAtom::Generator,
837            PredefinedAtom::Proxy,
838            PredefinedAtom::Promise,
839            PredefinedAtom::PromiseResolveFunction,
840            PredefinedAtom::PromiseRejectFunction,
841            PredefinedAtom::AsyncFunction,
842            PredefinedAtom::AsyncFunctionResolve,
843            PredefinedAtom::AsyncFunctionReject,
844            PredefinedAtom::AsyncGeneratorFunction,
845            PredefinedAtom::AsyncGenerator,
846            PredefinedAtom::EvalError,
847            PredefinedAtom::RangeError,
848            PredefinedAtom::ReferenceError,
849            PredefinedAtom::SyntaxError,
850            PredefinedAtom::TypeError,
851            PredefinedAtom::URIError,
852            PredefinedAtom::InternalError,
853            PredefinedAtom::SymbolAsyncIterator,
854            PredefinedAtom::SymbolIterator,
855            PredefinedAtom::SymbolMatch,
856            PredefinedAtom::SymbolMatchAll,
857            PredefinedAtom::SymbolReplace,
858            PredefinedAtom::SymbolSearch,
859            PredefinedAtom::SymbolSplit,
860            PredefinedAtom::SymbolToStringTag,
861            PredefinedAtom::SymbolIsConcatSpreadable,
862            PredefinedAtom::SymbolHasInstance,
863            PredefinedAtom::SymbolSpecies,
864            PredefinedAtom::SymbolUnscopables,
865        ];
866
867        let rt = Runtime::new().unwrap();
868        let context = Context::full(&rt).unwrap();
869        context.with(|ctx| {
870            for predef in ALL_PREDEFS {
871                let atom = predef.into_atom(&ctx).unwrap();
872                assert_eq!(atom.to_string().unwrap().as_str(), predef.to_str());
873
874                // the string of a symbol doesn't convert to the same atom.
875                if predef.is_symbol() {
876                    continue;
877                }
878
879                let from_str = Atom::from_str(ctx.clone(), predef.to_str()).unwrap();
880                assert_eq!(
881                    atom,
882                    from_str,
883                    "Atom `{}` from str and from redefined not equal",
884                    predef.to_str()
885                )
886            }
887        })
888    }
889}