@tilua/parser 2.4.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -212,7 +212,7 @@ interface ExportAllStatement extends BaseNode {
212
212
  type: "ExportAllStatement";
213
213
  source: StringLiteral;
214
214
  }
215
- type Statement = VariableDeclaration | FunctionDeclaration | FunctionDeclarationStatement | ClassDeclaration | AssignmentStatement | CompoundAssignmentStatement | CallStatement | ExpressionStatement | DoStatement | WhileStatement | RepeatStatement | IfStatement | NumericForStatement | GenericForStatement | ReturnStatement | BreakStatement | ContinueStatement | TypeAliasStatement | ExportTypeAliasStatement | ImportStatement | ExportStatement | ExportDefaultStatement | ExportNamedStatement | ExportAllStatement | DeclareStatement | DeclareClassStatement | ErrorStatement;
215
+ type Statement = VariableDeclaration | FunctionDeclaration | FunctionDeclarationStatement | ClassDeclaration | AssignmentStatement | CompoundAssignmentStatement | CallStatement | ExpressionStatement | DoStatement | WhileStatement | RepeatStatement | IfStatement | NumericForStatement | GenericForStatement | ReturnStatement | BreakStatement | ContinueStatement | TypeAliasStatement | ExportTypeAliasStatement | ImportStatement | ExportStatement | ExportDefaultStatement | ExportNamedStatement | ExportAllStatement | DeclareStatement | DeclareClassStatement | DeclareMetatableStatement | ErrorStatement;
216
216
  /** `declare game: DataModel` / `declare function require(m: string): unknown`
217
217
  * — an ambient value/function declaration for a definitions file (`.d.tilua`).
218
218
  * Contributes a global type; emits no runtime code. */
@@ -236,6 +236,25 @@ interface DeclareClassStatement extends BaseNode {
236
236
  superclass?: TypeReference;
237
237
  body: TableTypeNode;
238
238
  }
239
+ /** `declare metatable string: { __index: StringLibrary }` — the metatable
240
+ * every value of `target` has, as far as types go. A method call reads
241
+ * through its `__index`: `text:upper()` is `upper` there.
242
+ *
243
+ * A library may declare one a value does not really have — Lua gives an
244
+ * array none — and ship a lowering that turns a call through it into a
245
+ * call of its own (`names:filter(f)` becomes `array.filter(names, f)`).
246
+ * The compiler asks the library that declared the metatable, and only it.
247
+ *
248
+ * `target` may use the declaration's type parameters: `<T> T[]` is every
249
+ * array, `T` its elements; `<T extends {}> T` every plain table, `T` the
250
+ * table itself. The most specific target a value matches is its metatable,
251
+ * and declaring one target again adds to it. */
252
+ interface DeclareMetatableStatement extends BaseNode {
253
+ type: "DeclareMetatableStatement";
254
+ generics: GenericTypeParameter[];
255
+ target: TypeNode;
256
+ metatable: TypeNode;
257
+ }
239
258
  /** A statement position that could not be parsed. Only produced when parsing
240
259
  * in recovery mode (`parseWithRecovery`); its span covers the skipped tokens
241
260
  * so tools can still map a cursor there. */
@@ -1045,7 +1064,7 @@ interface ScopeDiagnostic {
1045
1064
  };
1046
1065
  };
1047
1066
  message: string;
1048
- kind: "redeclare" | "const-assign" | "type-only" | "undeclared" | "use-before-define";
1067
+ kind: "redeclare" | "const-assign" | "type-only" | "undeclared" | "use-before-define" | "outside-loop";
1049
1068
  }
1050
1069
  interface ScopeAnalysis {
1051
1070
  /** Every Identifier that appears in a variable *usage* position (i.e.
@@ -1488,8 +1507,27 @@ interface TypeAnalysis {
1488
1507
  /** How each `for (const item in source)` walks its source; see
1489
1508
  * `LoopForm`. A loop missing here walks values. */
1490
1509
  readonly loops: ReadonlyMap<GenericForStatement, LoopForm>;
1510
+ /** Each `receiver:method(...)` whose method the receiver's metatable
1511
+ * gave it (`declare metatable`), and which library declared that. A call
1512
+ * missing here reached a member of the receiver's own. */
1513
+ readonly methodSources: ReadonlyMap<MethodCallExpression, MethodSource>;
1514
+ /** The members a value's metatable `__index` gives it — what an editor
1515
+ * offers after `:`. Empty for a value no metatable matches. */
1516
+ readonly metatableMembers: (type: Type) => ReadonlyMap<string, Type>;
1491
1517
  readonly diagnostics: TypeDiagnostic[];
1492
1518
  }
1519
+ /** Where a metatable reached by a method call was declared: by the language
1520
+ * itself (the prelude's metatables for strings, arrays and tables), by a
1521
+ * library (its index in `libs`), or by the program. The compiler lowers a
1522
+ * language method itself, and asks a library about its own. */
1523
+ type MethodSource = {
1524
+ readonly origin: "language";
1525
+ } | {
1526
+ readonly origin: "library";
1527
+ readonly library: number;
1528
+ } | {
1529
+ readonly origin: "program";
1530
+ };
1493
1531
  /** A type a module exports: the resolved type, plus the parameter names of a
1494
1532
  * generic alias so an importer can instantiate it (`Box<number>`). */
1495
1533
  interface ExportedType {
@@ -1551,14 +1589,19 @@ resolveModule?: (specifier: string) => ModuleExports | undefined): ModuleExports
1551
1589
  * What a runtime provides — `print`, `string`, `game` — is not here: that is a
1552
1590
  * type library's job (`@tilua-types/lua`, `@tilua-types/roblox`).
1553
1591
  *
1554
- * The methods an array and a string answer to — `names:filter(f)`,
1555
- * `text:trim()` — are a library's too. `propertyType` reads them from types
1556
- * named `ArrayMethods<T>` and `StringMethods`, whichever library declares
1557
- * those; the library also says which of them the compiler must emit code for
1558
- * (`tilua.methods` in its package.json). Nothing about `filter` is written
1559
- * into the analyzer.
1592
+ * Strings, arrays and tables are the language's own, so the metatables they
1593
+ * answer to are declared here too — `declare metatable`, in tilua, the way a
1594
+ * library declares one. A string's is Lua's (`upper`, `sub`) with tilua's
1595
+ * answers where Lua's are several values (`find` is an array); the rest —
1596
+ * `names:filter(f)`, `text:trim()`, `point:keys()` — no Lua value really
1597
+ * has, and the compiler lowers each call to a function of its own runtime.
1598
+ * A library adds to any of them by declaring the same target again.
1599
+ *
1600
+ * The analyzer supplies only what no type can compute: `ObjectKeys<T>`,
1601
+ * `ObjectValues<T>` and `ObjectEntries<T>`, an object's members as tuples in
1602
+ * the order they were written.
1560
1603
  */
