bonsai-js 1.1.0 → 1.2.0
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/CHANGELOG.md +9 -0
- package/README.md +4 -4
- package/dist/builtins/index.d.mts +91 -0
- package/dist/builtins/index.mjs +93 -0
- package/dist/builtins/index.mjs.map +1 -0
- package/dist/check/checker.mjs +20 -4
- package/dist/check/checker.mjs.map +1 -1
- package/dist/environment.d.mts +13 -0
- package/dist/environment.mjs +14 -7
- package/dist/environment.mjs.map +1 -1
- package/dist/functions/builtins.mjs +550 -473
- package/dist/functions/builtins.mjs.map +1 -1
- package/dist/functions/define.mjs +41 -6
- package/dist/functions/define.mjs.map +1 -1
- package/dist/functions/descriptions.mjs +110 -0
- package/dist/functions/descriptions.mjs.map +1 -0
- package/dist/index.d.mts +2 -2
- package/dist/lite/index.d.mts +2 -2
- package/dist/lite/index.mjs.map +1 -1
- package/dist/load.mjs +1 -2
- package/dist/load.mjs.map +1 -1
- package/dist/program.mjs +6 -8
- package/dist/program.mjs.map +1 -1
- package/dist/runtime/core.d.mts +18 -0
- package/dist/runtime/core.mjs +31 -0
- package/dist/runtime/core.mjs.map +1 -0
- package/dist/runtime/create.d.mts +61 -0
- package/dist/runtime/create.mjs +76 -0
- package/dist/runtime/create.mjs.map +1 -0
- package/dist/runtime/index.d.mts +4 -41
- package/dist/runtime/index.mjs +7 -68
- package/dist/runtime/index.mjs.map +1 -1
- package/dist/service/index.mjs +4 -3
- package/dist/service/index.mjs.map +1 -1
- package/dist/version.mjs +1 -1
- package/dist/version.mjs.map +1 -1
- package/package.json +17 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.mjs","names":[],"sources":["../../src/check/checker.ts"],"sourcesContent":["import { bindImplicit } from './bind.js'\nimport { BonsaiLimitError, type DiagnosticCode, type Finding } from '../errors.js'\nimport { RESULT_REFINERS } from '../functions/builtins.js'\nimport { isStackOverflow, tooDeep } from '../runtime/overflow.js'\nimport { closest, didYouMean } from '../suggest.js'\nimport { BLOCKED_NAMES } from '../syntax/lexer.js'\nimport { writtenWithExponent } from '../syntax/parser.js'\nimport { signatureText, type FunctionDef, type Overload } from '../functions/define.js'\nimport {\n forEachChild,\n type CallNode,\n type LambdaNode,\n type MemberNode,\n type Node,\n} from '../syntax/ast.js'\nimport {\n chargeTypeWork,\n exactObject,\n freshLiteral,\n fieldOf,\n isAssignable,\n isExact,\n isProvenAssignable,\n isNullable,\n nonNull,\n overlaps,\n sameType,\n t,\n TypeBudgetExceeded,\n unionMembers,\n unionOf,\n widen,\n widenFresh,\n withFields,\n withTypeBudget,\n typeText,\n type MapType,\n type Type,\n} from '../types.js'\n\n/** What the checker needs to know about an environment. */\nexport interface CheckEnv {\n /** Declared context variables; undefined when none are declared. */\n readonly variables: Readonly<Record<string, Type>> | undefined\n /** Unknown variables are errors (otherwise they have type `any`). */\n readonly strict: boolean\n lookup: (name: string) => FunctionDef | undefined\n functionNames: () => Iterable<string>\n}\n\n/** How the compiler should invoke a call. */\nexport interface CallPlan {\n readonly def: FunctionDef\n /** Candidate overload indices, in declaration order. */\n readonly candidates: readonly number[]\n /**\n * An argument was accepted gradually: an open object that may hold an\n * optional key of the parameter with another type. Checked at run time.\n */\n readonly gradual?: boolean\n}\n\nexport interface Analysis {\n /** The tree with implicit lambdas made explicit. */\n readonly root: Node\n readonly type: Type\n readonly diagnostics: readonly Finding[]\n readonly calls: ReadonlyMap<CallNode, CallPlan>\n readonly types: ReadonlyMap<Node, Type>\n /** Whether evaluation may call an async host function. */\n readonly async: boolean\n /**\n * The checker could not prove the result matches the expected type (part of\n * it is `any`, or an open object may hold an unlisted key): check the result\n * at run time.\n */\n readonly checkResult: boolean\n readonly references: {\n readonly variables: readonly string[]\n readonly functions: readonly string[]\n }\n /** The scope at the probe variable, when one was requested and reached. */\n readonly probeScope?: ProbeScope | undefined\n /** For `object.probe`: what reading each field the object lists gives there. */\n readonly probeMembers?: ReadonlyMap<string, Type> | undefined\n}\n\nexport interface CheckOptions {\n readonly expected?: Type | undefined\n /** Tooling: a variable name whose lexical scope should be recorded. */\n readonly probe?: string | undefined\n}\n\n/** The lexical scope at a probed position (for completions). */\nexport interface ProbeScope {\n readonly locals: ReadonlyMap<string, Type>\n readonly it: Type | undefined\n}\n\n/**\n * Paths (see pathKey) known to be non-null, as a chain of frames so entering a\n * condition adds only its own facts (a long `&&` chain stays linear).\n */\ninterface Facts {\n readonly keys: ReadonlySet<string>\n readonly parent: Facts | undefined\n /** Facts about `.` from enclosing frames do not reach a new implicit lambda. */\n readonly hidesIt: boolean\n}\n\nfunction hasFact(facts: Facts | undefined, key: string): boolean {\n const aboutIt = key === 'it' || key.startsWith('it.') || key.startsWith('it[')\n for (let frame = facts; frame !== undefined; frame = frame.parent) {\n if (frame.keys.has(key)) return true\n if (frame.hidesIt && aboutIt) return false\n }\n return false\n}\n\ninterface Scope {\n readonly locals: ReadonlyMap<string, Type>\n /** Type of the implicit parameter `.` in the innermost implicit lambda. */\n readonly it: Type | undefined\n /** Paths known to be non-null here, from enclosing conditions. */\n readonly nonNull?: Facts | undefined\n}\n\n/**\n * Type work allowed per analysis: generous for the largest sources the parse\n * limits admit, small enough that a pathological one fails fast.\n */\nconst CHECK_BUDGET = 500_000\n\n/** Whether a type explicitly admits null (unlike `any`, which admits everything). */\nfunction mayBeNull(type: Type): boolean {\n return type.kind === 'null' || (type.kind === 'union' && type.types.some(mayBeNull))\n}\n\n/** The node whose value is the result (the body of lets, the last expression). */\nfunction resultSpan(node: Node): Node {\n return node.type === 'Let' ? resultSpan(node.body) : node\n}\n\n/** Why `actual` does not satisfy `expected`, naming missing and unexpected fields. */\nfunction expectationProblem(actual: Type, expected: Type): string | undefined {\n if (expected.kind === 'map' && actual.kind === 'map') {\n const missing = Object.keys(expected.fields).filter(\n (key) =>\n !Object.hasOwn(actual.fields, key) &&\n actual.rest === undefined &&\n !isNullable(expected.fields[key]),\n )\n const wrong = Object.keys(expected.fields).filter((key) => {\n const field = fieldOf(actual, key)\n return field !== undefined && !isAssignable(field, expected.fields[key])\n })\n const rest = expected.rest\n const wrongRest =\n rest === undefined\n ? []\n : Object.keys(actual.fields).filter(\n (key) =>\n !Object.hasOwn(expected.fields, key) && !isAssignable(actual.fields[key], rest),\n )\n const parts: string[] = []\n if (missing.length > 0) parts.push(`missing ${missing.map((k) => `\"${k}\"`).join(', ')}`)\n for (const key of wrong) {\n parts.push(\n `\"${key}\" should be ${typeText(expected.fields[key])} but is ${typeText(fieldOf(actual, key) as Type)}`,\n )\n }\n for (const key of wrongRest) {\n parts.push(\n `\"${key}\" should be ${typeText(rest as Type)} but is ${typeText(actual.fields[key])}`,\n )\n }\n if (parts.length > 0)\n return `The result does not match ${typeText(expected)}: ${parts.join('; ')}`\n if (isAssignable(actual, expected)) return undefined\n }\n if (isAssignable(actual, expected)) return undefined\n return `Expected the expression to produce ${typeText(expected)} but it produces ${typeText(actual)}`\n}\n\n/**\n * Fields a map literal adds beyond an expected object type. An expected type\n * means \"has at least these fields\", so they are allowed (and kept in the\n * result), but often a misspelling: a warning, not an error.\n */\nfunction unexpectedFields(actual: Type, expected: Type): string | undefined {\n if (expected.kind !== 'map' || actual.kind !== 'map') return undefined\n if (expected.rest !== undefined || !isExact(actual)) return undefined\n const extra = Object.keys(actual.fields).filter((key) => !Object.hasOwn(expected.fields, key))\n if (extra.length === 0) return undefined\n const names = extra.map((k) => `\"${k}\"`).join(', ')\n const them = extra.length === 1 ? 'it' : 'them'\n return `unexpected ${names} for ${typeText(expected)}; the result keeps ${them}${suggestAll(extra, Object.keys(expected.fields))}`\n}\n\n/**\n * Where `name` is written in a member read: the name after `.`, or the text\n * inside the quotes of `x[\"name\"]`. Undefined when the source does not spell\n * it out (an escaped key, a computed one), so no quick-fix is offered.\n */\nfunction nameSpan(at: Node, name: string): { start: number; end: number } | undefined {\n if (at.type === 'Member') {\n if (at.nameStart === undefined || at.nameEnd === undefined) return undefined\n return at.nameEnd - at.nameStart === name.length\n ? { start: at.nameStart, end: at.nameEnd }\n : undefined\n }\n if (at.type === 'Index' && at.index.type === 'Literal' && typeof at.index.value === 'string') {\n // The literal's source is the name between two quotes only when nothing is escaped.\n const { start, end } = at.index\n return end - start - 2 === name.length ? { start: start + 1, end: end - 1 } : undefined\n }\n return undefined\n}\n\nfunction suggestAll(names: readonly string[], candidates: readonly string[]): string {\n return names.map((name) => didYouMean(suggest(name, () => candidates))).join('')\n}\n\nconst pathKeys = new WeakMap<Node, string | null>()\n\n/**\n * A stable key for a readable path, or undefined. `m.a` and `m[\"a\"]` share a\n * key: segments are `.\"name\"` (JSON-quoted, so no two paths collide) or `[n]`.\n */\nfunction pathKey(node: Node): string | undefined {\n const cached = pathKeys.get(node)\n if (cached !== undefined) return cached ?? undefined\n const key = computePathKey(node)\n pathKeys.set(node, key ?? null)\n return key\n}\n\nfunction computePathKey(node: Node): string | undefined {\n switch (node.type) {\n case 'Variable':\n return `v:${node.name}`\n case 'Local':\n return `l:${node.name}`\n case 'It':\n return 'it'\n case 'Member': {\n const base = pathKey(node.object)\n return base === undefined ? undefined : `${base}.${JSON.stringify(node.name)}`\n }\n case 'Index': {\n const base = pathKey(node.object)\n if (base === undefined || node.index.type !== 'Literal') return undefined\n const { value } = node.index\n if (typeof value === 'string') return `${base}.${JSON.stringify(value)}`\n return typeof value === 'number' ? `${base}[${value}]` : undefined\n }\n case 'Binary':\n case 'Call':\n case 'Conditional':\n case 'Has':\n case 'Lambda':\n case 'Let':\n case 'List':\n case 'Literal':\n case 'Map':\n case 'Template':\n case 'Try':\n case 'Unary':\n default:\n return undefined\n }\n}\n\nconst factMemo = [\n new WeakMap<Node, ReadonlySet<string>>(),\n new WeakMap<Node, ReadonlySet<string>>(),\n]\n\n/** Paths that are non-null whenever `condition` evaluates to `positive`. */\nfunction nonNullFacts(condition: Node, positive: boolean): ReadonlySet<string> {\n const memo = factMemo[positive ? 1 : 0]\n let facts = memo.get(condition)\n if (facts === undefined) {\n facts = computeFacts(condition, positive)\n memo.set(condition, facts)\n }\n return facts\n}\n\nfunction computeFacts(condition: Node, positive: boolean): ReadonlySet<string> {\n const out = new Set<string>()\n switch (condition.type) {\n case 'Unary':\n return condition.operator === '!' ? nonNullFacts(condition.operand, !positive) : out\n case 'Binary': {\n const { operator, left, right } = condition\n if (operator === '&&' || operator === '||') {\n const a = nonNullFacts(left, positive)\n const b = nonNullFacts(right, positive)\n // a && b true (or a || b false): both hold. Otherwise only common facts.\n if ((operator === '&&') === positive) {\n if (a.size === 0) return b\n if (b.size === 0) return a\n return new Set([...a, ...b])\n }\n return new Set([...a].filter((key) => b.has(key)))\n }\n if (operator === '!=' || operator === '==') {\n const holds = (operator === '!=') === positive\n if (!holds) return out\n let subject: Node | undefined\n if (right.type === 'Literal' && right.value === null) subject = left\n else if (left.type === 'Literal' && left.value === null) subject = right\n const key = subject === undefined ? undefined : pathKey(subject)\n if (key !== undefined) out.add(key)\n return out\n }\n if (positive && ['<', '<=', '>', '>='].includes(operator)) {\n // An ordering comparison is only true when both sides are non-null.\n for (const side of [left, right]) {\n const key = pathKey(side)\n if (key !== undefined) out.add(key)\n }\n }\n return out\n }\n case 'Has': {\n // has(a.b.c) is true only when a.b is a map (so a and a.b are not null);\n // the value at a.b.c itself may be null.\n if (!positive) return out\n for (let node: Node = condition.target.object; ;) {\n const key = pathKey(node)\n if (key !== undefined) out.add(key)\n if (node.type !== 'Member' && node.type !== 'Index') break\n node = node.object\n }\n return out\n }\n case 'Call':\n case 'Conditional':\n case 'Index':\n case 'It':\n case 'Lambda':\n case 'Let':\n case 'List':\n case 'Literal':\n case 'Local':\n case 'Map':\n case 'Member':\n case 'Template':\n case 'Try':\n case 'Variable':\n default: {\n // A path used as a condition is non-null when it is true.\n const key = positive ? pathKey(condition) : undefined\n if (key !== undefined) out.add(key)\n return out\n }\n }\n}\n\nfunction withFacts(scope: Scope, facts: ReadonlySet<string>): Scope {\n if (facts.size === 0) return scope\n return { ...scope, nonNull: { keys: facts, parent: scope.nonNull, hidesIt: false } }\n}\n\n/** The field names of a path key suffix (`.\"a\".\"b\"`), or undefined at an index. */\nfunction pathSegments(suffix: string): string[] | undefined {\n const out: string[] = []\n const segment = /^\\.(?<name>\"(?:[^\"\\\\]|\\\\.)*\")/u\n let rest = suffix\n while (rest !== '') {\n const match = segment.exec(rest)\n if (match === null) return undefined\n out.push(JSON.parse(match.groups?.name ?? '\"\"') as string)\n rest = rest.slice(match[0].length)\n }\n return out\n}\n\n/** Marks the value at `path` (segments after the root) as non-null inside `type`. */\nfunction refinePath(type: Type, path: readonly string[]): Type {\n if (path.length === 0) return nonNull(type)\n if (type.kind === 'union') return unionOf(type.types.map((member) => refinePath(member, path)))\n if (type.kind !== 'map') return type\n const [head, ...rest] = path as [string, ...string[]]\n const field = fieldOf(type, head) ?? type.rest\n if (field === undefined) return type\n return withFields(type, { ...type.fields, [head]: refinePath(field, rest) })\n}\n\nconst ANY = t.any()\nconst NUMBER = t.number()\nconst STRING = t.string()\nconst BOOLEAN = t.boolean()\nconst NULL = t.null()\nconst OPTIONAL_BOOLEAN = t.optional(BOOLEAN)\nconst NUMBER_OR_DURATION = t.union(NUMBER, t.duration())\n/** Re-checks of a lambda whose parameter types depend on its own result. */\nconst MAX_LAMBDA_ROUNDS = 4\n\n/** The element type of a list, or of a union of lists; undefined for anything else. */\nfunction elementOf(type: Type | undefined): Type | undefined {\n if (type === undefined) return undefined\n if (type.kind === 'any' || type.kind === 'var') return ANY\n if (type.kind === 'list') return type.element\n if (type.kind !== 'union') return undefined\n const elements: Type[] = []\n for (const member of type.types) {\n const element = elementOf(member)\n if (element === undefined) return undefined\n elements.push(element)\n }\n return unionOf(elements)\n}\n\n/**\n * A map type, or a union of map types merged into one: keys every member has\n * keep their (joined) types, keys only some members have move to `rest`.\n */\nconst mapOfMemo = new WeakMap<Type, MapType | null>()\n\nfunction mapOf(type: Type): MapType | undefined {\n if (type.kind === 'map') return type\n if (type.kind !== 'union') return undefined\n const memo = mapOfMemo.get(type)\n if (memo !== undefined) return memo ?? undefined\n const merged = mergeMaps(type)\n mapOfMemo.set(type, merged ?? null)\n return merged\n}\n\nconst ORDERING: ReadonlySet<string> = new Set(['<', '<=', '>', '>='])\n\n/** The text of a constant key: \"a\" or `a` (a template without substitutions). */\nfunction constantText(node: Node): string | undefined {\n if (node.type === 'Literal') return typeof node.value === 'string' ? node.value : undefined\n if (node.type !== 'Template') return undefined\n let text = ''\n for (const part of node.parts) {\n if (typeof part !== 'string') return undefined\n text += part\n }\n return text\n}\n\n/** The map a union of maps reads as: fields every member has, the rest optional. */\nfunction mergeMaps(type: Type & { kind: 'union' }): MapType | undefined {\n const members = unionMembers(type)\n chargeTypeWork(members.length)\n if (!members.every((m): m is MapType => m.kind === 'map')) return undefined\n const fields: Record<string, Type> = {}\n const partial: Type[] = []\n const keys = new Set(members.flatMap((m) => Object.keys(m.fields)))\n // Every key is looked up in every member.\n chargeTypeWork(keys.size * members.length)\n for (const key of keys) {\n const found = members.map((m) => fieldOf(m, key) ?? m.rest)\n const present = found.filter((f): f is Type => f !== undefined)\n if (present.length < members.length) partial.push(...present)\n // A member that has the key only through `rest` may not hold it at all.\n else if (members.some((m) => fieldOf(m, key) === undefined))\n fields[key] = t.optional(unionOf(present))\n else fields[key] = unionOf(present)\n }\n for (const m of members) if (m.rest !== undefined) partial.push(m.rest)\n if (partial.length > 0) {\n // A declared object may hold any other key, with any value.\n if (members.some((m) => m.rest === undefined && !isExact(m))) partial.push(ANY)\n return { kind: 'map', fields, rest: unionOf(partial) }\n }\n return members.every(isExact) ? exactObject(fields) : t.object(fields)\n}\n\n/**\n * Checks a parsed expression. Checking time is bounded: a source that would\n * need too much type work fails with a TOO_COMPLEX limit error.\n */\nexport function analyze(root: Node, env: CheckEnv, options: CheckOptions = {}): Analysis {\n const outerSuggestions = suggestionsLeft\n suggestionsLeft = MAX_SUGGESTIONS\n try {\n return withTypeBudget(CHECK_BUDGET, () => analyzeWithin(root, env, options))\n } catch (error) {\n if (isStackOverflow(error)) throw tooDeep(undefined, error)\n if (!(error instanceof TypeBudgetExceeded)) throw error\n throw new BonsaiLimitError('TOO_COMPLEX', 'Expression is too complex to check', {\n span: { start: root.start, end: root.end },\n })\n } finally {\n suggestionsLeft = outerSuggestions\n }\n}\n\nfunction analyzeWithin(root: Node, env: CheckEnv, options: CheckOptions): Analysis {\n const diagnostics: Finding[] = []\n const calls = new Map<CallNode, CallPlan>()\n const types = new Map<Node, Type>()\n const asyncNodes = new Set<Node>()\n // Ordering comparisons whose false (from a null side) becomes a verdict, not a skip.\n const verdicts = new WeakSet<Node>()\n // The verdict passes through the parts whose value becomes the outer value.\n const nullFalseMatters = (node: Node): void => {\n if (node.type === 'Conditional') {\n nullFalseMatters(node.then)\n nullFalseMatters(node.otherwise)\n } else if (node.type === 'Let') nullFalseMatters(node.body)\n else if (node.type === 'Try') {\n nullFalseMatters(node.body)\n nullFalseMatters(node.fallback)\n }\n if (node.type !== 'Binary') return\n if (node.operator === '&&' || node.operator === '||') {\n nullFalseMatters(node.left)\n nullFalseMatters(node.right)\n } else if (ORDERING.has(node.operator)) verdicts.add(node)\n else if (node.operator === '==' || node.operator === '!=') {\n // x == true and x != false keep x's own value.\n const keeps = (n: Node): boolean =>\n n.type === 'Literal' && n.value === (node.operator === '==')\n if (keeps(node.right)) nullFalseMatters(node.left)\n else if (keeps(node.left)) nullFalseMatters(node.right)\n }\n }\n const variables = new Set<string>()\n const functions = new Set<string>()\n let probeScope: ProbeScope | undefined\n let probeMembers: ReadonlyMap<string, Type> | undefined\n\n const reported = new Set<string>()\n const report = (\n code: DiagnosticCode,\n message: string,\n at: { start: number; end: number },\n severity: 'error' | 'warning' = 'error',\n suggestion?: string,\n ): void => {\n const key = `${at.start}:${at.end}:${code}:${message}`\n if (reported.has(key)) return\n reported.add(key)\n diagnostics.push(\n suggestion === undefined\n ? { code, message, severity, start: at.start, end: at.end }\n : { code, message, severity, start: at.start, end: at.end, suggestion },\n )\n }\n /** Drops diagnostics after `mark` (a re-check or a speculative check). */\n const truncate = (mark: number): void => {\n for (let i = mark; i < diagnostics.length; i++) {\n const d = diagnostics[i]\n reported.delete(`${d.start}:${d.end}:${d.code}:${d.message}`)\n }\n diagnostics.length = mark\n }\n\n /**\n * The last result of each call that takes a lambda, by the types of the\n * outer locals it reads. Re-checking an outer lambda (reduce's accumulator)\n * then reuses inner calls that do not depend on what changed, instead of\n * redoing their own re-checks (which would multiply with nesting depth).\n * One entry per node keeps `types` and `calls` consistent: only computing\n * this node writes the entries for its subtree.\n */\n const callMemo = new WeakMap<\n CallNode,\n {\n expected: Type | undefined\n inputs: readonly Type[]\n type: Type\n diagnostics: readonly Finding[]\n }\n >()\n\n // === pass 1: bind the implicit parameter ===\n\n const binding = bindImplicit(root, (name) => env.lookup(name))\n for (const problem of binding.problems) report('INVALID_LAMBDA', problem.message, problem.at)\n const boundRoot = binding.root\n\n // === pass 2: types ===\n\n const rootScope: Scope = { locals: new Map(), it: undefined }\n const raw = check(boundRoot, rootScope, options.expected)\n // The expectation sees literal types (a plan enum accepts \"pro\"); the result shows base kinds.\n let checkResult = false\n if (options.expected !== undefined) {\n const problem = expectationProblem(raw, options.expected)\n if (problem !== undefined) report('EXPECTED_TYPE', problem, resultSpan(boundRoot))\n const extra = unexpectedFields(raw, options.expected)\n if (extra !== undefined) report('EXPECTED_TYPE', extra, resultSpan(boundRoot), 'warning')\n checkResult = containsAny(raw) || !isProvenAssignable(raw, options.expected)\n }\n const type = widen(raw)\n\n /**\n * The type of `node`. `expected` is the type the context wants, so a literal\n * that fits it (`\"pro\"` for a plan enum) keeps its literal type in lists and maps.\n */\n function check(node: Node, scope: Scope, expected?: Type): Type {\n chargeTypeWork(1)\n let result = checkNode(node, scope, expected)\n if (scope.nonNull !== undefined) {\n const key = pathKey(node)\n if (key !== undefined && hasFact(scope.nonNull, key)) result = nonNull(result)\n }\n types.set(node, result)\n return result\n }\n\n /**\n * What `object.name` reads as here, for each field the object's maps list:\n * the type check() would give that read, narrowing included (for completions).\n */\n function readsOf(probe: MemberNode, objectType: Type, scope: Scope): Map<string, Type> {\n const names = new Set<string>()\n for (const member of unionMembers(nonNull(objectType))) {\n if (member.kind === 'map') for (const name of Object.keys(member.fields)) names.add(name)\n }\n chargeTypeWork(names.size)\n const reads = new Map<string, Type>()\n const mark = diagnostics.length\n for (const name of names) {\n const read: MemberNode = { ...probe, name }\n let readType = memberType(objectType, name, read)\n const key = scope.nonNull === undefined ? undefined : pathKey(read)\n if (key !== undefined && hasFact(scope.nonNull, key)) readType = nonNull(readType)\n reads.set(name, readType)\n }\n // Reading a candidate is not a finding about the source.\n truncate(mark)\n return reads\n }\n\n function markAsync(node: Node, child: Node): void {\n if (asyncNodes.has(child)) asyncNodes.add(node)\n }\n\n /** The literal type when it satisfies the expected type, otherwise its base kind. */\n function fit(actual: Type, expected: Type | undefined): Type {\n return expected !== undefined &&\n expected.kind !== 'any' &&\n expected.kind !== 'var' &&\n isAssignable(actual, expected)\n ? actual\n : widenFresh(actual)\n }\n\n function checkNode(node: Node, scope: Scope, expected: Type | undefined): Type {\n switch (node.type) {\n case 'Literal':\n if (\n typeof node.value === 'number' &&\n Number.isInteger(node.value) &&\n Math.abs(node.value) > Number.MAX_SAFE_INTEGER &&\n !writtenWithExponent(node)\n ) {\n report(\n 'UNSAFE_INTEGER',\n 'This number is past 2^53, where neighbouring integers are not all distinct (9007199254740993 reads as ...992)',\n node,\n 'warning',\n )\n }\n return node.value === null ? NULL : freshLiteral(node.value)\n case 'Template':\n for (const part of node.parts) {\n if (typeof part === 'string') continue\n const partType = check(part, scope)\n markAsync(node, part)\n if (\n !isAssignable(\n partType,\n t.union(STRING, NUMBER, BOOLEAN, NULL, t.timestamp(), t.duration()),\n )\n ) {\n report('TYPE_ERROR', `Cannot render ${typeText(partType)} in a template`, part)\n }\n }\n // `a` with nothing substituted is the constant \"a\".\n const text = constantText(node)\n return text === undefined ? STRING : freshLiteral(text)\n case 'Variable': {\n if (node.name === options.probe) {\n probeScope = { locals: scope.locals, it: scope.it }\n return ANY\n }\n variables.add(node.name)\n const declared =\n env.variables !== undefined && Object.hasOwn(env.variables, node.name)\n ? env.variables[node.name]\n : undefined\n if (declared !== undefined) return declared\n if (env.strict) {\n const suggestion = suggest(node.name, () => Object.keys(env.variables ?? {}))\n report(\n 'UNKNOWN_VARIABLE',\n `Unknown variable \"${node.name}\"${didYouMean(suggestion)}`,\n node,\n 'error',\n suggestion,\n )\n } else if (env.variables !== undefined) {\n // Undeclared names read the context, but one edit from a declared\n // name is most likely a typo of it.\n const suggestion = suggest(node.name, () => Object.keys(env.variables ?? {}))\n if (suggestion !== undefined && withinOneEdit(node.name, suggestion)) {\n report(\n 'UNKNOWN_VARIABLE',\n `\"${node.name}\" is not declared and reads the context as any${didYouMean(suggestion)}`,\n node,\n 'warning',\n suggestion,\n )\n }\n }\n return ANY\n }\n case 'Local':\n return scope.locals.get(node.name) ?? ANY\n case 'It':\n return scope.it ?? ANY\n case 'Member': {\n const objectType = check(node.object, scope)\n markAsync(node, node.object)\n if (node.name === options.probe) probeMembers = readsOf(node, objectType, scope)\n return memberType(objectType, node.name, node)\n }\n case 'Index': {\n const objectType = check(node.object, scope)\n const indexType = check(node.index, scope)\n markAsync(node, node.object)\n markAsync(node, node.index)\n return indexedType(objectType, indexType, node)\n }\n case 'Call':\n return checkCall(node, scope, expected)\n case 'Unary': {\n if (node.operator === '!') nullFalseMatters(node.operand)\n const operand = check(node.operand, scope)\n markAsync(node, node.operand)\n if (node.operator === '!') {\n expectLogic(operand, node.operand, '!')\n return BOOLEAN\n }\n // An unknown operand gives an unknown result, checked when it runs (as\n // x - 1 does): typing it number | duration would reject round(-x).\n if (operand.kind === 'any' || operand.kind === 'var') return ANY\n if (operand.kind === 'never') return operand\n if (isAssignable(operand, NUMBER)) return NUMBER\n if (isAssignable(operand, t.duration())) return t.duration()\n if (isAssignable(operand, NUMBER_OR_DURATION)) return widen(operand)\n report('TYPE_ERROR', `Cannot negate ${typeText(operand)}`, node)\n return ANY\n }\n case 'Binary':\n return checkBinary(node, scope, expected)\n case 'Conditional': {\n nullFalseMatters(node.test)\n const test = check(node.test, scope)\n expectLogic(test, node.test, 'A condition')\n const a = check(node.then, withFacts(scope, nonNullFacts(node.test, true)), expected)\n const b = check(node.otherwise, withFacts(scope, nonNullFacts(node.test, false)), expected)\n markAsync(node, node.test)\n markAsync(node, node.then)\n markAsync(node, node.otherwise)\n return unionOf([a, b])\n }\n case 'List': {\n const expectedItem = elementOf(expected)\n const elements: Type[] = []\n for (const item of node.items) {\n if (item.type === 'Spread') {\n const spread = check(item.argument, scope)\n markAsync(node, item.argument)\n const element = elementOf(nonNull(spread))\n if (element !== undefined) elements.push(element)\n else if (nonNull(spread).kind !== 'never')\n report(\n 'TYPE_ERROR',\n `Only a list can be spread into a list, not ${typeText(spread)}`,\n item,\n )\n } else {\n elements.push(fit(check(item, scope, expectedItem), expectedItem))\n markAsync(node, item)\n }\n }\n if (elements.length === 0) return t.list(t.never())\n // Items that all fit the expected item type (an allow-list of a large\n // enum) keep their literals rather than collapsing to the base kind.\n const fits =\n expectedItem !== undefined &&\n expectedItem.kind !== 'any' &&\n elements.every((element) => isAssignable(element, expectedItem))\n return t.list(unionOf(elements, !fits))\n }\n case 'Map': {\n const expectedMap = expected === undefined ? undefined : mapOf(nonNull(expected))\n const fields: Record<string, Type> = {}\n let rest: Type | undefined\n // A literal holds exactly its keys, unless a spread may add unknown ones.\n let exact = true\n for (const entry of node.entries) {\n if (entry.type === 'Spread') {\n const spread = check(entry.argument, scope)\n markAsync(node, entry.argument)\n const mapped = mapOf(nonNull(spread))\n if (mapped !== undefined) {\n // A spread may overwrite any earlier field it does not declare,\n // unless it is exact (a literal) and lists every key it has.\n const spreadExact = isExact(mapped)\n if (!spreadExact || mapped.rest !== undefined) {\n const keys = Object.keys(fields)\n chargeTypeWork(keys.length)\n for (const key of keys) {\n if (!Object.hasOwn(mapped.fields, key)) {\n if (mapped.rest !== undefined) fields[key] = unionOf([fields[key], mapped.rest])\n else fields[key] = ANY\n }\n }\n }\n chargeTypeWork(Object.keys(mapped.fields).length)\n // What a key not listed so far may already hold: the computed and\n // record entries' values, or anything after an open declared object.\n const unlisted = exact ? rest : ANY\n if (mayBeNull(spread)) {\n // A null spread adds nothing: its keys may be absent.\n for (const [key, field] of Object.entries(mapped.fields)) {\n fields[key] = Object.hasOwn(fields, key)\n ? unionOf([fields[key], field])\n : t.optional(unlisted === undefined ? field : unionOf([unlisted, field]))\n }\n } else {\n for (const [key, field] of Object.entries(mapped.fields)) {\n // An optional field of a declared object may be absent and leave\n // an earlier value in place; a literal's keys are always there.\n const earlier = Object.hasOwn(fields, key) ? fields[key] : unlisted\n fields[key] =\n earlier !== undefined && !spreadExact && mayBeNull(field)\n ? unionOf([earlier, field])\n : field\n }\n }\n if (mapped.rest !== undefined)\n rest = rest === undefined ? mapped.rest : unionOf([rest, mapped.rest])\n else if (!spreadExact) exact = false\n } else if (nonNull(spread).kind === 'any') {\n // An unknown map may overwrite every earlier field.\n const keys = Object.keys(fields)\n chargeTypeWork(keys.length)\n for (const key of keys) fields[key] = ANY\n rest = ANY\n } else if (nonNull(spread).kind === 'never') continue\n else\n report(\n 'TYPE_ERROR',\n `Only a map can be spread into a map, not ${typeText(spread)}`,\n entry,\n )\n continue\n }\n const expectedField =\n expectedMap === undefined || typeof entry.key !== 'string'\n ? undefined\n : (fieldOf(expectedMap, entry.key) ?? expectedMap.rest)\n const valueType = fit(check(entry.value, scope, expectedField), expectedField)\n markAsync(node, entry.value)\n const constant = typeof entry.key === 'string' ? entry.key : constantText(entry.key)\n if (typeof entry.key === 'string') fields[entry.key] = valueType\n else if (constant !== undefined) {\n // [\"a\"] or [`a`]: a constant key is a static one. A blocked one fails at run time.\n check(entry.key, scope)\n if (BLOCKED_NAMES.has(constant)) {\n report('BLOCKED_PROPERTY', `\"${constant}\" cannot be used as a key`, entry.key)\n } else fields[constant] = valueType\n } else {\n const keyType = check(entry.key, scope)\n markAsync(node, entry.key)\n if (!isAssignable(keyType, t.union(STRING, NUMBER))) {\n report(\n 'TYPE_ERROR',\n `A map key must be a string, not ${typeText(keyType)}`,\n entry.key,\n )\n } else reportBlockedKey(keyType, entry.key)\n // A computed key may overwrite any earlier field.\n const keys = Object.keys(fields)\n chargeTypeWork(keys.length)\n for (const key of keys) fields[key] = unionOf([fields[key], valueType])\n rest = rest === undefined ? valueType : unionOf([rest, valueType])\n }\n }\n // A spread declared object may hold any other key, with any value.\n if (rest !== undefined) return { kind: 'map', fields, rest: exact ? rest : ANY }\n return exact ? exactObject(fields) : t.object(fields)\n }\n case 'Lambda':\n report('INVALID_LAMBDA', 'A lambda can only be passed to a function that takes one', node)\n return ANY\n case 'Let': {\n const valueType = check(node.value, scope)\n markAsync(node, node.value)\n chargeTypeWork(scope.locals.size)\n const locals = new Map(scope.locals)\n locals.set(node.name, valueType)\n const bodyType = check(node.body, { ...scope, locals }, expected)\n markAsync(node, node.body)\n return bodyType\n }\n case 'Has': {\n // has() may probe a key a declared object does not list: it can still exist.\n const target = node.target\n if (target.type === 'Member') {\n const objectType = check(target.object, scope)\n markAsync(node, target.object)\n if (target.name === options.probe) probeMembers = readsOf(target, objectType, scope)\n types.set(target, memberType(objectType, target.name, target, true))\n } else check(target, scope)\n markAsync(node, node.target)\n return BOOLEAN\n }\n case 'Try': {\n const a = check(node.body, scope, expected)\n const b = check(node.fallback, scope, expected)\n markAsync(node, node.body)\n markAsync(node, node.fallback)\n return unionOf([a, b])\n }\n }\n throw new Error('unreachable')\n }\n\n /** A key whose every possible value is a blocked name fails whenever it runs. */\n function reportBlockedKey(keyType: Type, at: Node): void {\n const members = keyType.kind === 'union' ? keyType.types : [keyType]\n const blocked = members.every(\n (m) => m.kind === 'literal' && typeof m.value === 'string' && BLOCKED_NAMES.has(m.value),\n )\n if (blocked && members.length > 0) {\n const names = members.map((m) => (m.kind === 'literal' ? `\"${String(m.value)}\"` : ''))\n report('BLOCKED_PROPERTY', `${names.join(' or ')} cannot be used as a key`, at)\n }\n }\n\n function expectLogic(actual: Type, at: Node, what: string): void {\n if (!isAssignable(actual, OPTIONAL_BOOLEAN)) {\n report('TYPE_ERROR', `${what} expects a boolean but got ${typeText(actual)}`, at)\n } else if (mayBeNull(actual)) {\n // Null counts as false here, which ! turns into true: say which one is meant.\n report(\n 'MAYBE_NULL',\n `This value may be null, and ${what === 'A condition' ? 'a condition' : what} treats null as false; write x == true or x == false to say what null means`,\n at,\n 'warning',\n )\n }\n }\n\n /**\n * The type of `object.name`. A key a declared object does not list may still\n * exist with any value (declared objects are open); `quiet` (for has()) and\n * unions where another member has the key read it as unknown instead of failing.\n */\n function memberType(objectType: Type, name: string, at: Node, quiet = false): Type {\n if (objectType.kind === 'any' || objectType.kind === 'var') return ANY\n if (objectType.kind === 'never') return t.never()\n if (objectType.kind === 'null') return NULL\n if (objectType.kind === 'union') {\n // Another member has the key (null has none: a?.x on a missing key still fails).\n const somewhere = objectType.types.some(\n (member) =>\n member.kind !== 'null' &&\n member.kind !== 'never' &&\n (member.kind !== 'map' ||\n fieldOf(member, name) !== undefined ||\n member.rest !== undefined),\n )\n return unionOf(\n objectType.types.map((member) => memberType(member, name, at, quiet || somewhere)),\n )\n }\n if (objectType.kind === 'map') {\n const field = fieldOf(objectType, name)\n if (field !== undefined) return field\n if (objectType.rest !== undefined) return t.optional(objectType.rest)\n // A map literal holds no other keys; a declared object may.\n if (quiet) return isExact(objectType) ? NULL : ANY\n const suggestion = suggest(name, () => Object.keys(objectType.fields))\n // The span is the name itself, so a quick-fix can replace it with the suggestion.\n const span = nameSpan(at, name)\n const receiver = at.type === 'Member' || at.type === 'Index' ? pathText(at.object) : undefined\n report(\n 'UNKNOWN_PROPERTY',\n `Property \"${name}\" does not exist on ${receiver ?? typeText(objectType)}${didYouMean(suggestion)}`,\n span ?? at,\n 'error',\n span === undefined ? undefined : suggestion,\n )\n return ANY\n }\n if (\n (objectType.kind === 'list' ||\n objectType.kind === 'string' ||\n (objectType.kind === 'literal' && typeof objectType.value === 'string')) &&\n name === 'length'\n ) {\n return NUMBER\n }\n const fn = env.lookup(name)\n // `1.e3` reads \"e3\" of 1: a number does not end in \".\", so say how to write the exponent.\n const exponent =\n objectType.kind === 'literal' &&\n typeof objectType.value === 'number' &&\n /^[eE]\\d+$/u.test(name)\n report(\n 'TYPE_ERROR',\n `Cannot read property \"${name}\" of ${typeText(objectType)}${fn === undefined ? '' : `; did you mean to call ${name}()?`}${exponent ? `; for an exponent write ${String(objectType.value)}${name} or ${String(objectType.value)}.0${name}` : ''}`,\n at,\n )\n return ANY\n }\n\n function indexedType(objectType: Type, indexType: Type, at: Node): Type {\n if (objectType.kind === 'any' || objectType.kind === 'var') return ANY\n if (objectType.kind === 'never') return t.never()\n if (objectType.kind === 'null') return NULL\n if (objectType.kind === 'union') {\n // A literal key reads like a member: m[\"b\"] on a union is m.b.\n if (indexType.kind === 'literal' && typeof indexType.value === 'string')\n return memberType(objectType, indexType.value, at)\n return unionOf(objectType.types.map((member) => indexedType(member, indexType, at)))\n }\n if (\n objectType.kind === 'list' ||\n objectType.kind === 'string' ||\n (objectType.kind === 'literal' && typeof objectType.value === 'string')\n ) {\n if (!isAssignable(indexType, NUMBER))\n report('TYPE_ERROR', `An index must be a number, not ${typeText(indexType)}`, at)\n return t.optional(objectType.kind === 'list' ? objectType.element : STRING)\n }\n if (objectType.kind === 'map') {\n if (!isAssignable(indexType, t.union(STRING, NUMBER))) {\n report('TYPE_ERROR', `A map key must be a string, not ${typeText(indexType)}`, at)\n return ANY\n }\n if (indexType.kind === 'literal') return memberType(objectType, String(indexType.value), at)\n // Any key may exist on a declared object, with any value.\n if (objectType.rest === undefined && !isExact(objectType)) return ANY\n const members = Object.values(objectType.fields)\n if (objectType.rest !== undefined) members.push(objectType.rest)\n return t.optional(unionOf(members))\n }\n report('TYPE_ERROR', `Cannot index ${typeText(objectType)}`, at)\n return ANY\n }\n\n function checkBinary(\n node: Extract<Node, { type: 'Binary' }>,\n scope: Scope,\n expected: Type | undefined,\n ): Type {\n const nullish = node.operator === '??'\n // x == false (or != true) reads a null comparison's false as a verdict.\n if (node.operator === '==' || node.operator === '!=') {\n const negates = node.operator === '!='\n const negating = (n: Node): boolean => n.type === 'Literal' && n.value === negates\n if (negating(node.right)) nullFalseMatters(node.left)\n else if (negating(node.left)) nullFalseMatters(node.right)\n }\n // Joining lists: an expected list type (or the other operand's) is the\n // context for list literals, so plans + [\"free\"] stays a list of plans.\n const listContext =\n node.operator === '+' && expected !== undefined && elementOf(nonNull(expected)) !== undefined\n ? expected\n : undefined\n let leftExpected = listContext\n if (nullish && expected !== undefined) leftExpected = t.optional(expected)\n const left = check(node.left, scope, leftExpected)\n let rightScope = scope\n if (node.operator === '&&') rightScope = withFacts(scope, nonNullFacts(node.left, true))\n else if (node.operator === '||') rightScope = withFacts(scope, nonNullFacts(node.left, false))\n let rightExpected: Type | undefined = nullish ? expected : undefined\n if (node.operator === '+')\n rightExpected = listContext ?? (left.kind === 'list' ? left : undefined)\n const right = check(node.right, rightScope, rightExpected)\n markAsync(node, node.left)\n markAsync(node, node.right)\n const op = node.operator\n switch (op) {\n case '&&':\n case '||':\n expectLogic(left, node.left, `\"${op}\"`)\n expectLogic(right, node.right, `\"${op}\"`)\n return BOOLEAN\n case '??':\n if (!isNullable(left))\n report('NEVER_NULL', 'The left side of \"??\" is never null', node.left, 'warning')\n return unionOf([nonNull(left), right])\n case '==':\n case '!=':\n if (!overlaps(left, right)) {\n report(\n op === '==' ? 'ALWAYS_FALSE' : 'ALWAYS_TRUE',\n `This comparison is always ${op === '==' ? 'false' : 'true'}: ${typeText(left)} and ${typeText(right)} have no values in common`,\n node,\n 'warning',\n )\n }\n return BOOLEAN\n case '<':\n case '<=':\n case '>':\n case '>=': {\n // Ordering with null is false whatever the other side is (the spec).\n if (left.kind === 'null' || right.kind === 'null') {\n report(\n 'ALWAYS_FALSE',\n 'This comparison is always false: an ordering with null is false',\n node,\n 'warning',\n )\n return BOOLEAN\n }\n // A side that may be null is not a warning where false means \"skip\"\n // (`users.filter(.age >= 18)`), only where false becomes a verdict:\n // `user.age < 18 ? \"deny\" : \"allow\"` allows a user with no age.\n if (verdicts.has(node)) {\n for (const [side, sideType] of [\n [node.left, left],\n [node.right, right],\n ] as const) {\n if (mayBeNull(sideType)) {\n report(\n 'MAYBE_NULL',\n 'This value may be null, and a comparison with null is false; check it first (x != null && ...) or use ??',\n side,\n 'warning',\n )\n }\n }\n }\n const a = widen(nonNull(left))\n const b = widen(nonNull(right))\n const comparable = ['number', 'string', 'timestamp', 'duration']\n const ok = (x: Type): boolean =>\n x.kind === 'any' || x.kind === 'var' || x.kind === 'never' || comparable.includes(x.kind)\n if (\n !ok(a) ||\n !ok(b) ||\n (a.kind !== b.kind &&\n a.kind !== 'any' &&\n b.kind !== 'any' &&\n a.kind !== 'never' &&\n b.kind !== 'never')\n ) {\n report(\n 'TYPE_ERROR',\n `Cannot compare ${typeText(left)} with ${typeText(right)}${mixedKinds(a, 'left') ?? mixedKinds(b, 'right') ?? ''}`,\n node,\n )\n }\n return BOOLEAN\n }\n case 'in':\n case 'not in': {\n // A list literal's items keep their literal types: `plan in [\"gold\"]` can be always false.\n const literalItems =\n node.right.type === 'List' && node.right.items.every((item) => item.type !== 'Spread')\n ? node.right.items.map((item) => types.get(item) ?? ANY)\n : undefined\n const containers =\n literalItems === undefined\n ? nonNull(right)\n : t.list(literalItems.length === 0 ? t.never() : unionOf(literalItems))\n for (const container of containers.kind === 'union' ? containers.types : [containers]) {\n checkMembership(container, left, right, node)\n }\n return BOOLEAN\n }\n case '%':\n case '*':\n case '**':\n case '+':\n case '-':\n case '/':\n default:\n return arithmetic(op, left, right, node)\n }\n }\n\n function checkMembership(\n container: Type,\n left: Type,\n right: Type,\n node: Extract<Node, { type: 'Binary' }>,\n ): void {\n if (\n container.kind === 'string' ||\n (container.kind === 'literal' && typeof container.value === 'string')\n ) {\n if (!isAssignable(left, STRING))\n report(\n 'TYPE_ERROR',\n `\"in\" on text needs text on the left, not ${typeText(left)}`,\n node.left,\n )\n } else if (container.kind === 'map') {\n if (!isAssignable(left, t.union(STRING, NUMBER)))\n report('TYPE_ERROR', `\"in\" on a map needs a string key, not ${typeText(left)}`, node.left)\n } else if (container.kind === 'list') {\n if (!overlaps(left, container.element) && container.element.kind !== 'never') {\n const negated = node.operator === 'not in'\n report(\n negated ? 'ALWAYS_TRUE' : 'ALWAYS_FALSE',\n `${typeText(left)} can never be in ${typeText(container)}, so this is always ${negated ? 'true' : 'false'}`,\n node,\n 'warning',\n )\n }\n } else if (container.kind !== 'any' && container.kind !== 'never' && container.kind !== 'var') {\n report(\n 'TYPE_ERROR',\n `\"in\" needs a list, text, or map on the right, not ${typeText(right)}`,\n node.right,\n )\n }\n }\n\n function arithmetic(op: string, left: Type, right: Type, node: Node): Type {\n const a = widen(left)\n const b = widen(right)\n // `never` (e.g. an item of []) has no values, so no operation on it can fail.\n if (a.kind === 'never' || b.kind === 'never') return t.never()\n if (a.kind === 'any' || b.kind === 'any' || a.kind === 'var' || b.kind === 'var') {\n if (op === '+' && (a.kind === 'string' || b.kind === 'string')) return STRING\n return op === '+' || op === '-' || op === '*' || op === '/' ? ANY : NUMBER\n }\n const kinds = `${a.kind} ${op} ${b.kind}`\n const table: Record<string, Type> = {\n 'number + number': NUMBER,\n 'string + string': STRING,\n 'duration + duration': t.duration(),\n 'timestamp + duration': t.timestamp(),\n 'duration + timestamp': t.timestamp(),\n 'number - number': NUMBER,\n 'timestamp - timestamp': t.duration(),\n 'timestamp - duration': t.timestamp(),\n 'duration - duration': t.duration(),\n 'number * number': NUMBER,\n 'duration * number': t.duration(),\n 'number * duration': t.duration(),\n 'number / number': NUMBER,\n 'duration / number': t.duration(),\n 'duration / duration': NUMBER,\n 'number % number': NUMBER,\n 'number ** number': NUMBER,\n }\n const known = table[kinds]\n if (known !== undefined) return known\n if (op === '+') {\n // Lists (or unions of lists) concatenate.\n const x = a.kind === 'list' || a.kind === 'union' ? elementOf(a) : undefined\n const y = b.kind === 'list' || b.kind === 'union' ? elementOf(b) : undefined\n if (x !== undefined && y !== undefined) return t.list(unionOf([x, y]))\n }\n if (a.kind === 'union' || b.kind === 'union') {\n // Each combination of members must be valid; the result joins them.\n const results: Type[] = []\n for (const x of a.kind === 'union' ? a.types : [a]) {\n for (const y of b.kind === 'union' ? b.types : [b]) {\n const r = x.kind === 'null' || y.kind === 'null' ? undefined : arithmeticQuiet(op, x, y)\n if (r === undefined) {\n results.length = 0\n break\n }\n results.push(r)\n }\n if (results.length === 0) break\n }\n if (results.length > 0) return unionOf(results)\n }\n const nullable = isNullable(a) || isNullable(b)\n if (nullable) {\n const retry = arithmeticQuiet(op, nonNull(a), nonNull(b))\n if (retry !== undefined) {\n // Underline the operand that may be null, not the whole expression.\n let culprit: Node = node\n if (node.type === 'Binary') culprit = isNullable(a) ? node.left : node.right\n report(\n 'TYPE_ERROR',\n `An operand of \"${op}\" may be null; use ?? to supply a default`,\n culprit,\n )\n return retry\n }\n }\n let hint = ''\n if (op === '+' && (a.kind === 'string' || b.kind === 'string'))\n hint = '; use a template to build text'\n else if (\n (a.kind === 'timestamp' || b.kind === 'timestamp') &&\n (a.kind === 'number' || b.kind === 'number')\n )\n hint = '; use a duration such as days(30)'\n report(\n 'TYPE_ERROR',\n `Cannot apply \"${op}\" to ${typeText(left)} and ${typeText(right)}${hint}`,\n node,\n )\n return ANY\n }\n\n function arithmeticQuiet(op: string, a: Type, b: Type): Type | undefined {\n const saved = diagnostics.length\n const result = arithmetic(op, a, b, { type: 'Literal', value: null, start: 0, end: 0 })\n const failed = diagnostics.length > saved\n truncate(saved)\n return failed ? undefined : result\n }\n\n // === calls ===\n\n function checkCall(node: CallNode, scope: Scope, expected?: Type): Type {\n if (!node.args.some((arg) => arg.type === 'Lambda')) return checkCallNow(node, scope, expected)\n const free = freeLocals(node)\n const inputs = free.names.map((name) => scope.locals.get(name) ?? ANY)\n if (free.it) inputs.push(scope.it ?? ANY)\n const last = callMemo.get(node)\n if (\n last !== undefined &&\n last.expected === expected &&\n last.inputs.length === inputs.length &&\n last.inputs.every((input, i) => sameType(input, inputs[i] ?? ANY))\n ) {\n for (const d of last.diagnostics) report(d.code, d.message, d, d.severity, d.suggestion)\n return last.type\n }\n const mark = diagnostics.length\n const result = checkCallNow(node, scope, expected)\n // groupBy makes its keys map keys, so a key that is always blocked fails.\n if (node.name === 'groupBy' && env.lookup(node.name)?.host !== true) {\n const lambda = node.args.find((arg) => arg.type === 'Lambda')\n const keyType = lambda?.type === 'Lambda' ? types.get(lambda.body) : undefined\n if (lambda?.type === 'Lambda' && keyType !== undefined) reportBlockedKey(keyType, lambda.body)\n }\n callMemo.set(node, { expected, inputs, type: result, diagnostics: diagnostics.slice(mark) })\n return result\n }\n\n function checkCallNow(node: CallNode, scope: Scope, expected?: Type): Type {\n functions.add(node.name)\n const receiver = node.args[0]\n // Math.max(...) and friends. In an open environment the context may really\n // hold a variable with that name, so the hint is a warning there.\n if (\n node.style === 'method' &&\n receiver?.type === 'Variable' &&\n Object.hasOwn(JS_GLOBALS, receiver.name) &&\n (env.variables === undefined || !Object.hasOwn(env.variables, receiver.name))\n ) {\n const open = !env.strict && env.variables === undefined\n report(\n 'UNKNOWN_VARIABLE',\n `There is no ${receiver.name} object; ${JS_GLOBALS[receiver.name] ?? ''}`,\n receiver,\n open ? 'warning' : 'error',\n )\n if (!open) return ANY\n }\n const def = env.lookup(node.name)\n // every() and none() turn an item a null comparison skips into a verdict.\n if (def?.host !== true && (node.name === 'every' || node.name === 'none')) {\n for (const arg of node.args) if (arg.type === 'Lambda') nullFalseMatters(arg.body)\n }\n // With one signature, a parameter type is the context for its argument, so\n // setPlans([\"pro\"]) keeps the literal a plan enum needs.\n const only = def?.overloads.length === 1 ? def.overloads[0] : undefined\n const contextFor = (index: number): Type | undefined => {\n const param = only?.params[index] ?? only?.rest\n return param === undefined || param.kind === 'function' || hasVar(param) ? undefined : param\n }\n // Argument types, except lambdas (checked once parameter types are known).\n const argTypes: (Type | undefined)[] = node.args.map((arg, index) => {\n if (arg.type === 'Lambda') return undefined\n if (arg.type === 'Spread') {\n const spread = check(arg.argument, scope)\n markAsync(node, arg.argument)\n if (elementOf(nonNull(spread)) === undefined && nonNull(spread).kind !== 'never') {\n report(\n 'TYPE_ERROR',\n `Only a list can be spread into arguments, not ${typeText(spread)}`,\n arg,\n )\n }\n return spread\n }\n const argType = check(arg, scope, contextFor(index))\n markAsync(node, arg)\n return argType\n })\n if (def === undefined) {\n const alias = Object.hasOwn(FUNCTION_ALIASES, node.name)\n ? FUNCTION_ALIASES[node.name]\n : undefined\n // An alias hint names its replacement in quotes ('did you mean \"includes\"?').\n const suggestion =\n alias === undefined\n ? suggest(node.name, () => env.functionNames())\n : /\"(?<name>[^\"]+)\"/u.exec(alias)?.groups?.name\n const hint = alias === undefined ? didYouMean(suggestion) : `; ${alias}`\n report(\n 'UNKNOWN_FUNCTION',\n `Unknown function \"${node.name}\"${hint}`,\n { start: node.nameStart ?? node.start, end: node.nameEnd ?? node.end },\n 'error',\n suggestion,\n )\n for (const arg of node.args) if (arg.type === 'Lambda') checkLambda(arg, [], scope)\n return ANY\n }\n if (def.async === true) asyncNodes.add(node)\n\n let receiverNull = false\n if (node.optional && argTypes[0] !== undefined) {\n receiverNull = isNullable(argTypes[0])\n argTypes[0] = nonNull(argTypes[0])\n if (argTypes[0].kind === 'never') {\n // The receiver is always null, so the call never runs.\n for (const arg of node.args) if (arg.type === 'Lambda') checkLambda(arg, [], scope)\n calls.set(node, {\n def,\n candidates: def.overloads.map((_, i) => i),\n })\n return NULL\n }\n }\n\n const hasSpread = node.args.some((arg) => arg.type === 'Spread')\n if (hasSpread && def.overloads.some((o) => o.params.some((p) => p.kind === 'function'))) {\n report(\n 'INVALID_LAMBDA',\n `Spread arguments cannot be used with ${node.name}(), which takes a lambda`,\n node,\n )\n }\n const candidates: number[] = []\n const bindings: Map<string, Type>[] = []\n def.overloads.forEach((candidate, index) => {\n const b = new Map<string, Type>()\n if (matchOverload(candidate, node, argTypes, b, hasSpread)) {\n candidates.push(index)\n bindings.push(b)\n }\n })\n\n if (candidates.length === 0 && !node.args.some((arg) => arg.type === 'Lambda')) {\n // A union argument (number | duration) is fine when every member has an\n // overload: the call dispatches on the value at run time.\n const distributed = distribute(def, node, argTypes, hasSpread)\n if (distributed !== undefined) {\n calls.set(node, {\n def,\n candidates: distributed.candidates,\n })\n return receiverNull ? t.optional(distributed.result) : distributed.result\n }\n }\n\n if (candidates.length === 0) {\n reportNoOverload(node, def, argTypes, hasSpread)\n recoverLambdas(def, node, argTypes, scope)\n calls.set(node, {\n def,\n candidates: def.overloads.map((_, i) => i),\n })\n return ANY\n }\n\n // Check lambda bodies against the first candidate's parameter types.\n const first = def.overloads[candidates[0]]\n const firstBindings = bindings[0]\n let asyncLambda = false\n node.args.forEach((arg, index) => {\n if (arg.type !== 'Lambda') return\n const param = first.params[index]\n if (param?.kind !== 'function') {\n report(\n 'INVALID_LAMBDA',\n `${node.name}() does not take a lambda as argument ${index + 1}`,\n arg,\n )\n checkLambda(arg, [], scope)\n return\n }\n let paramTypes = param.params.map((p) => substitute(p, firstBindings))\n const mark = diagnostics.length\n // What the call is expected to produce tells the lambda what to return:\n // `map` returns list<U> of the lambda's U, `reduce` returns its U.\n const bodyExpected = lambdaExpected(first.result, param.result, expected)\n let bodyType = checkLambda(arg, paramTypes, scope, bodyExpected)\n unify(param.result, bodyType, firstBindings)\n // A parameter that takes the lambda's own result (reduce's accumulator)\n // widens with it: re-check until the parameter types are stable.\n for (let round = 1; ; round++) {\n // An error stands: its recovery type (`any`) would make the next round\n // clean and hide it.\n if (diagnostics.slice(mark).some((d) => d.severity === 'error')) break\n let next = param.params.map((p) => substitute(p, firstBindings))\n const changed = changedAt(next, paramTypes)\n if (changed.length === 0) break\n const last = round >= MAX_LAMBDA_ROUNDS\n if (last) next = next.map((p, i) => (changed.includes(i) ? ANY : p))\n truncate(mark)\n paramTypes = next\n bodyType = checkLambda(arg, paramTypes, scope, bodyExpected)\n unify(param.result, bodyType, firstBindings)\n if (last) {\n // Still growing: what the lambda returns (and so the call's result) is\n // unknown, and checked at run time where it matters.\n for (const name of varNames(param.result)) firstBindings.set(name, ANY)\n break\n }\n }\n if (asyncNodes.has(arg.body)) asyncLambda = true\n if (\n !hasVar(param.result) &&\n param.result.kind !== 'any' &&\n !isAssignable(bodyType, param.result)\n ) {\n const required = substitute(param.result, firstBindings)\n const onlyNull = required.kind === 'boolean' && isAssignable(bodyType, OPTIONAL_BOOLEAN)\n report(\n onlyNull ? 'MAYBE_NULL' : 'TYPE_ERROR',\n `The lambda for ${node.name}() must return ${typeText(required)} but returns ${typeText(bodyType)}`,\n arg.body,\n onlyNull ? 'warning' : 'error',\n )\n }\n })\n if (asyncLambda) asyncNodes.add(node)\n if (first.literals !== undefined) {\n const values = node.args.map((arg) => (arg.type === 'Literal' ? arg.value : undefined))\n const problem = first.literals(values)\n if (problem !== undefined) report('INVALID_ARGUMENT', problem, node)\n }\n if (def.host !== true && (def.name === 'filter' || def.name === 'find')) {\n const lambda = node.args[1]\n const element = firstBindings.get('T')\n if (lambda?.type === 'Lambda' && element !== undefined) {\n let itemPath: string | undefined\n if (lambda.implicit) itemPath = 'it'\n else if (lambda.params[0] !== undefined) itemPath = `l:${lambda.params[0]}`\n let refined = element\n for (const key of nonNullFacts(lambda.body, true)) {\n if (itemPath === undefined || (key !== itemPath && !key.startsWith(`${itemPath}.`)))\n continue\n const path = pathSegments(key.slice(itemPath.length))\n if (path !== undefined) refined = refinePath(refined, path)\n }\n firstBindings.set('T', refined)\n }\n }\n for (const name of first.ordered ?? []) {\n const boundType = firstBindings.get(name)\n if (boundType !== undefined && !orderable(boundType)) {\n report(\n 'TYPE_ERROR',\n `${node.name}() can only order numbers, text, timestamps, or durations (one kind at a time), not ${typeText(boundType)}`,\n node,\n )\n }\n }\n\n const results = candidates.map((index, i) => {\n const candidate = def.overloads[index]\n const refined =\n def.host === true || !Object.hasOwn(RESULT_REFINERS, def.name)\n ? undefined\n : refine(\n RESULT_REFINERS[def.name],\n argTypes.map((a) => a ?? ANY),\n )\n if (refined !== undefined) return refined\n const exact = substitute(candidate.result, bindings[i])\n return expected !== undefined &&\n expected.kind !== 'any' &&\n expected.kind !== 'var' &&\n isAssignable(exact, expected)\n ? exact\n : widenFresh(exact)\n })\n const gradual =\n candidates.length === 1 &&\n argTypes.some((argType, index) => {\n const param = first.params[index] ?? first.rest\n return (\n argType !== undefined &&\n param !== undefined &&\n !containsAny(argType) &&\n !isProvenAssignable(argType, param)\n )\n })\n calls.set(node, { def, candidates, ...(gradual ? { gradual } : {}) })\n // xs.includes(v) is `v in xs`: warn the same way when it can never hold.\n if (def.host !== true && def.name === 'includes' && node.args.length === 2) {\n const list = argTypes[0]\n const item = argTypes[1]\n if (\n list?.kind === 'list' &&\n item !== undefined &&\n list.element.kind !== 'never' &&\n !overlaps(item, list.element)\n ) {\n report(\n 'ALWAYS_FALSE',\n `${typeText(item)} can never be in ${typeText(list)}`,\n node,\n 'warning',\n )\n }\n }\n // Several overloads can only match when argument types are unknown; the\n // result is then unknown too, unless every candidate agrees.\n const merged = unionOf(results)\n const known = argTypes.every((argType) => argType === undefined || !containsAny(argType))\n let result = merged\n if (candidates.length > 1 && merged.kind === 'union') result = known ? results[0] : ANY\n return receiverNull ? t.optional(result) : result\n }\n\n /**\n * After a failed match, checks lambdas with the parameter types of the first\n * overload their other arguments fit, so an unfinished call being edited\n * (`reduce(lines, (acc, l) => l.`) still types `l` for completions and hover.\n */\n function recoverLambdas(\n def: FunctionDef,\n node: CallNode,\n argTypes: readonly (Type | undefined)[],\n scope: Scope,\n ): void {\n let params: readonly (readonly Type[])[] | undefined\n for (const candidate of def.overloads) {\n const b = new Map<string, Type>()\n const fits = node.args.every((arg, index) => {\n const param = candidate.params[index]\n const argType = argTypes[index]\n if (arg.type === 'Lambda') return param?.kind === 'function'\n return param === undefined || argType === undefined || unify(param, argType, b)\n })\n if (!fits) continue\n params = node.args.map((_, index) => {\n const param = candidate.params[index]\n return param?.kind === 'function' ? param.params.map((p) => substitute(p, b)) : []\n })\n break\n }\n node.args.forEach((arg, index) => {\n if (arg.type === 'Lambda') checkLambda(arg, params?.[index] ?? [], scope)\n })\n }\n\n function checkLambda(\n node: LambdaNode,\n params: readonly Type[],\n scope: Scope,\n expected?: Type,\n ): Type {\n let inner: Scope\n // Facts about an outer item do not apply to the new item.\n const outer: Facts | undefined =\n scope.nonNull === undefined\n ? undefined\n : { keys: new Set(), parent: scope.nonNull, hidesIt: true }\n if (node.implicit) {\n inner = { locals: scope.locals, it: params[0] ?? ANY, nonNull: outer }\n } else {\n chargeTypeWork(scope.locals.size)\n const locals = new Map(scope.locals)\n node.params.forEach((name, index) => {\n locals.set(name, params[index] ?? ANY)\n })\n inner = { locals, it: undefined, nonNull: outer }\n }\n const bodyType = check(node.body, inner, expected)\n types.set(node, bodyType)\n return bodyType\n }\n\n function matchOverload(\n candidate: Overload,\n node: CallNode,\n argTypes: readonly (Type | undefined)[],\n b: Map<string, Type>,\n hasSpread: boolean,\n ): boolean {\n const count = node.args.length\n const required = candidate.required ?? candidate.params.length\n // Spreading an empty list (`...[]`) passes no arguments at all.\n const isEmptySpread = (i: number): boolean =>\n node.args[i].type === 'Spread' && elementOf(nonNull(argTypes[i] ?? ANY))?.kind === 'never'\n let passed = count\n let otherSpread = false\n for (let i = 0; i < count; i++) {\n if (isEmptySpread(i)) passed--\n else if (node.args[i].type === 'Spread') otherSpread = true\n }\n if (!hasSpread || !otherSpread) {\n if (passed < required) return false\n if (passed > candidate.params.length && candidate.rest === undefined) return false\n }\n for (let i = 0; i < count; i++) {\n const arg = node.args[i]\n const param = candidate.params[i] ?? candidate.rest\n if (param === undefined) return hasSpread\n if (arg.type === 'Spread') {\n // Its items may fill this and every later position (how many is only\n // known at run time), so each must fit all of them.\n const element = elementOf(nonNull(argTypes[i] ?? ANY)) ?? ANY\n if (element.kind === 'never') continue\n const positions = [...candidate.params.slice(i), candidate.rest]\n for (const position of positions) {\n if (position !== undefined && !unify(position, element, b)) return false\n }\n continue\n }\n if (arg.type === 'Lambda') {\n if (param.kind !== 'function') return false\n continue\n }\n if (param.kind === 'function') return false\n let argType = argTypes[i] as Type\n if (!hasSpread && i >= required && i < candidate.params.length) {\n // A null optional argument is omitted: the default is used.\n argType = nonNull(argType)\n if (argType.kind === 'never') continue\n }\n if (!unify(param, argType, b)) return false\n }\n return true\n }\n\n /** Overloads per member of the first union argument; undefined unless every member has one. */\n function distribute(\n def: FunctionDef,\n node: CallNode,\n argTypes: readonly (Type | undefined)[],\n hasSpread: boolean,\n ): { candidates: number[]; result: Type } | undefined {\n const index = argTypes.findIndex(\n (argType, i) =>\n argType !== undefined &&\n node.args[i]?.type !== 'Spread' &&\n !mayBeNull(argType) &&\n widen(argType).kind === 'union',\n )\n if (index < 0) return undefined\n const members = (widen(argTypes[index] as Type) as Extract<Type, { kind: 'union' }>).types\n const chosen = new Set<number>()\n const results: Type[] = []\n for (const member of members) {\n const args = argTypes.map((argType, i) => (i === index ? member : argType))\n let matched = false\n def.overloads.forEach((candidate, i) => {\n const b = new Map<string, Type>()\n if (\n matchOverload(candidate, node, args, b, hasSpread) &&\n (candidate.ordered ?? []).every((name) => orderable(b.get(name) ?? ANY))\n ) {\n matched = true\n chosen.add(i)\n results.push(widenFresh(substitute(candidate.result, b)))\n }\n })\n if (!matched) return undefined\n }\n return { candidates: [...chosen].sort((a, b) => a - b), result: unionOf(results) }\n }\n\n function reportNoOverload(\n node: CallNode,\n def: FunctionDef,\n argTypes: readonly (Type | undefined)[],\n hasSpread: boolean,\n ): void {\n // Would the call type-check if nullable arguments were non-null?\n const relaxed = argTypes.map((a) => (a === undefined ? a : nonNull(a)))\n const nullableFix = def.overloads.some((candidate) =>\n matchOverload(candidate, node, relaxed, new Map(), hasSpread),\n )\n if (nullableFix) {\n // `any` could be anything, not specifically null: blame an argument that may be null.\n const receiverIsNullable =\n node.style === 'method' && argTypes[0] !== undefined && mayBeNull(argTypes[0])\n const nullableIndex = argTypes.findIndex(\n (argType) => argType !== undefined && mayBeNull(argType),\n )\n const culprit = node.args[receiverIsNullable ? 0 : Math.max(nullableIndex, 0)]\n report(\n 'NULLABLE_RECEIVER',\n receiverIsNullable\n ? `The value before .${node.name}() may be null; use ?.${node.name}() or ?? to supply a default`\n : `An argument of ${node.name}() may be null; use ?? to supply a default`,\n culprit ?? node,\n )\n return\n }\n const shown = node.args\n .map((arg, i) => (arg.type === 'Lambda' ? 'lambda' : typeText(argTypes[i] ?? ANY)))\n .join(', ')\n const signatures = def.overloads\n .map((candidate) => signatureText(def.name, candidate))\n .join('; ')\n report(\n 'NO_OVERLOAD',\n `${node.name}(${shown}) does not match ${def.overloads.length > 1 ? 'any of ' : ''}${signatures}`,\n node,\n )\n }\n\n return {\n root: boundRoot,\n type,\n diagnostics,\n calls,\n types,\n async: asyncNodes.has(boundRoot),\n checkResult,\n references: { variables: [...variables], functions: [...functions] },\n probeScope,\n probeMembers,\n }\n}\n\n// === helpers ===\n\n/** Whether values of a type can be ordered (one kind: numbers, text, timestamps, durations). */\nfunction orderable(type: Type): boolean {\n const kind = widen(nonNull(type)).kind\n return ['any', 'never', 'var', 'number', 'string', 'timestamp', 'duration'].includes(kind)\n}\n\n/** A result refiner, applied per member when the first argument is a union (flat() of `a[] | b[]`). */\nfunction refine(\n refiner: ((args: readonly Type[]) => Type | undefined) | undefined,\n args: readonly Type[],\n): Type | undefined {\n if (refiner === undefined) return undefined\n const direct = refiner(args)\n const first = args[0]\n if (direct !== undefined || first?.kind !== 'union') return direct\n const results: Type[] = []\n for (const member of first.types) {\n const result = refiner([member, ...args.slice(1)])\n if (result === undefined) return undefined\n results.push(result)\n }\n return unionOf(results)\n}\n\nconst freeMemo = new WeakMap<Node, { names: readonly string[]; it: boolean }>()\n\n/** The outer locals (and whether the outer `.`) a node reads. */\nfunction freeLocals(root: Node): { names: readonly string[]; it: boolean } {\n const cached = freeMemo.get(root)\n if (cached !== undefined) return cached\n const names = new Set<string>()\n let it = false\n const visit = (node: Node, bound: ReadonlySet<string>, itBound: boolean): void => {\n switch (node.type) {\n case 'Local':\n if (!bound.has(node.name)) names.add(node.name)\n return\n case 'It':\n if (!itBound) it = true\n return\n case 'Lambda':\n if (node.implicit) visit(node.body, bound, true)\n else visit(node.body, new Set([...bound, ...node.params]), itBound)\n return\n case 'Let':\n visit(node.value, bound, itBound)\n visit(node.body, new Set([...bound, node.name]), itBound)\n return\n case 'Binary':\n case 'Call':\n case 'Conditional':\n case 'Has':\n case 'Index':\n case 'List':\n case 'Literal':\n case 'Map':\n case 'Member':\n case 'Template':\n case 'Try':\n case 'Unary':\n case 'Variable':\n default:\n forEachChild(node, (child) => {\n visit(child, bound, itBound)\n })\n }\n }\n visit(root, new Set(), false)\n const result = { names: [...names].sort(), it }\n freeMemo.set(root, result)\n return result\n}\n\n/** Indices where two parameter-type lists differ. */\nfunction changedAt(next: readonly Type[], previous: readonly Type[]): number[] {\n const out: number[] = []\n next.forEach((type, i) => {\n if (!sameType(type, previous[i] ?? ANY)) out.push(i)\n })\n return out\n}\n\nconst containsAnyMemo = new WeakMap<Type, boolean>()\n\n/** Whether a type is only partly known statically (`any` somewhere inside). */\nfunction containsAny(type: Type): boolean {\n if (type.kind !== 'list' && type.kind !== 'map' && type.kind !== 'union')\n return type.kind === 'any' || type.kind === 'var'\n let result = containsAnyMemo.get(type)\n if (result === undefined) {\n result = computeContainsAny(type)\n containsAnyMemo.set(type, result)\n }\n return result\n}\n\nfunction computeContainsAny(type: Type): boolean {\n switch (type.kind) {\n case 'any':\n case 'var':\n return true\n case 'list':\n return containsAny(type.element)\n case 'map':\n return (\n (type.rest !== undefined && containsAny(type.rest)) ||\n Object.values(type.fields).some(containsAny)\n )\n case 'union':\n return type.types.some(containsAny)\n case 'boolean':\n case 'duration':\n case 'function':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return false\n }\n}\n\n/** Whether a value of type `arg` can be passed for parameter `param` (tooling). */\nexport function acceptsArgument(param: Type, arg: Type): boolean {\n return unify(param, arg, new Map())\n}\n\n/** Binds type variables in `param` from `arg`; false when they cannot match. */\n/** The type a lambda should return for its call to produce `expected`, when the signature says. */\nfunction lambdaExpected(\n result: Type,\n lambdaResult: Type,\n expected: Type | undefined,\n): Type | undefined {\n if (expected === undefined || expected.kind === 'any' || lambdaResult.kind !== 'var')\n return undefined\n if (result.kind === 'var' && result.name === lambdaResult.name) return expected\n if (\n result.kind === 'list' &&\n result.element.kind === 'var' &&\n result.element.name === lambdaResult.name &&\n expected.kind === 'list'\n )\n return expected.element\n return undefined\n}\n\nfunction unify(param: Type, arg: Type, b: Map<string, Type>): boolean {\n if (arg.kind === 'any') {\n // Anything may flow into every type variable here: `any` absorbs them, so\n // e.g. reduce's result is not typed from its lambda alone when the initial\n // value is unknown.\n for (const name of varNames(param)) b.set(name, ANY)\n return true\n }\n if (arg.kind === 'never') {\n bindNever(param, b)\n return true\n }\n switch (param.kind) {\n case 'var': {\n // Bound as given: a declared enum stays an enum through first(), sort(),\n // reduce(); literals from the source widen when a list or map holds them.\n const existing = b.get(param.name)\n if (existing?.kind === 'any') return true\n if (existing === undefined || existing.kind === 'never') {\n b.set(param.name, arg)\n return true\n }\n if (isAssignable(arg, existing)) return true\n if (isAssignable(existing, arg)) {\n b.set(param.name, arg)\n return true\n }\n b.set(param.name, unionOf([existing, arg]))\n return true\n }\n case 'list':\n if (arg.kind === 'list') return unify(param.element, arg.element, b)\n if (arg.kind === 'union') return arg.types.every((member) => unify(param, member, b))\n return false\n case 'map': {\n if (arg.kind === 'union') return arg.types.every((member) => unify(param, member, b))\n if (arg.kind !== 'map') return false\n if (!hasVar(param)) return isAssignable(arg, param)\n if (param.rest !== undefined && Object.keys(param.fields).length === 0) {\n const members = Object.values(arg.fields)\n if (arg.rest !== undefined) members.push(arg.rest)\n // A declared object may hold unlisted keys, of any type.\n else if (!isExact(arg)) members.push(ANY)\n return members.length === 0 || unify(param.rest, unionOf(members), b)\n }\n return isAssignable(arg, param)\n }\n case 'union': {\n if (!hasVar(param)) return isAssignable(arg, param)\n // e.g. `list<U> | U` (flatMap): each member of the argument binds on its\n // own, so lists give their elements and other values (null too) bind U.\n const members = param.types\n const listMember = members.find((m) => m.kind === 'list')\n const variable = members.find((m) => m.kind === 'var')\n const concrete = members.filter((m) => !hasVar(m))\n for (const member of arg.kind === 'union' ? arg.types : [arg]) {\n if (listMember !== undefined && member.kind === 'list') {\n if (!unify(listMember, member, b)) return false\n } else if (!concrete.some((m) => isAssignable(member, m))) {\n if (variable === undefined || !unify(variable, member, b)) return false\n }\n }\n return true\n }\n case 'any':\n case 'boolean':\n case 'duration':\n case 'function':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return isAssignable(arg, param)\n }\n}\n\n/** A `never` argument (e.g. the element of `[]`) binds every free variable to never. */\nfunction bindNever(param: Type, b: Map<string, Type>): void {\n switch (param.kind) {\n case 'var':\n if (!b.has(param.name)) b.set(param.name, t.never())\n return\n case 'list':\n bindNever(param.element, b)\n return\n case 'map':\n if (param.rest !== undefined) bindNever(param.rest, b)\n for (const field of Object.values(param.fields)) bindNever(field, b)\n return\n case 'union':\n for (const member of param.types) bindNever(member, b)\n break\n case 'any':\n case 'boolean':\n case 'duration':\n case 'function':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n break\n }\n}\n\n/** The names of the type variables in a type. */\nfunction varNames(type: Type): string[] {\n switch (type.kind) {\n case 'var':\n return [type.name]\n case 'list':\n return varNames(type.element)\n case 'map':\n return [\n ...Object.values(type.fields).flatMap(varNames),\n ...(type.rest === undefined ? [] : varNames(type.rest)),\n ]\n case 'union':\n return type.types.flatMap(varNames)\n case 'function':\n return [...type.params.flatMap(varNames), ...varNames(type.result)]\n case 'any':\n case 'boolean':\n case 'duration':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return []\n }\n}\n\nfunction hasVar(type: Type): boolean {\n switch (type.kind) {\n case 'var':\n return true\n case 'list':\n return hasVar(type.element)\n case 'map':\n return (\n (type.rest !== undefined && hasVar(type.rest)) || Object.values(type.fields).some(hasVar)\n )\n case 'union':\n return type.types.some(hasVar)\n case 'function':\n return type.params.some(hasVar) || hasVar(type.result)\n case 'any':\n case 'boolean':\n case 'duration':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return false\n }\n}\n\nfunction substitute(type: Type, b: ReadonlyMap<string, Type>): Type {\n switch (type.kind) {\n case 'var':\n return b.get(type.name) ?? ANY\n case 'list':\n return t.list(substitute(type.element, b))\n case 'map': {\n const fields: Record<string, Type> = {}\n for (const [key, value] of Object.entries(type.fields)) fields[key] = substitute(value, b)\n const mapped: MapType =\n type.rest === undefined\n ? { kind: 'map', fields }\n : { kind: 'map', fields, rest: substitute(type.rest, b) }\n return mapped\n }\n case 'union':\n return unionOf(type.types.map((member) => substitute(member, b)))\n case 'function':\n return {\n kind: 'function',\n params: type.params.map((p) => substitute(p, b)),\n result: substitute(type.result, b),\n }\n case 'any':\n case 'boolean':\n case 'duration':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return type\n }\n}\n\n/** Names from other languages, with the Bonsai spelling. */\nconst FUNCTION_ALIASES: Readonly<Record<string, string>> = {\n length: 'length is a property: write x.length',\n size: 'use the length property: x.length',\n len: 'use the length property: x.length',\n count: 'use count(list) or x.length',\n contains: 'did you mean \"includes\"?',\n substring: 'did you mean \"slice\"?',\n substr: 'did you mean \"slice\"?',\n lower: 'did you mean \"toLowerCase\"?',\n upper: 'did you mean \"toUpperCase\"?',\n lowercase: 'did you mean \"toLowerCase\"?',\n uppercase: 'did you mean \"toUpperCase\"?',\n test: 'did you mean \"matches\"?',\n match: 'did you mean \"matches\"?',\n regex: 'did you mean \"matches\"?',\n distinct: 'did you mean \"unique\"?',\n uniq: 'did you mean \"unique\"?',\n average: 'did you mean \"avg\"?',\n mean: 'did you mean \"avg\"?',\n exists: 'did you mean \"some\"?',\n any: 'did you mean \"some\"?',\n all: 'did you mean \"every\"?',\n int: 'did you mean \"toNumber\" (with trunc to drop decimals)?',\n parseInt: 'did you mean \"toNumber\"?',\n parseFloat: 'did you mean \"toNumber\"?',\n Number: 'did you mean \"toNumber\"?',\n String: 'did you mean \"toString\"?',\n str: 'did you mean \"toString\"?',\n concat: 'use + to join lists or strings',\n push: 'use + to append: list + [item]',\n today: 'use startOfDay(now())',\n date: 'did you mean \"timestamp\"?',\n format: 'use formatDate, formatNumber, or a template',\n isNull: 'compare with == null',\n}\n\n/** JavaScript globals people reach for, with what to write instead. */\nconst JS_GLOBALS: Readonly<Record<string, string>> = {\n Math: 'call the function directly, e.g. max(a, b), round(x), abs(x)',\n Date: 'use now() or timestamp(\"2026-01-31\")',\n JSON: 'expressions work on values directly',\n Object: 'use keys(map), values(map), entries(map)',\n Number: 'use toNumber(x)',\n String: 'use toString(x)',\n Array: 'use a list literal [...]',\n}\n\n/** Longest receiver path a diagnostic message names instead of its type. */\nconst MESSAGE_PATH_TEXT = 60\n\n/**\n * A receiver as the expression reads it (`customer.address`), for messages\n * people who write rules can follow; undefined unless it is a plain path of\n * names that fits in a message.\n */\nfunction pathText(node: Node): string | undefined {\n let suffix = ''\n let current = node\n while (current.type === 'Member') {\n suffix = `${current.optional ? '?.' : '.'}${current.name}${suffix}`\n if (suffix.length > MESSAGE_PATH_TEXT) return undefined\n current = current.object\n }\n if (current.type !== 'Variable' && current.type !== 'Local') return undefined\n const text = `${current.name}${suffix}`\n return text.length > MESSAGE_PATH_TEXT ? undefined : text\n}\n\n/**\n * \"Did you mean\" hints cost an edit distance per candidate, so a source full of\n * typos against a large schema is bounded: hints for the first unknown names\n * only, each against a bounded number of candidates.\n */\nconst MAX_SUGGESTIONS = 16\nlet suggestionsLeft = MAX_SUGGESTIONS\n\n/**\n * Why a side that may hold several kinds (`s ?? 0` is a string or a number)\n * cannot be ordered, as a message suffix; undefined for a side of one kind.\n */\nfunction mixedKinds(type: Type, side: 'left' | 'right'): string | undefined {\n if (type.kind !== 'union') return undefined\n const kinds = [...new Set(type.types.map((member) => member.kind))]\n if (kinds.length < 2) return undefined\n return `: the ${side} side may be a ${kinds.join(' or a ')}, and an ordering compares values of one kind`\n}\n\n/** Whether one insertion, deletion, or substitution (ignoring case) turns `a` into `b`. */\nfunction withinOneEdit(a: string, b: string): boolean {\n const x = a.toLowerCase()\n const y = b.toLowerCase()\n if (Math.abs(x.length - y.length) > 1) return false\n let i = 0\n while (i < x.length && i < y.length && x[i] === y[i]) i++\n // Past the first difference, the rest must match after skipping one character.\n if (x.length === y.length) return x.slice(i + 1) === y.slice(i + 1)\n return x.length < y.length ? x.slice(i) === y.slice(i + 1) : x.slice(i + 1) === y.slice(i)\n}\n\n/** The closest candidate by edit distance, if one is close enough, within this check's budget. */\nfunction suggest(name: string, candidatesOf: () => Iterable<string>): string | undefined {\n if (suggestionsLeft <= 0) return undefined\n suggestionsLeft--\n return closest(name, candidatesOf())\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"checker.mjs","names":[],"sources":["../../src/check/checker.ts"],"sourcesContent":["import { bindImplicit } from './bind.js'\nimport { BonsaiLimitError, type DiagnosticCode, type Finding } from '../errors.js'\nimport { BUILTINS, RESULT_REFINERS } from '../functions/builtins.js'\nimport { isStackOverflow, tooDeep } from '../runtime/overflow.js'\nimport { closest, didYouMean } from '../suggest.js'\nimport { BLOCKED_NAMES } from '../syntax/lexer.js'\nimport { writtenWithExponent } from '../syntax/parser.js'\nimport { signatureText, type FunctionDef, type Overload } from '../functions/define.js'\nimport {\n forEachChild,\n type CallNode,\n type LambdaNode,\n type MemberNode,\n type Node,\n} from '../syntax/ast.js'\nimport {\n chargeTypeWork,\n exactObject,\n freshLiteral,\n fieldOf,\n isAssignable,\n isExact,\n isProvenAssignable,\n isNullable,\n nonNull,\n overlaps,\n sameType,\n t,\n TypeBudgetExceeded,\n unionMembers,\n unionOf,\n widen,\n widenFresh,\n withFields,\n withTypeBudget,\n typeText,\n type MapType,\n type Type,\n} from '../types.js'\n\n/** What the checker needs to know about an environment. */\nexport interface CheckEnv {\n /** Declared context variables; undefined when none are declared. */\n readonly variables: Readonly<Record<string, Type>> | undefined\n /** Unknown variables are errors (otherwise they have type `any`). */\n readonly strict: boolean\n lookup: (name: string) => FunctionDef | undefined\n functionNames: () => Iterable<string>\n}\n\n/** How the compiler should invoke a call. */\nexport interface CallPlan {\n readonly def: FunctionDef\n /** Candidate overload indices, in declaration order. */\n readonly candidates: readonly number[]\n /**\n * An argument was accepted gradually: an open object that may hold an\n * optional key of the parameter with another type. Checked at run time.\n */\n readonly gradual?: boolean\n}\n\nexport interface Analysis {\n /** The tree with implicit lambdas made explicit. */\n readonly root: Node\n readonly type: Type\n readonly diagnostics: readonly Finding[]\n readonly calls: ReadonlyMap<CallNode, CallPlan>\n readonly types: ReadonlyMap<Node, Type>\n /** Whether evaluation may call an async host function. */\n readonly async: boolean\n /**\n * The checker could not prove the result matches the expected type (part of\n * it is `any`, or an open object may hold an unlisted key): check the result\n * at run time.\n */\n readonly checkResult: boolean\n readonly references: {\n readonly variables: readonly string[]\n readonly functions: readonly string[]\n }\n /** The scope at the probe variable, when one was requested and reached. */\n readonly probeScope?: ProbeScope | undefined\n /** For `object.probe`: what reading each field the object lists gives there. */\n readonly probeMembers?: ReadonlyMap<string, Type> | undefined\n}\n\nexport interface CheckOptions {\n readonly expected?: Type | undefined\n /** Tooling: a variable name whose lexical scope should be recorded. */\n readonly probe?: string | undefined\n}\n\n/** The lexical scope at a probed position (for completions). */\nexport interface ProbeScope {\n readonly locals: ReadonlyMap<string, Type>\n readonly it: Type | undefined\n}\n\n/**\n * Paths (see pathKey) known to be non-null, as a chain of frames so entering a\n * condition adds only its own facts (a long `&&` chain stays linear).\n */\ninterface Facts {\n readonly keys: ReadonlySet<string>\n readonly parent: Facts | undefined\n /** Facts about `.` from enclosing frames do not reach a new implicit lambda. */\n readonly hidesIt: boolean\n}\n\nfunction hasFact(facts: Facts | undefined, key: string): boolean {\n const aboutIt = key === 'it' || key.startsWith('it.') || key.startsWith('it[')\n for (let frame = facts; frame !== undefined; frame = frame.parent) {\n if (frame.keys.has(key)) return true\n if (frame.hidesIt && aboutIt) return false\n }\n return false\n}\n\ninterface Scope {\n readonly locals: ReadonlyMap<string, Type>\n /** Type of the implicit parameter `.` in the innermost implicit lambda. */\n readonly it: Type | undefined\n /** Paths known to be non-null here, from enclosing conditions. */\n readonly nonNull?: Facts | undefined\n}\n\n/**\n * Type work allowed per analysis: generous for the largest sources the parse\n * limits admit, small enough that a pathological one fails fast.\n */\nconst CHECK_BUDGET = 500_000\n\n/** Whether a type explicitly admits null (unlike `any`, which admits everything). */\nfunction mayBeNull(type: Type): boolean {\n return type.kind === 'null' || (type.kind === 'union' && type.types.some(mayBeNull))\n}\n\n/** The node whose value is the result (the body of lets, the last expression). */\nfunction resultSpan(node: Node): Node {\n return node.type === 'Let' ? resultSpan(node.body) : node\n}\n\n/** Why `actual` does not satisfy `expected`, naming missing and unexpected fields. */\nfunction expectationProblem(actual: Type, expected: Type): string | undefined {\n if (expected.kind === 'map' && actual.kind === 'map') {\n const missing = Object.keys(expected.fields).filter(\n (key) =>\n !Object.hasOwn(actual.fields, key) &&\n actual.rest === undefined &&\n !isNullable(expected.fields[key]),\n )\n const wrong = Object.keys(expected.fields).filter((key) => {\n const field = fieldOf(actual, key)\n return field !== undefined && !isAssignable(field, expected.fields[key])\n })\n const rest = expected.rest\n const wrongRest =\n rest === undefined\n ? []\n : Object.keys(actual.fields).filter(\n (key) =>\n !Object.hasOwn(expected.fields, key) && !isAssignable(actual.fields[key], rest),\n )\n const parts: string[] = []\n if (missing.length > 0) parts.push(`missing ${missing.map((k) => `\"${k}\"`).join(', ')}`)\n for (const key of wrong) {\n parts.push(\n `\"${key}\" should be ${typeText(expected.fields[key])} but is ${typeText(fieldOf(actual, key) as Type)}`,\n )\n }\n for (const key of wrongRest) {\n parts.push(\n `\"${key}\" should be ${typeText(rest as Type)} but is ${typeText(actual.fields[key])}`,\n )\n }\n if (parts.length > 0)\n return `The result does not match ${typeText(expected)}: ${parts.join('; ')}`\n if (isAssignable(actual, expected)) return undefined\n }\n if (isAssignable(actual, expected)) return undefined\n return `Expected the expression to produce ${typeText(expected)} but it produces ${typeText(actual)}`\n}\n\n/**\n * Fields a map literal adds beyond an expected object type. An expected type\n * means \"has at least these fields\", so they are allowed (and kept in the\n * result), but often a misspelling: a warning, not an error.\n */\nfunction unexpectedFields(actual: Type, expected: Type): string | undefined {\n if (expected.kind !== 'map' || actual.kind !== 'map') return undefined\n if (expected.rest !== undefined || !isExact(actual)) return undefined\n const extra = Object.keys(actual.fields).filter((key) => !Object.hasOwn(expected.fields, key))\n if (extra.length === 0) return undefined\n const names = extra.map((k) => `\"${k}\"`).join(', ')\n const them = extra.length === 1 ? 'it' : 'them'\n return `unexpected ${names} for ${typeText(expected)}; the result keeps ${them}${suggestAll(extra, Object.keys(expected.fields))}`\n}\n\n/**\n * Where `name` is written in a member read: the name after `.`, or the text\n * inside the quotes of `x[\"name\"]`. Undefined when the source does not spell\n * it out (an escaped key, a computed one), so no quick-fix is offered.\n */\nfunction nameSpan(at: Node, name: string): { start: number; end: number } | undefined {\n if (at.type === 'Member') {\n if (at.nameStart === undefined || at.nameEnd === undefined) return undefined\n return at.nameEnd - at.nameStart === name.length\n ? { start: at.nameStart, end: at.nameEnd }\n : undefined\n }\n if (at.type === 'Index' && at.index.type === 'Literal' && typeof at.index.value === 'string') {\n // The literal's source is the name between two quotes only when nothing is escaped.\n const { start, end } = at.index\n return end - start - 2 === name.length ? { start: start + 1, end: end - 1 } : undefined\n }\n return undefined\n}\n\nfunction suggestAll(names: readonly string[], candidates: readonly string[]): string {\n return names.map((name) => didYouMean(suggest(name, () => candidates))).join('')\n}\n\nconst pathKeys = new WeakMap<Node, string | null>()\n\n/**\n * A stable key for a readable path, or undefined. `m.a` and `m[\"a\"]` share a\n * key: segments are `.\"name\"` (JSON-quoted, so no two paths collide) or `[n]`.\n */\nfunction pathKey(node: Node): string | undefined {\n const cached = pathKeys.get(node)\n if (cached !== undefined) return cached ?? undefined\n const key = computePathKey(node)\n pathKeys.set(node, key ?? null)\n return key\n}\n\nfunction computePathKey(node: Node): string | undefined {\n switch (node.type) {\n case 'Variable':\n return `v:${node.name}`\n case 'Local':\n return `l:${node.name}`\n case 'It':\n return 'it'\n case 'Member': {\n const base = pathKey(node.object)\n return base === undefined ? undefined : `${base}.${JSON.stringify(node.name)}`\n }\n case 'Index': {\n const base = pathKey(node.object)\n if (base === undefined || node.index.type !== 'Literal') return undefined\n const { value } = node.index\n if (typeof value === 'string') return `${base}.${JSON.stringify(value)}`\n return typeof value === 'number' ? `${base}[${value}]` : undefined\n }\n case 'Binary':\n case 'Call':\n case 'Conditional':\n case 'Has':\n case 'Lambda':\n case 'Let':\n case 'List':\n case 'Literal':\n case 'Map':\n case 'Template':\n case 'Try':\n case 'Unary':\n default:\n return undefined\n }\n}\n\nconst factMemo = [\n new WeakMap<Node, ReadonlySet<string>>(),\n new WeakMap<Node, ReadonlySet<string>>(),\n]\n\n/** Paths that are non-null whenever `condition` evaluates to `positive`. */\nfunction nonNullFacts(condition: Node, positive: boolean): ReadonlySet<string> {\n const memo = factMemo[positive ? 1 : 0]\n let facts = memo.get(condition)\n if (facts === undefined) {\n facts = computeFacts(condition, positive)\n memo.set(condition, facts)\n }\n return facts\n}\n\nfunction computeFacts(condition: Node, positive: boolean): ReadonlySet<string> {\n const out = new Set<string>()\n switch (condition.type) {\n case 'Unary':\n return condition.operator === '!' ? nonNullFacts(condition.operand, !positive) : out\n case 'Binary': {\n const { operator, left, right } = condition\n if (operator === '&&' || operator === '||') {\n const a = nonNullFacts(left, positive)\n const b = nonNullFacts(right, positive)\n // a && b true (or a || b false): both hold. Otherwise only common facts.\n if ((operator === '&&') === positive) {\n if (a.size === 0) return b\n if (b.size === 0) return a\n return new Set([...a, ...b])\n }\n return new Set([...a].filter((key) => b.has(key)))\n }\n if (operator === '!=' || operator === '==') {\n const holds = (operator === '!=') === positive\n if (!holds) return out\n let subject: Node | undefined\n if (right.type === 'Literal' && right.value === null) subject = left\n else if (left.type === 'Literal' && left.value === null) subject = right\n const key = subject === undefined ? undefined : pathKey(subject)\n if (key !== undefined) out.add(key)\n return out\n }\n if (positive && ['<', '<=', '>', '>='].includes(operator)) {\n // An ordering comparison is only true when both sides are non-null.\n for (const side of [left, right]) {\n const key = pathKey(side)\n if (key !== undefined) out.add(key)\n }\n }\n return out\n }\n case 'Has': {\n // has(a.b.c) is true only when a.b is a map (so a and a.b are not null);\n // the value at a.b.c itself may be null.\n if (!positive) return out\n for (let node: Node = condition.target.object; ;) {\n const key = pathKey(node)\n if (key !== undefined) out.add(key)\n if (node.type !== 'Member' && node.type !== 'Index') break\n node = node.object\n }\n return out\n }\n case 'Call':\n case 'Conditional':\n case 'Index':\n case 'It':\n case 'Lambda':\n case 'Let':\n case 'List':\n case 'Literal':\n case 'Local':\n case 'Map':\n case 'Member':\n case 'Template':\n case 'Try':\n case 'Variable':\n default: {\n // A path used as a condition is non-null when it is true.\n const key = positive ? pathKey(condition) : undefined\n if (key !== undefined) out.add(key)\n return out\n }\n }\n}\n\nfunction withFacts(scope: Scope, facts: ReadonlySet<string>): Scope {\n if (facts.size === 0) return scope\n return { ...scope, nonNull: { keys: facts, parent: scope.nonNull, hidesIt: false } }\n}\n\n/** The field names of a path key suffix (`.\"a\".\"b\"`), or undefined at an index. */\nfunction pathSegments(suffix: string): string[] | undefined {\n const out: string[] = []\n const segment = /^\\.(?<name>\"(?:[^\"\\\\]|\\\\.)*\")/u\n let rest = suffix\n while (rest !== '') {\n const match = segment.exec(rest)\n if (match === null) return undefined\n out.push(JSON.parse(match.groups?.name ?? '\"\"') as string)\n rest = rest.slice(match[0].length)\n }\n return out\n}\n\n/** Marks the value at `path` (segments after the root) as non-null inside `type`. */\nfunction refinePath(type: Type, path: readonly string[]): Type {\n if (path.length === 0) return nonNull(type)\n if (type.kind === 'union') return unionOf(type.types.map((member) => refinePath(member, path)))\n if (type.kind !== 'map') return type\n const [head, ...rest] = path as [string, ...string[]]\n const field = fieldOf(type, head) ?? type.rest\n if (field === undefined) return type\n return withFields(type, { ...type.fields, [head]: refinePath(field, rest) })\n}\n\nconst ANY = t.any()\nconst NUMBER = t.number()\nconst STRING = t.string()\nconst BOOLEAN = t.boolean()\nconst NULL = t.null()\nconst OPTIONAL_BOOLEAN = t.optional(BOOLEAN)\nconst NUMBER_OR_DURATION = t.union(NUMBER, t.duration())\n/** Re-checks of a lambda whose parameter types depend on its own result. */\nconst MAX_LAMBDA_ROUNDS = 4\n\n/** The element type of a list, or of a union of lists; undefined for anything else. */\nfunction elementOf(type: Type | undefined): Type | undefined {\n if (type === undefined) return undefined\n if (type.kind === 'any' || type.kind === 'var') return ANY\n if (type.kind === 'list') return type.element\n if (type.kind !== 'union') return undefined\n const elements: Type[] = []\n for (const member of type.types) {\n const element = elementOf(member)\n if (element === undefined) return undefined\n elements.push(element)\n }\n return unionOf(elements)\n}\n\n/**\n * A map type, or a union of map types merged into one: keys every member has\n * keep their (joined) types, keys only some members have move to `rest`.\n */\nconst mapOfMemo = new WeakMap<Type, MapType | null>()\n\nfunction mapOf(type: Type): MapType | undefined {\n if (type.kind === 'map') return type\n if (type.kind !== 'union') return undefined\n const memo = mapOfMemo.get(type)\n if (memo !== undefined) return memo ?? undefined\n const merged = mergeMaps(type)\n mapOfMemo.set(type, merged ?? null)\n return merged\n}\n\nconst ORDERING: ReadonlySet<string> = new Set(['<', '<=', '>', '>='])\n\n/** The text of a constant key: \"a\" or `a` (a template without substitutions). */\nfunction constantText(node: Node): string | undefined {\n if (node.type === 'Literal') return typeof node.value === 'string' ? node.value : undefined\n if (node.type !== 'Template') return undefined\n let text = ''\n for (const part of node.parts) {\n if (typeof part !== 'string') return undefined\n text += part\n }\n return text\n}\n\n/** The map a union of maps reads as: fields every member has, the rest optional. */\nfunction mergeMaps(type: Type & { kind: 'union' }): MapType | undefined {\n const members = unionMembers(type)\n chargeTypeWork(members.length)\n if (!members.every((m): m is MapType => m.kind === 'map')) return undefined\n const fields: Record<string, Type> = {}\n const partial: Type[] = []\n const keys = new Set(members.flatMap((m) => Object.keys(m.fields)))\n // Every key is looked up in every member.\n chargeTypeWork(keys.size * members.length)\n for (const key of keys) {\n const found = members.map((m) => fieldOf(m, key) ?? m.rest)\n const present = found.filter((f): f is Type => f !== undefined)\n if (present.length < members.length) partial.push(...present)\n // A member that has the key only through `rest` may not hold it at all.\n else if (members.some((m) => fieldOf(m, key) === undefined))\n fields[key] = t.optional(unionOf(present))\n else fields[key] = unionOf(present)\n }\n for (const m of members) if (m.rest !== undefined) partial.push(m.rest)\n if (partial.length > 0) {\n // A declared object may hold any other key, with any value.\n if (members.some((m) => m.rest === undefined && !isExact(m))) partial.push(ANY)\n return { kind: 'map', fields, rest: unionOf(partial) }\n }\n return members.every(isExact) ? exactObject(fields) : t.object(fields)\n}\n\n/**\n * Checks a parsed expression. Checking time is bounded: a source that would\n * need too much type work fails with a TOO_COMPLEX limit error.\n */\nexport function analyze(root: Node, env: CheckEnv, options: CheckOptions = {}): Analysis {\n const outerSuggestions = suggestionsLeft\n suggestionsLeft = MAX_SUGGESTIONS\n try {\n return withTypeBudget(CHECK_BUDGET, () => analyzeWithin(root, env, options))\n } catch (error) {\n if (isStackOverflow(error)) throw tooDeep(undefined, error)\n if (!(error instanceof TypeBudgetExceeded)) throw error\n throw new BonsaiLimitError('TOO_COMPLEX', 'Expression is too complex to check', {\n span: { start: root.start, end: root.end },\n })\n } finally {\n suggestionsLeft = outerSuggestions\n }\n}\n\nfunction analyzeWithin(root: Node, env: CheckEnv, options: CheckOptions): Analysis {\n const diagnostics: Finding[] = []\n const calls = new Map<CallNode, CallPlan>()\n const types = new Map<Node, Type>()\n const asyncNodes = new Set<Node>()\n // Ordering comparisons whose false (from a null side) becomes a verdict, not a skip.\n const verdicts = new WeakSet<Node>()\n // The verdict passes through the parts whose value becomes the outer value.\n const nullFalseMatters = (node: Node): void => {\n if (node.type === 'Conditional') {\n nullFalseMatters(node.then)\n nullFalseMatters(node.otherwise)\n } else if (node.type === 'Let') nullFalseMatters(node.body)\n else if (node.type === 'Try') {\n nullFalseMatters(node.body)\n nullFalseMatters(node.fallback)\n }\n if (node.type !== 'Binary') return\n if (node.operator === '&&' || node.operator === '||') {\n nullFalseMatters(node.left)\n nullFalseMatters(node.right)\n } else if (ORDERING.has(node.operator)) verdicts.add(node)\n else if (node.operator === '==' || node.operator === '!=') {\n // x == true and x != false keep x's own value.\n const keeps = (n: Node): boolean =>\n n.type === 'Literal' && n.value === (node.operator === '==')\n if (keeps(node.right)) nullFalseMatters(node.left)\n else if (keeps(node.left)) nullFalseMatters(node.right)\n }\n }\n const variables = new Set<string>()\n const functions = new Set<string>()\n let probeScope: ProbeScope | undefined\n let probeMembers: ReadonlyMap<string, Type> | undefined\n\n const reported = new Set<string>()\n const report = (\n code: DiagnosticCode,\n message: string,\n at: { start: number; end: number },\n severity: 'error' | 'warning' = 'error',\n suggestion?: string,\n ): void => {\n const key = `${at.start}:${at.end}:${code}:${message}`\n if (reported.has(key)) return\n reported.add(key)\n diagnostics.push(\n suggestion === undefined\n ? { code, message, severity, start: at.start, end: at.end }\n : { code, message, severity, start: at.start, end: at.end, suggestion },\n )\n }\n /** Drops diagnostics after `mark` (a re-check or a speculative check). */\n const truncate = (mark: number): void => {\n for (let i = mark; i < diagnostics.length; i++) {\n const d = diagnostics[i]\n reported.delete(`${d.start}:${d.end}:${d.code}:${d.message}`)\n }\n diagnostics.length = mark\n }\n\n /**\n * The last result of each call that takes a lambda, by the types of the\n * outer locals it reads. Re-checking an outer lambda (reduce's accumulator)\n * then reuses inner calls that do not depend on what changed, instead of\n * redoing their own re-checks (which would multiply with nesting depth).\n * One entry per node keeps `types` and `calls` consistent: only computing\n * this node writes the entries for its subtree.\n */\n const callMemo = new WeakMap<\n CallNode,\n {\n expected: Type | undefined\n inputs: readonly Type[]\n type: Type\n diagnostics: readonly Finding[]\n }\n >()\n\n // === pass 1: bind the implicit parameter ===\n\n const binding = bindImplicit(root, (name) => env.lookup(name))\n for (const problem of binding.problems) report('INVALID_LAMBDA', problem.message, problem.at)\n const boundRoot = binding.root\n\n // === pass 2: types ===\n\n const rootScope: Scope = { locals: new Map(), it: undefined }\n const raw = check(boundRoot, rootScope, options.expected)\n // The expectation sees literal types (a plan enum accepts \"pro\"); the result shows base kinds.\n let checkResult = false\n if (options.expected !== undefined) {\n const problem = expectationProblem(raw, options.expected)\n if (problem !== undefined) report('EXPECTED_TYPE', problem, resultSpan(boundRoot))\n const extra = unexpectedFields(raw, options.expected)\n if (extra !== undefined) report('EXPECTED_TYPE', extra, resultSpan(boundRoot), 'warning')\n checkResult = containsAny(raw) || !isProvenAssignable(raw, options.expected)\n }\n const type = widen(raw)\n\n /**\n * The type of `node`. `expected` is the type the context wants, so a literal\n * that fits it (`\"pro\"` for a plan enum) keeps its literal type in lists and maps.\n */\n function check(node: Node, scope: Scope, expected?: Type): Type {\n chargeTypeWork(1)\n let result = checkNode(node, scope, expected)\n if (scope.nonNull !== undefined) {\n const key = pathKey(node)\n if (key !== undefined && hasFact(scope.nonNull, key)) result = nonNull(result)\n }\n types.set(node, result)\n return result\n }\n\n /**\n * What `object.name` reads as here, for each field the object's maps list:\n * the type check() would give that read, narrowing included (for completions).\n */\n function readsOf(probe: MemberNode, objectType: Type, scope: Scope): Map<string, Type> {\n const names = new Set<string>()\n for (const member of unionMembers(nonNull(objectType))) {\n if (member.kind === 'map') for (const name of Object.keys(member.fields)) names.add(name)\n }\n chargeTypeWork(names.size)\n const reads = new Map<string, Type>()\n const mark = diagnostics.length\n for (const name of names) {\n const read: MemberNode = { ...probe, name }\n let readType = memberType(objectType, name, read)\n const key = scope.nonNull === undefined ? undefined : pathKey(read)\n if (key !== undefined && hasFact(scope.nonNull, key)) readType = nonNull(readType)\n reads.set(name, readType)\n }\n // Reading a candidate is not a finding about the source.\n truncate(mark)\n return reads\n }\n\n function markAsync(node: Node, child: Node): void {\n if (asyncNodes.has(child)) asyncNodes.add(node)\n }\n\n /** The literal type when it satisfies the expected type, otherwise its base kind. */\n function fit(actual: Type, expected: Type | undefined): Type {\n return expected !== undefined &&\n expected.kind !== 'any' &&\n expected.kind !== 'var' &&\n isAssignable(actual, expected)\n ? actual\n : widenFresh(actual)\n }\n\n function checkNode(node: Node, scope: Scope, expected: Type | undefined): Type {\n switch (node.type) {\n case 'Literal':\n if (\n typeof node.value === 'number' &&\n Number.isInteger(node.value) &&\n Math.abs(node.value) > Number.MAX_SAFE_INTEGER &&\n !writtenWithExponent(node)\n ) {\n report(\n 'UNSAFE_INTEGER',\n 'This number is past 2^53, where neighbouring integers are not all distinct (9007199254740993 reads as ...992)',\n node,\n 'warning',\n )\n }\n return node.value === null ? NULL : freshLiteral(node.value)\n case 'Template':\n for (const part of node.parts) {\n if (typeof part === 'string') continue\n const partType = check(part, scope)\n markAsync(node, part)\n if (\n !isAssignable(\n partType,\n t.union(STRING, NUMBER, BOOLEAN, NULL, t.timestamp(), t.duration()),\n )\n ) {\n report('TYPE_ERROR', `Cannot render ${typeText(partType)} in a template`, part)\n }\n }\n // `a` with nothing substituted is the constant \"a\".\n const text = constantText(node)\n return text === undefined ? STRING : freshLiteral(text)\n case 'Variable': {\n if (node.name === options.probe) {\n probeScope = { locals: scope.locals, it: scope.it }\n return ANY\n }\n variables.add(node.name)\n const declared =\n env.variables !== undefined && Object.hasOwn(env.variables, node.name)\n ? env.variables[node.name]\n : undefined\n if (declared !== undefined) return declared\n if (env.strict) {\n const suggestion = suggest(node.name, () => Object.keys(env.variables ?? {}))\n report(\n 'UNKNOWN_VARIABLE',\n `Unknown variable \"${node.name}\"${didYouMean(suggestion)}`,\n node,\n 'error',\n suggestion,\n )\n } else if (env.variables !== undefined) {\n // Undeclared names read the context, but one edit from a declared\n // name is most likely a typo of it.\n const suggestion = suggest(node.name, () => Object.keys(env.variables ?? {}))\n if (suggestion !== undefined && withinOneEdit(node.name, suggestion)) {\n report(\n 'UNKNOWN_VARIABLE',\n `\"${node.name}\" is not declared and reads the context as any${didYouMean(suggestion)}`,\n node,\n 'warning',\n suggestion,\n )\n }\n }\n return ANY\n }\n case 'Local':\n return scope.locals.get(node.name) ?? ANY\n case 'It':\n return scope.it ?? ANY\n case 'Member': {\n const objectType = check(node.object, scope)\n markAsync(node, node.object)\n if (node.name === options.probe) probeMembers = readsOf(node, objectType, scope)\n return memberType(objectType, node.name, node)\n }\n case 'Index': {\n const objectType = check(node.object, scope)\n const indexType = check(node.index, scope)\n markAsync(node, node.object)\n markAsync(node, node.index)\n return indexedType(objectType, indexType, node)\n }\n case 'Call':\n return checkCall(node, scope, expected)\n case 'Unary': {\n if (node.operator === '!') nullFalseMatters(node.operand)\n const operand = check(node.operand, scope)\n markAsync(node, node.operand)\n if (node.operator === '!') {\n expectLogic(operand, node.operand, '!')\n return BOOLEAN\n }\n // An unknown operand gives an unknown result, checked when it runs (as\n // x - 1 does): typing it number | duration would reject round(-x).\n if (operand.kind === 'any' || operand.kind === 'var') return ANY\n if (operand.kind === 'never') return operand\n if (isAssignable(operand, NUMBER)) return NUMBER\n if (isAssignable(operand, t.duration())) return t.duration()\n if (isAssignable(operand, NUMBER_OR_DURATION)) return widen(operand)\n report('TYPE_ERROR', `Cannot negate ${typeText(operand)}`, node)\n return ANY\n }\n case 'Binary':\n return checkBinary(node, scope, expected)\n case 'Conditional': {\n nullFalseMatters(node.test)\n const test = check(node.test, scope)\n expectLogic(test, node.test, 'A condition')\n const a = check(node.then, withFacts(scope, nonNullFacts(node.test, true)), expected)\n const b = check(node.otherwise, withFacts(scope, nonNullFacts(node.test, false)), expected)\n markAsync(node, node.test)\n markAsync(node, node.then)\n markAsync(node, node.otherwise)\n return unionOf([a, b])\n }\n case 'List': {\n const expectedItem = elementOf(expected)\n const elements: Type[] = []\n for (const item of node.items) {\n if (item.type === 'Spread') {\n const spread = check(item.argument, scope)\n markAsync(node, item.argument)\n const element = elementOf(nonNull(spread))\n if (element !== undefined) elements.push(element)\n else if (nonNull(spread).kind !== 'never')\n report(\n 'TYPE_ERROR',\n `Only a list can be spread into a list, not ${typeText(spread)}`,\n item,\n )\n } else {\n elements.push(fit(check(item, scope, expectedItem), expectedItem))\n markAsync(node, item)\n }\n }\n if (elements.length === 0) return t.list(t.never())\n // Items that all fit the expected item type (an allow-list of a large\n // enum) keep their literals rather than collapsing to the base kind.\n const fits =\n expectedItem !== undefined &&\n expectedItem.kind !== 'any' &&\n elements.every((element) => isAssignable(element, expectedItem))\n return t.list(unionOf(elements, !fits))\n }\n case 'Map': {\n const expectedMap = expected === undefined ? undefined : mapOf(nonNull(expected))\n const fields: Record<string, Type> = {}\n let rest: Type | undefined\n // A literal holds exactly its keys, unless a spread may add unknown ones.\n let exact = true\n for (const entry of node.entries) {\n if (entry.type === 'Spread') {\n const spread = check(entry.argument, scope)\n markAsync(node, entry.argument)\n const mapped = mapOf(nonNull(spread))\n if (mapped !== undefined) {\n // A spread may overwrite any earlier field it does not declare,\n // unless it is exact (a literal) and lists every key it has.\n const spreadExact = isExact(mapped)\n if (!spreadExact || mapped.rest !== undefined) {\n const keys = Object.keys(fields)\n chargeTypeWork(keys.length)\n for (const key of keys) {\n if (!Object.hasOwn(mapped.fields, key)) {\n if (mapped.rest !== undefined) fields[key] = unionOf([fields[key], mapped.rest])\n else fields[key] = ANY\n }\n }\n }\n chargeTypeWork(Object.keys(mapped.fields).length)\n // What a key not listed so far may already hold: the computed and\n // record entries' values, or anything after an open declared object.\n const unlisted = exact ? rest : ANY\n if (mayBeNull(spread)) {\n // A null spread adds nothing: its keys may be absent.\n for (const [key, field] of Object.entries(mapped.fields)) {\n fields[key] = Object.hasOwn(fields, key)\n ? unionOf([fields[key], field])\n : t.optional(unlisted === undefined ? field : unionOf([unlisted, field]))\n }\n } else {\n for (const [key, field] of Object.entries(mapped.fields)) {\n // An optional field of a declared object may be absent and leave\n // an earlier value in place; a literal's keys are always there.\n const earlier = Object.hasOwn(fields, key) ? fields[key] : unlisted\n fields[key] =\n earlier !== undefined && !spreadExact && mayBeNull(field)\n ? unionOf([earlier, field])\n : field\n }\n }\n if (mapped.rest !== undefined)\n rest = rest === undefined ? mapped.rest : unionOf([rest, mapped.rest])\n else if (!spreadExact) exact = false\n } else if (nonNull(spread).kind === 'any') {\n // An unknown map may overwrite every earlier field.\n const keys = Object.keys(fields)\n chargeTypeWork(keys.length)\n for (const key of keys) fields[key] = ANY\n rest = ANY\n } else if (nonNull(spread).kind === 'never') continue\n else\n report(\n 'TYPE_ERROR',\n `Only a map can be spread into a map, not ${typeText(spread)}`,\n entry,\n )\n continue\n }\n const expectedField =\n expectedMap === undefined || typeof entry.key !== 'string'\n ? undefined\n : (fieldOf(expectedMap, entry.key) ?? expectedMap.rest)\n const valueType = fit(check(entry.value, scope, expectedField), expectedField)\n markAsync(node, entry.value)\n const constant = typeof entry.key === 'string' ? entry.key : constantText(entry.key)\n if (typeof entry.key === 'string') fields[entry.key] = valueType\n else if (constant !== undefined) {\n // [\"a\"] or [`a`]: a constant key is a static one. A blocked one fails at run time.\n check(entry.key, scope)\n if (BLOCKED_NAMES.has(constant)) {\n report('BLOCKED_PROPERTY', `\"${constant}\" cannot be used as a key`, entry.key)\n } else fields[constant] = valueType\n } else {\n const keyType = check(entry.key, scope)\n markAsync(node, entry.key)\n if (!isAssignable(keyType, t.union(STRING, NUMBER))) {\n report(\n 'TYPE_ERROR',\n `A map key must be a string, not ${typeText(keyType)}`,\n entry.key,\n )\n } else reportBlockedKey(keyType, entry.key)\n // A computed key may overwrite any earlier field.\n const keys = Object.keys(fields)\n chargeTypeWork(keys.length)\n for (const key of keys) fields[key] = unionOf([fields[key], valueType])\n rest = rest === undefined ? valueType : unionOf([rest, valueType])\n }\n }\n // A spread declared object may hold any other key, with any value.\n if (rest !== undefined) return { kind: 'map', fields, rest: exact ? rest : ANY }\n return exact ? exactObject(fields) : t.object(fields)\n }\n case 'Lambda':\n report('INVALID_LAMBDA', 'A lambda can only be passed to a function that takes one', node)\n return ANY\n case 'Let': {\n const valueType = check(node.value, scope)\n markAsync(node, node.value)\n chargeTypeWork(scope.locals.size)\n const locals = new Map(scope.locals)\n locals.set(node.name, valueType)\n const bodyType = check(node.body, { ...scope, locals }, expected)\n markAsync(node, node.body)\n return bodyType\n }\n case 'Has': {\n // has() may probe a key a declared object does not list: it can still exist.\n const target = node.target\n if (target.type === 'Member') {\n const objectType = check(target.object, scope)\n markAsync(node, target.object)\n if (target.name === options.probe) probeMembers = readsOf(target, objectType, scope)\n types.set(target, memberType(objectType, target.name, target, true))\n } else check(target, scope)\n markAsync(node, node.target)\n return BOOLEAN\n }\n case 'Try': {\n const a = check(node.body, scope, expected)\n const b = check(node.fallback, scope, expected)\n markAsync(node, node.body)\n markAsync(node, node.fallback)\n return unionOf([a, b])\n }\n }\n throw new Error('unreachable')\n }\n\n /** A key whose every possible value is a blocked name fails whenever it runs. */\n function reportBlockedKey(keyType: Type, at: Node): void {\n const members = keyType.kind === 'union' ? keyType.types : [keyType]\n const blocked = members.every(\n (m) => m.kind === 'literal' && typeof m.value === 'string' && BLOCKED_NAMES.has(m.value),\n )\n if (blocked && members.length > 0) {\n const names = members.map((m) => (m.kind === 'literal' ? `\"${String(m.value)}\"` : ''))\n report('BLOCKED_PROPERTY', `${names.join(' or ')} cannot be used as a key`, at)\n }\n }\n\n function expectLogic(actual: Type, at: Node, what: string): void {\n if (!isAssignable(actual, OPTIONAL_BOOLEAN)) {\n report('TYPE_ERROR', `${what} expects a boolean but got ${typeText(actual)}`, at)\n } else if (mayBeNull(actual)) {\n // Null counts as false here, which ! turns into true: say which one is meant.\n report(\n 'MAYBE_NULL',\n `This value may be null, and ${what === 'A condition' ? 'a condition' : what} treats null as false; write x == true or x == false to say what null means`,\n at,\n 'warning',\n )\n }\n }\n\n /**\n * The type of `object.name`. A key a declared object does not list may still\n * exist with any value (declared objects are open); `quiet` (for has()) and\n * unions where another member has the key read it as unknown instead of failing.\n */\n function memberType(objectType: Type, name: string, at: Node, quiet = false): Type {\n if (objectType.kind === 'any' || objectType.kind === 'var') return ANY\n if (objectType.kind === 'never') return t.never()\n if (objectType.kind === 'null') return NULL\n if (objectType.kind === 'union') {\n // Another member has the key (null has none: a?.x on a missing key still fails).\n const somewhere = objectType.types.some(\n (member) =>\n member.kind !== 'null' &&\n member.kind !== 'never' &&\n (member.kind !== 'map' ||\n fieldOf(member, name) !== undefined ||\n member.rest !== undefined),\n )\n return unionOf(\n objectType.types.map((member) => memberType(member, name, at, quiet || somewhere)),\n )\n }\n if (objectType.kind === 'map') {\n const field = fieldOf(objectType, name)\n if (field !== undefined) return field\n if (objectType.rest !== undefined) return t.optional(objectType.rest)\n // A map literal holds no other keys; a declared object may.\n if (quiet) return isExact(objectType) ? NULL : ANY\n const suggestion = suggest(name, () => Object.keys(objectType.fields))\n // The span is the name itself, so a quick-fix can replace it with the suggestion.\n const span = nameSpan(at, name)\n const receiver = at.type === 'Member' || at.type === 'Index' ? pathText(at.object) : undefined\n report(\n 'UNKNOWN_PROPERTY',\n `Property \"${name}\" does not exist on ${receiver ?? typeText(objectType)}${didYouMean(suggestion)}`,\n span ?? at,\n 'error',\n span === undefined ? undefined : suggestion,\n )\n return ANY\n }\n if (\n (objectType.kind === 'list' ||\n objectType.kind === 'string' ||\n (objectType.kind === 'literal' && typeof objectType.value === 'string')) &&\n name === 'length'\n ) {\n return NUMBER\n }\n const fn = env.lookup(name)\n // `1.e3` reads \"e3\" of 1: a number does not end in \".\", so say how to write the exponent.\n const exponent =\n objectType.kind === 'literal' &&\n typeof objectType.value === 'number' &&\n /^[eE]\\d+$/u.test(name)\n report(\n 'TYPE_ERROR',\n `Cannot read property \"${name}\" of ${typeText(objectType)}${fn === undefined ? '' : `; did you mean to call ${name}()?`}${exponent ? `; for an exponent write ${String(objectType.value)}${name} or ${String(objectType.value)}.0${name}` : ''}`,\n at,\n )\n return ANY\n }\n\n function indexedType(objectType: Type, indexType: Type, at: Node): Type {\n if (objectType.kind === 'any' || objectType.kind === 'var') return ANY\n if (objectType.kind === 'never') return t.never()\n if (objectType.kind === 'null') return NULL\n if (objectType.kind === 'union') {\n // A literal key reads like a member: m[\"b\"] on a union is m.b.\n if (indexType.kind === 'literal' && typeof indexType.value === 'string')\n return memberType(objectType, indexType.value, at)\n return unionOf(objectType.types.map((member) => indexedType(member, indexType, at)))\n }\n if (\n objectType.kind === 'list' ||\n objectType.kind === 'string' ||\n (objectType.kind === 'literal' && typeof objectType.value === 'string')\n ) {\n if (!isAssignable(indexType, NUMBER))\n report('TYPE_ERROR', `An index must be a number, not ${typeText(indexType)}`, at)\n return t.optional(objectType.kind === 'list' ? objectType.element : STRING)\n }\n if (objectType.kind === 'map') {\n if (!isAssignable(indexType, t.union(STRING, NUMBER))) {\n report('TYPE_ERROR', `A map key must be a string, not ${typeText(indexType)}`, at)\n return ANY\n }\n if (indexType.kind === 'literal') return memberType(objectType, String(indexType.value), at)\n // Any key may exist on a declared object, with any value.\n if (objectType.rest === undefined && !isExact(objectType)) return ANY\n const members = Object.values(objectType.fields)\n if (objectType.rest !== undefined) members.push(objectType.rest)\n return t.optional(unionOf(members))\n }\n report('TYPE_ERROR', `Cannot index ${typeText(objectType)}`, at)\n return ANY\n }\n\n function checkBinary(\n node: Extract<Node, { type: 'Binary' }>,\n scope: Scope,\n expected: Type | undefined,\n ): Type {\n const nullish = node.operator === '??'\n // x == false (or != true) reads a null comparison's false as a verdict.\n if (node.operator === '==' || node.operator === '!=') {\n const negates = node.operator === '!='\n const negating = (n: Node): boolean => n.type === 'Literal' && n.value === negates\n if (negating(node.right)) nullFalseMatters(node.left)\n else if (negating(node.left)) nullFalseMatters(node.right)\n }\n // Joining lists: an expected list type (or the other operand's) is the\n // context for list literals, so plans + [\"free\"] stays a list of plans.\n const listContext =\n node.operator === '+' && expected !== undefined && elementOf(nonNull(expected)) !== undefined\n ? expected\n : undefined\n let leftExpected = listContext\n if (nullish && expected !== undefined) leftExpected = t.optional(expected)\n const left = check(node.left, scope, leftExpected)\n let rightScope = scope\n if (node.operator === '&&') rightScope = withFacts(scope, nonNullFacts(node.left, true))\n else if (node.operator === '||') rightScope = withFacts(scope, nonNullFacts(node.left, false))\n let rightExpected: Type | undefined = nullish ? expected : undefined\n if (node.operator === '+')\n rightExpected = listContext ?? (left.kind === 'list' ? left : undefined)\n const right = check(node.right, rightScope, rightExpected)\n markAsync(node, node.left)\n markAsync(node, node.right)\n const op = node.operator\n switch (op) {\n case '&&':\n case '||':\n expectLogic(left, node.left, `\"${op}\"`)\n expectLogic(right, node.right, `\"${op}\"`)\n return BOOLEAN\n case '??':\n if (!isNullable(left))\n report('NEVER_NULL', 'The left side of \"??\" is never null', node.left, 'warning')\n return unionOf([nonNull(left), right])\n case '==':\n case '!=':\n if (!overlaps(left, right)) {\n report(\n op === '==' ? 'ALWAYS_FALSE' : 'ALWAYS_TRUE',\n `This comparison is always ${op === '==' ? 'false' : 'true'}: ${typeText(left)} and ${typeText(right)} have no values in common`,\n node,\n 'warning',\n )\n }\n return BOOLEAN\n case '<':\n case '<=':\n case '>':\n case '>=': {\n // Ordering with null is false whatever the other side is (the spec).\n if (left.kind === 'null' || right.kind === 'null') {\n report(\n 'ALWAYS_FALSE',\n 'This comparison is always false: an ordering with null is false',\n node,\n 'warning',\n )\n return BOOLEAN\n }\n // A side that may be null is not a warning where false means \"skip\"\n // (`users.filter(.age >= 18)`), only where false becomes a verdict:\n // `user.age < 18 ? \"deny\" : \"allow\"` allows a user with no age.\n if (verdicts.has(node)) {\n for (const [side, sideType] of [\n [node.left, left],\n [node.right, right],\n ] as const) {\n if (mayBeNull(sideType)) {\n report(\n 'MAYBE_NULL',\n 'This value may be null, and a comparison with null is false; check it first (x != null && ...) or use ??',\n side,\n 'warning',\n )\n }\n }\n }\n const a = widen(nonNull(left))\n const b = widen(nonNull(right))\n const comparable = ['number', 'string', 'timestamp', 'duration']\n const ok = (x: Type): boolean =>\n x.kind === 'any' || x.kind === 'var' || x.kind === 'never' || comparable.includes(x.kind)\n if (\n !ok(a) ||\n !ok(b) ||\n (a.kind !== b.kind &&\n a.kind !== 'any' &&\n b.kind !== 'any' &&\n a.kind !== 'never' &&\n b.kind !== 'never')\n ) {\n report(\n 'TYPE_ERROR',\n `Cannot compare ${typeText(left)} with ${typeText(right)}${mixedKinds(a, 'left') ?? mixedKinds(b, 'right') ?? ''}`,\n node,\n )\n }\n return BOOLEAN\n }\n case 'in':\n case 'not in': {\n // A list literal's items keep their literal types: `plan in [\"gold\"]` can be always false.\n const literalItems =\n node.right.type === 'List' && node.right.items.every((item) => item.type !== 'Spread')\n ? node.right.items.map((item) => types.get(item) ?? ANY)\n : undefined\n const containers =\n literalItems === undefined\n ? nonNull(right)\n : t.list(literalItems.length === 0 ? t.never() : unionOf(literalItems))\n for (const container of containers.kind === 'union' ? containers.types : [containers]) {\n checkMembership(container, left, right, node)\n }\n return BOOLEAN\n }\n case '%':\n case '*':\n case '**':\n case '+':\n case '-':\n case '/':\n default:\n return arithmetic(op, left, right, node)\n }\n }\n\n function checkMembership(\n container: Type,\n left: Type,\n right: Type,\n node: Extract<Node, { type: 'Binary' }>,\n ): void {\n if (\n container.kind === 'string' ||\n (container.kind === 'literal' && typeof container.value === 'string')\n ) {\n if (!isAssignable(left, STRING))\n report(\n 'TYPE_ERROR',\n `\"in\" on text needs text on the left, not ${typeText(left)}`,\n node.left,\n )\n } else if (container.kind === 'map') {\n if (!isAssignable(left, t.union(STRING, NUMBER)))\n report('TYPE_ERROR', `\"in\" on a map needs a string key, not ${typeText(left)}`, node.left)\n } else if (container.kind === 'list') {\n if (!overlaps(left, container.element) && container.element.kind !== 'never') {\n const negated = node.operator === 'not in'\n report(\n negated ? 'ALWAYS_TRUE' : 'ALWAYS_FALSE',\n `${typeText(left)} can never be in ${typeText(container)}, so this is always ${negated ? 'true' : 'false'}`,\n node,\n 'warning',\n )\n }\n } else if (container.kind !== 'any' && container.kind !== 'never' && container.kind !== 'var') {\n report(\n 'TYPE_ERROR',\n `\"in\" needs a list, text, or map on the right, not ${typeText(right)}`,\n node.right,\n )\n }\n }\n\n function arithmetic(op: string, left: Type, right: Type, node: Node): Type {\n const a = widen(left)\n const b = widen(right)\n // `never` (e.g. an item of []) has no values, so no operation on it can fail.\n if (a.kind === 'never' || b.kind === 'never') return t.never()\n if (a.kind === 'any' || b.kind === 'any' || a.kind === 'var' || b.kind === 'var') {\n if (op === '+' && (a.kind === 'string' || b.kind === 'string')) return STRING\n return op === '+' || op === '-' || op === '*' || op === '/' ? ANY : NUMBER\n }\n const kinds = `${a.kind} ${op} ${b.kind}`\n const table: Record<string, Type> = {\n 'number + number': NUMBER,\n 'string + string': STRING,\n 'duration + duration': t.duration(),\n 'timestamp + duration': t.timestamp(),\n 'duration + timestamp': t.timestamp(),\n 'number - number': NUMBER,\n 'timestamp - timestamp': t.duration(),\n 'timestamp - duration': t.timestamp(),\n 'duration - duration': t.duration(),\n 'number * number': NUMBER,\n 'duration * number': t.duration(),\n 'number * duration': t.duration(),\n 'number / number': NUMBER,\n 'duration / number': t.duration(),\n 'duration / duration': NUMBER,\n 'number % number': NUMBER,\n 'number ** number': NUMBER,\n }\n const known = table[kinds]\n if (known !== undefined) return known\n if (op === '+') {\n // Lists (or unions of lists) concatenate.\n const x = a.kind === 'list' || a.kind === 'union' ? elementOf(a) : undefined\n const y = b.kind === 'list' || b.kind === 'union' ? elementOf(b) : undefined\n if (x !== undefined && y !== undefined) return t.list(unionOf([x, y]))\n }\n if (a.kind === 'union' || b.kind === 'union') {\n // Each combination of members must be valid; the result joins them.\n const results: Type[] = []\n for (const x of a.kind === 'union' ? a.types : [a]) {\n for (const y of b.kind === 'union' ? b.types : [b]) {\n const r = x.kind === 'null' || y.kind === 'null' ? undefined : arithmeticQuiet(op, x, y)\n if (r === undefined) {\n results.length = 0\n break\n }\n results.push(r)\n }\n if (results.length === 0) break\n }\n if (results.length > 0) return unionOf(results)\n }\n const nullable = isNullable(a) || isNullable(b)\n if (nullable) {\n const retry = arithmeticQuiet(op, nonNull(a), nonNull(b))\n if (retry !== undefined) {\n // Underline the operand that may be null, not the whole expression.\n let culprit: Node = node\n if (node.type === 'Binary') culprit = isNullable(a) ? node.left : node.right\n report(\n 'TYPE_ERROR',\n `An operand of \"${op}\" may be null; use ?? to supply a default`,\n culprit,\n )\n return retry\n }\n }\n let hint = ''\n if (op === '+' && (a.kind === 'string' || b.kind === 'string'))\n hint = '; use a template to build text'\n else if (\n (a.kind === 'timestamp' || b.kind === 'timestamp') &&\n (a.kind === 'number' || b.kind === 'number')\n )\n hint = '; use a duration such as days(30)'\n report(\n 'TYPE_ERROR',\n `Cannot apply \"${op}\" to ${typeText(left)} and ${typeText(right)}${hint}`,\n node,\n )\n return ANY\n }\n\n function arithmeticQuiet(op: string, a: Type, b: Type): Type | undefined {\n const saved = diagnostics.length\n const result = arithmetic(op, a, b, { type: 'Literal', value: null, start: 0, end: 0 })\n const failed = diagnostics.length > saved\n truncate(saved)\n return failed ? undefined : result\n }\n\n // === calls ===\n\n function checkCall(node: CallNode, scope: Scope, expected?: Type): Type {\n if (!node.args.some((arg) => arg.type === 'Lambda')) return checkCallNow(node, scope, expected)\n const free = freeLocals(node)\n const inputs = free.names.map((name) => scope.locals.get(name) ?? ANY)\n if (free.it) inputs.push(scope.it ?? ANY)\n const last = callMemo.get(node)\n if (\n last !== undefined &&\n last.expected === expected &&\n last.inputs.length === inputs.length &&\n last.inputs.every((input, i) => sameType(input, inputs[i] ?? ANY))\n ) {\n for (const d of last.diagnostics) report(d.code, d.message, d, d.severity, d.suggestion)\n return last.type\n }\n const mark = diagnostics.length\n const result = checkCallNow(node, scope, expected)\n // groupBy makes its keys map keys, so a key that is always blocked fails.\n if (node.name === 'groupBy' && env.lookup(node.name)?.host !== true) {\n const lambda = node.args.find((arg) => arg.type === 'Lambda')\n const keyType = lambda?.type === 'Lambda' ? types.get(lambda.body) : undefined\n if (lambda?.type === 'Lambda' && keyType !== undefined) reportBlockedKey(keyType, lambda.body)\n }\n callMemo.set(node, { expected, inputs, type: result, diagnostics: diagnostics.slice(mark) })\n return result\n }\n\n function checkCallNow(node: CallNode, scope: Scope, expected?: Type): Type {\n functions.add(node.name)\n const receiver = node.args[0]\n // Math.max(...) and friends. In an open environment the context may really\n // hold a variable with that name, so the hint is a warning there.\n if (\n node.style === 'method' &&\n receiver?.type === 'Variable' &&\n Object.hasOwn(JS_GLOBALS, receiver.name) &&\n (env.variables === undefined || !Object.hasOwn(env.variables, receiver.name))\n ) {\n const open = !env.strict && env.variables === undefined\n report(\n 'UNKNOWN_VARIABLE',\n `There is no ${receiver.name} object; ${JS_GLOBALS[receiver.name] ?? ''}`,\n receiver,\n open ? 'warning' : 'error',\n )\n if (!open) return ANY\n }\n const def = env.lookup(node.name)\n // every() and none() turn an item a null comparison skips into a verdict.\n if (def?.host !== true && (node.name === 'every' || node.name === 'none')) {\n for (const arg of node.args) if (arg.type === 'Lambda') nullFalseMatters(arg.body)\n }\n // With one signature, a parameter type is the context for its argument, so\n // setPlans([\"pro\"]) keeps the literal a plan enum needs.\n const only = def?.overloads.length === 1 ? def.overloads[0] : undefined\n const contextFor = (index: number): Type | undefined => {\n const param = only?.params[index] ?? only?.rest\n return param === undefined || param.kind === 'function' || hasVar(param) ? undefined : param\n }\n // Argument types, except lambdas (checked once parameter types are known).\n const argTypes: (Type | undefined)[] = node.args.map((arg, index) => {\n if (arg.type === 'Lambda') return undefined\n if (arg.type === 'Spread') {\n const spread = check(arg.argument, scope)\n markAsync(node, arg.argument)\n if (elementOf(nonNull(spread)) === undefined && nonNull(spread).kind !== 'never') {\n report(\n 'TYPE_ERROR',\n `Only a list can be spread into arguments, not ${typeText(spread)}`,\n arg,\n )\n }\n return spread\n }\n const argType = check(arg, scope, contextFor(index))\n markAsync(node, arg)\n return argType\n })\n if (def === undefined) {\n // A built-in the environment's `builtins` option leaves out.\n const excluded = BUILTINS.has(node.name)\n let alias =\n !excluded && Object.hasOwn(FUNCTION_ALIASES, node.name)\n ? FUNCTION_ALIASES[node.name]\n : undefined\n // An alias hint names its replacement in quotes ('did you mean \"includes\"?'),\n // which must itself be available.\n const replacement =\n alias === undefined ? undefined : /\"(?<name>[^\"]+)\"/u.exec(alias)?.groups?.name\n // A replacement left out by `builtins` is named as such, without a quick-fix.\n let leftOut: string | undefined\n if (replacement !== undefined && env.lookup(replacement) === undefined) {\n alias = undefined\n if (BUILTINS.has(replacement)) leftOut = replacement\n }\n let suggestion: string | undefined\n let hint: string\n if (excluded) {\n hint = `; ${node.name} is a built-in this environment does not include (add it to builtins)`\n } else if (leftOut !== undefined) {\n hint = `; the built-in for this is ${leftOut}, which this environment does not include (add it to builtins)`\n } else if (alias === undefined) {\n suggestion = suggest(node.name, () => env.functionNames())\n hint = didYouMean(suggestion)\n } else {\n suggestion = replacement\n hint = `; ${alias}`\n }\n report(\n 'UNKNOWN_FUNCTION',\n `Unknown function \"${node.name}\"${hint}`,\n { start: node.nameStart ?? node.start, end: node.nameEnd ?? node.end },\n 'error',\n suggestion,\n )\n for (const arg of node.args) if (arg.type === 'Lambda') checkLambda(arg, [], scope)\n return ANY\n }\n if (def.async === true) asyncNodes.add(node)\n\n let receiverNull = false\n if (node.optional && argTypes[0] !== undefined) {\n receiverNull = isNullable(argTypes[0])\n argTypes[0] = nonNull(argTypes[0])\n if (argTypes[0].kind === 'never') {\n // The receiver is always null, so the call never runs.\n for (const arg of node.args) if (arg.type === 'Lambda') checkLambda(arg, [], scope)\n calls.set(node, {\n def,\n candidates: def.overloads.map((_, i) => i),\n })\n return NULL\n }\n }\n\n const hasSpread = node.args.some((arg) => arg.type === 'Spread')\n if (hasSpread && def.overloads.some((o) => o.params.some((p) => p.kind === 'function'))) {\n report(\n 'INVALID_LAMBDA',\n `Spread arguments cannot be used with ${node.name}(), which takes a lambda`,\n node,\n )\n }\n const candidates: number[] = []\n const bindings: Map<string, Type>[] = []\n def.overloads.forEach((candidate, index) => {\n const b = new Map<string, Type>()\n if (matchOverload(candidate, node, argTypes, b, hasSpread)) {\n candidates.push(index)\n bindings.push(b)\n }\n })\n\n if (candidates.length === 0 && !node.args.some((arg) => arg.type === 'Lambda')) {\n // A union argument (number | duration) is fine when every member has an\n // overload: the call dispatches on the value at run time.\n const distributed = distribute(def, node, argTypes, hasSpread)\n if (distributed !== undefined) {\n calls.set(node, {\n def,\n candidates: distributed.candidates,\n })\n return receiverNull ? t.optional(distributed.result) : distributed.result\n }\n }\n\n if (candidates.length === 0) {\n reportNoOverload(node, def, argTypes, hasSpread)\n recoverLambdas(def, node, argTypes, scope)\n calls.set(node, {\n def,\n candidates: def.overloads.map((_, i) => i),\n })\n return ANY\n }\n\n // Check lambda bodies against the first candidate's parameter types.\n const first = def.overloads[candidates[0]]\n const firstBindings = bindings[0]\n let asyncLambda = false\n node.args.forEach((arg, index) => {\n if (arg.type !== 'Lambda') return\n const param = first.params[index]\n if (param?.kind !== 'function') {\n report(\n 'INVALID_LAMBDA',\n `${node.name}() does not take a lambda as argument ${index + 1}`,\n arg,\n )\n checkLambda(arg, [], scope)\n return\n }\n let paramTypes = param.params.map((p) => substitute(p, firstBindings))\n const mark = diagnostics.length\n // What the call is expected to produce tells the lambda what to return:\n // `map` returns list<U> of the lambda's U, `reduce` returns its U.\n const bodyExpected = lambdaExpected(first.result, param.result, expected)\n let bodyType = checkLambda(arg, paramTypes, scope, bodyExpected)\n unify(param.result, bodyType, firstBindings)\n // A parameter that takes the lambda's own result (reduce's accumulator)\n // widens with it: re-check until the parameter types are stable.\n for (let round = 1; ; round++) {\n // An error stands: its recovery type (`any`) would make the next round\n // clean and hide it.\n if (diagnostics.slice(mark).some((d) => d.severity === 'error')) break\n let next = param.params.map((p) => substitute(p, firstBindings))\n const changed = changedAt(next, paramTypes)\n if (changed.length === 0) break\n const last = round >= MAX_LAMBDA_ROUNDS\n if (last) next = next.map((p, i) => (changed.includes(i) ? ANY : p))\n truncate(mark)\n paramTypes = next\n bodyType = checkLambda(arg, paramTypes, scope, bodyExpected)\n unify(param.result, bodyType, firstBindings)\n if (last) {\n // Still growing: what the lambda returns (and so the call's result) is\n // unknown, and checked at run time where it matters.\n for (const name of varNames(param.result)) firstBindings.set(name, ANY)\n break\n }\n }\n if (asyncNodes.has(arg.body)) asyncLambda = true\n if (\n !hasVar(param.result) &&\n param.result.kind !== 'any' &&\n !isAssignable(bodyType, param.result)\n ) {\n const required = substitute(param.result, firstBindings)\n const onlyNull = required.kind === 'boolean' && isAssignable(bodyType, OPTIONAL_BOOLEAN)\n report(\n onlyNull ? 'MAYBE_NULL' : 'TYPE_ERROR',\n `The lambda for ${node.name}() must return ${typeText(required)} but returns ${typeText(bodyType)}`,\n arg.body,\n onlyNull ? 'warning' : 'error',\n )\n }\n })\n if (asyncLambda) asyncNodes.add(node)\n if (first.literals !== undefined) {\n const values = node.args.map((arg) => (arg.type === 'Literal' ? arg.value : undefined))\n const problem = first.literals(values)\n if (problem !== undefined) report('INVALID_ARGUMENT', problem, node)\n }\n if (def.host !== true && (def.name === 'filter' || def.name === 'find')) {\n const lambda = node.args[1]\n const element = firstBindings.get('T')\n if (lambda?.type === 'Lambda' && element !== undefined) {\n let itemPath: string | undefined\n if (lambda.implicit) itemPath = 'it'\n else if (lambda.params[0] !== undefined) itemPath = `l:${lambda.params[0]}`\n let refined = element\n for (const key of nonNullFacts(lambda.body, true)) {\n if (itemPath === undefined || (key !== itemPath && !key.startsWith(`${itemPath}.`)))\n continue\n const path = pathSegments(key.slice(itemPath.length))\n if (path !== undefined) refined = refinePath(refined, path)\n }\n firstBindings.set('T', refined)\n }\n }\n for (const name of first.ordered ?? []) {\n const boundType = firstBindings.get(name)\n if (boundType !== undefined && !orderable(boundType)) {\n report(\n 'TYPE_ERROR',\n `${node.name}() can only order numbers, text, timestamps, or durations (one kind at a time), not ${typeText(boundType)}`,\n node,\n )\n }\n }\n\n const results = candidates.map((index, i) => {\n const candidate = def.overloads[index]\n const refined =\n def.host === true || !Object.hasOwn(RESULT_REFINERS, def.name)\n ? undefined\n : refine(\n RESULT_REFINERS[def.name],\n argTypes.map((a) => a ?? ANY),\n )\n if (refined !== undefined) return refined\n const exact = substitute(candidate.result, bindings[i])\n return expected !== undefined &&\n expected.kind !== 'any' &&\n expected.kind !== 'var' &&\n isAssignable(exact, expected)\n ? exact\n : widenFresh(exact)\n })\n const gradual =\n candidates.length === 1 &&\n argTypes.some((argType, index) => {\n const param = first.params[index] ?? first.rest\n return (\n argType !== undefined &&\n param !== undefined &&\n !containsAny(argType) &&\n !isProvenAssignable(argType, param)\n )\n })\n calls.set(node, { def, candidates, ...(gradual ? { gradual } : {}) })\n // xs.includes(v) is `v in xs`: warn the same way when it can never hold.\n if (def.host !== true && def.name === 'includes' && node.args.length === 2) {\n const list = argTypes[0]\n const item = argTypes[1]\n if (\n list?.kind === 'list' &&\n item !== undefined &&\n list.element.kind !== 'never' &&\n !overlaps(item, list.element)\n ) {\n report(\n 'ALWAYS_FALSE',\n `${typeText(item)} can never be in ${typeText(list)}`,\n node,\n 'warning',\n )\n }\n }\n // Several overloads can only match when argument types are unknown; the\n // result is then unknown too, unless every candidate agrees.\n const merged = unionOf(results)\n const known = argTypes.every((argType) => argType === undefined || !containsAny(argType))\n let result = merged\n if (candidates.length > 1 && merged.kind === 'union') result = known ? results[0] : ANY\n return receiverNull ? t.optional(result) : result\n }\n\n /**\n * After a failed match, checks lambdas with the parameter types of the first\n * overload their other arguments fit, so an unfinished call being edited\n * (`reduce(lines, (acc, l) => l.`) still types `l` for completions and hover.\n */\n function recoverLambdas(\n def: FunctionDef,\n node: CallNode,\n argTypes: readonly (Type | undefined)[],\n scope: Scope,\n ): void {\n let params: readonly (readonly Type[])[] | undefined\n for (const candidate of def.overloads) {\n const b = new Map<string, Type>()\n const fits = node.args.every((arg, index) => {\n const param = candidate.params[index]\n const argType = argTypes[index]\n if (arg.type === 'Lambda') return param?.kind === 'function'\n return param === undefined || argType === undefined || unify(param, argType, b)\n })\n if (!fits) continue\n params = node.args.map((_, index) => {\n const param = candidate.params[index]\n return param?.kind === 'function' ? param.params.map((p) => substitute(p, b)) : []\n })\n break\n }\n node.args.forEach((arg, index) => {\n if (arg.type === 'Lambda') checkLambda(arg, params?.[index] ?? [], scope)\n })\n }\n\n function checkLambda(\n node: LambdaNode,\n params: readonly Type[],\n scope: Scope,\n expected?: Type,\n ): Type {\n let inner: Scope\n // Facts about an outer item do not apply to the new item.\n const outer: Facts | undefined =\n scope.nonNull === undefined\n ? undefined\n : { keys: new Set(), parent: scope.nonNull, hidesIt: true }\n if (node.implicit) {\n inner = { locals: scope.locals, it: params[0] ?? ANY, nonNull: outer }\n } else {\n chargeTypeWork(scope.locals.size)\n const locals = new Map(scope.locals)\n node.params.forEach((name, index) => {\n locals.set(name, params[index] ?? ANY)\n })\n inner = { locals, it: undefined, nonNull: outer }\n }\n const bodyType = check(node.body, inner, expected)\n types.set(node, bodyType)\n return bodyType\n }\n\n function matchOverload(\n candidate: Overload,\n node: CallNode,\n argTypes: readonly (Type | undefined)[],\n b: Map<string, Type>,\n hasSpread: boolean,\n ): boolean {\n const count = node.args.length\n const required = candidate.required ?? candidate.params.length\n // Spreading an empty list (`...[]`) passes no arguments at all.\n const isEmptySpread = (i: number): boolean =>\n node.args[i].type === 'Spread' && elementOf(nonNull(argTypes[i] ?? ANY))?.kind === 'never'\n let passed = count\n let otherSpread = false\n for (let i = 0; i < count; i++) {\n if (isEmptySpread(i)) passed--\n else if (node.args[i].type === 'Spread') otherSpread = true\n }\n if (!hasSpread || !otherSpread) {\n if (passed < required) return false\n if (passed > candidate.params.length && candidate.rest === undefined) return false\n }\n for (let i = 0; i < count; i++) {\n const arg = node.args[i]\n const param = candidate.params[i] ?? candidate.rest\n if (param === undefined) return hasSpread\n if (arg.type === 'Spread') {\n // Its items may fill this and every later position (how many is only\n // known at run time), so each must fit all of them.\n const element = elementOf(nonNull(argTypes[i] ?? ANY)) ?? ANY\n if (element.kind === 'never') continue\n const positions = [...candidate.params.slice(i), candidate.rest]\n for (const position of positions) {\n if (position !== undefined && !unify(position, element, b)) return false\n }\n continue\n }\n if (arg.type === 'Lambda') {\n if (param.kind !== 'function') return false\n continue\n }\n if (param.kind === 'function') return false\n let argType = argTypes[i] as Type\n if (!hasSpread && i >= required && i < candidate.params.length) {\n // A null optional argument is omitted: the default is used.\n argType = nonNull(argType)\n if (argType.kind === 'never') continue\n }\n if (!unify(param, argType, b)) return false\n }\n return true\n }\n\n /** Overloads per member of the first union argument; undefined unless every member has one. */\n function distribute(\n def: FunctionDef,\n node: CallNode,\n argTypes: readonly (Type | undefined)[],\n hasSpread: boolean,\n ): { candidates: number[]; result: Type } | undefined {\n const index = argTypes.findIndex(\n (argType, i) =>\n argType !== undefined &&\n node.args[i]?.type !== 'Spread' &&\n !mayBeNull(argType) &&\n widen(argType).kind === 'union',\n )\n if (index < 0) return undefined\n const members = (widen(argTypes[index] as Type) as Extract<Type, { kind: 'union' }>).types\n const chosen = new Set<number>()\n const results: Type[] = []\n for (const member of members) {\n const args = argTypes.map((argType, i) => (i === index ? member : argType))\n let matched = false\n def.overloads.forEach((candidate, i) => {\n const b = new Map<string, Type>()\n if (\n matchOverload(candidate, node, args, b, hasSpread) &&\n (candidate.ordered ?? []).every((name) => orderable(b.get(name) ?? ANY))\n ) {\n matched = true\n chosen.add(i)\n results.push(widenFresh(substitute(candidate.result, b)))\n }\n })\n if (!matched) return undefined\n }\n return { candidates: [...chosen].sort((a, b) => a - b), result: unionOf(results) }\n }\n\n function reportNoOverload(\n node: CallNode,\n def: FunctionDef,\n argTypes: readonly (Type | undefined)[],\n hasSpread: boolean,\n ): void {\n // Would the call type-check if nullable arguments were non-null?\n const relaxed = argTypes.map((a) => (a === undefined ? a : nonNull(a)))\n const nullableFix = def.overloads.some((candidate) =>\n matchOverload(candidate, node, relaxed, new Map(), hasSpread),\n )\n if (nullableFix) {\n // `any` could be anything, not specifically null: blame an argument that may be null.\n const receiverIsNullable =\n node.style === 'method' && argTypes[0] !== undefined && mayBeNull(argTypes[0])\n const nullableIndex = argTypes.findIndex(\n (argType) => argType !== undefined && mayBeNull(argType),\n )\n const culprit = node.args[receiverIsNullable ? 0 : Math.max(nullableIndex, 0)]\n report(\n 'NULLABLE_RECEIVER',\n receiverIsNullable\n ? `The value before .${node.name}() may be null; use ?.${node.name}() or ?? to supply a default`\n : `An argument of ${node.name}() may be null; use ?? to supply a default`,\n culprit ?? node,\n )\n return\n }\n const shown = node.args\n .map((arg, i) => (arg.type === 'Lambda' ? 'lambda' : typeText(argTypes[i] ?? ANY)))\n .join(', ')\n const signatures = def.overloads\n .map((candidate) => signatureText(def.name, candidate))\n .join('; ')\n report(\n 'NO_OVERLOAD',\n `${node.name}(${shown}) does not match ${def.overloads.length > 1 ? 'any of ' : ''}${signatures}`,\n node,\n )\n }\n\n return {\n root: boundRoot,\n type,\n diagnostics,\n calls,\n types,\n async: asyncNodes.has(boundRoot),\n checkResult,\n references: { variables: [...variables], functions: [...functions] },\n probeScope,\n probeMembers,\n }\n}\n\n// === helpers ===\n\n/** Whether values of a type can be ordered (one kind: numbers, text, timestamps, durations). */\nfunction orderable(type: Type): boolean {\n const kind = widen(nonNull(type)).kind\n return ['any', 'never', 'var', 'number', 'string', 'timestamp', 'duration'].includes(kind)\n}\n\n/** A result refiner, applied per member when the first argument is a union (flat() of `a[] | b[]`). */\nfunction refine(\n refiner: ((args: readonly Type[]) => Type | undefined) | undefined,\n args: readonly Type[],\n): Type | undefined {\n if (refiner === undefined) return undefined\n const direct = refiner(args)\n const first = args[0]\n if (direct !== undefined || first?.kind !== 'union') return direct\n const results: Type[] = []\n for (const member of first.types) {\n const result = refiner([member, ...args.slice(1)])\n if (result === undefined) return undefined\n results.push(result)\n }\n return unionOf(results)\n}\n\nconst freeMemo = new WeakMap<Node, { names: readonly string[]; it: boolean }>()\n\n/** The outer locals (and whether the outer `.`) a node reads. */\nfunction freeLocals(root: Node): { names: readonly string[]; it: boolean } {\n const cached = freeMemo.get(root)\n if (cached !== undefined) return cached\n const names = new Set<string>()\n let it = false\n const visit = (node: Node, bound: ReadonlySet<string>, itBound: boolean): void => {\n switch (node.type) {\n case 'Local':\n if (!bound.has(node.name)) names.add(node.name)\n return\n case 'It':\n if (!itBound) it = true\n return\n case 'Lambda':\n if (node.implicit) visit(node.body, bound, true)\n else visit(node.body, new Set([...bound, ...node.params]), itBound)\n return\n case 'Let':\n visit(node.value, bound, itBound)\n visit(node.body, new Set([...bound, node.name]), itBound)\n return\n case 'Binary':\n case 'Call':\n case 'Conditional':\n case 'Has':\n case 'Index':\n case 'List':\n case 'Literal':\n case 'Map':\n case 'Member':\n case 'Template':\n case 'Try':\n case 'Unary':\n case 'Variable':\n default:\n forEachChild(node, (child) => {\n visit(child, bound, itBound)\n })\n }\n }\n visit(root, new Set(), false)\n const result = { names: [...names].sort(), it }\n freeMemo.set(root, result)\n return result\n}\n\n/** Indices where two parameter-type lists differ. */\nfunction changedAt(next: readonly Type[], previous: readonly Type[]): number[] {\n const out: number[] = []\n next.forEach((type, i) => {\n if (!sameType(type, previous[i] ?? ANY)) out.push(i)\n })\n return out\n}\n\nconst containsAnyMemo = new WeakMap<Type, boolean>()\n\n/** Whether a type is only partly known statically (`any` somewhere inside). */\nfunction containsAny(type: Type): boolean {\n if (type.kind !== 'list' && type.kind !== 'map' && type.kind !== 'union')\n return type.kind === 'any' || type.kind === 'var'\n let result = containsAnyMemo.get(type)\n if (result === undefined) {\n result = computeContainsAny(type)\n containsAnyMemo.set(type, result)\n }\n return result\n}\n\nfunction computeContainsAny(type: Type): boolean {\n switch (type.kind) {\n case 'any':\n case 'var':\n return true\n case 'list':\n return containsAny(type.element)\n case 'map':\n return (\n (type.rest !== undefined && containsAny(type.rest)) ||\n Object.values(type.fields).some(containsAny)\n )\n case 'union':\n return type.types.some(containsAny)\n case 'boolean':\n case 'duration':\n case 'function':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return false\n }\n}\n\n/** Whether a value of type `arg` can be passed for parameter `param` (tooling). */\nexport function acceptsArgument(param: Type, arg: Type): boolean {\n return unify(param, arg, new Map())\n}\n\n/** Binds type variables in `param` from `arg`; false when they cannot match. */\n/** The type a lambda should return for its call to produce `expected`, when the signature says. */\nfunction lambdaExpected(\n result: Type,\n lambdaResult: Type,\n expected: Type | undefined,\n): Type | undefined {\n if (expected === undefined || expected.kind === 'any' || lambdaResult.kind !== 'var')\n return undefined\n if (result.kind === 'var' && result.name === lambdaResult.name) return expected\n if (\n result.kind === 'list' &&\n result.element.kind === 'var' &&\n result.element.name === lambdaResult.name &&\n expected.kind === 'list'\n )\n return expected.element\n return undefined\n}\n\nfunction unify(param: Type, arg: Type, b: Map<string, Type>): boolean {\n if (arg.kind === 'any') {\n // Anything may flow into every type variable here: `any` absorbs them, so\n // e.g. reduce's result is not typed from its lambda alone when the initial\n // value is unknown.\n for (const name of varNames(param)) b.set(name, ANY)\n return true\n }\n if (arg.kind === 'never') {\n bindNever(param, b)\n return true\n }\n switch (param.kind) {\n case 'var': {\n // Bound as given: a declared enum stays an enum through first(), sort(),\n // reduce(); literals from the source widen when a list or map holds them.\n const existing = b.get(param.name)\n if (existing?.kind === 'any') return true\n if (existing === undefined || existing.kind === 'never') {\n b.set(param.name, arg)\n return true\n }\n if (isAssignable(arg, existing)) return true\n if (isAssignable(existing, arg)) {\n b.set(param.name, arg)\n return true\n }\n b.set(param.name, unionOf([existing, arg]))\n return true\n }\n case 'list':\n if (arg.kind === 'list') return unify(param.element, arg.element, b)\n if (arg.kind === 'union') return arg.types.every((member) => unify(param, member, b))\n return false\n case 'map': {\n if (arg.kind === 'union') return arg.types.every((member) => unify(param, member, b))\n if (arg.kind !== 'map') return false\n if (!hasVar(param)) return isAssignable(arg, param)\n if (param.rest !== undefined && Object.keys(param.fields).length === 0) {\n const members = Object.values(arg.fields)\n if (arg.rest !== undefined) members.push(arg.rest)\n // A declared object may hold unlisted keys, of any type.\n else if (!isExact(arg)) members.push(ANY)\n return members.length === 0 || unify(param.rest, unionOf(members), b)\n }\n return isAssignable(arg, param)\n }\n case 'union': {\n if (!hasVar(param)) return isAssignable(arg, param)\n // e.g. `list<U> | U` (flatMap): each member of the argument binds on its\n // own, so lists give their elements and other values (null too) bind U.\n const members = param.types\n const listMember = members.find((m) => m.kind === 'list')\n const variable = members.find((m) => m.kind === 'var')\n const concrete = members.filter((m) => !hasVar(m))\n for (const member of arg.kind === 'union' ? arg.types : [arg]) {\n if (listMember !== undefined && member.kind === 'list') {\n if (!unify(listMember, member, b)) return false\n } else if (!concrete.some((m) => isAssignable(member, m))) {\n if (variable === undefined || !unify(variable, member, b)) return false\n }\n }\n return true\n }\n case 'any':\n case 'boolean':\n case 'duration':\n case 'function':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return isAssignable(arg, param)\n }\n}\n\n/** A `never` argument (e.g. the element of `[]`) binds every free variable to never. */\nfunction bindNever(param: Type, b: Map<string, Type>): void {\n switch (param.kind) {\n case 'var':\n if (!b.has(param.name)) b.set(param.name, t.never())\n return\n case 'list':\n bindNever(param.element, b)\n return\n case 'map':\n if (param.rest !== undefined) bindNever(param.rest, b)\n for (const field of Object.values(param.fields)) bindNever(field, b)\n return\n case 'union':\n for (const member of param.types) bindNever(member, b)\n break\n case 'any':\n case 'boolean':\n case 'duration':\n case 'function':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n break\n }\n}\n\n/** The names of the type variables in a type. */\nfunction varNames(type: Type): string[] {\n switch (type.kind) {\n case 'var':\n return [type.name]\n case 'list':\n return varNames(type.element)\n case 'map':\n return [\n ...Object.values(type.fields).flatMap(varNames),\n ...(type.rest === undefined ? [] : varNames(type.rest)),\n ]\n case 'union':\n return type.types.flatMap(varNames)\n case 'function':\n return [...type.params.flatMap(varNames), ...varNames(type.result)]\n case 'any':\n case 'boolean':\n case 'duration':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return []\n }\n}\n\nfunction hasVar(type: Type): boolean {\n switch (type.kind) {\n case 'var':\n return true\n case 'list':\n return hasVar(type.element)\n case 'map':\n return (\n (type.rest !== undefined && hasVar(type.rest)) || Object.values(type.fields).some(hasVar)\n )\n case 'union':\n return type.types.some(hasVar)\n case 'function':\n return type.params.some(hasVar) || hasVar(type.result)\n case 'any':\n case 'boolean':\n case 'duration':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return false\n }\n}\n\nfunction substitute(type: Type, b: ReadonlyMap<string, Type>): Type {\n switch (type.kind) {\n case 'var':\n return b.get(type.name) ?? ANY\n case 'list':\n return t.list(substitute(type.element, b))\n case 'map': {\n const fields: Record<string, Type> = {}\n for (const [key, value] of Object.entries(type.fields)) fields[key] = substitute(value, b)\n const mapped: MapType =\n type.rest === undefined\n ? { kind: 'map', fields }\n : { kind: 'map', fields, rest: substitute(type.rest, b) }\n return mapped\n }\n case 'union':\n return unionOf(type.types.map((member) => substitute(member, b)))\n case 'function':\n return {\n kind: 'function',\n params: type.params.map((p) => substitute(p, b)),\n result: substitute(type.result, b),\n }\n case 'any':\n case 'boolean':\n case 'duration':\n case 'literal':\n case 'never':\n case 'null':\n case 'number':\n case 'opaque':\n case 'string':\n case 'timestamp':\n default:\n return type\n }\n}\n\n/** Names from other languages, with the Bonsai spelling. */\nconst FUNCTION_ALIASES: Readonly<Record<string, string>> = {\n length: 'length is a property: write x.length',\n size: 'use the length property: x.length',\n len: 'use the length property: x.length',\n count: 'use count(list) or x.length',\n contains: 'did you mean \"includes\"?',\n substring: 'did you mean \"slice\"?',\n substr: 'did you mean \"slice\"?',\n lower: 'did you mean \"toLowerCase\"?',\n upper: 'did you mean \"toUpperCase\"?',\n lowercase: 'did you mean \"toLowerCase\"?',\n uppercase: 'did you mean \"toUpperCase\"?',\n test: 'did you mean \"matches\"?',\n match: 'did you mean \"matches\"?',\n regex: 'did you mean \"matches\"?',\n distinct: 'did you mean \"unique\"?',\n uniq: 'did you mean \"unique\"?',\n average: 'did you mean \"avg\"?',\n mean: 'did you mean \"avg\"?',\n exists: 'did you mean \"some\"?',\n any: 'did you mean \"some\"?',\n all: 'did you mean \"every\"?',\n int: 'did you mean \"toNumber\" (with trunc to drop decimals)?',\n parseInt: 'did you mean \"toNumber\"?',\n parseFloat: 'did you mean \"toNumber\"?',\n Number: 'did you mean \"toNumber\"?',\n String: 'did you mean \"toString\"?',\n str: 'did you mean \"toString\"?',\n concat: 'use + to join lists or strings',\n push: 'use + to append: list + [item]',\n today: 'use startOfDay(now())',\n date: 'did you mean \"timestamp\"?',\n format: 'use formatDate, formatNumber, or a template',\n isNull: 'compare with == null',\n}\n\n/** JavaScript globals people reach for, with what to write instead. */\nconst JS_GLOBALS: Readonly<Record<string, string>> = {\n Math: 'call the function directly, e.g. max(a, b), round(x), abs(x)',\n Date: 'use now() or timestamp(\"2026-01-31\")',\n JSON: 'expressions work on values directly',\n Object: 'use keys(map), values(map), entries(map)',\n Number: 'use toNumber(x)',\n String: 'use toString(x)',\n Array: 'use a list literal [...]',\n}\n\n/** Longest receiver path a diagnostic message names instead of its type. */\nconst MESSAGE_PATH_TEXT = 60\n\n/**\n * A receiver as the expression reads it (`customer.address`), for messages\n * people who write rules can follow; undefined unless it is a plain path of\n * names that fits in a message.\n */\nfunction pathText(node: Node): string | undefined {\n let suffix = ''\n let current = node\n while (current.type === 'Member') {\n suffix = `${current.optional ? '?.' : '.'}${current.name}${suffix}`\n if (suffix.length > MESSAGE_PATH_TEXT) return undefined\n current = current.object\n }\n if (current.type !== 'Variable' && current.type !== 'Local') return undefined\n const text = `${current.name}${suffix}`\n return text.length > MESSAGE_PATH_TEXT ? undefined : text\n}\n\n/**\n * \"Did you mean\" hints cost an edit distance per candidate, so a source full of\n * typos against a large schema is bounded: hints for the first unknown names\n * only, each against a bounded number of candidates.\n */\nconst MAX_SUGGESTIONS = 16\nlet suggestionsLeft = MAX_SUGGESTIONS\n\n/**\n * Why a side that may hold several kinds (`s ?? 0` is a string or a number)\n * cannot be ordered, as a message suffix; undefined for a side of one kind.\n */\nfunction mixedKinds(type: Type, side: 'left' | 'right'): string | undefined {\n if (type.kind !== 'union') return undefined\n const kinds = [...new Set(type.types.map((member) => member.kind))]\n if (kinds.length < 2) return undefined\n return `: the ${side} side may be a ${kinds.join(' or a ')}, and an ordering compares values of one kind`\n}\n\n/** Whether one insertion, deletion, or substitution (ignoring case) turns `a` into `b`. */\nfunction withinOneEdit(a: string, b: string): boolean {\n const x = a.toLowerCase()\n const y = b.toLowerCase()\n if (Math.abs(x.length - y.length) > 1) return false\n let i = 0\n while (i < x.length && i < y.length && x[i] === y[i]) i++\n // Past the first difference, the rest must match after skipping one character.\n if (x.length === y.length) return x.slice(i + 1) === y.slice(i + 1)\n return x.length < y.length ? x.slice(i) === y.slice(i + 1) : x.slice(i + 1) === y.slice(i)\n}\n\n/** The closest candidate by edit distance, if one is close enough, within this check's budget. */\nfunction suggest(name: string, candidatesOf: () => Iterable<string>): string | undefined {\n if (suggestionsLeft <= 0) return undefined\n suggestionsLeft--\n return closest(name, candidatesOf())\n}\n"],"mappings":"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"}
|