Path: blob/master/Analysis/src/EmbeddedBuiltinDefinitions.cpp
2725 views
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details1#include "Luau/BuiltinDefinitions.h"23LUAU_FASTFLAGVARIABLE(LuauTypeCheckerUdtfRenameClassToExtern)4LUAU_FASTFLAGVARIABLE(LuauNewMathConstantsAnalysis)5LUAU_FASTFLAGVARIABLE(LuauTypeCheckerVectorReadOnly)6LUAU_FASTFLAG(LuauIntegerLibrary)7LUAU_FASTFLAG(LuauIntegerType)89namespace Luau10{1112static constexpr const char* kBuiltinDefinitionBaseSrc = R"BUILTIN_SRC(1314@checked declare function require(target: any): any1516@checked declare function getfenv(target: any): { [string]: any }1718declare _G: any19declare _VERSION: string2021declare function gcinfo(): number2223declare function print<T...>(...: T...)2425declare function type<T>(value: T): string26declare function typeof<T>(value: T): string2728-- `assert` has a magic function attached that will give more detailed type information29declare function assert<T>(value: T, errorMessage: string?): T30declare function error<T>(message: T, level: number?): never3132declare function tostring<T>(value: T): string33declare function tonumber<T>(value: T, radix: number?): number?3435declare function rawequal<T1, T2>(a: T1, b: T2): boolean36declare function rawget<K, V>(tab: {[K]: V}, k: K): V?37declare function rawset<K, V>(tab: {[K]: V}, k: K, v: V): {[K]: V}38declare function rawlen<K, V>(obj: {[K]: V} | string): number3940declare function setfenv<T..., R...>(target: number | (T...) -> R..., env: {[string]: any}): ((T...) -> R...)?4142declare function ipairs<V>(tab: {V}): (({V}, number) -> (number?, V), {V}, number)4344declare function pcall<A..., R...>(f: (A...) -> R..., ...: A...): (boolean, R...)4546-- FIXME: The actual type of `xpcall` is:47-- <E, A..., R1..., R2...>(f: (A...) -> R1..., err: (E) -> R2..., A...) -> (true, R1...) | (false, R2...)48-- Since we can't represent the return value, we use (boolean, R1...).49declare function xpcall<E, A..., R1..., R2...>(f: (A...) -> R1..., err: (E) -> R2..., ...: A...): (boolean, R1...)5051-- `select` has a magic function attached to provide more detailed type information52declare function select<A...>(i: string | number, ...: A...): ...any5354-- FIXME: This type is not entirely correct - `loadstring` returns a function or55-- (nil, string).56declare function loadstring<A...>(src: string, chunkname: string?): (((A...) -> any)?, string?)5758@checked declare function newproxy(mt: boolean?): any5960-- Cannot use `typeof` here because it will produce a polytype when we expect a monotype.61declare function unpack<V>(tab: {V}, i: number?, j: number?): ...V6263)BUILTIN_SRC";6465static constexpr const char* kBuiltinDefinitionBit32Src = R"BUILTIN_SRC(6667declare bit32: {68band: @checked (...number) -> number,69bor: @checked (...number) -> number,70bxor: @checked (...number) -> number,71btest: @checked (number, ...number) -> boolean,72rrotate: @checked (x: number, disp: number) -> number,73lrotate: @checked (x: number, disp: number) -> number,74lshift: @checked (x: number, disp: number) -> number,75arshift: @checked (x: number, disp: number) -> number,76rshift: @checked (x: number, disp: number) -> number,77bnot: @checked (x: number) -> number,78extract: @checked (n: number, field: number, width: number?) -> number,79replace: @checked (n: number, v: number, field: number, width: number?) -> number,80countlz: @checked (n: number) -> number,81countrz: @checked (n: number) -> number,82byteswap: @checked (n: number) -> number,83}8485)BUILTIN_SRC";8687static constexpr const char* kBuiltinDefinitionMathSrc = R"BUILTIN_SRC(8889declare math: {90frexp: @checked (n: number) -> (number, number),91ldexp: @checked (s: number, e: number) -> number,92fmod: @checked (x: number, y: number) -> number,93modf: @checked (n: number) -> (number, number),94pow: @checked (x: number, y: number) -> number,95exp: @checked (n: number) -> number,9697ceil: @checked (n: number) -> number,98floor: @checked (n: number) -> number,99abs: @checked (n: number) -> number,100sqrt: @checked (n: number) -> number,101102log: @checked (n: number, base: number?) -> number,103log10: @checked (n: number) -> number,104105rad: @checked (n: number) -> number,106deg: @checked (n: number) -> number,107108sin: @checked (n: number) -> number,109cos: @checked (n: number) -> number,110tan: @checked (n: number) -> number,111sinh: @checked (n: number) -> number,112cosh: @checked (n: number) -> number,113tanh: @checked (n: number) -> number,114atan: @checked (n: number) -> number,115acos: @checked (n: number) -> number,116asin: @checked (n: number) -> number,117atan2: @checked (y: number, x: number) -> number,118119min: @checked (number, ...number) -> number,120max: @checked (number, ...number) -> number,121122pi: number,123huge: number,124nan: number,125e: number,126phi: number,127sqrt2: number,128tau: number,129130randomseed: @checked (seed: number) -> (),131random: @checked (number?, number?) -> number,132133sign: @checked (n: number) -> number,134clamp: @checked (n: number, min: number, max: number) -> number,135noise: @checked (x: number, y: number?, z: number?) -> number,136round: @checked (n: number) -> number,137map: @checked (x: number, inmin: number, inmax: number, outmin: number, outmax: number) -> number,138lerp: @checked (a: number, b: number, t: number) -> number,139140isnan: @checked (x: number) -> boolean,141isinf: @checked (x: number) -> boolean,142isfinite: @checked (x: number) -> boolean,143}144145)BUILTIN_SRC";146147// Remove with FFlag::LuauNewMathConstantsAnalysis148static constexpr const char* kBuiltinDefinitionMathSrc_DEPRECATED = R"BUILTIN_SRC(149150declare math: {151frexp: @checked (n: number) -> (number, number),152ldexp: @checked (s: number, e: number) -> number,153fmod: @checked (x: number, y: number) -> number,154modf: @checked (n: number) -> (number, number),155pow: @checked (x: number, y: number) -> number,156exp: @checked (n: number) -> number,157158ceil: @checked (n: number) -> number,159floor: @checked (n: number) -> number,160abs: @checked (n: number) -> number,161sqrt: @checked (n: number) -> number,162163log: @checked (n: number, base: number?) -> number,164log10: @checked (n: number) -> number,165166rad: @checked (n: number) -> number,167deg: @checked (n: number) -> number,168169sin: @checked (n: number) -> number,170cos: @checked (n: number) -> number,171tan: @checked (n: number) -> number,172sinh: @checked (n: number) -> number,173cosh: @checked (n: number) -> number,174tanh: @checked (n: number) -> number,175atan: @checked (n: number) -> number,176acos: @checked (n: number) -> number,177asin: @checked (n: number) -> number,178atan2: @checked (y: number, x: number) -> number,179180min: @checked (number, ...number) -> number,181max: @checked (number, ...number) -> number,182183pi: number,184huge: number,185186randomseed: @checked (seed: number) -> (),187random: @checked (number?, number?) -> number,188189sign: @checked (n: number) -> number,190clamp: @checked (n: number, min: number, max: number) -> number,191noise: @checked (x: number, y: number?, z: number?) -> number,192round: @checked (n: number) -> number,193map: @checked (x: number, inmin: number, inmax: number, outmin: number, outmax: number) -> number,194lerp: @checked (a: number, b: number, t: number) -> number,195196isnan: @checked (x: number) -> boolean,197isinf: @checked (x: number) -> boolean,198isfinite: @checked (x: number) -> boolean,199}200201)BUILTIN_SRC";202203static constexpr const char* kBuiltinDefinitionOsSrc = R"BUILTIN_SRC(204205type DateTypeArg = {206year: number,207month: number,208day: number,209hour: number?,210min: number?,211sec: number?,212isdst: boolean?,213}214215type DateTypeResult = {216year: number,217month: number,218wday: number,219yday: number,220day: number,221hour: number,222min: number,223sec: number,224isdst: boolean,225}226227declare os: {228time: (time: DateTypeArg?) -> number,229date: ((formatString: "*t" | "!*t", time: number?) -> DateTypeResult) & ((formatString: string?, time: number?) -> string),230difftime: (t2: DateTypeResult | number, t1: DateTypeResult | number) -> number,231clock: () -> number,232}233234)BUILTIN_SRC";235236static constexpr const char* kBuiltinDefinitionCoroutineSrc = R"BUILTIN_SRC(237238declare coroutine: {239create: <A..., R...>(f: (A...) -> R...) -> thread,240resume: <A..., R...>(co: thread, A...) -> (boolean, R...),241running: () -> thread,242status: @checked (co: thread) -> "dead" | "running" | "normal" | "suspended",243wrap: <A..., R...>(f: (A...) -> R...) -> ((A...) -> R...),244yield: <A..., R...>(A...) -> R...,245isyieldable: () -> boolean,246close: @checked (co: thread) -> (boolean, any)247}248249)BUILTIN_SRC";250251static constexpr const char* kBuiltinDefinitionTableSrc = R"BUILTIN_SRC(252253declare table: {254concat: <V>(t: {V}, sep: string?, i: number?, j: number?) -> string,255insert: (<V>(t: {V}, value: V) -> ()) & (<V>(t: {V}, pos: number, value: V) -> ()),256maxn: <V>(t: {V}) -> number,257remove: <V>(t: {V}, number?) -> V?,258sort: <V>(t: {V}, comp: ((V, V) -> boolean)?) -> (),259create: <V>(count: number, value: V?) -> {V},260find: <V>(haystack: {V}, needle: V, init: number?) -> number?,261262unpack: <V>(list: {V}, i: number?, j: number?) -> ...V,263pack: <V>(...V) -> { n: number, [number]: V },264265getn: <V>(t: {V}) -> number,266foreach: <K, V>(t: {[K]: V}, f: (K, V) -> ()) -> (),267foreachi: <V>({V}, (number, V) -> ()) -> (),268269move: <V>(src: {V}, a: number, b: number, t: number, dst: {V}?) -> {V},270271clear: (table: {}) -> (),272isfrozen: (t: {}) -> boolean,273}274275)BUILTIN_SRC";276277static constexpr const char* kBuiltinDefinitionDebugSrc = R"BUILTIN_SRC(278279declare debug: {280info: ((thread: thread, level: number, options: string) -> ...any) & ((level: number, options: string) -> ...any) & (<A..., R1...>(func: (A...) -> R1..., options: string) -> ...any),281traceback: ((message: string?, level: number?) -> string) & ((thread: thread, message: string?, level: number?) -> string),282}283284)BUILTIN_SRC";285286static constexpr const char* kBuiltinDefinitionUtf8Src = R"BUILTIN_SRC(287288declare utf8: {289char: @checked (...number) -> string,290charpattern: string,291codes: @checked (str: string) -> ((string, number) -> (number, number), string, number),292codepoint: @checked (str: string, i: number?, j: number?) -> ...number,293len: @checked (s: string, i: number?, j: number?) -> (number?, number?),294offset: @checked (s: string, n: number?, i: number?) -> number,295}296297)BUILTIN_SRC";298299static constexpr const char* kBuiltinDefinitionBufferSrc = R"BUILTIN_SRC(300--- Buffer API301declare buffer: {302create: @checked (size: number) -> buffer,303fromstring: @checked (str: string) -> buffer,304tostring: @checked (b: buffer) -> string,305len: @checked (b: buffer) -> number,306copy: @checked (target: buffer, targetOffset: number, source: buffer, sourceOffset: number?, count: number?) -> (),307fill: @checked (b: buffer, offset: number, value: number, count: number?) -> (),308readi8: @checked (b: buffer, offset: number) -> number,309readu8: @checked (b: buffer, offset: number) -> number,310readi16: @checked (b: buffer, offset: number) -> number,311readu16: @checked (b: buffer, offset: number) -> number,312readi32: @checked (b: buffer, offset: number) -> number,313readu32: @checked (b: buffer, offset: number) -> number,314readf32: @checked (b: buffer, offset: number) -> number,315readf64: @checked (b: buffer, offset: number) -> number,316writei8: @checked (b: buffer, offset: number, value: number) -> (),317writeu8: @checked (b: buffer, offset: number, value: number) -> (),318writei16: @checked (b: buffer, offset: number, value: number) -> (),319writeu16: @checked (b: buffer, offset: number, value: number) -> (),320writei32: @checked (b: buffer, offset: number, value: number) -> (),321writeu32: @checked (b: buffer, offset: number, value: number) -> (),322writef32: @checked (b: buffer, offset: number, value: number) -> (),323writef64: @checked (b: buffer, offset: number, value: number) -> (),324readstring: @checked (b: buffer, offset: number, count: number) -> string,325writestring: @checked (b: buffer, offset: number, value: string, count: number?) -> (),326readbits: @checked (b: buffer, bitOffset: number, bitCount: number) -> number,327writebits: @checked (b: buffer, bitOffset: number, bitCount: number, value: number) -> (),328readinteger: @checked (b: buffer, offset: number) -> integer,329writeinteger: @checked (b: buffer, offset: number, value: integer) -> (),330}331332)BUILTIN_SRC";333334static constexpr const char* kBuiltinDefinitionBufferSrc_NOINTEGER = R"BUILTIN_SRC(335--- Buffer API336declare buffer: {337create: @checked (size: number) -> buffer,338fromstring: @checked (str: string) -> buffer,339tostring: @checked (b: buffer) -> string,340len: @checked (b: buffer) -> number,341copy: @checked (target: buffer, targetOffset: number, source: buffer, sourceOffset: number?, count: number?) -> (),342fill: @checked (b: buffer, offset: number, value: number, count: number?) -> (),343readi8: @checked (b: buffer, offset: number) -> number,344readu8: @checked (b: buffer, offset: number) -> number,345readi16: @checked (b: buffer, offset: number) -> number,346readu16: @checked (b: buffer, offset: number) -> number,347readi32: @checked (b: buffer, offset: number) -> number,348readu32: @checked (b: buffer, offset: number) -> number,349readf32: @checked (b: buffer, offset: number) -> number,350readf64: @checked (b: buffer, offset: number) -> number,351writei8: @checked (b: buffer, offset: number, value: number) -> (),352writeu8: @checked (b: buffer, offset: number, value: number) -> (),353writei16: @checked (b: buffer, offset: number, value: number) -> (),354writeu16: @checked (b: buffer, offset: number, value: number) -> (),355writei32: @checked (b: buffer, offset: number, value: number) -> (),356writeu32: @checked (b: buffer, offset: number, value: number) -> (),357writef32: @checked (b: buffer, offset: number, value: number) -> (),358writef64: @checked (b: buffer, offset: number, value: number) -> (),359readstring: @checked (b: buffer, offset: number, count: number) -> string,360writestring: @checked (b: buffer, offset: number, value: string, count: number?) -> (),361readbits: @checked (b: buffer, bitOffset: number, bitCount: number) -> number,362writebits: @checked (b: buffer, bitOffset: number, bitCount: number, value: number) -> ()363}364365)BUILTIN_SRC";366367static const char* const kBuiltinDefinitionVectorSrc = R"BUILTIN_SRC(368369-- While vector would have been better represented as a built-in primitive type, type solver extern type handling covers most of the properties370declare extern type vector with371read x: number372read y: number373read z: number374end375376declare vector: {377create: @checked (x: number, y: number, z: number?) -> vector,378magnitude: @checked (vec: vector) -> number,379normalize: @checked (vec: vector) -> vector,380cross: @checked (vec1: vector, vec2: vector) -> vector,381dot: @checked (vec1: vector, vec2: vector) -> number,382angle: @checked (vec1: vector, vec2: vector, axis: vector?) -> number,383floor: @checked (vec: vector) -> vector,384ceil: @checked (vec: vector) -> vector,385abs: @checked (vec: vector) -> vector,386sign: @checked (vec: vector) -> vector,387clamp: @checked (vec: vector, min: vector, max: vector) -> vector,388max: @checked (vector, ...vector) -> vector,389min: @checked (vector, ...vector) -> vector,390lerp: @checked (vec1: vector, vec2: vector, t: number) -> vector,391392zero: vector,393one: vector,394}395396)BUILTIN_SRC";397398static const char* const kBuiltinDefinitionVectorSrc_DEPRECATED = R"BUILTIN_SRC(399400-- While vector would have been better represented as a built-in primitive type, type solver extern type handling covers most of the properties401declare extern type vector with402x: number403y: number404z: number405end406407declare vector: {408create: @checked (x: number, y: number, z: number?) -> vector,409magnitude: @checked (vec: vector) -> number,410normalize: @checked (vec: vector) -> vector,411cross: @checked (vec1: vector, vec2: vector) -> vector,412dot: @checked (vec1: vector, vec2: vector) -> number,413angle: @checked (vec1: vector, vec2: vector, axis: vector?) -> number,414floor: @checked (vec: vector) -> vector,415ceil: @checked (vec: vector) -> vector,416abs: @checked (vec: vector) -> vector,417sign: @checked (vec: vector) -> vector,418clamp: @checked (vec: vector, min: vector, max: vector) -> vector,419max: @checked (vector, ...vector) -> vector,420min: @checked (vector, ...vector) -> vector,421lerp: @checked (vec1: vector, vec2: vector, t: number) -> vector,422423zero: vector,424one: vector,425}426427)BUILTIN_SRC";428429static const char* const kBuiltinDefinitionIntegerSrc = R"BUILTIN_SRC(430431declare integer: {432create: @checked (x: number) -> integer,433tonumber: @checked (x: integer) -> number,434neg: @checked (value: integer) -> integer,435add: @checked (x: integer, y: integer) -> integer,436sub: @checked (x: integer, y: integer) -> integer,437mul: @checked (x: integer, y: integer) -> integer,438div: @checked (x: integer, y: integer) -> integer,439rem: @checked (x: integer, y: integer) -> integer,440idiv: @checked (x: integer, y: integer) -> integer,441mod: @checked (x: integer, y: integer) -> integer,442udiv: @checked (x: integer, y: integer) -> integer,443urem: @checked (x: integer, y: integer) -> integer,444min: @checked (integer, ...integer) -> integer,445max: @checked (integer, ...integer) -> integer,446band: @checked (...integer) -> integer,447bor: @checked (...integer) -> integer,448bnot: @checked (x: integer) -> integer,449bxor: @checked (...integer) -> integer,450lt: @checked (x: integer, y: integer) -> boolean,451le: @checked (x: integer, y: integer) -> boolean,452ult: @checked (x: integer, y: integer) -> boolean,453ule: @checked (x: integer, y: integer) -> boolean,454gt: @checked (x: integer, y: integer) -> boolean,455ge: @checked (x: integer, y: integer) -> boolean,456ugt: @checked (x: integer, y: integer) -> boolean,457uge: @checked (x: integer, y: integer) -> boolean,458lshift: @checked (x: integer, numBitPositions: integer) -> integer,459rshift: @checked (x: integer, numBitPositions: integer) -> integer,460arshift: @checked (x: integer, numBitPositions: integer) -> integer,461lrotate: @checked (x: integer, numBitPositions: integer) -> integer,462rrotate: @checked (x: integer, numBitPositions: integer) -> integer,463extract: @checked (value: integer, bitPosition: integer, numBits: integer?) -> integer,464replace: @checked (value: integer, replacement: integer, bitPosition: integer, numBits: integer?) -> integer,465clamp: @checked (value: integer, min: integer, max: integer) -> integer,466btest: @checked (...integer) -> boolean,467countrz: @checked (x: integer) -> integer,468countlz: @checked (x: integer) -> integer,469bswap: @checked (x: integer) -> integer,470fromstring: @checked (str: string, base: number?) -> integer,471minsigned: integer,472maxsigned: integer473}474475)BUILTIN_SRC";476477std::string getBuiltinDefinitionSource()478{479std::string result = kBuiltinDefinitionBaseSrc;480481result += kBuiltinDefinitionBit32Src;482if (FFlag::LuauNewMathConstantsAnalysis)483result += kBuiltinDefinitionMathSrc;484else485result += kBuiltinDefinitionMathSrc_DEPRECATED;486result += kBuiltinDefinitionOsSrc;487result += kBuiltinDefinitionCoroutineSrc;488result += kBuiltinDefinitionTableSrc;489result += kBuiltinDefinitionDebugSrc;490result += kBuiltinDefinitionUtf8Src;491if (FFlag::LuauIntegerType && FFlag::LuauIntegerLibrary)492result += kBuiltinDefinitionBufferSrc;493else494result += kBuiltinDefinitionBufferSrc_NOINTEGER;495496if (FFlag::LuauTypeCheckerVectorReadOnly)497{498result += kBuiltinDefinitionVectorSrc;499}500else501{502result += kBuiltinDefinitionVectorSrc_DEPRECATED;503}504505if (FFlag::LuauIntegerType && FFlag::LuauIntegerLibrary)506{507result += kBuiltinDefinitionIntegerSrc;508}509510return result;511}512513// TODO: split into separate tagged unions when the new solver can appropriately handle that.514static constexpr const char* kBuiltinDefinitionTypeMethodSrc = R"BUILTIN_SRC(515516export type type = {517tag: "nil" | "unknown" | "never" | "any" | "boolean" | "number" | "integer" | "string" | "buffer" | "thread" |518"singleton" | "negation" | "union" | "intersection" | "table" | "function" | "extern" | "generic",519520is: (self: type, arg: string) -> boolean,521522-- for singleton type523value: (self: type) -> (string | boolean | nil),524525-- for negation type526inner: (self: type) -> type,527528-- for union and intersection types529components: (self: type) -> {type},530531-- for table type532setproperty: (self: type, key: type, value: type?) -> (),533setreadproperty: (self: type, key: type, value: type?) -> (),534setwriteproperty: (self: type, key: type, value: type?) -> (),535readproperty: (self: type, key: type) -> type?,536writeproperty: (self: type, key: type) -> type?,537properties: (self: type) -> { [type]: { read: type?, write: type? } },538setindexer: (self: type, index: type, result: type) -> (),539setreadindexer: (self: type, index: type, result: type) -> (),540setwriteindexer: (self: type, index: type, result: type) -> (),541indexer: (self: type) -> { index: type, readresult: type, writeresult: type }?,542readindexer: (self: type) -> { index: type, result: type }?,543writeindexer: (self: type) -> { index: type, result: type }?,544setmetatable: (self: type, arg: type) -> (),545metatable: (self: type) -> type?,546547-- for function type548setparameters: (self: type, head: {type}?, tail: type?) -> (),549parameters: (self: type) -> { head: {type}?, tail: type? },550setreturns: (self: type, head: {type}?, tail: type? ) -> (),551returns: (self: type) -> { head: {type}?, tail: type? },552setgenerics: (self: type, {type}?) -> (),553generics: (self: type) -> {type},554555-- for class type556-- 'properties', 'metatable', 'indexer', 'readindexer' and 'writeindexer' are shared with table type557readparent: (self: type) -> type?,558writeparent: (self: type) -> type?,559560-- for generic type561name: (self: type) -> string?,562ispack: (self: type) -> boolean,563}564565)BUILTIN_SRC";566567static constexpr const char* kBuiltinDefinitionTypeMethodSrc_NOINTEGER = R"BUILTIN_SRC(568569export type type = {570tag: "nil" | "unknown" | "never" | "any" | "boolean" | "number" | "string" | "buffer" | "thread" |571"singleton" | "negation" | "union" | "intersection" | "table" | "function" | "extern" | "generic",572573is: (self: type, arg: string) -> boolean,574575-- for singleton type576value: (self: type) -> (string | boolean | nil),577578-- for negation type579inner: (self: type) -> type,580581-- for union and intersection types582components: (self: type) -> {type},583584-- for table type585setproperty: (self: type, key: type, value: type?) -> (),586setreadproperty: (self: type, key: type, value: type?) -> (),587setwriteproperty: (self: type, key: type, value: type?) -> (),588readproperty: (self: type, key: type) -> type?,589writeproperty: (self: type, key: type) -> type?,590properties: (self: type) -> { [type]: { read: type?, write: type? } },591setindexer: (self: type, index: type, result: type) -> (),592setreadindexer: (self: type, index: type, result: type) -> (),593setwriteindexer: (self: type, index: type, result: type) -> (),594indexer: (self: type) -> { index: type, readresult: type, writeresult: type }?,595readindexer: (self: type) -> { index: type, result: type }?,596writeindexer: (self: type) -> { index: type, result: type }?,597setmetatable: (self: type, arg: type) -> (),598metatable: (self: type) -> type?,599600-- for function type601setparameters: (self: type, head: {type}?, tail: type?) -> (),602parameters: (self: type) -> { head: {type}?, tail: type? },603setreturns: (self: type, head: {type}?, tail: type? ) -> (),604returns: (self: type) -> { head: {type}?, tail: type? },605setgenerics: (self: type, {type}?) -> (),606generics: (self: type) -> {type},607608-- for class type609-- 'properties', 'metatable', 'indexer', 'readindexer' and 'writeindexer' are shared with table type610readparent: (self: type) -> type?,611writeparent: (self: type) -> type?,612613-- for generic type614name: (self: type) -> string?,615ispack: (self: type) -> boolean,616}617618)BUILTIN_SRC";619620static constexpr const char* kBuiltinDefinitionTypeMethodSrc_DEPRECATED = R"BUILTIN_SRC(621622export type type = {623tag: "nil" | "unknown" | "never" | "any" | "boolean" | "number" | "integer" | "string" | "buffer" | "thread" |624"singleton" | "negation" | "union" | "intersection" | "table" | "function" | "class" | "generic",625626is: (self: type, arg: string) -> boolean,627628-- for singleton type629value: (self: type) -> (string | boolean | nil),630631-- for negation type632inner: (self: type) -> type,633634-- for union and intersection types635components: (self: type) -> {type},636637-- for table type638setproperty: (self: type, key: type, value: type?) -> (),639setreadproperty: (self: type, key: type, value: type?) -> (),640setwriteproperty: (self: type, key: type, value: type?) -> (),641readproperty: (self: type, key: type) -> type?,642writeproperty: (self: type, key: type) -> type?,643properties: (self: type) -> { [type]: { read: type?, write: type? } },644setindexer: (self: type, index: type, result: type) -> (),645setreadindexer: (self: type, index: type, result: type) -> (),646setwriteindexer: (self: type, index: type, result: type) -> (),647indexer: (self: type) -> { index: type, readresult: type, writeresult: type }?,648readindexer: (self: type) -> { index: type, result: type }?,649writeindexer: (self: type) -> { index: type, result: type }?,650setmetatable: (self: type, arg: type) -> (),651metatable: (self: type) -> type?,652653-- for function type654setparameters: (self: type, head: {type}?, tail: type?) -> (),655parameters: (self: type) -> { head: {type}?, tail: type? },656setreturns: (self: type, head: {type}?, tail: type? ) -> (),657returns: (self: type) -> { head: {type}?, tail: type? },658setgenerics: (self: type, {type}?) -> (),659generics: (self: type) -> {type},660661-- for class type662-- 'properties', 'metatable', 'indexer', 'readindexer' and 'writeindexer' are shared with table type663readparent: (self: type) -> type?,664writeparent: (self: type) -> type?,665666-- for generic type667name: (self: type) -> string?,668ispack: (self: type) -> boolean,669}670671)BUILTIN_SRC";672673static constexpr const char* kBuiltinDefinitionTypeMethodSrc_DEPRECATED_NOINTEGER = R"BUILTIN_SRC(674675export type type = {676tag: "nil" | "unknown" | "never" | "any" | "boolean" | "number" | "string" | "buffer" | "thread" |677"singleton" | "negation" | "union" | "intersection" | "table" | "function" | "class" | "generic",678679is: (self: type, arg: string) -> boolean,680681-- for singleton type682value: (self: type) -> (string | boolean | nil),683684-- for negation type685inner: (self: type) -> type,686687-- for union and intersection types688components: (self: type) -> {type},689690-- for table type691setproperty: (self: type, key: type, value: type?) -> (),692setreadproperty: (self: type, key: type, value: type?) -> (),693setwriteproperty: (self: type, key: type, value: type?) -> (),694readproperty: (self: type, key: type) -> type?,695writeproperty: (self: type, key: type) -> type?,696properties: (self: type) -> { [type]: { read: type?, write: type? } },697setindexer: (self: type, index: type, result: type) -> (),698setreadindexer: (self: type, index: type, result: type) -> (),699setwriteindexer: (self: type, index: type, result: type) -> (),700indexer: (self: type) -> { index: type, readresult: type, writeresult: type }?,701readindexer: (self: type) -> { index: type, result: type }?,702writeindexer: (self: type) -> { index: type, result: type }?,703setmetatable: (self: type, arg: type) -> (),704metatable: (self: type) -> type?,705706-- for function type707setparameters: (self: type, head: {type}?, tail: type?) -> (),708parameters: (self: type) -> { head: {type}?, tail: type? },709setreturns: (self: type, head: {type}?, tail: type? ) -> (),710returns: (self: type) -> { head: {type}?, tail: type? },711setgenerics: (self: type, {type}?) -> (),712generics: (self: type) -> {type},713714-- for class type715-- 'properties', 'metatable', 'indexer', 'readindexer' and 'writeindexer' are shared with table type716readparent: (self: type) -> type?,717writeparent: (self: type) -> type?,718719-- for generic type720name: (self: type) -> string?,721ispack: (self: type) -> boolean,722}723724)BUILTIN_SRC";725726static constexpr const char* kBuiltinDefinitionTypesLibSrc = R"BUILTIN_SRC(727728declare types: {729unknown: type,730never: type,731any: type,732boolean: type,733number: type,734string: type,735thread: type,736buffer: type,737integer: type,738739singleton: @checked (arg: string | boolean | nil) -> type,740optional: @checked (arg: type) -> type,741generic: @checked (name: string, ispack: boolean?) -> type,742negationof: @checked (arg: type) -> type,743unionof: @checked (...type) -> type,744intersectionof: @checked (...type) -> type,745newtable: @checked (props: {[type]: type} | {[type]: { read: type?, write: type? } }?, indexer: { index: type, readresult: type, writeresult: type }?, metatable: type?) -> type,746newfunction: @checked (parameters: { head: {type}?, tail: type? }?, returns: { head: {type}?, tail: type? }?, generics: {type}?) -> type,747copy: @checked (arg: type) -> type,748}749)BUILTIN_SRC";750751static constexpr const char* kBuiltinDefinitionTypesLibSrc_NOINTEGER = R"BUILTIN_SRC(752753declare types: {754unknown: type,755never: type,756any: type,757boolean: type,758number: type,759string: type,760thread: type,761buffer: type,762763singleton: @checked (arg: string | boolean | nil) -> type,764optional: @checked (arg: type) -> type,765generic: @checked (name: string, ispack: boolean?) -> type,766negationof: @checked (arg: type) -> type,767unionof: @checked (...type) -> type,768intersectionof: @checked (...type) -> type,769newtable: @checked (props: {[type]: type} | {[type]: { read: type?, write: type? } }?, indexer: { index: type, readresult: type, writeresult: type }?, metatable: type?) -> type,770newfunction: @checked (parameters: { head: {type}?, tail: type? }?, returns: { head: {type}?, tail: type? }?, generics: {type}?) -> type,771copy: @checked (arg: type) -> type,772}773)BUILTIN_SRC";774775std::string getTypeFunctionDefinitionSource()776{777std::string result;778779if (FFlag::LuauTypeCheckerUdtfRenameClassToExtern)780{781if (FFlag::LuauIntegerType)782result += kBuiltinDefinitionTypeMethodSrc;783else784result += kBuiltinDefinitionTypeMethodSrc_NOINTEGER;785}786else787{788if (FFlag::LuauIntegerType)789result += kBuiltinDefinitionTypeMethodSrc_DEPRECATED;790else791result += kBuiltinDefinitionTypeMethodSrc_DEPRECATED_NOINTEGER;792}793794if (FFlag::LuauIntegerType)795result += kBuiltinDefinitionTypesLibSrc;796else797result += kBuiltinDefinitionTypesLibSrc_NOINTEGER;798799return result;800}801802} // namespace Luau803804805