1561
- declare const PRELUDE_SOURCE = "\n-- In Luau only `nil` and `false` are falsy: `0` and `\"\"` are truthy.\n-- These are what truthiness narrowing computes, made available to write down.\ntype Falsy = nil | false\ntype Truthy<T> = T - Falsy\n\n-- `-` is set difference. Over a union it drops members; over a concrete type\n-- it simplifies away; over an opaque type (`unknown`, an unresolved parameter)\n-- it is kept, so `Exclude<unknown, 1>` stays `unknown - 1`.\ntype Exclude<T, U> = T - U\ntype Extract<T, U> = T extends U ? T : never\ntype NonNullable<T> = T - nil\n\ntype ReturnType<T> = T extends (...args: unknown[]) => infer R ? R : never\ntype Parameters<T> = T extends (...args: infer P) => unknown ? P : never\n\ntype Partial<T> = { [K in keyof T]?: T[K] }\ntype Required<T> = { [K in keyof T]-?: T[K] }\ntype Readonly<T> = { readonly [K in keyof T]: T[K] }\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n\ntype Pick<T, K> = { [P in K]: T[P] }\ntype Omit<T, K> = Pick<T, Exclude<keyof T, K>>\ntype Record<K, V> = { [P in K]: V }\n";
1604
+ declare const PRELUDE_SOURCE = "\n-- In Luau only `nil` and `false` are falsy: `0` and `\"\"` are truthy.\n-- These are what truthiness narrowing computes, made available to write down.\ntype Falsy = nil | false\ntype Truthy<T> = T - Falsy\n\n-- `-` is set difference. Over a union it drops members; over a concrete type\n-- it simplifies away; over an opaque type (`unknown`, an unresolved parameter)\n-- it is kept, so `Exclude<unknown, 1>` stays `unknown - 1`.\ntype Exclude<T, U> = T - U\ntype Extract<T, U> = T extends U ? T : never\ntype NonNullable<T> = T - nil\n\ntype ReturnType<T> = T extends (...args: unknown[]) => infer R ? R : never\ntype Parameters<T> = T extends (...args: infer P) => unknown ? P : never\n\ntype Partial<T> = { [K in keyof T]?: T[K] }\ntype Required<T> = { [K in keyof T]-?: T[K] }\ntype Readonly<T> = { readonly [K in keyof T]: T[K] }\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n\ntype Pick<T, K> = { [P in K]: T[P] }\ntype Omit<T, K> = Pick<T, Exclude<keyof T, K>>\ntype Record<K, V> = { [P in K]: V }\n\n-- ============================================================\n-- The metatables of the language's own values\n-- ============================================================\n\n-- A string's methods. The first group is Lua's string library, which a\n-- string really answers to; where Lua answers several values, tilua answers\n-- one, as the global functions do (`find` is an array, `gsub` the new\n-- string). The second group is written the way JavaScript writes it.\n--\n-- Positions are Lua's: `sub` and `slice` count from 1, and `indexOf` is\n-- `nil` when the text is not there.\ndeclare metatable string: {\n __index: {\n upper: (self: string) => string,\n lower: (self: string) => string,\n len: (self: string) => number,\n sub: (self: string, i: number, j?: number) => string,\n rep: (self: string, n: number, separator?: string) => string,\n reverse: (self: string) => string,\n format: (self: string, ...args: unknown[]) => string,\n byte: ((self: string, i?: number) => number) & ((self: string, i: number, j: number) => number[]),\n find: (self: string, pattern: string, init?: number, plain?: boolean) => [number, number, ...string[]] | nil,\n match: (self: string, pattern: string, init?: number) => [...string[]] | nil,\n gmatch: (self: string, pattern: string) => () => [string, ...string[]] | nil,\n gsub: (self: string, pattern: string, replacement: unknown, n?: number) => string,\n\n trim: (self: string) => string,\n trimStart: (self: string) => string,\n trimEnd: (self: string) => string,\n startsWith: (self: string, text: string) => boolean,\n endsWith: (self: string, text: string) => boolean,\n includes: (self: string, text: string) => boolean,\n indexOf: (self: string, text: string, start?: number) => number | nil,\n slice: (self: string, start?: number, stop?: number) => string,\n replace: (self: string, text: string, replacement: string) => string,\n replaceAll: (self: string, text: string, replacement: string) => string,\n padStart: (self: string, length: number, padding?: string) => string,\n padEnd: (self: string, length: number, padding?: string) => string,\n },\n}\n\n-- An array's methods. Lua gives an array no metatable: the compiler lowers\n-- each call to a plain function, so they work on any array, one a Lua\n-- library made included.\n--\n-- Indices are Lua's: the first element is 1, and `indexOf` / `findIndex`\n-- answer `nil` rather than JavaScript's -1. `sort` takes Lua's comparator\n-- (true when `a` comes first). `push`, `pop`, `shift`, `unshift`,\n-- `sort` and `reverse` change the array; everything else returns a new one.\n-- A `filter` whose test is a guard \u2014 `v is S`, or `v => v ~= nil` \u2014\n-- answers an array of what it let through.\ndeclare metatable<T> T[]: {\n __index: {\n find: (self: T[], test: (value: T, index: number) => boolean) => T | nil,\n findIndex: (self: T[], test: (value: T, index: number) => boolean) => number | nil,\n filter: (<S extends T>(self: T[], test: (value: T, index: number) => value is S) => S[])\n & ((self: T[], test: (value: T, index: number) => boolean) => T[]),\n map: <U>(self: T[], transform: (value: T, index: number) => U) => U[],\n forEach: (self: T[], visit: (value: T, index: number) => nil) => nil,\n some: (self: T[], test: (value: T, index: number) => boolean) => boolean,\n every: (self: T[], test: (value: T, index: number) => boolean) => boolean,\n reduce: <U>(self: T[], step: (total: U, value: T, index: number) => U, initial: U) => U,\n includes: (self: T[], value: T) => boolean,\n indexOf: (self: T[], value: T, start?: number) => number | nil,\n join: (self: T[], separator?: string) => string,\n concat: (self: T[], ...others: T[][]) => T[],\n slice: (self: T[], start?: number, stop?: number) => T[],\n flat: (self: T[]) => T[],\n reverse: (self: T[]) => T[],\n sort: (self: T[], compare?: (a: T, b: T) => boolean) => T[],\n push: (self: T[], ...args: T[]) => number,\n pop: (self: T[]) => T | nil,\n shift: (self: T[]) => T | nil,\n unshift: (self: T[], ...args: T[]) => number,\n },\n}\n\n-- A table's methods. Unlike JavaScript's `Object.keys`, they answer a\n-- tuple, in the order the table's type wrote its members:\n--\n-- const point = { x: 1, y: \"up\" }\n-- point:keys() -- [\"x\", \"y\"]\n-- point:values() -- [number, string]\n-- point:entries() -- [[\"x\", number], [\"y\", string]]\n--\n-- A Lua table has no order of its own, so the compiler hands its runtime the\n-- keys as the type lists them. An optional member keeps its place, holding\n-- `nil` when it is missing; an indexer's keys follow the named ones. A\n-- member of the table's own with one of these names is what a call reaches,\n-- and a class instance, which has a metatable of its own, has none of them.\ndeclare metatable<T extends {}> T: {\n __index: {\n keys: (self: T) => ObjectKeys<T>,\n values: (self: T) => ObjectValues<T>,\n entries: (self: T) => ObjectEntries<T>,\n },\n}\n";
1562
1605
 
