Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file token.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551(*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*)typet=|T_NUMBERof{kind:number_type;raw:string;}|T_BIGINTof{kind:bigint_type;raw:string;}|T_STRINGof(Loc.t*string*string*bool)(* loc, value, raw, octal *)|T_TEMPLATE_PARTof(Loc.t*string*string*bool*bool)(* loc, value, raw, head, tail *)|T_IDENTIFIERof{loc:Loc.t;value:string;raw:string;}|T_REGEXPofLoc.t*string*string(* /pattern/flags *)(* Syntax *)|T_LCURLY|T_RCURLY|T_LCURLYBAR|T_RCURLYBAR|T_LPAREN|T_RPAREN|T_LBRACKET|T_RBRACKET|T_SEMICOLON|T_COMMA|T_PERIOD|T_ARROW|T_ELLIPSIS|T_AT|T_POUND(* Keywords *)|T_FUNCTION|T_IF|T_IN|T_INSTANCEOF|T_RETURN|T_SWITCH|T_MATCH|T_THIS|T_THROW|T_TRY|T_VAR|T_WHILE|T_WITH|T_CONST|T_LET|T_NULL|T_FALSE|T_TRUE|T_BREAK|T_CASE|T_CATCH|T_CONTINUE|T_DEFAULT|T_DO|T_FINALLY|T_FOR|T_CLASS|T_EXTENDS|T_STATIC|T_ELSE|T_NEW|T_DELETE|T_TYPEOF|T_VOID|T_ENUM|T_EXPORT|T_IMPORT|T_SUPER|T_IMPLEMENTS|T_INTERFACE|T_PACKAGE|T_PRIVATE|T_PROTECTED|T_PUBLIC|T_YIELD|T_DEBUGGER|T_DECLARE|T_TYPE|T_OPAQUE|T_OF|T_ASYNC|T_AWAIT|T_CHECKS(* Operators *)|T_RSHIFT3_ASSIGN|T_RSHIFT_ASSIGN|T_LSHIFT_ASSIGN|T_BIT_XOR_ASSIGN|T_BIT_OR_ASSIGN|T_BIT_AND_ASSIGN|T_MOD_ASSIGN|T_DIV_ASSIGN|T_MULT_ASSIGN|T_EXP_ASSIGN|T_MINUS_ASSIGN|T_PLUS_ASSIGN|T_NULLISH_ASSIGN|T_AND_ASSIGN|T_OR_ASSIGN|T_ASSIGN|T_PLING_PERIOD|T_PLING_PLING|T_PLING|T_COLON|T_OR|T_AND|T_BIT_OR|T_BIT_XOR|T_BIT_AND|T_EQUAL|T_NOT_EQUAL|T_STRICT_EQUAL|T_STRICT_NOT_EQUAL|T_LESS_THAN_EQUAL|T_GREATER_THAN_EQUAL|T_LESS_THAN|T_GREATER_THAN|T_LSHIFT|T_RSHIFT|T_RSHIFT3|T_PLUS|T_MINUS|T_DIV|T_MULT|T_EXP|T_MOD|T_NOT|T_BIT_NOT|T_INCR|T_DECR(* Extra tokens *)|T_INTERPRETERofLoc.t*string|T_ERRORofstring|T_EOF(* JSX *)|T_JSX_IDENTIFIERof{raw:string;loc:Loc.t;}|T_JSX_CHILD_TEXTofLoc.t*string*string(* loc, value, raw *)|T_JSX_QUOTE_TEXTofLoc.t*string*string(* loc, value, raw *)(* Type primitives *)|T_ANY_TYPE|T_MIXED_TYPE|T_EMPTY_TYPE|T_BOOLEAN_TYPEofbool_or_boolean|T_NUMBER_TYPE|T_BIGINT_TYPE|T_NUMBER_SINGLETON_TYPEof{kind:number_type;value:float;raw:string;}|T_BIGINT_SINGLETON_TYPEof{kind:bigint_type;value:int64option;raw:string;}|T_STRING_TYPE|T_VOID_TYPE|T_SYMBOL_TYPE|T_UNKNOWN_TYPE|T_NEVER_TYPE|T_UNDEFINED_TYPE|T_KEYOF|T_READONLY|T_INFER|T_IS|T_ASSERTS|T_IMPLIES|T_RENDERS_QUESTION|T_RENDERS_STAR(* `bool` and `boolean` are equivalent annotations, but we need to track
which one was used for when it might be an identifier, as in
`(bool: boolean) => void`. It's lexed as two T_BOOLEAN_TYPEs, then the
first one is converted into an identifier. *)andbool_or_boolean=|BOOL|BOOLEANandnumber_type=|BINARY|LEGACY_OCTAL|LEGACY_NON_OCTAL(* NonOctalDecimalIntegerLiteral in Annex B *)|OCTAL|NORMALandbigint_type=|BIG_BINARY|BIG_OCTAL|BIG_NORMAL[@@derivingeq](*****************************************************************************)(* Pretty printer (pretty?) *)(*****************************************************************************)lettoken_to_string=function|T_NUMBER_->"T_NUMBER"|T_BIGINT_->"T_BIGINT"|T_STRING_->"T_STRING"|T_TEMPLATE_PART_->"T_TEMPLATE_PART"|T_IDENTIFIER_->"T_IDENTIFIER"|T_REGEXP_->"T_REGEXP"|T_FUNCTION->"T_FUNCTION"|T_IF->"T_IF"|T_IN->"T_IN"|T_INSTANCEOF->"T_INSTANCEOF"|T_RETURN->"T_RETURN"|T_SWITCH->"T_SWITCH"|T_MATCH->"T_MATCH"|T_THIS->"T_THIS"|T_THROW->"T_THROW"|T_TRY->"T_TRY"|T_VAR->"T_VAR"|T_WHILE->"T_WHILE"|T_WITH->"T_WITH"|T_CONST->"T_CONST"|T_LET->"T_LET"|T_NULL->"T_NULL"|T_FALSE->"T_FALSE"|T_TRUE->"T_TRUE"|T_BREAK->"T_BREAK"|T_CASE->"T_CASE"|T_CATCH->"T_CATCH"|T_CONTINUE->"T_CONTINUE"|T_DEFAULT->"T_DEFAULT"|T_DO->"T_DO"|T_FINALLY->"T_FINALLY"|T_FOR->"T_FOR"|T_CLASS->"T_CLASS"|T_EXTENDS->"T_EXTENDS"|T_STATIC->"T_STATIC"|T_ELSE->"T_ELSE"|T_NEW->"T_NEW"|T_DELETE->"T_DELETE"|T_TYPEOF->"T_TYPEOF"|T_VOID->"T_VOID"|T_ENUM->"T_ENUM"|T_EXPORT->"T_EXPORT"|T_IMPORT->"T_IMPORT"|T_SUPER->"T_SUPER"|T_IMPLEMENTS->"T_IMPLEMENTS"|T_INTERFACE->"T_INTERFACE"|T_PACKAGE->"T_PACKAGE"|T_PRIVATE->"T_PRIVATE"|T_PROTECTED->"T_PROTECTED"|T_PUBLIC->"T_PUBLIC"|T_YIELD->"T_YIELD"|T_DEBUGGER->"T_DEBUGGER"|T_DECLARE->"T_DECLARE"|T_TYPE->"T_TYPE"|T_OPAQUE->"T_OPAQUE"|T_OF->"T_OF"|T_ASYNC->"T_ASYNC"|T_AWAIT->"T_AWAIT"|T_CHECKS->"T_CHECKS"|T_LCURLY->"T_LCURLY"|T_RCURLY->"T_RCURLY"|T_LCURLYBAR->"T_LCURLYBAR"|T_RCURLYBAR->"T_RCURLYBAR"|T_LPAREN->"T_LPAREN"|T_RPAREN->"T_RPAREN"|T_LBRACKET->"T_LBRACKET"|T_RBRACKET->"T_RBRACKET"|T_SEMICOLON->"T_SEMICOLON"|T_COMMA->"T_COMMA"|T_PERIOD->"T_PERIOD"|T_ARROW->"T_ARROW"|T_ELLIPSIS->"T_ELLIPSIS"|T_AT->"T_AT"|T_POUND->"T_POUND"|T_RSHIFT3_ASSIGN->"T_RSHIFT3_ASSIGN"|T_RSHIFT_ASSIGN->"T_RSHIFT_ASSIGN"|T_LSHIFT_ASSIGN->"T_LSHIFT_ASSIGN"|T_BIT_XOR_ASSIGN->"T_BIT_XOR_ASSIGN"|T_BIT_OR_ASSIGN->"T_BIT_OR_ASSIGN"|T_BIT_AND_ASSIGN->"T_BIT_AND_ASSIGN"|T_MOD_ASSIGN->"T_MOD_ASSIGN"|T_DIV_ASSIGN->"T_DIV_ASSIGN"|T_MULT_ASSIGN->"T_MULT_ASSIGN"|T_EXP_ASSIGN->"T_EXP_ASSIGN"|T_MINUS_ASSIGN->"T_MINUS_ASSIGN"|T_PLUS_ASSIGN->"T_PLUS_ASSIGN"|T_NULLISH_ASSIGN->"T_NULLISH_ASSIGN"|T_AND_ASSIGN->"T_AND_ASSIGN"|T_OR_ASSIGN->"T_OR_ASSIGN"|T_ASSIGN->"T_ASSIGN"|T_PLING_PERIOD->"T_PLING_PERIOD"|T_PLING_PLING->"T_PLING_PLING"|T_PLING->"T_PLING"|T_COLON->"T_COLON"|T_OR->"T_OR"|T_AND->"T_AND"|T_BIT_OR->"T_BIT_OR"|T_BIT_XOR->"T_BIT_XOR"|T_BIT_AND->"T_BIT_AND"|T_EQUAL->"T_EQUAL"|T_NOT_EQUAL->"T_NOT_EQUAL"|T_STRICT_EQUAL->"T_STRICT_EQUAL"|T_STRICT_NOT_EQUAL->"T_STRICT_NOT_EQUAL"|T_LESS_THAN_EQUAL->"T_LESS_THAN_EQUAL"|T_GREATER_THAN_EQUAL->"T_GREATER_THAN_EQUAL"|T_LESS_THAN->"T_LESS_THAN"|T_GREATER_THAN->"T_GREATER_THAN"|T_LSHIFT->"T_LSHIFT"|T_RSHIFT->"T_RSHIFT"|T_RSHIFT3->"T_RSHIFT3"|T_PLUS->"T_PLUS"|T_MINUS->"T_MINUS"|T_DIV->"T_DIV"|T_MULT->"T_MULT"|T_EXP->"T_EXP"|T_MOD->"T_MOD"|T_NOT->"T_NOT"|T_BIT_NOT->"T_BIT_NOT"|T_INCR->"T_INCR"|T_DECR->"T_DECR"|T_KEYOF->"T_KEYOF"|T_READONLY->"T_READONLY"|T_INFER->"T_INFER"|T_IS->"T_IS"|T_ASSERTS->"T_ASSERTS"|T_IMPLIES->"T_IMPLIES"|T_RENDERS_QUESTION->"T_RENDERS_QUESTION"|T_RENDERS_STAR->"T_RENDERS_QUESTION"(* Extra tokens *)|T_INTERPRETER_->"T_INTERPRETER"|T_ERROR_->"T_ERROR"|T_EOF->"T_EOF"|T_JSX_IDENTIFIER_->"T_JSX_IDENTIFIER"|T_JSX_CHILD_TEXT_->"T_JSX_TEXT"|T_JSX_QUOTE_TEXT_->"T_JSX_TEXT"(* Type primitives *)|T_ANY_TYPE->"T_ANY_TYPE"|T_MIXED_TYPE->"T_MIXED_TYPE"|T_EMPTY_TYPE->"T_EMPTY_TYPE"|T_BOOLEAN_TYPE_->"T_BOOLEAN_TYPE"|T_NUMBER_TYPE->"T_NUMBER_TYPE"|T_BIGINT_TYPE->"T_BIGINT_TYPE"|T_NUMBER_SINGLETON_TYPE_->"T_NUMBER_SINGLETON_TYPE"|T_BIGINT_SINGLETON_TYPE_->"T_BIGINT_SINGLETON_TYPE"|T_STRING_TYPE->"T_STRING_TYPE"|T_VOID_TYPE->"T_VOID_TYPE"|T_SYMBOL_TYPE->"T_SYMBOL_TYPE"|T_UNKNOWN_TYPE->"T_UNKNOWN_TYPE"|T_NEVER_TYPE->"T_NEVER_TYPE"|T_UNDEFINED_TYPE->"T_UNDEFINED_TYPE"letvalue_of_token=function|T_NUMBER{raw;_}->raw|T_BIGINT{raw;_}->raw|T_STRING(_,_,raw,_)->raw|T_TEMPLATE_PART(_,_,raw,is_head,is_tail)->ifis_head&&is_tailthen"`"^raw^"`"elseifis_headthen"`"^raw^"${"elseifis_tailthen"}"^raw^"`"else"${"^raw^"}"|T_IDENTIFIER{raw;_}->raw|T_REGEXP(_,pattern,flags)->"/"^pattern^"/"^flags|T_LCURLY->"{"|T_RCURLY->"}"|T_LCURLYBAR->"{|"|T_RCURLYBAR->"|}"|T_LPAREN->"("|T_RPAREN->")"|T_LBRACKET->"["|T_RBRACKET->"]"|T_SEMICOLON->";"|T_COMMA->","|T_PERIOD->"."|T_ARROW->"=>"|T_ELLIPSIS->"..."|T_AT->"@"|T_POUND->"#"|T_FUNCTION->"function"|T_IF->"if"|T_IN->"in"|T_INSTANCEOF->"instanceof"|T_RETURN->"return"|T_SWITCH->"switch"|T_MATCH->"match"|T_THIS->"this"|T_THROW->"throw"|T_TRY->"try"|T_VAR->"var"|T_WHILE->"while"|T_WITH->"with"|T_CONST->"const"|T_LET->"let"|T_NULL->"null"|T_FALSE->"false"|T_TRUE->"true"|T_BREAK->"break"|T_CASE->"case"|T_CATCH->"catch"|T_CONTINUE->"continue"|T_DEFAULT->"default"|T_DO->"do"|T_FINALLY->"finally"|T_FOR->"for"|T_CLASS->"class"|T_EXTENDS->"extends"|T_STATIC->"static"|T_ELSE->"else"|T_NEW->"new"|T_DELETE->"delete"|T_TYPEOF->"typeof"|T_VOID->"void"|T_ENUM->"enum"|T_EXPORT->"export"|T_IMPORT->"import"|T_SUPER->"super"|T_IMPLEMENTS->"implements"|T_INTERFACE->"interface"|T_PACKAGE->"package"|T_PRIVATE->"private"|T_PROTECTED->"protected"|T_PUBLIC->"public"|T_YIELD->"yield"|T_DEBUGGER->"debugger"|T_DECLARE->"declare"|T_TYPE->"type"|T_OPAQUE->"opaque"|T_OF->"of"|T_ASYNC->"async"|T_AWAIT->"await"|T_CHECKS->"%checks"|T_RSHIFT3_ASSIGN->">>>="|T_RSHIFT_ASSIGN->">>="|T_LSHIFT_ASSIGN->"<<="|T_BIT_XOR_ASSIGN->"^="|T_BIT_OR_ASSIGN->"|="|T_BIT_AND_ASSIGN->"&="|T_MOD_ASSIGN->"%="|T_DIV_ASSIGN->"/="|T_MULT_ASSIGN->"*="|T_EXP_ASSIGN->"**="|T_MINUS_ASSIGN->"-="|T_PLUS_ASSIGN->"+="|T_NULLISH_ASSIGN->"??="|T_AND_ASSIGN->"&&="|T_OR_ASSIGN->"||="|T_ASSIGN->"="|T_PLING_PERIOD->"?."|T_PLING_PLING->"??"|T_PLING->"?"|T_COLON->":"|T_OR->"||"|T_AND->"&&"|T_BIT_OR->"|"|T_BIT_XOR->"^"|T_BIT_AND->"&"|T_EQUAL->"=="|T_NOT_EQUAL->"!="|T_STRICT_EQUAL->"==="|T_STRICT_NOT_EQUAL->"!=="|T_LESS_THAN_EQUAL->"<="|T_GREATER_THAN_EQUAL->">="|T_LESS_THAN->"<"|T_GREATER_THAN->">"|T_LSHIFT->"<<"|T_RSHIFT->">>"|T_RSHIFT3->">>>"|T_PLUS->"+"|T_MINUS->"-"|T_DIV->"/"|T_MULT->"*"|T_EXP->"**"|T_MOD->"%"|T_NOT->"!"|T_BIT_NOT->"~"|T_INCR->"++"|T_DECR->"--"|T_KEYOF->"keyof"|T_READONLY->"readonly"|T_INFER->"infer"|T_IS->"is"|T_ASSERTS->"asserts"|T_IMPLIES->"implies"|T_RENDERS_QUESTION->"renders?"|T_RENDERS_STAR->"renders*"(* Extra tokens *)|T_INTERPRETER(_,str)->str|T_ERRORraw->raw|T_EOF->""|T_JSX_IDENTIFIER{raw;_}->raw|T_JSX_CHILD_TEXT(_,_,raw)->raw|T_JSX_QUOTE_TEXT(_,_,raw)->raw(* Type primitives *)|T_ANY_TYPE->"any"|T_MIXED_TYPE->"mixed"|T_EMPTY_TYPE->"empty"|T_BOOLEAN_TYPEkind->beginmatchkindwith|BOOL->"bool"|BOOLEAN->"boolean"end|T_NUMBER_TYPE->"number"|T_BIGINT_TYPE->"bigint"|T_NUMBER_SINGLETON_TYPE{raw;_}->raw|T_BIGINT_SINGLETON_TYPE{raw;_}->raw|T_STRING_TYPE->"string"|T_VOID_TYPE->"void"|T_SYMBOL_TYPE->"symbol"|T_UNKNOWN_TYPE->"unknown"|T_NEVER_TYPE->"never"|T_UNDEFINED_TYPE->"undefined"letquote_token_valuevalue=Printf.sprintf"token `%s`"valueletexplanation_of_token?(use_article=false)token=let(value,article)=matchtokenwith|T_NUMBER_SINGLETON_TYPE_|T_NUMBER_->("number","a")|T_BIGINT_SINGLETON_TYPE_|T_BIGINT_->("bigint","a")|T_JSX_CHILD_TEXT_|T_JSX_QUOTE_TEXT_|T_STRING_->("string","a")|T_TEMPLATE_PART_->("template literal part","a")|T_JSX_IDENTIFIER_|T_IDENTIFIER_->("identifier","an")|T_REGEXP_->("regexp","a")|T_EOF->("end of input","the")|_->(quote_token_value(value_of_tokentoken),"the")inifuse_articlethenarticle^" "^valueelsevalue