1563
1606
  interface ProjectHost {
1564
1607
  /** A file's text, or `undefined` when there is no such file. */
@@ -1634,9 +1677,9 @@ interface TypeLibraries {
1634
1677
  * call written against this library's types should become.
1635
1678
  *
1636
1679
  * The library declares the *types* in its definitions file; this is the other
1637
- * half. `names:filter(f)` is a call to a function only because `@tilua-types/lua`
1638
- * says so and ships the Luau behind it — the compiler knows how to ask, and
1639
- * nothing about `filter`.
1680
+ * half. `names:first()` is a call to a function only because the library that
1681
+ * put `first` in an array's metatable says so and ships the Luau behind it —
1682
+ * the compiler knows how to ask, and nothing about `first`.
1640
1683
  *
1641
1684
  * `tilua.lowering` in the package.json names the module; what it must export
1642
1685
  * is the compiler's business (see @tilua/compiler's `LoweringPlugin`). */
@@ -1645,6 +1688,10 @@ interface LoweringModule {
1645
1688
  readonly file: string;
1646
1689
  /** The package it came from, for reporting. */
1647
1690
  readonly from: string;
1691
+ /** The package's definitions file, as its index in `files` — what the
1692
+ * analyzer names when a method comes from a metatable the package
1693
+ * declared (`MethodSource`), so the compiler asks this lowering. */
1694
+ readonly library: number;
1648
1695
  }
1649
1696
  declare function resolveTypeLibraries(config: TiluaConfig, host?: ProjectHost): TypeLibraries;
1650
1697
 
@@ -1653,10 +1700,11 @@ declare function resolveTypeLibraries(config: TiluaConfig, host?: ProjectHost):
1653
1700
  *
1654
1701
  * A library's definitions file says what a value *is*; when what it gives is
1655
1702
  * not something the value already answers to, the library must also say how
1656
- * it runs. `names:filter(f)` is a call to a function because `@tilua-types/lua`
1657
- * declares the method and ships the Luau behind it — the compiler lowers the
1658
- * language (`import`, `export`, `?.`, `a ? b : c`, destructuring, spreads)
1659
- * and asks a library about everything else.
1703
+ * it runs. `names:first()` is a call to a function when a library declares
1704
+ * `first` in an array's metatable and ships the Luau behind it — the compiler
1705
+ * lowers the language (`import`, `export`, `?.`, `a ? b : c`, destructuring,
1706
+ * spreads, and the methods of the language's own metatables, such as
1707
+ * `names:filter(f)`) and asks a library about what the library declared.
1660
1708
  *
1661
1709
  * These types are declarations only: nothing here runs, and the parser never
1662
1710
  * loads a lowering module. They live here so a library can be checked against
@@ -1668,10 +1716,8 @@ declare function resolveTypeLibraries(config: TiluaConfig, host?: ProjectHost):
1668
1716
  * /** @type {import("@tilua/parser").LoweringPlugin} *\/
1669
1717
  * const plugin = {
1670
1718
  * runtime: { array: "local __NAME__ = {}\n..." },
1671
- * methodCall({ method, receiver, use }) {
1672
- * if (receiver?.kind === "array" && method === "filter") {
1673
- * return { callee: `${use("array")}.filter` }
1674
- * }
1719
+ * methodCall({ method, use }) {
1720
+ * if (method === "first") return { callee: `${use("array")}.first` }
1675
1721
  * return undefined
1676
1722
  * },
1677
1723
  * }
@@ -1696,10 +1742,12 @@ interface LoweringPlugin {
1696
1742
  * that callback's errors the same way.
1697
1743
  *
1698
1744
  * local __NAME__ = {}
1699
- * function __NAME__.filter(t, test) ... end
1745
+ * function __NAME__.first(t) return t[1] end
1700
1746
  */
1701
1747
  readonly runtime?: Readonly<Record<string, string>>;
1702
- /** What `receiver:method(...)` becomes. `undefined` leaves a plain Luau
1748
+ /** What `receiver:method(...)` becomes. Asked about a method a metatable
1749
+ * gave the receiver only when this library declared that metatable, and
1750
+ * about a method of the receiver's own always. `undefined` leaves a plain Luau
1703
1751
  * method call, which is what a value that answers to the method itself
1704
1752
  * wants — `text:upper()` reaches Lua's own. */
1705
1753
  methodCall?(call: MethodCall): MethodLowering | undefined;
@@ -1830,4 +1878,4 @@ declare const tilua: {
1830
1878
  readonly analyzeTypes: typeof analyzeTypes;
1831
1879
  };
1832
1880
 
1833
- export { type AnalyzeTypesOptions, type AnyType, type ArgumentInfo, type ArrayExpression, type ArrayPattern, type ArrayPatternElement, type ArrayType, type ArrayTypeNode, type AsConstExpression, type AssignmentStatement, type BaseNode, type BaseToken, type BinaryExpression, BinaryOperators, type Binding, type BindingId, type BindingKind, type BindingTarget, type Block, type BooleanLiteral, type BreakStatement, type BuildTarget, CONFIG_FILE_NAMES, type CallExpression, type CallLowering, type CallSite, type CallStatement, type ClassAccessibility, type ClassAccessor, type ClassConstructor, type ClassDeclaration, type ClassExpression, type ClassField, type ClassInfo, type ClassLike, type ClassMember, type ClassMethod, type CompoundAssignmentStatement, type ConditionalType, type ConditionalTypeNode, type ConfigLookup, type ConfigProblem, type ContinueStatement, type DeclareClassStatement, type DeclareStatement, type DifferenceType, type DifferenceTypeNode, type Directive, type DirectiveKind, type DirectiveOutcome, type Directives, type DoStatement, type EOFToken, type ErrorExpression, type ErrorStatement, type ExportAllStatement, type ExportDefaultStatement, type ExportNamedStatement, type ExportSpecifier, type ExportStatement, type ExportTypeAliasStatement, type ExportedType, type Expression, type ExpressionStatement, type FunctionBody, type FunctionDeclaration, type FunctionDeclarationStatement, type FunctionExpression, type FunctionName, type FunctionParam, type FunctionParameter, type FunctionSignature, type FunctionType, type FunctionTypeNode, type FunctionTypeParameter, type GenericForStatement, type GenericRefType, type GenericTypeParameter, type GlobalCall, type GlobalValue, type Identifier, type IdentifierPattern, type IdentifierToken, type IfClause, type IfElseExpression, type IfStatement, type ImportSpecifier, type ImportStatement, type IndexExpression, type IndexedAccessType, type IndexedAccessTypeNode, type InferType, type InferTypeNode, type InterpolatedStringExpression, type InterpolatedStringPart, type InterpolatedStringPart_Expression, type InterpolatedStringPart_String, type InterpolatedStringToken, type IntersectionType, type IntersectionTypeNode, type KeyofType, type KeyofTypeNode, type KeywordToken, Keywords, LANGUAGE_GLOBALS, LexError, type LiteralToken, type LiteralType, type LoweringModule, type LoweringPlugin, type MappedType, type MappedTypeNode, type MemberExpression, type MethodCall, type MethodCallExpression, type MethodLowering, type ModuleExports, type NeverType, type NilLiteral, type Node, type NumberLiteral, type NumericForStatement, type ObjectPattern, type ObjectPatternProperty, type ObjectProperty, type ObjectType, type OperatorToken, Operators, PRELUDE_SOURCE, type ParenthesizedExpression, type ParenthesizedTypeNode, ParseError, type ParserOptions, type PrimitiveName, type PrimitiveType, type Program, type ProjectHost, type PunctuatorToken, Punctuators, type RecoverResult, type RepeatStatement, type ReturnStatement, type SatisfiesExpression, type ScopeAnalysis, type ScopeDiagnostic, type SourceComment, type SourceMapNode, type SourceMapOptions, type SourceMapTypes, type SpreadElement, type Statement, type StringLiteral, type SuperExpression, type TableExpression, type TableField, type TableTypeNode, type TableTypeProperty, type TemplateLiteralType, type TemplateLiteralTypeNode, type TiluaConfig, type Token, type TokenizeOptions, type TupleType, type TupleTypeNode, type Type, type TypeAliasStatement, type TypeAnalysis, type TypeAssertionExpression, type TypeDiagnostic, type TypeLibraries, type TypeLiteralBoolean, type TypeLiteralNumber, type TypeLiteralString, type TypeNode, type TypeOrigin, type TypeParamType, type TypePredicate, type TypePredicateNode, type TypeReference, type TypedIdentifier, type TypeofTypeNode, UNUSED_EXPECT_ERROR, type UnaryExpression, UnaryOperators, type Unification, type UnionType, type UnionTypeNode, type UnknownType, type VariableDeclaration, type WhileStatement, aliasNameOf, analyzeScopes, analyzeTypes, anyType, applyDirectives, arrayOf, booleanType, bufferType, containsTypeParam, declaredUnknownType, tilua as default, difference, directivesOf, equalTypes, falsyType, findConfig, fn, formatType, getBinding, intersection, isAssignable, isClassType, isGlobal, isPossiblyFalsy, isPossiblyTruthy, isUnassignedGlobal, literal, loadConfig, matchInfer, moduleCandidates, moduleExports, narrowExclude, narrowFalsy, narrowTo, narrowTruthy, neverType, nilType, nodeHost, numberType, objectType, optional, overlaps, parse, parseExpressionFromSource, parseTokens, parseWithRecovery, primitive, readDirectives, resolveModulePath, resolveTypeLibraries, setAliasExpander, setDeferredBound, sourceMapTypes, stringType, stripJsonComments, substitute, templateMatches, threadType, tilua, tokenize, tuple, tupleMembers, typeParam, unify, union, unknownType, widen, withAliasName, withoutAliasName };
1881
+ export { type AnalyzeTypesOptions, type AnyType, type ArgumentInfo, type ArrayExpression, type ArrayPattern, type ArrayPatternElement, type ArrayType, type ArrayTypeNode, type AsConstExpression, type AssignmentStatement, type BaseNode, type BaseToken, type BinaryExpression, BinaryOperators, type Binding, type BindingId, type BindingKind, type BindingTarget, type Block, type BooleanLiteral, type BreakStatement, type BuildTarget, CONFIG_FILE_NAMES, type CallExpression, type CallLowering, type CallSite, type CallStatement, type ClassAccessibility, type ClassAccessor, type ClassConstructor, type ClassDeclaration, type ClassExpression, type ClassField, type ClassInfo, type ClassLike, type ClassMember, type ClassMethod, type CompoundAssignmentStatement, type ConditionalType, type ConditionalTypeNode, type ConfigLookup, type ConfigProblem, type ContinueStatement, type DeclareClassStatement, type DeclareMetatableStatement, type DeclareStatement, type DifferenceType, type DifferenceTypeNode, type Directive, type DirectiveKind, type DirectiveOutcome, type Directives, type DoStatement, type EOFToken, type ErrorExpression, type ErrorStatement, type ExportAllStatement, type ExportDefaultStatement, type ExportNamedStatement, type ExportSpecifier, type ExportStatement, type ExportTypeAliasStatement, type ExportedType, type Expression, type ExpressionStatement, type FunctionBody, type FunctionDeclaration, type FunctionDeclarationStatement, type FunctionExpression, type FunctionName, type FunctionParam, type FunctionParameter, type FunctionSignature, type FunctionType, type FunctionTypeNode, type FunctionTypeParameter, type GenericForStatement, type GenericRefType, type GenericTypeParameter, type GlobalCall, type GlobalValue, type Identifier, type IdentifierPattern, type IdentifierToken, type IfClause, type IfElseExpression, type IfStatement, type ImportSpecifier, type ImportStatement, type IndexExpression, type IndexedAccessType, type IndexedAccessTypeNode, type InferType, type InferTypeNode, type InterpolatedStringExpression, type InterpolatedStringPart, type InterpolatedStringPart_Expression, type InterpolatedStringPart_String, type InterpolatedStringToken, type IntersectionType, type IntersectionTypeNode, type KeyofType, type KeyofTypeNode, type KeywordToken, Keywords, LANGUAGE_GLOBALS, LexError, type LiteralToken, type LiteralType, type LoweringModule, type LoweringPlugin, type MappedType, type MappedTypeNode, type MemberExpression, type MethodCall, type MethodCallExpression, type MethodLowering, type ModuleExports, type NeverType, type NilLiteral, type Node, type NumberLiteral, type NumericForStatement, type ObjectPattern, type ObjectPatternProperty, type ObjectProperty, type ObjectType, type OperatorToken, Operators, PRELUDE_SOURCE, type ParenthesizedExpression, type ParenthesizedTypeNode, ParseError, type ParserOptions, type PrimitiveName, type PrimitiveType, type Program, type ProjectHost, type PunctuatorToken, Punctuators, type RecoverResult, type RepeatStatement, type ReturnStatement, type SatisfiesExpression, type ScopeAnalysis, type ScopeDiagnostic, type SourceComment, type SourceMapNode, type SourceMapOptions, type SourceMapTypes, type SpreadElement, type Statement, type StringLiteral, type SuperExpression, type TableExpression, type TableField, type TableTypeNode, type TableTypeProperty, type TemplateLiteralType, type TemplateLiteralTypeNode, type TiluaConfig, type Token, type TokenizeOptions, type TupleType, type TupleTypeNode, type Type, type TypeAliasStatement, type TypeAnalysis, type TypeAssertionExpression, type TypeDiagnostic, type TypeLibraries, type TypeLiteralBoolean, type TypeLiteralNumber, type TypeLiteralString, type TypeNode, type TypeOrigin, type TypeParamType, type TypePredicate, type TypePredicateNode, type TypeReference, type TypedIdentifier, type TypeofTypeNode, UNUSED_EXPECT_ERROR, type UnaryExpression, UnaryOperators, type Unification, type UnionType, type UnionTypeNode, type UnknownType, type VariableDeclaration, type WhileStatement, aliasNameOf, analyzeScopes, analyzeTypes, anyType, applyDirectives, arrayOf, booleanType, bufferType, containsTypeParam, declaredUnknownType, tilua as default, difference, directivesOf, equalTypes, falsyType, findConfig, fn, formatType, getBinding, intersection, isAssignable, isClassType, isGlobal, isPossiblyFalsy, isPossiblyTruthy, isUnassignedGlobal, literal, loadConfig, matchInfer, moduleCandidates, moduleExports, narrowExclude, narrowFalsy, narrowTo, narrowTruthy, neverType, nilType, nodeHost, numberType, objectType, optional, overlaps, parse, parseExpressionFromSource, parseTokens, parseWithRecovery, primitive, readDirectives, resolveModulePath, resolveTypeLibraries, setAliasExpander, setDeferredBound, sourceMapTypes, stringType, stripJsonComments, substitute, templateMatches, threadType, tilua, tokenize, tuple, tupleMembers, typeParam, unify, union, unknownType, widen, withAliasName, withoutAliasName };
package/dist/index.d.ts CHANGED
@@ -212,7 +212,7 @@ interface ExportAllStatement extends BaseNode {
212
212
  type: "ExportAllStatement";
213
213
  source: StringLiteral;
214
214
  }
215
- type Statement = VariableDeclaration | FunctionDeclaration | FunctionDeclarationStatement | ClassDeclaration | AssignmentStatement | CompoundAssignmentStatement | CallStatement | ExpressionStatement | DoStatement | WhileStatement | RepeatStatement | IfStatement | NumericForStatement | GenericForStatement | ReturnStatement | BreakStatement | ContinueStatement | TypeAliasStatement | ExportTypeAliasStatement | ImportStatement | ExportStatement | ExportDefaultStatement | ExportNamedStatement | ExportAllStatement | DeclareStatement | DeclareClassStatement | ErrorStatement;
215
+ type Statement = VariableDeclaration | FunctionDeclaration | FunctionDeclarationStatement | ClassDeclaration | AssignmentStatement | CompoundAssignmentStatement | CallStatement | ExpressionStatement | DoStatement | WhileStatement | RepeatStatement | IfStatement | NumericForStatement | GenericForStatement | ReturnStatement | BreakStatement | ContinueStatement | TypeAliasStatement | ExportTypeAliasStatement | ImportStatement | ExportStatement | ExportDefaultStatement | ExportNamedStatement | ExportAllStatement | DeclareStatement | DeclareClassStatement | DeclareMetatableStatement | ErrorStatement;
216
216
  /** `declare game: DataModel` / `declare function require(m: string): unknown`
217
217
  * — an ambient value/function declaration for a definitions file (`.d.tilua`).
218
218
  * Contributes a global type; emits no runtime code. */
@@ -236,6 +236,25 @@ interface DeclareClassStatement extends BaseNode {
236
236
  superclass?: TypeReference;
237
237
  body: TableTypeNode;
238
238
  }
239
+ /** `declare metatable string: { __index: StringLibrary }` — the metatable
240
+ * every value of `target` has, as far as types go. A method call reads
241
+ * through its `__index`: `text:upper()` is `upper` there.
242
+ *
243
+ * A library may declare one a value does not really have — Lua gives an
244
+ * array none — and ship a lowering that turns a call through it into a
245
+ * call of its own (`names:filter(f)` becomes `array.filter(names, f)`).
246
+ * The compiler asks the library that declared the metatable, and only it.
247
+ *
248
+ * `target` may use the declaration's type parameters: `<T> T[]` is every
249
+ * array, `T` its elements; `<T extends {}> T` every plain table, `T` the
250
+ * table itself. The most specific target a value matches is its metatable,
251
+ * and declaring one target again adds to it. */
252
+ interface DeclareMetatableStatement extends BaseNode {
253
+ type: "DeclareMetatableStatement";
254
+ generics: GenericTypeParameter[];
255
+ target: TypeNode;
256
+ metatable: TypeNode;
257
+ }
239
258
  /** A statement position that could not be parsed. Only produced when parsing
240
259
  * in recovery mode (`parseWithRecovery`); its span covers the skipped tokens
241
260
  * so tools can still map a cursor there. */
@@ -1045,7 +1064,7 @@ interface ScopeDiagnostic {
1045
1064
  };
1046
1065
  };
1047
1066
  message: string;
1048
- kind: "redeclare" | "const-assign" | "type-only" | "undeclared" | "use-before-define";
1067
+ kind: "redeclare" | "const-assign" | "type-only" | "undeclared" | "use-before-define" | "outside-loop";
1049
1068
  }
1050
1069
  interface ScopeAnalysis {
1051
1070
  /** Every Identifier that appears in a variable *usage* position (i.e.
@@ -1488,8 +1507,27 @@ interface TypeAnalysis {
1488
1507
  /** How each `for (const item in source)` walks its source; see
1489
1508
  * `LoopForm`. A loop missing here walks values. */
1490
1509
  readonly loops: ReadonlyMap<GenericForStatement, LoopForm>;
1510
+ /** Each `receiver:method(...)` whose method the receiver's metatable
1511
+ * gave it (`declare metatable`), and which library declared that. A call
1512
+ * missing here reached a member of the receiver's own. */
1513
+ readonly methodSources: ReadonlyMap<MethodCallExpression, MethodSource>;
1514
+ /** The members a value's metatable `__index` gives it — what an editor
1515
+ * offers after `:`. Empty for a value no metatable matches. */
1516
+ readonly metatableMembers: (type: Type) => ReadonlyMap<string, Type>;
1491
1517
  readonly diagnostics: TypeDiagnostic[];
1492
1518
  }
1519
+ /** Where a metatable reached by a method call was declared: by the language
1520
+ * itself (the prelude's metatables for strings, arrays and tables), by a
1521
+ * library (its index in `libs`), or by the program. The compiler lowers a
1522
+ * language method itself, and asks a library about its own. */
1523
+ type MethodSource = {
1524
+ readonly origin: "language";
1525
+ } | {
1526
+ readonly origin: "library";
1527
+ readonly library: number;
1528
+ } | {
1529
+ readonly origin: "program";
1530
+ };
1493
1531
  /** A type a module exports: the resolved type, plus the parameter names of a
1494
1532
  * generic alias so an importer can instantiate it (`Box<number>`). */
1495
1533
  interface ExportedType {
@@ -1551,14 +1589,19 @@ resolveModule?: (specifier: string) => ModuleExports | undefined): ModuleExports
1551
1589
  * What a runtime provides — `print`, `string`, `game` — is not here: that is a
1552
1590
  * type library's job (`@tilua-types/lua`, `@tilua-types/roblox`).
1553
1591
  *
1554
- * The methods an array and a string answer to — `names:filter(f)`,
1555
- * `text:trim()` — are a library's too. `propertyType` reads them from types
1556
- * named `ArrayMethods<T>` and `StringMethods`, whichever library declares
1557
- * those; the library also says which of them the compiler must emit code for
1558
- * (`tilua.methods` in its package.json). Nothing about `filter` is written
1559
- * into the analyzer.
1592
+ * Strings, arrays and tables are the language's own, so the metatables they
1593
+ * answer to are declared here too — `declare metatable`, in tilua, the way a
1594
+ * library declares one. A string's is Lua's (`upper`, `sub`) with tilua's
1595
+ * answers where Lua's are several values (`find` is an array); the rest —
1596
+ * `names:filter(f)`, `text:trim()`, `point:keys()` — no Lua value really
1597
+ * has, and the compiler lowers each call to a function of its own runtime.
1598
+ * A library adds to any of them by declaring the same target again.
1599
+ *
1600
+ * The analyzer supplies only what no type can compute: `ObjectKeys<T>`,
1601
+ * `ObjectValues<T>` and `ObjectEntries<T>`, an object's members as tuples in
1602
+ * the order they were written.
1560
1603
  */
1561
- declare const PRELUDE_SOURCE = "\n-- In Luau only `nil` and `false` are falsy: `0` and `\"\"` are truthy.\n-- These are what truthiness narrowing computes, made available to write down.\ntype Falsy = nil | false\ntype Truthy<T> = T - Falsy\n\n-- `-` is set difference. Over a union it drops members; over a concrete type\n-- it simplifies away; over an opaque type (`unknown`, an unresolved parameter)\n-- it is kept, so `Exclude<unknown, 1>` stays `unknown - 1`.\ntype Exclude<T, U> = T - U\ntype Extract<T, U> = T extends U ? T : never\ntype NonNullable<T> = T - nil\n\ntype ReturnType<T> = T extends (...args: unknown[]) => infer R ? R : never\ntype Parameters<T> = T extends (...args: infer P) => unknown ? P : never\n\ntype Partial<T> = { [K in keyof T]?: T[K] }\ntype Required<T> = { [K in keyof T]-?: T[K] }\ntype Readonly<T> = { readonly [K in keyof T]: T[K] }\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n\ntype Pick<T, K> = { [P in K]: T[P] }\ntype Omit<T, K> = Pick<T, Exclude<keyof T, K>>\ntype Record<K, V> = { [P in K]: V }\n";
1604
+ declare const PRELUDE_SOURCE = "\n-- In Luau only `nil` and `false` are falsy: `0` and `\"\"` are truthy.\n-- These are what truthiness narrowing computes, made available to write down.\ntype Falsy = nil | false\ntype Truthy<T> = T - Falsy\n\n-- `-` is set difference. Over a union it drops members; over a concrete type\n-- it simplifies away; over an opaque type (`unknown`, an unresolved parameter)\n-- it is kept, so `Exclude<unknown, 1>` stays `unknown - 1`.\ntype Exclude<T, U> = T - U\ntype Extract<T, U> = T extends U ? T : never\ntype NonNullable<T> = T - nil\n\ntype ReturnType<T> = T extends (...args: unknown[]) => infer R ? R : never\ntype Parameters<T> = T extends (...args: infer P) => unknown ? P : never\n\ntype Partial<T> = { [K in keyof T]?: T[K] }\ntype Required<T> = { [K in keyof T]-?: T[K] }\ntype Readonly<T> = { readonly [K in keyof T]: T[K] }\ntype Mutable<T> = { -readonly [K in keyof T]: T[K] }\n\ntype Pick<T, K> = { [P in K]: T[P] }\ntype Omit<T, K> = Pick<T, Exclude<keyof T, K>>\ntype Record<K, V> = { [P in K]: V }\n\n-- ============================================================\n-- The metatables of the language's own values\n-- ============================================================\n\n-- A string's methods. The first group is Lua's string library, which a\n-- string really answers to; where Lua answers several values, tilua answers\n-- one, as the global functions do (`find` is an array, `gsub` the new\n-- string). The second group is written the way JavaScript writes it.\n--\n-- Positions are Lua's: `sub` and `slice` count from 1, and `indexOf` is\n-- `nil` when the text is not there.\ndeclare metatable string: {\n __index: {\n upper: (self: string) => string,\n lower: (self: string) => string,\n len: (self: string) => number,\n sub: (self: string, i: number, j?: number) => string,\n rep: (self: string, n: number, separator?: string) => string,\n reverse: (self: string) => string,\n format: (self: string, ...args: unknown[]) => string,\n byte: ((self: string, i?: number) => number) & ((self: string, i: number, j: number) => number[]),\n find: (self: string, pattern: string, init?: number, plain?: boolean) => [number, number, ...string[]] | nil,\n match: (self: string, pattern: string, init?: number) => [...string[]] | nil,\n gmatch: (self: string, pattern: string) => () => [string, ...string[]] | nil,\n gsub: (self: string, pattern: string, replacement: unknown, n?: number) => string,\n\n trim: (self: string) => string,\n trimStart: (self: string) => string,\n trimEnd: (self: string) => string,\n startsWith: (self: string, text: string) => boolean,\n endsWith: (self: string, text: string) => boolean,\n includes: (self: string, text: string) => boolean,\n indexOf: (self: string, text: string, start?: number) => number | nil,\n slice: (self: string, start?: number, stop?: number) => string,\n replace: (self: string, text: string, replacement: string) => string,\n replaceAll: (self: string, text: string, replacement: string) => string,\n padStart: (self: string, length: number, padding?: string) => string,\n padEnd: (self: string, length: number, padding?: string) => string,\n },\n}\n\n-- An array's methods. Lua gives an array no metatable: the compiler lowers\n-- each call to a plain function, so they work on any array, one a Lua\n-- library made included.\n--\n-- Indices are Lua's: the first element is 1, and `indexOf` / `findIndex`\n-- answer `nil` rather than JavaScript's -1. `sort` takes Lua's comparator\n-- (true when `a` comes first). `push`, `pop`, `shift`, `unshift`,\n-- `sort` and `reverse` change the array; everything else returns a new one.\n-- A `filter` whose test is a guard \u2014 `v is S`, or `v => v ~= nil` \u2014\n-- answers an array of what it let through.\ndeclare metatable<T> T[]: {\n __index: {\n find: (self: T[], test: (value: T, index: number) => boolean) => T | nil,\n findIndex: (self: T[], test: (value: T, index: number) => boolean) => number | nil,\n filter: (<S extends T>(self: T[], test: (value: T, index: number) => value is S) => S[])\n & ((self: T[], test: (value: T, index: number) => boolean) => T[]),\n map: <U>(self: T[], transform: (value: T, index: number) => U) => U[],\n forEach: (self: T[], visit: (value: T, index: number) => nil) => nil,\n some: (self: T[], test: (value: T, index: number) => boolean) => boolean,\n every: (self: T[], test: (value: T, index: number) => boolean) => boolean,\n reduce: <U>(self: T[], step: (total: U, value: T, index: number) => U, initial: U) => U,\n includes: (self: T[], value: T) => boolean,\n indexOf: (self: T[], value: T, start?: number) => number | nil,\n join: (self: T[], separator?: string) => string,\n concat: (self: T[], ...others: T[][]) => T[],\n slice: (self: T[], start?: number, stop?: number) => T[],\n flat: (self: T[]) => T[],\n reverse: (self: T[]) => T[],\n sort: (self: T[], compare?: (a: T, b: T) => boolean) => T[],\n push: (self: T[], ...args: T[]) => number,\n pop: (self: T[]) => T | nil,\n shift: (self: T[]) => T | nil,\n unshift: (self: T[], ...args: T[]) => number,\n },\n}\n\n-- A table's methods. Unlike JavaScript's `Object.keys`, they answer a\n-- tuple, in the order the table's type wrote its members:\n--\n-- const point = { x: 1, y: \"up\" }\n-- point:keys() -- [\"x\", \"y\"]\n-- point:values() -- [number, string]\n-- point:entries() -- [[\"x\", number], [\"y\", string]]\n--\n-- A Lua table has no order of its own, so the compiler hands its runtime the\n-- keys as the type lists them. An optional member keeps its place, holding\n-- `nil` when it is missing; an indexer's keys follow the named ones. A\n-- member of the table's own with one of these names is what a call reaches,\n-- and a class instance, which has a metatable of its own, has none of them.\ndeclare metatable<T extends {}> T: {\n __index: {\n keys: (self: T) => ObjectKeys<T>,\n values: (self: T) => ObjectValues<T>,\n entries: (self: T) => ObjectEntries<T>,\n },\n}\n";
1562
1605
 
1563
1606
  interface ProjectHost {
1564
1607
  /** A file's text, or `undefined` when there is no such file. */
@@ -1634,9 +1677,9 @@ interface TypeLibraries {
1634
1677
  * call written against this library's types should become.
1635
1678
  *
1636
1679
  * The library declares the *types* in its definitions file; this is the other
1637
- * half. `names:filter(f)` is a call to a function only because `@tilua-types/lua`
1638
- * says so and ships the Luau behind it — the compiler knows how to ask, and
1639
- * nothing about `filter`.
1680
+ * half. `names:first()` is a call to a function only because the library that
1681
+ * put `first` in an array's metatable says so and ships the Luau behind it —
1682
+ * the compiler knows how to ask, and nothing about `first`.
1640
1683
  *
1641
1684
  * `tilua.lowering` in the package.json names the module; what it must export
1642
1685
  * is the compiler's business (see @tilua/compiler's `LoweringPlugin`). */
@@ -1645,6 +1688,10 @@ interface LoweringModule {
1645
1688
  readonly file: string;
1646
1689
  /** The package it came from, for reporting. */
1647
1690
  readonly from: string;
1691
+ /** The package's definitions file, as its index in `files` — what the
1692
+ * analyzer names when a method comes from a metatable the package
1693
+ * declared (`MethodSource`), so the compiler asks this lowering. */
1694
+ readonly library: number;
1648
1695
  }
1649
1696
  declare function resolveTypeLibraries(config: TiluaConfig, host?: ProjectHost): TypeLibraries;
1650
1697
 
@@ -1653,10 +1700,11 @@ declare function resolveTypeLibraries(config: TiluaConfig, host?: ProjectHost):
1653
1700
  *
1654
1701
  * A library's definitions file says what a value *is*; when what it gives is
1655
1702
  * not something the value already answers to, the library must also say how
1656
- * it runs. `names:filter(f)` is a call to a function because `@tilua-types/lua`
1657
- * declares the method and ships the Luau behind it — the compiler lowers the
1658
- * language (`import`, `export`, `?.`, `a ? b : c`, destructuring, spreads)
1659
- * and asks a library about everything else.
1703
+ * it runs. `names:first()` is a call to a function when a library declares
1704
+ * `first` in an array's metatable and ships the Luau behind it — the compiler
1705
+ * lowers the language (`import`, `export`, `?.`, `a ? b : c`, destructuring,
1706
+ * spreads, and the methods of the language's own metatables, such as
1707
+ * `names:filter(f)`) and asks a library about what the library declared.
1660
1708
  *
1661
1709
  * These types are declarations only: nothing here runs, and the parser never
1662
1710
  * loads a lowering module. They live here so a library can be checked against
@@ -1668,10 +1716,8 @@ declare function resolveTypeLibraries(config: TiluaConfig, host?: ProjectHost):
1668
1716
  * /** @type {import("@tilua/parser").LoweringPlugin} *\/
1669
1717
  * const plugin = {
1670
1718
  * runtime: { array: "local __NAME__ = {}\n..." },
1671
- * methodCall({ method, receiver, use }) {
1672
- * if (receiver?.kind === "array" && method === "filter") {
1673
- * return { callee: `${use("array")}.filter` }
1674
- * }
1719
+ * methodCall({ method, use }) {
1720
+ * if (method === "first") return { callee: `${use("array")}.first` }
1675
1721
  * return undefined
1676
1722
  * },
1677
1723
  * }
@@ -1696,10 +1742,12 @@ interface LoweringPlugin {
1696
1742
  * that callback's errors the same way.
1697
1743
  *
1698
1744
  * local __NAME__ = {}
1699
- * function __NAME__.filter(t, test) ... end
1745
+ * function __NAME__.first(t) return t[1] end
1700
1746
  */
1701
1747
  readonly runtime?: Readonly<Record<string, string>>;
1702
- /** What `receiver:method(...)` becomes. `undefined` leaves a plain Luau
1748
+ /** What `receiver:method(...)` becomes. Asked about a method a metatable
1749
+ * gave the receiver only when this library declared that metatable, and
1750
+ * about a method of the receiver's own always. `undefined` leaves a plain Luau
1703
1751
  * method call, which is what a value that answers to the method itself
1704
1752
  * wants — `text:upper()` reaches Lua's own. */
1705
1753
  methodCall?(call: MethodCall): MethodLowering | undefined;
@@ -1830,4 +1878,4 @@ declare const tilua: {
1830
1878
  readonly analyzeTypes: typeof analyzeTypes;
1831
1879
  };
1832
1880
 
1833
- export { type AnalyzeTypesOptions, type AnyType, type ArgumentInfo, type ArrayExpression, type ArrayPattern, type ArrayPatternElement, type ArrayType, type ArrayTypeNode, type AsConstExpression, type AssignmentStatement, type BaseNode, type BaseToken, type BinaryExpression, BinaryOperators, type Binding, type BindingId, type BindingKind, type BindingTarget, type Block, type BooleanLiteral, type BreakStatement, type BuildTarget, CONFIG_FILE_NAMES, type CallExpression, type CallLowering, type CallSite, type CallStatement, type ClassAccessibility, type ClassAccessor, type ClassConstructor, type ClassDeclaration, type ClassExpression, type ClassField, type ClassInfo, type ClassLike, type ClassMember, type ClassMethod, type CompoundAssignmentStatement, type ConditionalType, type ConditionalTypeNode, type ConfigLookup, type ConfigProblem, type ContinueStatement, type DeclareClassStatement, type DeclareStatement, type DifferenceType, type DifferenceTypeNode, type Directive, type DirectiveKind, type DirectiveOutcome, type Directives, type DoStatement, type EOFToken, type ErrorExpression, type ErrorStatement, type ExportAllStatement, type ExportDefaultStatement, type ExportNamedStatement, type ExportSpecifier, type ExportStatement, type ExportTypeAliasStatement, type ExportedType, type Expression, type ExpressionStatement, type FunctionBody, type FunctionDeclaration, type FunctionDeclarationStatement, type FunctionExpression, type FunctionName, type FunctionParam, type FunctionParameter, type FunctionSignature, type FunctionType, type FunctionTypeNode, type FunctionTypeParameter, type GenericForStatement, type GenericRefType, type GenericTypeParameter, type GlobalCall, type GlobalValue, type Identifier, type IdentifierPattern, type IdentifierToken, type IfClause, type IfElseExpression, type IfStatement, type ImportSpecifier, type ImportStatement, type IndexExpression, type IndexedAccessType, type IndexedAccessTypeNode, type InferType, type InferTypeNode, type InterpolatedStringExpression, type InterpolatedStringPart, type InterpolatedStringPart_Expression, type InterpolatedStringPart_String, type InterpolatedStringToken, type IntersectionType, type IntersectionTypeNode, type KeyofType, type KeyofTypeNode, type KeywordToken, Keywords, LANGUAGE_GLOBALS, LexError, type LiteralToken, type LiteralType, type LoweringModule, type LoweringPlugin, type MappedType, type MappedTypeNode, type MemberExpression, type MethodCall, type MethodCallExpression, type MethodLowering, type ModuleExports, type NeverType, type NilLiteral, type Node, type NumberLiteral, type NumericForStatement, type ObjectPattern, type ObjectPatternProperty, type ObjectProperty, type ObjectType, type OperatorToken, Operators, PRELUDE_SOURCE, type ParenthesizedExpression, type ParenthesizedTypeNode, ParseError, type ParserOptions, type PrimitiveName, type PrimitiveType, type Program, type ProjectHost, type PunctuatorToken, Punctuators, type RecoverResult, type RepeatStatement, type ReturnStatement, type SatisfiesExpression, type ScopeAnalysis, type ScopeDiagnostic, type SourceComment, type SourceMapNode, type SourceMapOptions, type SourceMapTypes, type SpreadElement, type Statement, type StringLiteral, type SuperExpression, type TableExpression, type TableField, type TableTypeNode, type TableTypeProperty, type TemplateLiteralType, type TemplateLiteralTypeNode, type TiluaConfig, type Token, type TokenizeOptions, type TupleType, type TupleTypeNode, type Type, type TypeAliasStatement, type TypeAnalysis, type TypeAssertionExpression, type TypeDiagnostic, type TypeLibraries, type TypeLiteralBoolean, type TypeLiteralNumber, type TypeLiteralString, type TypeNode, type TypeOrigin, type TypeParamType, type TypePredicate, type TypePredicateNode, type TypeReference, type TypedIdentifier, type TypeofTypeNode, UNUSED_EXPECT_ERROR, type UnaryExpression, UnaryOperators, type Unification, type UnionType, type UnionTypeNode, type UnknownType, type VariableDeclaration, type WhileStatement, aliasNameOf, analyzeScopes, analyzeTypes, anyType, applyDirectives, arrayOf, booleanType, bufferType, containsTypeParam, declaredUnknownType, tilua as default, difference, directivesOf, equalTypes, falsyType, findConfig, fn, formatType, getBinding, intersection, isAssignable, isClassType, isGlobal, isPossiblyFalsy, isPossiblyTruthy, isUnassignedGlobal, literal, loadConfig, matchInfer, moduleCandidates, moduleExports, narrowExclude, narrowFalsy, narrowTo, narrowTruthy, neverType, nilType, nodeHost, numberType, objectType, optional, overlaps, parse, parseExpressionFromSource, parseTokens, parseWithRecovery, primitive, readDirectives, resolveModulePath, resolveTypeLibraries, setAliasExpander, setDeferredBound, sourceMapTypes, stringType, stripJsonComments, substitute, templateMatches, threadType, tilua, tokenize, tuple, tupleMembers, typeParam, unify, union, unknownType, widen, withAliasName, withoutAliasName };
1881
+ export { type AnalyzeTypesOptions, type AnyType, type ArgumentInfo, type ArrayExpression, type ArrayPattern, type ArrayPatternElement, type ArrayType, type ArrayTypeNode, type AsConstExpression, type AssignmentStatement, type BaseNode, type BaseToken, type BinaryExpression, BinaryOperators, type Binding, type BindingId, type BindingKind, type BindingTarget, type Block, type BooleanLiteral, type BreakStatement, type BuildTarget, CONFIG_FILE_NAMES, type CallExpression, type CallLowering, type CallSite, type CallStatement, type ClassAccessibility, type ClassAccessor, type ClassConstructor, type ClassDeclaration, type ClassExpression, type ClassField, type ClassInfo, type ClassLike, type ClassMember, type ClassMethod, type CompoundAssignmentStatement, type ConditionalType, type ConditionalTypeNode, type ConfigLookup, type ConfigProblem, type ContinueStatement, type DeclareClassStatement, type DeclareMetatableStatement, type DeclareStatement, type DifferenceType, type DifferenceTypeNode, type Directive, type DirectiveKind, type DirectiveOutcome, type Directives, type DoStatement, type EOFToken, type ErrorExpression, type ErrorStatement, type ExportAllStatement, type ExportDefaultStatement, type ExportNamedStatement, type ExportSpecifier, type ExportStatement, type ExportTypeAliasStatement, type ExportedType, type Expression, type ExpressionStatement, type FunctionBody, type FunctionDeclaration, type FunctionDeclarationStatement, type FunctionExpression, type FunctionName, type FunctionParam, type FunctionParameter, type FunctionSignature, type FunctionType, type FunctionTypeNode, type FunctionTypeParameter, type GenericForStatement, type GenericRefType, type GenericTypeParameter, type GlobalCall, type GlobalValue, type Identifier, type IdentifierPattern, type IdentifierToken, type IfClause, type IfElseExpression, type IfStatement, type ImportSpecifier, type ImportStatement, type IndexExpression, type IndexedAccessType, type IndexedAccessTypeNode, type InferType, type InferTypeNode, type InterpolatedStringExpression, type InterpolatedStringPart, type InterpolatedStringPart_Expression, type InterpolatedStringPart_String, type InterpolatedStringToken, type IntersectionType, type IntersectionTypeNode, type KeyofType, type KeyofTypeNode, type KeywordToken, Keywords, LANGUAGE_GLOBALS, LexError, type LiteralToken, type LiteralType, type LoweringModule, type LoweringPlugin, type MappedType, type MappedTypeNode, type MemberExpression, type MethodCall, type MethodCallExpression, type MethodLowering, type ModuleExports, type NeverType, type NilLiteral, type Node, type NumberLiteral, type NumericForStatement, type ObjectPattern, type ObjectPatternProperty, type ObjectProperty, type ObjectType, type OperatorToken, Operators, PRELUDE_SOURCE, type ParenthesizedExpression, type ParenthesizedTypeNode, ParseError, type ParserOptions, type PrimitiveName, type PrimitiveType, type Program, type ProjectHost, type PunctuatorToken, Punctuators, type RecoverResult, type RepeatStatement, type ReturnStatement, type SatisfiesExpression, type ScopeAnalysis, type ScopeDiagnostic, type SourceComment, type SourceMapNode, type SourceMapOptions, type SourceMapTypes, type SpreadElement, type Statement, type StringLiteral, type SuperExpression, type TableExpression, type TableField, type TableTypeNode, type TableTypeProperty, type TemplateLiteralType, type TemplateLiteralTypeNode, type TiluaConfig, type Token, type TokenizeOptions, type TupleType, type TupleTypeNode, type Type, type TypeAliasStatement, type TypeAnalysis, type TypeAssertionExpression, type TypeDiagnostic, type TypeLibraries, type TypeLiteralBoolean, type TypeLiteralNumber, type TypeLiteralString, type TypeNode, type TypeOrigin, type TypeParamType, type TypePredicate, type TypePredicateNode, type TypeReference, type TypedIdentifier, type TypeofTypeNode, UNUSED_EXPECT_ERROR, type UnaryExpression, UnaryOperators, type Unification, type UnionType, type UnionTypeNode, type UnknownType, type VariableDeclaration, type WhileStatement, aliasNameOf, analyzeScopes, analyzeTypes, anyType, applyDirectives, arrayOf, booleanType, bufferType, containsTypeParam, declaredUnknownType, tilua as default, difference, directivesOf, equalTypes, falsyType, findConfig, fn, formatType, getBinding, intersection, isAssignable, isClassType, isGlobal, isPossiblyFalsy, isPossiblyTruthy, isUnassignedGlobal, literal, loadConfig, matchInfer, moduleCandidates, moduleExports, narrowExclude, narrowFalsy, narrowTo, narrowTruthy, neverType, nilType, nodeHost, numberType, objectType, optional, overlaps, parse, parseExpressionFromSource, parseTokens, parseWithRecovery, primitive, readDirectives, resolveModulePath, resolveTypeLibraries, setAliasExpander, setDeferredBound, sourceMapTypes, stringType, stripJsonComments, substitute, templateMatches, threadType, tilua, tokenize, tuple, tupleMembers, typeParam, unify, union, unknownType, widen, withAliasName, withoutAliasName };