@tsplc/compiler 0.0.0-stage → 0.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/LICENSE +21 -0
- package/README.md +16 -2
- package/backends/codesys/config.ts +54 -0
- package/backends/codesys/emit.ts +1063 -0
- package/backends/codesys/engineering.ts +88 -0
- package/backends/codesys/http.ts +598 -0
- package/backends/codesys/index.ts +12 -0
- package/backends/codesys/io-paths.ts +103 -0
- package/backends/codesys/names.ts +76 -0
- package/backends/codesys/numeric.ts +356 -0
- package/backends/codesys/plan.ts +512 -0
- package/backends/codesys/publication.ts +59 -0
- package/backends/codesys/storage.ts +63 -0
- package/backends/codesys/task-access.ts +118 -0
- package/backends/codesys/types.ts +178 -0
- package/backends/codesys/vendor.ts +108 -0
- package/dist/cli.js +1396 -0
- package/dist/cli.js.map +16 -0
- package/dist/clock.js +8 -0
- package/dist/clock.js.map +10 -0
- package/dist/codesys.js +2587 -0
- package/dist/codesys.js.map +22 -0
- package/dist/elaborate-capture.js +118 -0
- package/dist/elaborate-capture.js.map +10 -0
- package/dist/index.js +6859 -0
- package/dist/index.js.map +25 -0
- package/dist/ir.js +1888 -0
- package/dist/ir.js.map +22 -0
- package/dist/math.js +24 -0
- package/dist/math.js.map +10 -0
- package/dist/project.js +429 -0
- package/dist/project.js.map +11 -0
- package/ir/aggregates.ts +333 -0
- package/ir/allocation.ts +74 -0
- package/ir/core-model.ts +116 -0
- package/ir/core.ts +63 -0
- package/ir/declarations.ts +201 -0
- package/ir/diagnostics.ts +43 -0
- package/ir/domains.ts +96 -0
- package/ir/index.ts +7 -0
- package/ir/link.ts +176 -0
- package/ir/model.ts +268 -0
- package/ir/normalization-error.ts +10 -0
- package/ir/routine.ts +826 -0
- package/ir/scalars.ts +675 -0
- package/ir/types.ts +70 -0
- package/package.json +106 -4
- package/project/artifacts.ts +277 -0
- package/project/cli.ts +305 -0
- package/project/index.ts +1 -0
- package/project/plant.ts +437 -0
- package/project/project.ts +312 -0
- package/project/server.ts +83 -0
- package/src/frontend/async.ts +1060 -0
- package/src/frontend/blocks.ts +419 -0
- package/src/frontend/configuration.ts +167 -0
- package/src/frontend/const-functions.ts +153 -0
- package/src/frontend/cooperative.ts +75 -0
- package/src/frontend/elaborate/capture.ts +138 -0
- package/src/frontend/elaborate/graph.ts +94 -0
- package/src/frontend/elaborate/index.ts +302 -0
- package/src/frontend/elaborate/layouts.ts +390 -0
- package/src/frontend/elaborate/model.ts +177 -0
- package/src/frontend/elaborate/specialize.ts +2280 -0
- package/src/frontend/exposure.ts +147 -0
- package/src/frontend/module-graph.ts +63 -0
- package/src/frontend/promises.ts +751 -0
- package/src/frontend/services.ts +435 -0
- package/src/frontend/types.ts +578 -0
- package/src/frontend/typescript.ts +2442 -0
- package/src/index.ts +7 -0
- package/stdlib/clock.ts +2 -0
- package/stdlib/math.ts +19 -0
- package/types/async.d.ts +81 -0
- package/types/clock.d.ts +4 -0
- package/types/config.d.ts +2 -0
- package/types/data-types.d.ts +31 -0
- package/types/globals.d.ts +40 -0
- package/types/index.d.ts +111 -0
- package/types/plc.d.ts +5 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/frontend/module-graph.ts", "../src/frontend/typescript.ts", "../src/frontend/exposure.ts", "../src/frontend/services.ts", "../src/frontend/promises.ts", "../src/frontend/async.ts", "../src/frontend/cooperative.ts", "../src/frontend/configuration.ts", "../src/frontend/const-functions.ts", "../src/frontend/elaborate/index.ts", "../src/frontend/elaborate/graph.ts", "../src/frontend/elaborate/model.ts", "../src/frontend/elaborate/specialize.ts", "../src/frontend/elaborate/layouts.ts", "../src/frontend/blocks.ts", "../src/frontend/types.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import ts from \"typescript\";\n\n/** Runtime imports define execution; type-only imports provide layouts without allocating state. */\nexport const runtimeSources = (program: ts.Program): readonly ts.SourceFile[] => {\n const checker = program.getTypeChecker();\n const visited = new Set<ts.SourceFile>();\n // A block array allocates through its type, so its block's module runs even when type-imported.\n const visitBlockArrays = (node: ts.Node): void => {\n if (\n ts.isTypeReferenceNode(node) &&\n node.typeName.getText() === \"FixedArray\" &&\n node.typeArguments?.[0] &&\n ts.isTypeReferenceNode(node.typeArguments[0])\n ) {\n let symbol = checker.getSymbolAtLocation(node.typeArguments[0].typeName);\n while (symbol && symbol.flags & ts.SymbolFlags.Alias)\n symbol = checker.getAliasedSymbol(symbol);\n const block = symbol?.declarations?.find(ts.isClassDeclaration);\n if (block) visit(block.getSourceFile());\n }\n ts.forEachChild(node, visitBlockArrays);\n };\n const visit = (source: ts.SourceFile): void => {\n if (visited.has(source)) return;\n visited.add(source);\n if (source.isDeclarationFile) return;\n visitBlockArrays(source);\n for (const statement of source.statements) {\n if (ts.isImportDeclaration(statement)) {\n if (statement.importClause?.isTypeOnly) continue;\n const bindings = statement.importClause?.namedBindings;\n if (\n !statement.importClause?.name &&\n bindings &&\n ts.isNamedImports(bindings) &&\n bindings.elements.every((value) => value.isTypeOnly)\n )\n continue;\n const target = checker\n .getSymbolAtLocation(statement.moduleSpecifier)\n ?.declarations?.find(ts.isSourceFile);\n if (target) visit(target);\n }\n if (ts.isExportDeclaration(statement) && statement.moduleSpecifier && !statement.isTypeOnly) {\n if (\n statement.exportClause &&\n ts.isNamedExports(statement.exportClause) &&\n statement.exportClause.elements.every((value) => value.isTypeOnly)\n )\n continue;\n const target = checker\n .getSymbolAtLocation(statement.moduleSpecifier)\n ?.declarations?.find(ts.isSourceFile);\n if (target) visit(target);\n }\n }\n };\n for (const file of program.getRootFileNames()) {\n const source = program.getSourceFile(file);\n if (source) visit(source);\n }\n return program.getSourceFiles().filter((source) => visited.has(source));\n};\n",
|
|
6
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { createRequire } from \"node:module\";\nimport { mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport {\n instancedBlock,\n error,\n hasErrors,\n parseInteger,\n fold,\n canAssign,\n aggregate,\n expressionIssue,\n defaultValue,\n placeType,\n durationLiteral,\n calendarLiteral,\n loopIterations,\n loopBounds,\n narrowRanges,\n interval,\n valueRange,\n integerRange,\n comparisonOperators,\n type BinaryOperator,\n type IntegerInterval,\n type Constant,\n type Diagnostic,\n type Expression,\n type PlcFunction,\n type MethodOwner,\n type PlcModule,\n type PlcProgram,\n type SourceSpan,\n type Statement,\n type Variable,\n type Place,\n} from \"@tsplc/compiler/ir\";\n\nimport { lowerExposure } from \"./exposure.ts\";\nimport { lowerServices, serviceRecords, type ServiceOptions } from \"./services.ts\";\nimport { lowerPromises } from \"./promises.ts\";\nimport { lowerAsync } from \"./async.ts\";\nimport { lowerConstFunctions } from \"./const-functions.ts\";\nimport { lowerElaboration } from \"./elaborate/index.ts\";\nimport { lowerEnvironment } from \"./configuration.ts\";\nimport { BlockResolver, storageInitializer, type BlockSource } from \"./blocks.ts\";\nimport { numericLiteralType } from \"./types.ts\";\nimport {\n TypeResolver,\n calleeName,\n type Fail,\n type TypeEnvironment,\n type ResolvedType,\n} from \"./types.ts\";\n\nexport interface FrontendOptions {\n sourceScope?: \"project\" | \"entry\";\n services?: ServiceOptions;\n tsconfig: string;\n programs: Readonly<Record<string, { module: string; export: string }>>;\n}\n\nexport interface FrontendResult {\n module?: PlcModule;\n diagnostics: readonly Diagnostic[];\n}\n\n// TIME constructor scales in nanoseconds, and calendar constructor result types.\nconst durationScales: Readonly<Record<string, bigint>> = {\n ms: 1_000_000n,\n seconds: 1_000_000_000n,\n minutes: 60_000_000_000n,\n};\nconst calendarTypes: Readonly<Record<string, string>> = {\n date: \"DATE\",\n timeOfDay: \"TIME_OF_DAY\",\n dateAndTime: \"DATE_AND_TIME\",\n};\nconst conversions: Readonly<Record<string, \"exact\" | \"wrap\" | \"saturate\">> = {\n exact: \"exact\",\n wrap: \"wrap\",\n saturate: \"saturate\",\n};\nconst arithmetic: Readonly<\n Record<\n string,\n { operator: \"add\" | \"subtract\" | \"multiply\" | \"divide\"; policy?: \"wrap\" | \"saturate\" }\n >\n> = {\n div: { operator: \"divide\" },\n wrapAdd: { operator: \"add\", policy: \"wrap\" },\n wrapSubtract: { operator: \"subtract\", policy: \"wrap\" },\n wrapMultiply: { operator: \"multiply\", policy: \"wrap\" },\n saturatingAdd: { operator: \"add\", policy: \"saturate\" },\n saturatingSubtract: { operator: \"subtract\", policy: \"saturate\" },\n saturatingMultiply: { operator: \"multiply\", policy: \"saturate\" },\n};\nconst operators = new Map<ts.SyntaxKind, BinaryOperator>([\n [ts.SyntaxKind.AmpersandAmpersandToken, \"and\"],\n [ts.SyntaxKind.BarBarToken, \"or\"],\n [ts.SyntaxKind.EqualsEqualsEqualsToken, \"equal\"],\n [ts.SyntaxKind.ExclamationEqualsEqualsToken, \"notEqual\"],\n [ts.SyntaxKind.LessThanToken, \"less\"],\n [ts.SyntaxKind.LessThanEqualsToken, \"lessEqual\"],\n [ts.SyntaxKind.GreaterThanToken, \"greater\"],\n [ts.SyntaxKind.GreaterThanEqualsToken, \"greaterEqual\"],\n [ts.SyntaxKind.PlusToken, \"add\"],\n [ts.SyntaxKind.MinusToken, \"subtract\"],\n [ts.SyntaxKind.AsteriskToken, \"multiply\"],\n [ts.SyntaxKind.SlashToken, \"divide\"],\n [ts.SyntaxKind.PercentToken, \"remainder\"],\n [ts.SyntaxKind.AmpersandToken, \"bitAnd\"],\n [ts.SyntaxKind.BarToken, \"bitOr\"],\n [ts.SyntaxKind.CaretToken, \"bitXor\"],\n [ts.SyntaxKind.LessThanLessThanToken, \"shiftLeft\"],\n [ts.SyntaxKind.GreaterThanGreaterThanToken, \"shiftRight\"],\n]);\n\nclass SemanticError extends Error {\n constructor(readonly diagnostic: Diagnostic) {\n super(diagnostic.message);\n }\n}\n\nfunction sourceSpan(source: ts.SourceFile, start: number, end: number): SourceSpan {\n const position = source.getLineAndCharacterOfPosition(start);\n return {\n file: source.fileName,\n start,\n end,\n line: position.line + 1,\n column: position.character + 1,\n };\n}\n\nfunction span(node: ts.Node): SourceSpan {\n const source = node.getSourceFile();\n return sourceSpan(source, node.getStart(source), node.getEnd());\n}\n\nfunction tsDiagnostic(diagnostic: ts.Diagnostic): Diagnostic {\n const result: Diagnostic = {\n origin: \"typescript\",\n code: `TS${diagnostic.code}`,\n severity: diagnostic.category === ts.DiagnosticCategory.Error ? \"error\" : \"warning\",\n message: ts.flattenDiagnosticMessageText(diagnostic.messageText, \"\\n\"),\n };\n if (diagnostic.file && diagnostic.start !== undefined)\n result.span = sourceSpan(\n diagnostic.file,\n diagnostic.start,\n diagnostic.start + (diagnostic.length ?? 1),\n );\n return result;\n}\n\nconst suppressionDiagnostics = (source: ts.SourceFile): Diagnostic[] => {\n const diagnostics: Diagnostic[] = [];\n const scanner = ts.createScanner(\n ts.ScriptTarget.Latest,\n false,\n ts.LanguageVariant.Standard,\n source.text,\n );\n for (let token = scanner.scan(); token !== ts.SyntaxKind.EndOfFileToken; token = scanner.scan()) {\n if (\n token !== ts.SyntaxKind.SingleLineCommentTrivia &&\n token !== ts.SyntaxKind.MultiLineCommentTrivia\n )\n continue;\n const comment = scanner.getTokenText();\n const match = /(?:^|\\n)\\s*(?:\\/\\/+|\\/\\*+|\\*)\\s*(@ts-(?:nocheck|ignore|expect-error))\\b/.exec(\n comment,\n );\n if (!match) continue;\n const start = scanner.getTokenPos() + comment.indexOf(match[1] ?? \"@ts-\");\n diagnostics.push(\n error(\n \"PLC1009\",\n \"TypeScript diagnostic suppression is not allowed in PLC source.\",\n sourceSpan(source, start, start + (match[1]?.length ?? 4)),\n ),\n );\n }\n return diagnostics;\n};\n\n/**\n * Type checks a subset of a tsconfig's files without emitting. A project-reference\n * tsconfig's composite and declaration settings would demand every file be listed\n * (TS6307) or conflict with noEmit, so these replace them.\n */\nexport const typeCheckOnly: ts.CompilerOptions = {\n composite: false,\n declaration: false,\n declarationMap: false,\n emitDeclarationOnly: false,\n incremental: false,\n noEmit: true,\n tsBuildInfoFile: undefined,\n};\n\nexport function analyze(options: FrontendOptions): FrontendResult {\n const filename = resolve(options.tsconfig);\n const config = ts.readConfigFile(filename, ts.sys.readFile);\n if (config.error) return { diagnostics: [tsDiagnostic(config.error)] };\n const parsed = ts.parseJsonConfigFileContent(\n config.config,\n ts.sys,\n dirname(filename),\n undefined,\n filename,\n );\n if (parsed.errors.length) return { diagnostics: parsed.errors.map(tsDiagnostic) };\n // TypeScript stores SourceFile paths with forward slashes on every host.\n // Normalize require.resolve once so canonical SDK identity also works on Windows.\n const sdk = createRequire(import.meta.url)\n .resolve(\"@tsplc/compiler/globals\")\n .replaceAll(\"\\\\\", \"/\");\n const programFiles = Object.values(options.programs).map((entry) =>\n resolve(dirname(filename), entry.module),\n );\n // Full-stack builds follow entry imports; standalone projects retain explicit tsconfig globals.\n const scope = options.sourceScope ?? (options.services ? \"entry\" : \"project\");\n // The project's own ambient declarations; a shared base tsconfig's typings are for the host runtime.\n const ambient = parsed.fileNames.filter(\n (file) => /\\.d\\.[cm]?ts$/.test(file) && file.startsWith(`${dirname(filename)}/`),\n );\n const projectFiles = scope === \"project\" ? parsed.fileNames : ambient;\n const rootNames = [...new Set([...projectFiles, ...programFiles, sdk])];\n const compilerOptions: ts.CompilerOptions = {\n ...parsed.options,\n ...typeCheckOnly,\n // Lowered sources import their runtime helpers by .ts path and drop the imports they replace.\n allowImportingTsExtensions: true,\n noUnusedLocals: false,\n noUnusedParameters: false,\n strict: true,\n noImplicitAny: true,\n strictNullChecks: true,\n noCheck: false,\n allowJs: false,\n skipLibCheck: false,\n types: [],\n lib: [\"lib.es2022.d.ts\"],\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n };\n // Nothing is emitted, and a service client's router type imports modules outside these (TS6059).\n delete compilerOptions.rootDir;\n delete compilerOptions.outDir;\n let program = ts.createProgram(rootNames, compilerOptions);\n const plcFiles = (program: ts.Program) => {\n const files = new Set(runtimeSources(program));\n for (const source of program.getSourceFiles())\n if (source.fileName.startsWith(dirname(sdk) + \"/\")) files.add(source);\n return files;\n };\n // Only PLC files: a type-only import of the server router brings the server's sources along.\n const sourceDiagnostics = (program: ts.Program) =>\n [\n ...program.getConfigFileParsingDiagnostics(),\n ...program.getOptionsDiagnostics(),\n ...program.getGlobalDiagnostics(),\n ...[...plcFiles(program)].flatMap((file) => [\n ...program.getSyntacticDiagnostics(file),\n ...program.getSemanticDiagnostics(file),\n ]),\n ].map(tsDiagnostic);\n const diagnostics = sourceDiagnostics(program);\n if (\n program.getSyntacticDiagnostics().some((item) => !item.file || plcFiles(program).has(item.file))\n )\n return { diagnostics };\n const virtualSources = new Map<string, string>();\n // Lowering also adds modules, such as the service client, that exist only here.\n let host: ts.CompilerHost = ts.createCompilerHost(compilerOptions);\n const apply = (lowering: {\n sources: Map<string, string>;\n diagnostics: Diagnostic[];\n }): boolean => {\n diagnostics.push(...lowering.diagnostics);\n for (const source of runtimeSources(program))\n if (lowering.sources.has(source.fileName))\n diagnostics.push(...suppressionDiagnostics(source));\n if (lowering.diagnostics.length || (lowering.sources.size && hasErrors(diagnostics)))\n return false;\n if (lowering.sources.size) {\n for (const [path, text] of lowering.sources) virtualSources.set(path, text);\n // TSPLC_LOWERED=<directory> writes every generated or rewritten module, as the next step reads it.\n const dump = process.env.TSPLC_LOWERED;\n if (dump)\n for (const [path, text] of lowering.sources) {\n const target = join(dump, relative(dirname(filename), path));\n mkdirSync(dirname(target), { recursive: true });\n writeFileSync(target, text);\n }\n host = ts.createCompilerHost(compilerOptions);\n const read = host.readFile,\n exists = host.fileExists;\n const directoryExists = host.directoryExists?.bind(host);\n host.readFile = (path) => virtualSources.get(path) ?? read(path);\n host.fileExists = (path) => virtualSources.has(path) || exists(path);\n // Generated modules can live in a directory that only exists in memory.\n host.directoryExists = (path) =>\n [...virtualSources.keys()].some((file) => file.startsWith(`${path.replace(/\\/$/, \"\")}/`)) ||\n (directoryExists?.(path) ?? true);\n program = ts.createProgram(rootNames, compilerOptions, host);\n diagnostics.push(...sourceDiagnostics(program));\n }\n return true;\n };\n if (!apply(lowerElaboration(program, sdk, options.programs, dirname(filename))))\n return { diagnostics };\n const services = lowerServices(program, sdk, options.services);\n if (!apply(services)) return { diagnostics };\n const exposure = lowerExposure(program, sdk);\n if (!apply(exposure)) return { diagnostics };\n if (!apply(lowerEnvironment(program, sdk))) return { diagnostics };\n if (!apply(lowerConstFunctions(program))) return { diagnostics };\n const promises = lowerPromises(program, sdk);\n if (!apply(promises)) return { diagnostics };\n const lowering = lowerAsync(program, sdk);\n for (const [key, value] of promises.runtimeBlocks) lowering.blocks.set(key, value);\n if (!apply(lowering)) return { diagnostics };\n const analyzer = new Analyzer(\n program,\n host,\n dirname(filename),\n sdk,\n diagnostics,\n serviceRecords(program, services),\n );\n const module = analyzer.run({ ...options.programs, ...lowering.programs });\n for (const variable of module.variables) {\n const item = exposure.variables.get(`${variable.span.file}:${variable.name}`);\n if (item) variable.exposure = item;\n }\n for (const block of module.blocks) {\n const runtime = lowering.blocks.get(`${block.span.file}:${block.name}`);\n if (runtime) block.runtime = runtime;\n }\n for (const entry of module.programs) {\n const background = lowering.schedules.get(entry.name);\n if (background) entry.background = background;\n const continuation = lowering.continuations.get(entry.name);\n if (continuation) entry.continuation = continuation;\n }\n return hasErrors(diagnostics) ? { diagnostics } : { module, diagnostics };\n}\n\nexport function checkHostConfig(file: string): readonly Diagnostic[] {\n const bunTypes = createRequire(import.meta.url).resolve(\"@types/bun/index.d.ts\");\n const program = ts.createProgram([file], {\n strict: true,\n noEmit: true,\n target: ts.ScriptTarget.ES2022,\n module: ts.ModuleKind.ESNext,\n moduleResolution: ts.ModuleResolutionKind.Bundler,\n allowImportingTsExtensions: true,\n skipLibCheck: true,\n types: [bunTypes],\n });\n return ts.getPreEmitDiagnostics(program).map(tsDiagnostic);\n}\n\nclass Analyzer {\n private readonly checker: ts.TypeChecker;\n private readonly variables = new Map<ts.Symbol, Variable>();\n private readonly functions = new Map<ts.Symbol, PlcFunction>();\n private readonly methods = new Map<ts.Symbol, PlcFunction>();\n private readonly functionDeclarations = new Map<ts.Symbol, ts.FunctionDeclaration>();\n private readonly instances = new Map<string, PlcFunction>();\n private readonly pending: {\n node: ts.FunctionDeclaration | ts.MethodDeclaration;\n fn: PlcFunction;\n environment: TypeEnvironment;\n }[] = [];\n private readonly resolver: TypeResolver;\n private readonly blocks: BlockResolver;\n private readonly globalVariables: Variable[] = [];\n private readonly sources: readonly ts.SourceFile[];\n\n // This scope is saved and restored for each block or generic function body.\n private environment: TypeEnvironment = new Map();\n private activeBlock: BlockSource | undefined;\n private readonly ranges = new Map<string, IntegerInterval>();\n private readonly loopCounters = new Set<string>();\n private readonly aliases = new Map<ts.Symbol, Place>();\n private copySources: Place[] = [];\n private readonly breakTargets: (\"loop\" | \"switch\")[] = [];\n private activeFunction: PlcFunction | undefined;\n\n constructor(\n private readonly program: ts.Program,\n private readonly host: ts.ModuleResolutionHost,\n private readonly root: string,\n private readonly sdk: string,\n private readonly diagnostics: Diagnostic[],\n serviceRecord?: (type: ts.Type) => ts.Symbol | undefined,\n ) {\n this.checker = program.getTypeChecker();\n this.resolver = new TypeResolver(this.checker, root, sdk, this.fail, serviceRecord);\n this.blocks = new BlockResolver(\n this.resolver,\n span,\n this.fail,\n span(program.getSourceFile(sdk)!),\n );\n const roots = new Set(program.getRootFileNames());\n this.sources = runtimeSources(program).filter(\n (source) =>\n source.fileName !== sdk &&\n !source.fileName.startsWith(`${dirname(sdk)}/`) &&\n !program.isSourceFileDefaultLibrary(source) &&\n (!source.isDeclarationFile || roots.has(source.fileName)),\n );\n }\n\n private readonly fail: Fail = (node, code, message) => {\n throw new SemanticError(error(code, message, span(node)));\n };\n\n private type(node: ts.TypeNode): ResolvedType {\n return this.resolver.resolve(node, this.environment);\n }\n\n private storageId(node: ts.Node, name: string): string {\n return `${this.resolver.id(node, name)}${this.activeFunction ? `@${this.activeFunction.id}` : \"\"}`;\n }\n\n private guard(action: () => void): void {\n try {\n action();\n } catch (cause) {\n if (!(cause instanceof SemanticError)) throw cause;\n this.diagnostics.push(cause.diagnostic);\n }\n }\n\n run(entries: FrontendOptions[\"programs\"]): PlcModule {\n // Collect every declaration before resolving initializers and routine bodies.\n // Generic calls can enqueue more helpers, so resolve entry points last.\n this.collectDeclarations();\n this.initializeStorage();\n this.analyzeBlockBodies();\n this.analyzePendingFunctions();\n const programs = this.resolvePrograms(entries);\n\n return {\n types: [...this.resolver.types.values()],\n variables: this.globalVariables,\n functions: [...this.instances.values()],\n blocks: [...this.blocks.definitions.values()],\n programs,\n };\n }\n\n private collectDeclarations(): void {\n const classes = this.sources.flatMap((source) =>\n source.statements.filter(ts.isClassDeclaration),\n );\n this.blocks.index(classes);\n for (const node of classes) this.guard(() => this.blocks.collect(node));\n for (const source of this.blocks.sources.values()) {\n for (const method of source.methods)\n this.guard(() => {\n const fn = this.instantiate(method, [], method);\n fn.owner = {\n block: source.block.id,\n access: this.methodAccess(method),\n };\n this.methods.set(this.resolver.symbol(method.name), fn);\n });\n }\n for (const source of this.sources) {\n this.diagnostics.push(...suppressionDiagnostics(source));\n for (const statement of source.statements) {\n this.guard(() => this.declaration(statement));\n }\n }\n }\n\n private methodAccess(method: ts.MethodDeclaration): MethodOwner[\"access\"] {\n if (method.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.PrivateKeyword))\n return \"private\";\n if (method.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ProtectedKeyword))\n return \"protected\";\n return \"public\";\n }\n\n private initializeStorage(): void {\n for (const source of this.sources) {\n for (const statement of source.statements) {\n if (ts.isVariableStatement(statement) && !source.isDeclarationFile) {\n this.guard(() => {\n for (const declaration of statement.declarationList.declarations) {\n if (!declaration.initializer)\n this.fail(\n declaration,\n \"PLC3001\",\n \"Persistent PLC state requires a constant initializer.\",\n );\n const variable = this.variables.get(this.resolver.symbol(declaration.name));\n if (!variable || variable.storage === \"instance\") continue;\n const initializer = storageInitializer(\n declaration.initializer,\n this.resolver,\n this.fail,\n ).value;\n const inferred = variable.type === \"inferred\";\n const expression = this.expression(initializer, inferred ? undefined : variable.type);\n variable.type = expression.type;\n if (\n inferred &&\n variable.storage === \"constant\" &&\n aggregate(this.resolver.types.get(variable.type))\n )\n variable.storage = \"module\";\n if (variable.retain && variable.storage === \"constant\")\n this.fail(\n declaration,\n \"PLC3004\",\n \"retain requires mutable persistent storage or a static block instance.\",\n );\n const value = this.constant(this.implicitCopy(expression));\n if (!value)\n this.fail(\n declaration.initializer,\n \"PLC3001\",\n \"Persistent initializers must be compile-time constants.\",\n );\n variable.initial = value;\n }\n });\n }\n }\n }\n }\n\n private analyzeBlockBodies(): void {\n for (const source of this.blocks.sources.values())\n this.guard(() => {\n for (const [variable, node] of source.initializers) {\n const value = this.constant(this.expression(node, variable.type));\n if (!value)\n this.fail(node, \"PLC3001\", \"Block state requires a compile-time constant initializer.\");\n variable.initial = value;\n }\n const { block } = source;\n this.activeBlock = source;\n try {\n const routine = this.routineBody(\n {\n id: block.id,\n name: block.name,\n parameters: block.inputs,\n locals: [],\n body: [],\n span: block.span,\n ...(block.result && { result: block.result }),\n },\n source.fieldBindings,\n source.method.body!,\n );\n block.locals = routine.locals;\n block.body = routine.body;\n } finally {\n this.activeBlock = undefined;\n }\n });\n }\n\n private analyzePendingFunctions(): void {\n // A worklist allows explicit generic instances to share source without sharing locals.\n for (let index = 0; index < this.pending.length; index++) {\n const instance = this.pending[index]!;\n this.guard(() => {\n this.environment = instance.environment;\n this.activeBlock = instance.fn.owner\n ? [...this.blocks.sources.values()].find(\n (source) => source.block.id === instance.fn.owner?.block,\n )\n : undefined;\n try {\n // Declaration admission proved the parameter list and body before worklist analysis.\n const fn = this.routineBody(\n instance.fn,\n [\n ...(this.activeBlock?.fieldBindings ?? []),\n ...instance.node.parameters.map(\n (parameter, index) =>\n [this.resolver.symbol(parameter.name), instance.fn.parameters[index]!] as const,\n ),\n ],\n instance.node.body!,\n );\n this.instances.set(fn.id, fn);\n if (ts.isFunctionDeclaration(instance.node) && !instance.node.typeParameters?.length)\n this.functions.set(this.resolver.symbol(instance.node.name!), fn);\n } finally {\n this.environment = new Map();\n this.activeBlock = undefined;\n }\n });\n }\n }\n\n // Lowers one routine body with its bindings layered over module storage.\n private routineBody(\n fn: PlcFunction,\n bindings: Iterable<readonly [ts.Symbol, Variable]>,\n body: ts.Block,\n ): PlcFunction {\n const saved = new Map(this.variables),\n locals: Variable[] = [];\n this.activeFunction = fn;\n this.copySources = [];\n for (const [symbol, variable] of bindings) this.variables.set(symbol, variable);\n try {\n return { ...fn, locals, body: this.statements(body.statements, locals) };\n } finally {\n this.variables.clear();\n for (const [symbol, variable] of saved) this.variables.set(symbol, variable);\n this.activeFunction = undefined;\n }\n }\n\n private resolvePrograms(entries: FrontendOptions[\"programs\"]): PlcProgram[] {\n const programs: PlcProgram[] = [];\n for (const [name, entry] of Object.entries(entries)) {\n const source = this.program.getSourceFile(resolve(this.root, entry.module));\n if (!source) {\n this.diagnostics.push(error(\"PLC4001\", `Program source not found: ${entry.module}.`));\n continue;\n }\n this.guard(() => {\n const moduleSymbol = this.checker.getSymbolAtLocation(source);\n const exported =\n moduleSymbol &&\n this.checker\n .getExportsOfModule(moduleSymbol)\n .find((symbol) => symbol.name === entry.export);\n if (!exported)\n this.fail(source, \"PLC4001\", `Program export ${entry.export} was not found.`);\n const symbol =\n exported.flags & ts.SymbolFlags.Alias\n ? this.checker.getAliasedSymbol(exported)\n : exported;\n const fn = this.functions.get(symbol);\n if (!fn || fn.parameters.length || fn.result)\n this.fail(\n source,\n \"PLC4001\",\n \"Program entry must be an implemented parameterless void function.\",\n );\n programs.push({ id: `program:${name}`, name, entry: fn.id });\n });\n }\n return programs;\n }\n\n private dependency(node: ts.ImportDeclaration | ts.ExportDeclaration): void {\n if (!node.moduleSpecifier) return;\n if (!ts.isStringLiteral(node.moduleSpecifier))\n this.fail(node, \"PLC1001\", \"Only static module imports are supported.\");\n const resolved = ts.resolveModuleName(\n node.moduleSpecifier.text,\n node.getSourceFile().fileName,\n this.program.getCompilerOptions(),\n this.host,\n ).resolvedModule;\n if (!resolved)\n this.fail(\n node.moduleSpecifier,\n \"PLC1008\",\n \"This dependency could not be resolved to PLC source.\",\n );\n const source = this.program.getSourceFile(resolved.resolvedFileName);\n const typeOnly = ts.isImportDeclaration(node) ? node.importClause?.isTypeOnly : node.isTypeOnly;\n if (typeOnly) return;\n const bindings = ts.isImportDeclaration(node)\n ? node.importClause?.namedBindings\n : node.exportClause;\n const defaultName = ts.isImportDeclaration(node) ? node.importClause?.name : undefined;\n const namedOnly =\n bindings &&\n (ts.isNamedImports(bindings) || ts.isNamedExports(bindings)) &&\n bindings.elements.length > 0 &&\n bindings.elements.every(\n (binding) =>\n binding.isTypeOnly || !(this.resolver.symbol(binding.name).flags & ts.SymbolFlags.Value),\n );\n if (namedOnly && !defaultName) return;\n if (source && !source.isDeclarationFile) return;\n if (resolved.resolvedFileName.replaceAll(\"\\\\\", \"/\").startsWith(`${dirname(this.sdk)}/`)) return;\n const authoredIo =\n source &&\n this.sources.includes(source) &&\n source.statements.some(ts.isVariableStatement) &&\n source.statements.every(\n (statement) =>\n ts.isTypeAliasDeclaration(statement) ||\n ts.isEmptyStatement(statement) ||\n (ts.isVariableStatement(statement) &&\n statement.declarationList.declarations.every(\n (declaration) => declaration.type && this.type(declaration.type).io,\n )),\n );\n if (authoredIo) return;\n this.fail(\n node.moduleSpecifier,\n \"PLC1008\",\n \"Runtime dependencies need PLC TypeScript implementation source; JavaScript and declaration-only value imports are unsupported.\",\n );\n }\n\n private declaration(statement: ts.Statement): void {\n if (ts.isImportDeclaration(statement) || ts.isExportDeclaration(statement)) {\n this.dependency(statement);\n return;\n }\n if (\n ts.isClassDeclaration(statement) ||\n ts.isTypeAliasDeclaration(statement) ||\n ts.isInterfaceDeclaration(statement) ||\n ts.isEmptyStatement(statement)\n )\n return;\n if (ts.isEnumDeclaration(statement)) {\n this.resolver.enumeration(statement);\n return;\n }\n if (ts.isVariableStatement(statement)) {\n this.moduleVariables(statement);\n return;\n }\n if (ts.isFunctionDeclaration(statement)) {\n if (!statement.name || !statement.body)\n this.fail(statement, \"PLC1001\", \"PLC functions need a name and an implementation.\");\n if (statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword)) {\n this.fail(statement, \"PLC1007\", \"Async execution is not supported in PLC scan code.\");\n }\n if (statement.asteriskToken)\n this.fail(statement, \"PLC1007\", \"Generators are not supported in PLC scan code.\");\n const symbol = this.resolver.symbol(statement.name);\n this.functionDeclarations.set(symbol, statement);\n if (!statement.typeParameters?.length)\n this.functions.set(symbol, this.instantiate(statement, [], statement));\n return;\n }\n this.fail(\n statement,\n \"PLC1001\",\n `${ts.SyntaxKind[statement.kind]} is not supported in PLC source.`,\n );\n }\n\n private moduleVariables(statement: ts.VariableStatement): void {\n if (!(statement.declarationList.flags & (ts.NodeFlags.Let | ts.NodeFlags.Const)))\n this.fail(statement, \"PLC1001\", \"Use let or const instead of var.\");\n const immutable = Boolean(statement.declarationList.flags & ts.NodeFlags.Const);\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name))\n this.fail(declaration.name, \"PLC1001\", \"Destructuring declarations are not supported.\");\n const initializer =\n declaration.initializer &&\n storageInitializer(declaration.initializer, this.resolver, this.fail);\n const table = initializer && this.tableType(declaration, initializer.value);\n const instance =\n initializer && ts.isNewExpression(initializer.value)\n ? this.blocks.instanceType(initializer.value)\n : initializer && !table\n ? this.blocks.instanceArrayType(declaration.type, initializer.value)\n : undefined;\n const literal = initializer && this.numericLiteral(initializer.value);\n if (table && !immutable)\n this.fail(declaration, \"PLC2001\", \"A readonly table is a const declaration.\");\n const type = instance\n ? { type: instance }\n : (table ??\n (declaration.type\n ? this.type(declaration.type)\n : { type: immutable ? \"inferred\" : literal ? numericLiteralType(literal) : \"BOOL\" }));\n if (\n !instance &&\n !declaration.type &&\n !immutable &&\n !literal &&\n declaration.initializer &&\n initializer?.value.kind !== ts.SyntaxKind.TrueKeyword &&\n initializer?.value.kind !== ts.SyntaxKind.FalseKeyword\n )\n this.fail(declaration, \"PLC2001\", \"Annotate PLC storage explicitly.\");\n const ambient = declaration.getSourceFile().isDeclarationFile;\n if (type.mode || this.resolver.hasReferences(type.type))\n this.fail(declaration, \"PLC2001\", \"Borrow schemas cannot be stored as values.\");\n if (this.resolver.types.get(type.type)?.kind === \"block\" && !instance)\n this.fail(\n declaration,\n \"PLC1007\",\n \"Block instances require a static constructor initializer.\",\n );\n if (\n instance &&\n (!immutable || (declaration.type && this.type(declaration.type).type !== instance))\n )\n this.fail(\n declaration,\n \"PLC2001\",\n \"Static block instances require const bindings and matching annotations.\",\n );\n if (\n initializer?.retain &&\n (ambient ||\n (immutable &&\n type.type !== \"inferred\" &&\n !instance &&\n !aggregate(this.resolver.types.get(type.type))))\n )\n this.fail(\n declaration,\n \"PLC3004\",\n \"retain requires mutable persistent storage or a static block instance.\",\n );\n if (ambient && !type.io)\n this.fail(declaration, \"PLC4002\", \"Ambient PLC variables must declare Input or Output.\");\n if (!ambient && type.io)\n this.fail(declaration, \"PLC4002\", \"Logical I/O belongs in an ambient declaration file.\");\n if (type.io === \"input\" && !immutable)\n this.fail(declaration, \"PLC4002\", \"Inputs must use declare const.\");\n if (type.io === \"output\" && immutable)\n this.fail(declaration, \"PLC4002\", \"Outputs must use declare let.\");\n const variable: Variable = {\n id: this.storageId(declaration, declaration.name.text),\n name: declaration.name.text,\n type: type.type,\n storage: instance\n ? \"instance\"\n : (type.io ??\n (immutable && (table || !aggregate(this.resolver.types.get(type.type)))\n ? \"constant\"\n : \"module\")),\n mutable: !immutable,\n retain: initializer?.retain ?? false,\n ...(statement.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)\n ? { exported: true as const }\n : {}),\n span: span(declaration),\n };\n this.variables.set(this.resolver.symbol(declaration.name), variable);\n this.globalVariables.push(variable);\n }\n }\n\n /**\n * `const table: readonly T[] = [...]` or `const table = [...] as const satisfies readonly T[]`,\n * also spelled `ReadonlyArray<T>`, is a constant `FixedArray<T, N>` whose length is the\n * literal's element count.\n */\n private tableType(\n declaration: ts.VariableDeclaration,\n initializer: ts.Expression,\n ): ResolvedType | undefined {\n const satisfied = ts.isSatisfiesExpression(initializer) ? initializer : undefined;\n const annotation = declaration.type ?? satisfied?.type;\n if (!annotation) return undefined;\n let element: ts.TypeNode | undefined;\n if (\n ts.isTypeOperatorNode(annotation) &&\n annotation.operator === ts.SyntaxKind.ReadonlyKeyword &&\n ts.isArrayTypeNode(annotation.type)\n )\n element = annotation.type.elementType;\n else if (\n ts.isTypeReferenceNode(annotation) &&\n annotation.typeName.getText() === \"ReadonlyArray\" &&\n annotation.typeArguments?.length === 1 &&\n this.resolver.standardLibrary(this.resolver.symbol(annotation.typeName))\n )\n element = annotation.typeArguments[0];\n if (!element) return undefined;\n let literal = satisfied?.expression ?? initializer;\n while (\n ts.isParenthesizedExpression(literal) ||\n (ts.isAsExpression(literal) && ts.isConstTypeReference(literal.type))\n )\n literal = literal.expression;\n if (!ts.isArrayLiteralExpression(literal))\n this.fail(declaration, \"PLC2001\", \"A readonly table is initialized by an array literal.\");\n return this.resolver.fixedArray(\n annotation,\n this.type(element),\n { kind: \"integer\", value: literal.elements.length },\n { kind: \"integer\", value: 0 },\n );\n }\n\n private instantiate(\n node: ts.FunctionDeclaration | ts.MethodDeclaration,\n arguments_: readonly ts.TypeNode[],\n call: ts.Node,\n ): PlcFunction {\n if (!node.name || !ts.isIdentifier(node.name))\n this.fail(node, \"PLC1001\", \"PLC routines need identifier names.\");\n const routineName = node.name.text;\n const environment = this.resolver.bindings(\n node.typeParameters,\n arguments_,\n this.environment,\n call,\n );\n const suffix = (node.typeParameters ?? [])\n .map((parameter) => this.resolver.key(environment.get(this.resolver.symbol(parameter.name))!))\n .join(\",\");\n const id = `${this.resolver.id(node, routineName)}${suffix ? `<${suffix}>` : \"\"}`;\n const existing = this.instances.get(id);\n if (existing) return existing;\n // Bounds generic expansion; plain helpers each instantiate once.\n if (suffix && [...this.instances.keys()].filter((key) => key.endsWith(\">\")).length >= 256)\n this.fail(\n call,\n \"PLC2001\",\n \"Generic specialization exceeds 256 concrete helpers; recursive specialization is unsupported.\",\n );\n const saved = this.environment;\n this.environment = environment;\n try {\n const parameters = node.parameters.map((parameter) => {\n if (\n !ts.isIdentifier(parameter.name) ||\n !parameter.type ||\n parameter.initializer ||\n parameter.questionToken ||\n parameter.dotDotDotToken\n )\n this.fail(\n parameter,\n \"PLC2001\",\n \"PLC parameters need names and explicit types; optional/rest/default parameters are unsupported.\",\n );\n const type = this.type(parameter.type);\n const block = this.resolver.types.get(type.type)?.kind === \"block\";\n if (type.mode !== \"inOut\" && !block && !this.resolver.isValue(type))\n this.fail(parameter, \"PLC2001\", \"Parameters require value types or InOut borrows.\");\n if (type.io) this.fail(parameter, \"PLC2001\", \"Parameters cannot use logical I/O wrappers.\");\n // Records, arrays and blocks pass by reference, as objects do in TypeScript.\n const mode =\n type.mode ??\n (block || aggregate(this.resolver.types.get(type.type)) ? \"inOut\" : undefined);\n return {\n id: `${this.resolver.id(parameter, parameter.name.text)}@${id}`,\n name: parameter.name.text,\n type: type.type,\n storage: \"parameter\" as const,\n mutable: mode === \"inOut\",\n ...(mode && { mode }),\n retain: false,\n span: span(parameter),\n };\n });\n let result: string | undefined;\n if (node.type && node.type.kind !== ts.SyntaxKind.VoidKeyword) {\n const type = this.type(node.type);\n if (!this.resolver.isValue(type))\n this.fail(node.type, \"PLC2001\", \"Helper results require value types.\");\n if (type.io) this.fail(node.type, \"PLC4002\", \"Helper results cannot use I/O wrappers.\");\n result = type.type;\n } else if (!node.type) {\n const signature = this.checker.getSignatureFromDeclaration(node);\n if (\n !signature ||\n !(this.checker.getReturnTypeOfSignature(signature).flags & ts.TypeFlags.Void)\n )\n this.fail(node, \"PLC2001\", \"Annotate helper results explicitly.\");\n }\n const bounds = this.resolver.mathHelper(node, routineName);\n const fn: PlcFunction = {\n id,\n name: `${routineName}${suffix ? `_${suffix}` : \"\"}`,\n parameters,\n locals: [],\n body: [],\n span: span(node),\n ...(result && { result }),\n ...(bounds && { bounds }),\n };\n this.instances.set(id, fn);\n this.pending.push({ node, fn, environment });\n return fn;\n } finally {\n this.environment = saved;\n }\n }\n\n private byId(): Map<string, Variable> {\n return new Map(\n [\n ...this.variables.values(),\n ...(this.activeBlock\n ? [...this.activeBlock.block.inputs, ...this.activeBlock.block.outputs]\n : []),\n ].map((variable) => [variable.id, variable]),\n );\n }\n\n private checked(value: Expression): Expression {\n const message = expressionIssue(value, this.resolver.types, this.byId(), this.ranges);\n if (message) throw new SemanticError(error(\"PLC2002\", message, value.span));\n return value;\n }\n\n private coerce(value: Expression, destination: string): Expression {\n if (value.type === destination) return value;\n const source = this.resolver.types.get(value.type),\n target = this.resolver.types.get(destination);\n if (!source || !target)\n throw new SemanticError(error(\"PLC2001\", \"This PLC type has not been resolved.\", value.span));\n const constant = fold(value, this.byId(), this.resolver.types);\n if (\n source.kind === \"string\" &&\n target.kind === \"string\" &&\n source.encoding === target.encoding &&\n source.capacity <= target.capacity\n )\n return constant\n ? { kind: \"constant\", type: destination, value: constant, span: value.span }\n : { kind: \"convert\", type: destination, operand: value, policy: \"exact\", span: value.span };\n if (!canAssign(source, target, constant))\n throw new SemanticError(\n error(\n \"PLC2002\",\n \"Use an explicit conversion between these PLC domains or widths.\",\n value.span,\n ),\n );\n if (constant) return { kind: \"constant\", type: destination, value: constant, span: value.span };\n return this.checked({\n kind: \"convert\",\n type: destination,\n operand: value,\n policy: \"exact\",\n span: value.span,\n });\n }\n\n private constant(expression: Expression): Constant | undefined {\n return fold(expression, this.byId(), this.resolver.types);\n }\n\n private numericLiteral(node: ts.Expression): string | undefined {\n while (ts.isParenthesizedExpression(node)) node = node.expression;\n if (ts.isNumericLiteral(node) || ts.isBigIntLiteral(node)) return node.getText();\n if (ts.isPrefixUnaryExpression(node) && node.operator === ts.SyntaxKind.MinusToken) {\n const operand = this.numericLiteral(node.operand);\n if (operand !== undefined) return operand.startsWith(\"-\") ? operand.slice(1) : `-${operand}`;\n }\n return undefined;\n }\n\n private contextualLiteral(node: ts.Expression): boolean {\n while (ts.isParenthesizedExpression(node)) node = node.expression;\n return (\n this.numericLiteral(node) !== undefined ||\n ts.isStringLiteral(node) ||\n ts.isNoSubstitutionTemplateLiteral(node)\n );\n }\n\n private literal(node: ts.Expression, expected?: string): Expression | undefined {\n const text = this.numericLiteral(node);\n if (text === undefined) return undefined;\n const type = expected ?? numericLiteralType(text);\n const target = this.resolver.types.get(type);\n if (!target || ![\"integer\", \"bits\", \"float\"].includes(target.kind))\n this.fail(\n node,\n \"PLC2001\",\n \"Numeric literals require an arithmetic or bit-string PLC type; use named enum members.\",\n );\n let value: Constant;\n if (target.kind === \"float\") {\n const clean = text.replaceAll(\"_\", \"\");\n const number = /^-?0[xob]/i.test(clean) ? Number(parseInteger(clean)) : Number(clean);\n value = { kind: \"float\", value: target.bits === 32 ? Math.fround(number) : number };\n } else {\n try {\n value = { kind: \"integer\", value: String(parseInteger(text)) };\n } catch (cause) {\n this.fail(\n node,\n \"PLC2002\",\n cause instanceof Error ? cause.message : \"Invalid integer literal.\",\n );\n }\n }\n return this.checked({ kind: \"constant\", type, value, span: span(node) });\n }\n\n private expression(node: ts.Expression, expected?: string): Expression {\n if (\n ts.isParenthesizedExpression(node) ||\n ts.isSatisfiesExpression(node) ||\n (ts.isAsExpression(node) && ts.isConstTypeReference(node.type))\n )\n return this.expression(node.expression, expected);\n const literal = this.literal(node, expected);\n if (literal) return literal;\n const value = this.rawExpression(node, expected);\n return expected ? this.coerce(value, expected) : value;\n }\n\n private rawExpression(node: ts.Expression, expected?: string): Expression {\n const origin = { span: span(node) };\n if (node.kind === ts.SyntaxKind.TrueKeyword || node.kind === ts.SyntaxKind.FalseKeyword) {\n return {\n ...origin,\n type: \"BOOL\",\n kind: \"constant\",\n value: { kind: \"bool\", value: node.kind === ts.SyntaxKind.TrueKeyword },\n };\n }\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n const type = expected ? this.resolver.types.get(expected) : undefined;\n if (type?.kind === \"enum\") {\n const member = type.members.find((member) => member.name === node.text);\n if (member)\n return {\n ...origin,\n type: type.id,\n kind: \"constant\",\n value: { kind: \"integer\", value: member.value },\n };\n }\n if (type?.kind !== \"string\")\n this.fail(node, \"PLC2001\", \"String literals require a bounded STRING or WSTRING context.\");\n return this.checked({\n ...origin,\n type: type.id,\n kind: \"constant\",\n value: { kind: \"string\", value: node.text },\n });\n }\n if (ts.isObjectLiteralExpression(node)) {\n const type = expected ? this.resolver.types.get(expected) : undefined;\n if (type?.kind === \"array\" && type.index) {\n // Like an array literal, every element in order, so items evaluate in source order.\n const order = \"Enum-keyed record literals list every enum member once, in value order.\";\n const items: Expression[] = [];\n for (const property of node.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isComputedPropertyName(property.name))\n this.fail(\n property,\n \"PLC1001\",\n \"Enum-keyed record literals use computed member keys such as [Station.A].\",\n );\n const key = this.expression(property.name.expression, type.index);\n if (key.kind !== \"constant\" || key.type !== type.index || key.value.kind !== \"integer\")\n this.fail(property.name, \"PLC2001\", \"Keys must be members of the record's enum.\");\n if (Number(key.value.value) !== type.lowerBound + items.length)\n this.fail(property, \"PLC2001\", order);\n items.push(this.implicitCopy(this.expression(property.initializer, type.element)));\n }\n if (items.length !== type.length) this.fail(node, \"PLC2001\", order);\n return this.checked({ ...origin, type: type.id, kind: \"array\", items });\n }\n if (type?.kind !== \"record\")\n this.fail(node, \"PLC2001\", \"Record literals require an explicit closed PLC record type.\");\n const fields: Record<string, Expression> = Object.create(null);\n const written = new Set<string>();\n for (const [position, property] of node.properties.entries()) {\n if (ts.isSpreadAssignment(property) && !position) {\n for (const [name, value] of Object.entries(\n this.spreadFields(property.expression, type.fields),\n )) {\n // TypeScript's spread shares a nested record or array, so a later write to it diverges.\n this.recordCopySource(value);\n fields[name] = this.implicitCopy(value);\n }\n continue;\n }\n if (\n !(ts.isPropertyAssignment(property) || ts.isShorthandPropertyAssignment(property)) ||\n !ts.isIdentifier(property.name)\n )\n this.fail(\n property,\n \"PLC1001\",\n \"Record literals take named fields after at most one leading spread; methods are unsupported.\",\n );\n const fieldName = property.name.text;\n const field = type.fields.find((field) => field.name === fieldName);\n if (!field || written.has(field.name))\n this.fail(property, \"PLC2001\", \"Unknown or duplicate record field.\");\n written.add(field.name);\n // An explicit field overrides the spread and keeps its source evaluation order.\n delete fields[field.name];\n fields[field.name] = this.implicitCopy(\n this.expression(\n ts.isPropertyAssignment(property) ? property.initializer : property.name,\n field.type,\n ),\n );\n }\n if (this.resolver.unions.has(type.id))\n for (const field of type.fields)\n if (!Object.hasOwn(fields, field.name))\n fields[field.name] = {\n ...origin,\n type: field.type,\n kind: \"constant\",\n value: defaultValue(field.type, this.resolver.types),\n };\n return this.checked({ ...origin, type: type.id, kind: \"record\", fields });\n }\n if (ts.isArrayLiteralExpression(node)) {\n const type = expected ? this.resolver.types.get(expected) : undefined;\n if (type?.kind !== \"array\")\n this.fail(node, \"PLC2001\", \"Array literals require an explicit FixedArray type.\");\n const items = node.elements.map((element) => {\n if (ts.isOmittedExpression(element) || ts.isSpreadElement(element))\n this.fail(element, \"PLC1001\", \"Fixed arrays cannot have holes or spreading.\");\n return this.implicitCopy(this.expression(element, type.element));\n });\n return this.checked({ ...origin, type: type.id, kind: \"array\", items });\n }\n if (ts.isPropertyAccessExpression(node)) {\n const declaration = this.resolver.symbol(node.name).declarations?.find(ts.isEnumMember);\n if (declaration) {\n const type = this.resolver.enumeration(declaration.parent).type;\n const layout = this.resolver.types.get(type)!;\n if (layout.kind !== \"enum\") this.fail(node, \"PLC2001\", \"Invalid enum layout.\");\n return {\n ...origin,\n type,\n kind: \"constant\",\n value: {\n kind: \"integer\",\n value: layout.members.find((member) => member.name === declaration.name.getText())!\n .value,\n },\n };\n }\n if (node.name.text === \"length\") {\n const base = this.expression(node.expression),\n type = this.resolver.types.get(base.type);\n if (type?.kind === \"array\")\n return { ...origin, type: \"DINT\", kind: \"length\", operand: base };\n }\n }\n if (ts.isPropertyAccessExpression(node) || ts.isElementAccessExpression(node)) {\n const place = this.place(node),\n type = placeType(place, this.resolver.types, this.byId(), this.ranges);\n if (type.issue || !type.type) this.fail(node, \"PLC2001\", type.issue ?? \"Invalid PLC place.\");\n return { ...origin, type: type.type, kind: \"load\", place };\n }\n if (ts.isIdentifier(node) && this.aliases.has(this.resolver.symbol(node))) {\n const place = this.place(node),\n type = placeType(place, this.resolver.types, this.byId(), this.ranges);\n if (type.issue || !type.type) this.fail(node, \"PLC2001\", type.issue ?? \"Invalid PLC place.\");\n return { ...origin, type: type.type, kind: \"load\", place };\n }\n if (ts.isIdentifier(node)) {\n const variable = this.variables.get(this.resolver.symbol(node));\n if (!variable) this.fail(node, \"PLC1002\", \"This value has no supported PLC storage.\");\n if (variable.type === \"inferred\")\n this.fail(\n node,\n \"PLC3001\",\n \"Resolve constant initializer dependencies in declaration order.\",\n );\n return {\n ...origin,\n type: variable.type,\n kind: \"load\",\n place: { root: variable.id, path: [] },\n };\n }\n if (ts.isPrefixUnaryExpression(node)) {\n const operator =\n node.operator === ts.SyntaxKind.ExclamationToken\n ? \"not\"\n : node.operator === ts.SyntaxKind.MinusToken\n ? \"negate\"\n : node.operator === ts.SyntaxKind.TildeToken\n ? \"bitNot\"\n : undefined;\n if (!operator) this.fail(node, \"PLC2001\", \"Unsupported unary operation.\");\n const operand = this.expression(node.operand, operator === \"not\" ? \"BOOL\" : expected);\n return this.checked({\n ...origin,\n type: operator === \"not\" ? \"BOOL\" : operand.type,\n kind: \"unary\",\n operator,\n operand,\n });\n }\n if (ts.isCallExpression(node)) {\n const sdk = this.sdkExpression(node, expected);\n if (sdk) return sdk;\n const call = this.call(node);\n if (!call.fn.result)\n this.fail(node, \"PLC2001\", \"A void helper cannot produce an expression value.\");\n return {\n ...origin,\n type: call.fn.result,\n kind: \"call\",\n function: call.fn.id,\n arguments: call.arguments,\n ...(call.instance && { instance: call.instance }),\n ...(call.index && { index: call.index }),\n };\n }\n if (ts.isConditionalExpression(node)) {\n const then = this.expression(node.whenTrue, expected);\n return {\n ...origin,\n type: then.type,\n kind: \"conditional\",\n condition: this.expression(node.condition, \"BOOL\"),\n then,\n else: this.expression(node.whenFalse, then.type),\n };\n }\n if (ts.isBinaryExpression(node)) return this.binaryExpression(node, expected);\n this.fail(node, \"PLC1001\", `${ts.SyntaxKind[node.kind]} is not supported in PLC expressions.`);\n }\n\n private binaryExpression(node: ts.BinaryExpression, expected?: string): Expression {\n const origin = { span: span(node) };\n const operator = operators.get(node.operatorToken.kind);\n if (!operator)\n this.fail(\n node.operatorToken,\n \"PLC2001\",\n \"Unsupported binary operation; implicit coercion is prohibited.\",\n );\n const logical = operator === \"and\" || operator === \"or\";\n const comparison = comparisonOperators.has(operator);\n const leftIsLiteral = this.contextualLiteral(node.left);\n const context = logical\n ? \"BOOL\"\n : comparison\n ? leftIsLiteral\n ? this.expression(node.right).type\n : undefined\n : expected;\n let left = this.expression(node.left, context);\n if (comparison && !leftIsLiteral && !this.contextualLiteral(node.right)) {\n // Compare at the wider type; widening cannot change the value.\n const wider = this.expression(node.right).type,\n from = this.resolver.types.get(left.type),\n to = this.resolver.types.get(wider);\n if (from && to && !canAssign(to, from) && canAssign(from, to))\n left = this.coerce(left, wider);\n }\n const right = this.expression(\n node.right,\n operator === \"shiftLeft\" || operator === \"shiftRight\" ? \"DINT\" : left.type,\n );\n if (operator === \"divide\" && this.resolver.types.get(left.type)?.kind !== \"float\")\n this.fail(node, \"PLC2002\", \"Use div<T>() for truncating integer division.\");\n return this.checked({\n ...origin,\n type: logical || comparison ? \"BOOL\" : left.type,\n kind: \"binary\",\n operator,\n left,\n right,\n });\n }\n\n private sdkExpression(node: ts.CallExpression, expected?: string): Expression | undefined {\n const origin = { span: span(node) };\n const official = this.sdkCall(node);\n if (official === \"errorCode\") {\n if (node.arguments.length !== 1)\n this.fail(node, \"PLC1012\", \"errorCode requires one rejection reason.\");\n return this.expression(node.arguments[0]!, \"UDINT\");\n }\n if (\n official &&\n (Object.hasOwn(durationScales, official) || Object.hasOwn(calendarTypes, official))\n ) {\n if (node.arguments.length !== 1 || node.typeArguments?.length)\n this.fail(node, \"PLC2001\", \"Time constructors require one compile-time literal argument.\");\n const argument = node.arguments[0]!;\n const scale = durationScales[official];\n let value: Constant | undefined, type: string;\n if (scale) {\n type = \"TIME\";\n let text = this.numericLiteral(argument);\n if (text === undefined) {\n const folded = this.constant(this.expression(argument));\n if (folded?.kind === \"integer\") text = folded.value;\n }\n if (text !== undefined && /^-?0[xob]/i.test(text)) text = String(parseInteger(text));\n value = text === undefined ? undefined : durationLiteral(text.replace(/n$/, \"\"), scale);\n } else {\n type = calendarTypes[official]!;\n const layout = this.resolver.types.get(type)!;\n value =\n layout.kind === \"calendar\" &&\n (ts.isStringLiteral(argument) || ts.isNoSubstitutionTemplateLiteral(argument))\n ? calendarLiteral(layout.domain, argument.text)\n : undefined;\n }\n if (!value)\n this.fail(\n argument,\n \"PLC2002\",\n \"Invalid time literal: require an exact supported domain value and millisecond TIME precision.\",\n );\n return this.checked({ ...origin, type, kind: \"constant\", value });\n }\n if (official === \"now\") {\n if (node.arguments.length || node.typeArguments?.length)\n this.fail(node, \"PLC2001\", \"now() takes no arguments.\");\n return this.checked({\n ...origin,\n type: \"DINT\",\n kind: \"unary\",\n operator: \"clock\",\n operand: {\n ...origin,\n type: \"DINT\",\n kind: \"constant\",\n value: { kind: \"integer\", value: \"0\" },\n },\n });\n }\n if (official === \"timeToMilliseconds\") {\n if (node.arguments.length !== 1 || node.typeArguments?.length)\n this.fail(\n node,\n \"PLC2001\",\n \"timeToMilliseconds requires one TIME argument and no type arguments.\",\n );\n return this.checked({\n ...origin,\n type: \"UDINT\",\n kind: \"unary\",\n operator: \"timeToMilliseconds\",\n operand: this.expression(node.arguments[0]!),\n });\n }\n if (official === \"defaultValue\") {\n if (node.arguments.length || node.typeArguments?.length !== 1)\n this.fail(\n node,\n \"PLC2001\",\n \"defaultValue requires exactly one concrete type and no value arguments.\",\n );\n const type = this.type(node.typeArguments[0]!);\n if (!this.resolver.isValue(type))\n this.fail(\n node,\n \"PLC2001\",\n \"defaultValue requires a fixed value layout, not an instance or borrow schema.\",\n );\n if (type.io) this.fail(node, \"PLC4002\", \"Default values cannot create logical I/O.\");\n return this.checked({\n ...origin,\n type: type.type,\n kind: \"constant\",\n value: defaultValue(type.type, this.resolver.types),\n });\n }\n if (official === \"copy\") {\n if (node.arguments.length !== 1 || (node.typeArguments && node.typeArguments.length !== 1))\n this.fail(node, \"PLC2001\", \"copy requires one fixed aggregate value.\");\n const operand = this.expression(\n node.arguments[0]!,\n node.typeArguments?.[0] ? this.type(node.typeArguments[0]).type : expected,\n );\n return this.checked({ ...origin, type: operand.type, kind: \"copy\", operand });\n }\n if (official && (Object.hasOwn(conversions, official) || Object.hasOwn(arithmetic, official))) {\n const argument = node.typeArguments?.[0];\n if (!argument || node.typeArguments?.length !== 1)\n this.fail(\n node,\n \"PLC2001\",\n \"Numeric SDK operations require one explicit PLC type argument.\",\n );\n const target = this.type(argument);\n if (target.io)\n this.fail(argument, \"PLC2001\", \"I/O wrappers cannot select an operation type.\");\n const conversion = conversions[official];\n if (conversion) {\n if (node.arguments.length !== 1)\n this.fail(node, \"PLC2001\", \"Conversion needs exactly one operand.\");\n return this.checked({\n ...origin,\n type: target.type,\n kind: \"convert\",\n policy: conversion,\n operand: this.expression(node.arguments[0]!),\n });\n }\n const operation = arithmetic[official]!;\n if (node.arguments.length !== 2)\n this.fail(node, \"PLC2001\", \"Arithmetic SDK operation needs two operands.\");\n return this.checked({\n ...origin,\n type: target.type,\n kind: \"binary\",\n ...operation,\n left: this.expression(node.arguments[0]!, target.type),\n right: this.expression(node.arguments[1]!, target.type),\n });\n }\n return undefined;\n }\n\n private sdkCall(node: ts.CallExpression): string | undefined {\n const name = calleeName(node.expression);\n return name && this.resolver.sdkName(name);\n }\n\n private update(node: ts.CallExpression): Statement | undefined {\n if (!ts.isPropertyAccessExpression(node.expression) || node.expression.name.text !== \"update\")\n return undefined;\n const place = this.place(node.expression.expression),\n variable = this.byId().get(place.root),\n type = variable && instancedBlock(variable.type, this.resolver.types),\n [selector, ...rest] = place.path,\n index = selector?.kind === \"index\" ? selector.value : undefined;\n if (\n !type ||\n rest.length ||\n (this.resolver.types.get(variable.type)?.kind === \"array\" ? !index : selector)\n )\n this.fail(node, \"PLC1007\", \"Update requires a static block instance binding.\");\n const definition = this.blocks.definitions.get(type.block)!;\n if (\n node.typeArguments?.length ||\n node.arguments.length !== 1 ||\n !ts.isObjectLiteralExpression(node.arguments[0]!)\n )\n this.fail(node, \"PLC2001\", \"Block update requires one complete named input record.\");\n const inputs: Record<string, Expression> = Object.create(null);\n const written = new Set<string>();\n for (const [position, property] of node.arguments[0].properties.entries()) {\n if (ts.isSpreadAssignment(property) && !position) {\n for (const [name, value] of Object.entries(\n this.spreadFields(property.expression, definition.inputs),\n )) {\n const parameter = definition.inputs.find((input) => input.name === name)!;\n inputs[name] = parameter.mode === \"inOut\" ? this.reference(value, parameter) : value;\n }\n continue;\n }\n if (\n !(ts.isPropertyAssignment(property) || ts.isShorthandPropertyAssignment(property)) ||\n !ts.isIdentifier(property.name)\n )\n this.fail(\n property,\n \"PLC2001\",\n \"Block inputs are named fields after at most one leading spread.\",\n );\n const name = property.name.text;\n const parameter = definition.inputs.find((input) => input.name === name);\n if (!parameter || written.has(parameter.name))\n this.fail(property, \"PLC2001\", \"Unknown or duplicate block input.\");\n written.add(parameter.name);\n const value = ts.isPropertyAssignment(property) ? property.initializer : property.name;\n delete inputs[parameter.name];\n inputs[parameter.name] = this.inputArgument(value, parameter);\n }\n if (definition.inputs.some((input) => !Object.hasOwn(inputs, input.name)))\n this.fail(node, \"PLC2001\", \"Block update must bind every input on each call.\");\n return {\n kind: \"blockUpdate\",\n instance: place.root,\n ...(index && { index }),\n inputs,\n span: span(node),\n };\n }\n\n private call(node: ts.CallExpression): {\n fn: PlcFunction;\n arguments: Expression[];\n instance?: string;\n index?: Expression;\n } {\n const name = calleeName(node.expression);\n if (!name) this.fail(node, \"PLC1001\", \"Call a statically resolved PLC helper or block method.\");\n const symbol = this.resolver.symbol(name);\n // Structural return types can give a receiver a transient property symbol.\n // Resolve its declaration back to the canonical instance method identity.\n const method =\n this.methods.get(symbol) ??\n symbol.declarations\n ?.filter(ts.isMethodDeclaration)\n .map((node) => this.methods.get(this.resolver.symbol(node.name)))\n .find((fn) => fn !== undefined);\n if (method) {\n if (!ts.isPropertyAccessExpression(node.expression) || node.typeArguments?.length)\n this.fail(node, \"PLC1007\", \"Methods require a static instance receiver.\");\n const receiver = node.expression.expression;\n let instance: string | undefined;\n let index: Expression | undefined;\n if (receiver.kind === ts.SyntaxKind.ThisKeyword) {\n if (method.owner?.block !== this.activeBlock?.block.id)\n this.fail(node, \"PLC1007\", \"Method receiver differs from the enclosing block.\");\n } else {\n const place = this.place(receiver);\n const variable = this.byId().get(place.root);\n const type = variable && instancedBlock(variable.type, this.resolver.types);\n const [selector, ...rest] = place.path;\n index = selector?.kind === \"index\" ? selector.value : undefined;\n if (\n (variable?.storage !== \"instance\" && variable?.mode !== \"inOut\") ||\n rest.length ||\n (this.resolver.types.get(variable.type)?.kind === \"array\" ? !index : selector) ||\n type?.block !== method.owner?.block\n )\n this.fail(node, \"PLC1007\", \"Methods require a matching static block instance.\");\n if (method.owner?.access !== \"public\" && method.owner?.block !== this.activeBlock?.block.id)\n this.fail(\n node,\n \"PLC1007\",\n \"Private and protected methods are only accessible within their block.\",\n );\n instance = place.root;\n }\n return {\n fn: method,\n arguments: this.callArguments(node, method),\n ...(instance && { instance }),\n ...(index && { index }),\n };\n }\n const declaration = this.functionDeclarations.get(symbol);\n if (!declaration)\n this.fail(node, \"PLC1001\", \"Calls require PLC TypeScript implementation source.\");\n const fn = declaration.typeParameters?.length\n ? this.instantiate(declaration, node.typeArguments ?? [], node)\n : this.functions.get(symbol);\n if (!fn || (!declaration.typeParameters?.length && node.typeArguments?.length))\n this.fail(node, \"PLC2001\", \"Type arguments require a generic helper.\");\n return { fn, arguments: this.callArguments(node, fn) };\n }\n\n private callArguments(node: ts.CallExpression, fn: PlcFunction): Expression[] {\n if (node.arguments.length !== fn.parameters.length)\n this.fail(node, \"PLC2001\", \"PLC argument count differs from its signature.\");\n return fn.parameters.map((parameter, index) =>\n this.inputArgument(node.arguments[index]!, parameter),\n );\n }\n\n private inputArgument(value: ts.Expression, parameter: Variable): Expression {\n if (parameter.mode !== \"inOut\") return this.expression(value, parameter.type);\n if (ts.isCallExpression(value) && this.sdkCall(value) === \"ref\") {\n if (value.arguments.length !== 1 || value.typeArguments?.length)\n this.fail(value, \"PLC3003\", \"ref takes one place.\");\n const target = this.target(value.arguments[0]!);\n if (target.type !== parameter.type)\n this.fail(value, \"PLC2001\", \"Borrowed place type must exactly match its InOut parameter.\");\n return { kind: \"borrow\", place: target.place, type: target.type, span: span(value) };\n }\n if (this.resolver.types.get(parameter.type)?.kind === \"block\") {\n const place = this.place(value);\n if (placeType(place, this.resolver.types, this.byId(), this.ranges).type !== parameter.type)\n this.fail(value, \"PLC2001\", \"Pass a block instance of the parameter's type.\");\n return { kind: \"borrow\", place, type: parameter.type, span: span(value) };\n }\n return this.reference(this.expression(value, parameter.type), parameter);\n }\n\n /**\n * An aggregate InOut argument borrows its place; a value with no writable address reaches\n * the callee through a compiler temporary.\n */\n private reference(argument: Expression, parameter: Variable): Expression {\n if (!aggregate(this.resolver.types.get(parameter.type)))\n throw new SemanticError(\n error(\n \"PLC3003\",\n \"Scalar InOut arguments require a direct ref(place) borrow.\",\n argument.span,\n ),\n );\n return argument.kind === \"load\" &&\n !this.loopCounters.has(argument.place.root) &&\n !placeType(argument.place, this.resolver.types, this.byId(), this.ranges, true).issue\n ? { kind: \"borrow\", place: argument.place, type: argument.type, span: argument.span }\n : this.implicitCopy(argument);\n }\n\n /**\n * The fields `{ ...base }` supplies: base is a record whose fields are all target fields of the\n * same type. A stored base is read field by field; `defaultValue<T>()` gives constants.\n */\n private spreadFields(\n node: ts.Expression,\n targets: readonly { name: string; type: string }[],\n ): Record<string, Expression> {\n let base = this.expression(node);\n const layout = this.resolver.types.get(base.type);\n if (\n layout?.kind !== \"record\" ||\n layout.fields.some(\n (field) => targets.find((target) => target.name === field.name)?.type !== field.type,\n )\n )\n this.fail(\n node,\n \"PLC2001\",\n \"A spread is a record whose fields are all fields of the target, with the same types.\",\n );\n // Static initializers run before any scan, so a stored base contributes its initial value.\n const initial =\n !this.activeFunction && base.kind === \"load\" && !base.place.path.length\n ? this.byId().get(base.place.root)?.initial\n : undefined;\n if (initial) base = { ...base, kind: \"constant\", value: initial };\n if (base.kind === \"load\") {\n const { place } = base;\n return Object.fromEntries(\n layout.fields.map((field) => [\n field.name,\n {\n kind: \"load\",\n type: field.type,\n place: { root: place.root, path: [...place.path, { kind: \"field\", name: field.name }] },\n span: base.span,\n },\n ]),\n );\n }\n if (base.kind !== \"constant\" || base.value.kind !== \"record\")\n this.fail(\n node,\n \"PLC1001\",\n \"Spread a record in storage or defaultValue<T>(); bind other values to a const first.\",\n );\n const { value } = base;\n return Object.fromEntries(\n layout.fields.map((field) => [\n field.name,\n { kind: \"constant\", type: field.type, value: value.fields[field.name]!, span: base.span },\n ]),\n );\n }\n\n private statements(nodes: readonly ts.Statement[], locals: Variable[]): Statement[] {\n return nodes.flatMap((node) => this.statement(node, locals));\n }\n\n private body(node: ts.Statement, locals: Variable[]): Statement[] {\n return ts.isBlock(node)\n ? this.statements(node.statements, locals)\n : this.statement(node, locals);\n }\n\n /** A record or array assigned into storage copies: fixed storage cannot repoint at its source. */\n private implicitCopy(value: Expression): Expression {\n if (instancedBlock(value.type, this.resolver.types))\n throw new SemanticError(\n error(\"PLC3003\", \"Block instances cannot be copied, aliased or returned.\", value.span),\n );\n return aggregate(this.resolver.types.get(value.type)) && value.kind === \"load\"\n ? { kind: \"copy\", type: value.type, operand: value, span: value.span }\n : value;\n }\n\n /** Remember a copied source, so a later write to it in this routine cannot silently diverge. */\n private recordCopySource(value: Expression): void {\n if (value.kind === \"load\" && aggregate(this.resolver.types.get(value.type)))\n this.copySources.push(value.place);\n }\n\n /** An alias re-reads its path at each use, so its indexes must keep their value for its scope. */\n private unchanging(value: Expression): boolean {\n if (value.kind === \"constant\") return true;\n if (value.kind === \"convert\") return this.unchanging(value.operand);\n if (value.kind === \"binary\") return this.unchanging(value.left) && this.unchanging(value.right);\n if (value.kind !== \"load\" || value.place.path.length) return false;\n const root = this.byId().get(value.place.root);\n return (\n this.loopCounters.has(value.place.root) ||\n Boolean(root && !root.mutable && [\"parameter\", \"local\", \"constant\"].includes(root.storage))\n );\n }\n\n private place(node: ts.Expression): Place {\n if (ts.isParenthesizedExpression(node)) return this.place(node.expression);\n if (this.activeBlock && ts.isPropertyAccessExpression(node)) {\n if (\n ts.isIdentifier(node.expression) &&\n this.resolver.symbol(node.expression) === this.activeBlock.inputSymbol\n ) {\n const variable = this.activeBlock.inputBindings.get(node.name.text);\n if (!variable) this.fail(node, \"PLC2001\", \"Unknown block input field.\");\n return { root: variable.id, path: [] };\n }\n if (\n ts.isPropertyAccessExpression(node.expression) &&\n node.expression.expression.kind === ts.SyntaxKind.ThisKeyword &&\n node.expression.name.text === \"out\"\n ) {\n const variable = this.activeBlock.block.outputs.find(\n (output) => output.name === node.name.text,\n );\n if (!variable) this.fail(node, \"PLC2001\", \"Unknown block output field.\");\n return { root: variable.id, path: [] };\n }\n }\n if (\n ts.isPropertyAccessExpression(node) &&\n this.activeBlock?.fieldBindings.has(this.resolver.symbol(node.name)) &&\n node.expression.kind !== ts.SyntaxKind.ThisKeyword\n )\n this.fail(node, \"PLC1007\", \"Private block state is accessible through this.field only.\");\n if (ts.isIdentifier(node)) {\n const alias = this.aliases.get(this.resolver.symbol(node));\n if (alias) return alias;\n }\n if (ts.isIdentifier(node) || ts.isPropertyAccessExpression(node)) {\n const variable = this.variables.get(\n this.resolver.symbol(ts.isIdentifier(node) ? node : node.name),\n );\n if (variable) return { root: variable.id, path: [] };\n }\n if (ts.isPropertyAccessExpression(node)) {\n const base = this.place(node.expression);\n return { root: base.root, path: [...base.path, { kind: \"field\", name: node.name.text }] };\n }\n if (ts.isElementAccessExpression(node) && node.argumentExpression) {\n const base = this.place(node.expression),\n value = this.expression(node.argumentExpression),\n array = this.resolver.types.get(\n placeType(base, this.resolver.types, this.byId(), this.ranges).type ?? \"\",\n );\n if (array?.kind === \"array\" && array.index && value.type !== array.index)\n this.fail(node, \"PLC2001\", \"An enum-keyed record is indexed only by its own enum.\");\n return { root: base.root, path: [...base.path, { kind: \"index\", value }] };\n }\n this.fail(node, \"PLC1001\", \"Access requires statically allocated PLC storage.\");\n }\n\n private target(node: ts.Expression): { place: Place; type: string } {\n if (ts.isIdentifier(node)) {\n const binding = this.checker.getSymbolAtLocation(node);\n if (binding && binding.flags & ts.SymbolFlags.Alias)\n this.fail(node, \"PLC3002\", \"Imported scalar bindings are read-only.\");\n }\n const place = this.place(node),\n type = placeType(place, this.resolver.types, this.byId(), this.ranges, true);\n if (type.issue || !type.type || this.loopCounters.has(place.root))\n this.fail(node, \"PLC3002\", type.issue ?? \"This PLC storage is read-only.\");\n const overlaps = (source: Place) =>\n source.root === place.root &&\n source.path.every((segment, index) => {\n const other = place.path[index];\n return (\n !other ||\n segment.kind !== \"field\" ||\n other.kind !== \"field\" ||\n segment.name === other.name\n );\n });\n if (this.copySources.some(overlaps))\n this.fail(\n node,\n \"PLC3003\",\n \"This value was assigned into other storage, which holds a copy, so this write will not reach it. Assign it afterwards, or use copy(value) if separate values are intended.\",\n );\n return { place, type: type.type };\n }\n\n private statement(node: ts.Statement, locals: Variable[]): Statement[] {\n const origin = { span: span(node) };\n if (ts.isBlock(node)) return this.statements(node.statements, locals);\n if (ts.isEmptyStatement(node)) return [];\n if (ts.isIfStatement(node)) {\n const condition = this.expression(node.expression, \"BOOL\");\n const original = new Map(this.ranges);\n const branch = (body: ts.Statement | undefined, truth: boolean) => {\n this.ranges.clear();\n for (const [root, range] of narrowRanges(\n condition,\n truth,\n this.resolver.types,\n this.byId(),\n original,\n ))\n this.ranges.set(root, range);\n try {\n return body ? this.body(body, locals) : [];\n } finally {\n this.ranges.clear();\n for (const [root, range] of original) this.ranges.set(root, range);\n }\n };\n return [\n {\n ...origin,\n kind: \"if\",\n condition,\n then: branch(node.thenStatement, true),\n else: branch(node.elseStatement, false),\n },\n ];\n }\n if (ts.isReturnStatement(node)) {\n const result = this.activeFunction?.result;\n if (!result && node.expression)\n this.fail(node, \"PLC2001\", \"Void helpers and program entries cannot return a value.\");\n if (result && !node.expression)\n this.fail(node, \"PLC2001\", \"Typed helpers must return their declared PLC result.\");\n const value =\n node.expression && result\n ? this.implicitCopy(this.expression(node.expression, result))\n : undefined;\n return [{ ...origin, kind: \"return\", ...(value && { value }) }];\n }\n if (ts.isBreakStatement(node) || ts.isContinueStatement(node)) {\n if (ts.isBreakStatement(node) && this.breakTargets.at(-1) === \"switch\")\n this.fail(\n node,\n \"PLC1001\",\n \"Switch break must terminate its case; nested conditional switch breaks are unsupported.\",\n );\n if (node.label || !this.loopCounters.size)\n this.fail(\n node,\n \"PLC1001\",\n \"Loop control requires an enclosing bounded loop and cannot use a label.\",\n );\n return [{ ...origin, kind: ts.isBreakStatement(node) ? \"break\" : \"continue\" }];\n }\n if (ts.isVariableStatement(node)) return this.localDeclarations(node, locals);\n if (ts.isForStatement(node)) return this.loop(node, locals);\n if (ts.isForOfStatement(node)) return this.forOf(node, locals);\n if (ts.isSwitchStatement(node)) return this.switchStatement(node, locals);\n if (ts.isExpressionStatement(node)) {\n const expression = node.expression;\n if (ts.isCallExpression(expression)) {\n const update = this.update(expression);\n if (update) return [update];\n const call = this.call(expression);\n return [\n {\n ...origin,\n kind: \"invoke\",\n function: call.fn.id,\n arguments: call.arguments,\n ...(call.instance && { instance: call.instance }),\n ...(call.index && { index: call.index }),\n },\n ];\n }\n if (ts.isBinaryExpression(expression)) {\n const variable = this.target(expression.left);\n if (expression.operatorToken.kind !== ts.SyntaxKind.EqualsToken)\n this.fail(expression, \"PLC2001\", \"Use explicit assignment and arithmetic policies.\");\n const value = this.expression(expression.right, variable.type);\n this.recordCopySource(value);\n return [\n {\n ...origin,\n kind: \"assign\",\n destination: variable.place,\n value: this.implicitCopy(value),\n },\n ];\n }\n }\n this.fail(node, \"PLC1001\", `${ts.SyntaxKind[node.kind]} is not supported in PLC scan code.`);\n }\n\n private switchStatement(node: ts.SwitchStatement, locals: Variable[]): Statement[] {\n const origin = { span: span(node) };\n this.breakTargets.push(\"switch\");\n try {\n const value = this.expression(node.expression);\n const cases: { values: Constant[]; body: Statement[] }[] = [];\n let fallback: Statement[] = [];\n let pending: Constant[] = [],\n pendingDefault = false;\n for (const clause of node.caseBlock.clauses) {\n if (ts.isDefaultClause(clause)) pendingDefault = true;\n else {\n const constant = this.constant(this.expression(clause.expression, value.type));\n if (!constant)\n this.fail(clause, \"PLC2001\", \"Case values must be compile-time constants.\");\n pending.push(constant);\n }\n if (!clause.statements.length) continue;\n let statements = [...clause.statements];\n const last = statements.at(-1);\n if (last && ts.isBreakStatement(last) && !last.label) statements = statements.slice(0, -1);\n else if (statements.length && !(last && ts.isReturnStatement(last)))\n this.fail(\n clause,\n \"PLC1001\",\n \"Switch cases must end with break or return; fallthrough is prohibited.\",\n );\n const body = this.statements(statements, locals);\n if (pending.length) cases.push({ values: pending, body });\n if (pendingDefault) fallback = body;\n pending = [];\n pendingDefault = false;\n }\n if (pending.length) cases.push({ values: pending, body: [] });\n return [{ ...origin, kind: \"switch\", value, cases, fallback }];\n } finally {\n this.breakTargets.pop();\n }\n }\n\n private localDeclarations(node: ts.VariableStatement, locals: Variable[]): Statement[] {\n const origin = { span: span(node) };\n if (!(node.declarationList.flags & (ts.NodeFlags.Let | ts.NodeFlags.Const)))\n this.fail(node, \"PLC1001\", \"Use let or const for invocation locals.\");\n return node.declarationList.declarations.flatMap((declaration) => {\n if (!ts.isIdentifier(declaration.name))\n this.fail(declaration, \"PLC1001\", \"Destructuring is not supported.\");\n if (!declaration.initializer)\n this.fail(declaration, \"PLC3001\", \"Initialize invocation-local PLC variables explicitly.\");\n const annotation = declaration.type ? this.type(declaration.type) : undefined;\n if (annotation && !this.resolver.isValue(annotation))\n this.fail(\n declaration,\n \"PLC2001\",\n \"Invocation locals require value types, not instances or borrow schemas.\",\n );\n if (annotation?.io)\n this.fail(declaration, \"PLC4002\", \"Logical I/O cannot be invocation-local.\");\n if (\n !annotation &&\n !(node.declarationList.flags & ts.NodeFlags.Const) &&\n this.numericLiteral(declaration.initializer) === undefined &&\n ![ts.SyntaxKind.TrueKeyword, ts.SyntaxKind.FalseKeyword].includes(\n declaration.initializer.kind,\n )\n )\n this.fail(declaration, \"PLC2001\", \"Annotate mutable numeric storage explicitly.\");\n const initial = this.expression(declaration.initializer, annotation?.type);\n if (\n node.declarationList.flags & ts.NodeFlags.Const &&\n initial.kind === \"load\" &&\n aggregate(this.resolver.types.get(initial.type))\n ) {\n for (const segment of initial.place.path)\n if (segment.kind === \"index\" && !this.unchanging(segment.value))\n this.fail(\n declaration,\n \"PLC3003\",\n \"An alias index must keep its value while the alias is in scope; use copy(value) for a snapshot.\",\n );\n this.aliases.set(this.resolver.symbol(declaration.name), initial.place);\n return [];\n }\n this.recordCopySource(initial);\n const value = this.implicitCopy(initial);\n const variable: Variable = {\n id: this.storageId(declaration, declaration.name.text),\n name: declaration.name.text,\n type: value.type,\n storage: \"local\",\n mutable: !(node.declarationList.flags & ts.NodeFlags.Const),\n retain: false,\n span: span(declaration),\n };\n this.variables.set(this.resolver.symbol(declaration.name), variable);\n locals.push(variable);\n // A const is assigned once, so its initializer's range holds wherever it is read.\n const bound =\n !variable.mutable &&\n valueRange(value, this.resolver.types, this.byId(), this.ranges, this.instances);\n if (bound) this.ranges.set(variable.id, bound);\n return { ...origin, kind: \"assign\", destination: { root: variable.id, path: [] }, value };\n });\n }\n\n private loop(node: ts.ForStatement, locals: Variable[]): Statement[] {\n let counter: Variable;\n let initializer: ts.Expression;\n let existing = false;\n if (node.initializer && ts.isVariableDeclarationList(node.initializer)) {\n if (\n !(node.initializer.flags & ts.NodeFlags.Let) ||\n node.initializer.declarations.length !== 1\n )\n this.fail(\n node,\n \"PLC1001\",\n \"A bounded for loop requires one let counter or an existing counter assignment.\",\n );\n const declaration = node.initializer.declarations[0]!;\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer)\n this.fail(node, \"PLC2001\", \"Initialize the integer loop counter.\");\n const annotation = declaration.type ? this.type(declaration.type) : { type: \"DINT\" };\n if (annotation.io)\n this.fail(declaration, \"PLC4002\", \"Loop counters cannot use I/O wrappers.\");\n counter = {\n id: this.storageId(declaration, declaration.name.text),\n name: declaration.name.text,\n type: annotation.type,\n storage: \"local\",\n mutable: true,\n retain: false,\n span: span(declaration),\n };\n this.variables.set(this.resolver.symbol(declaration.name), counter);\n locals.push(counter);\n initializer = declaration.initializer;\n } else if (\n node.initializer &&\n ts.isBinaryExpression(node.initializer) &&\n node.initializer.operatorToken.kind === ts.SyntaxKind.EqualsToken\n ) {\n const target = this.target(node.initializer.left);\n counter = this.byId().get(target.place.root)!;\n if (target.place.path.length || ![\"local\", \"module\", \"field\"].includes(counter.storage))\n this.fail(\n node.initializer,\n \"PLC1001\",\n \"An existing loop counter must be a local, module variable or private block field.\",\n );\n initializer = node.initializer.right;\n existing = true;\n } else\n this.fail(\n node,\n \"PLC1001\",\n \"Initialize one let counter or assign an existing counter in the for header.\",\n );\n const type = counter.type,\n plcType = this.resolver.types.get(type);\n if (plcType?.kind !== \"integer\")\n this.fail(node.initializer!, \"PLC2001\", \"Loop counters require integer types.\");\n const startExpression = this.expression(initializer, type);\n const start = this.constant(startExpression);\n const isCounter = (expression: ts.Expression): boolean => {\n const place = this.place(expression);\n return place.root === counter.id && place.path.length === 0;\n };\n const condition = node.condition;\n if (!condition || !ts.isBinaryExpression(condition) || !isCounter(condition.left))\n this.fail(node, \"PLC1001\", \"Loop condition must compare its counter to a bounded integer.\");\n const boundExpression = this.expression(condition.right, type);\n const bound = this.constant(boundExpression);\n let step: bigint;\n const increment = node.incrementor;\n if (\n increment &&\n (ts.isPostfixUnaryExpression(increment) || ts.isPrefixUnaryExpression(increment)) &&\n isCounter(increment.operand) &&\n [ts.SyntaxKind.PlusPlusToken, ts.SyntaxKind.MinusMinusToken].includes(increment.operator)\n )\n step = increment.operator === ts.SyntaxKind.PlusPlusToken ? 1n : -1n;\n else if (\n increment &&\n ts.isBinaryExpression(increment) &&\n isCounter(increment.left) &&\n [ts.SyntaxKind.PlusEqualsToken, ts.SyntaxKind.MinusEqualsToken].includes(\n increment.operatorToken.kind,\n )\n ) {\n const amount = this.constant(this.expression(increment.right, type));\n if (amount?.kind !== \"integer\" || BigInt(amount.value) <= 0n)\n this.fail(increment, \"PLC2001\", \"Loop step must be a positive constant integer.\");\n step =\n BigInt(amount.value) *\n (increment.operatorToken.kind === ts.SyntaxKind.PlusEqualsToken ? 1n : -1n);\n } else this.fail(node, \"PLC1001\", \"Use i++, i--, i += step or i -= step in the for header.\");\n const operator = condition.operatorToken.kind,\n ascending = step > 0n;\n if (\n !(\n ascending\n ? [ts.SyntaxKind.LessThanToken, ts.SyntaxKind.LessThanEqualsToken]\n : [ts.SyntaxKind.GreaterThanToken, ts.SyntaxKind.GreaterThanEqualsToken]\n ).includes(operator)\n )\n this.fail(condition, \"PLC2001\", \"Loop direction and comparison must agree.\");\n const exclusive =\n operator === ts.SyntaxKind.LessThanToken || operator === ts.SyntaxKind.GreaterThanToken;\n if (start?.kind !== \"integer\" || bound?.kind !== \"integer\") {\n const startRange = interval(startExpression, this.resolver.types, this.byId(), this.ranges);\n const limitRange = interval(boundExpression, this.resolver.types, this.byId(), this.ranges);\n if (!startRange || !limitRange)\n this.fail(node, \"PLC2001\", \"Loop bounds require finite integer ranges.\");\n const proof = loopBounds(startRange, limitRange, step, exclusive);\n if (proof.count > 1_000_000n)\n this.fail(node, \"PLC2001\", \"A scan loop cannot exceed 1,000,000 iterations.\");\n if (existing && proof.count > 0n) {\n const terminal = (step > 0n ? proof.range[1] : proof.range[0]) + step;\n const [minimum, maximum] = integerRange(plcType);\n if (terminal < minimum || terminal > maximum)\n this.fail(\n node,\n \"PLC2001\",\n \"The existing loop counter would overflow on its final increment.\",\n );\n }\n this.loopCounters.add(counter.id);\n this.ranges.set(counter.id, proof.range);\n this.breakTargets.push(\"loop\");\n try {\n return [\n {\n span: span(node),\n kind: \"for\",\n counter: counter.id,\n ...(existing && { counterScope: \"existing\" as const }),\n start: startExpression,\n limit: boundExpression,\n step: String(step),\n ...(exclusive && { exclusive: true as const }),\n maxIterations: Number(proof.count),\n body: this.body(node.statement, locals),\n },\n ];\n } finally {\n this.breakTargets.pop();\n this.loopCounters.delete(counter.id);\n this.ranges.delete(counter.id);\n }\n }\n const finish = BigInt(bound.value) + (exclusive ? (ascending ? -1n : 1n) : 0n),\n first = BigInt(start.value);\n const count = loopIterations(first, finish, step);\n if (count > 1_000_000n)\n this.fail(node, \"PLC2001\", \"A scan loop cannot exceed 1,000,000 iterations.\");\n if (existing) {\n const terminal = first + count * step,\n [minimum, maximum] = integerRange(plcType);\n if (terminal < minimum || terminal > maximum)\n this.fail(\n node,\n \"PLC2001\",\n \"The existing loop counter would overflow on its final increment.\",\n );\n }\n this.loopCounters.add(counter.id);\n this.ranges.set(counter.id, first <= finish ? [first, finish] : [finish, first]);\n let body: Statement[];\n this.breakTargets.push(\"loop\");\n try {\n body = this.body(node.statement, locals);\n } finally {\n this.breakTargets.pop();\n this.loopCounters.delete(counter.id);\n this.ranges.delete(counter.id);\n }\n if (!count)\n return existing\n ? [\n {\n kind: \"assign\",\n destination: { root: counter.id, path: [] },\n value: { kind: \"constant\", type, value: start, span: span(initializer) },\n span: span(node.initializer!),\n },\n ]\n : [];\n const limit: Expression = {\n kind: \"constant\",\n type,\n value: { kind: \"integer\", value: String(finish) },\n span: span(condition.right),\n };\n return [\n {\n span: span(node),\n kind: \"for\",\n counter: counter.id,\n ...(existing && { counterScope: \"existing\" as const }),\n start: { kind: \"constant\", type, value: start, span: span(initializer) },\n limit,\n step: String(step),\n maxIterations: Number(count),\n body,\n },\n ];\n }\n\n /**\n * `for (const element of array)` is a bounded FOR over the array's declared bounds whose\n * element binding aliases `array[counter]`. `array.entries()` also binds the counter. An\n * enum-keyed Record iterates with `Object.values(record)`, or SDK `entries(record)` for its key.\n */\n private forOf(node: ts.ForOfStatement, locals: Variable[]): Statement[] {\n const list = node.initializer;\n if (\n node.awaitModifier ||\n !ts.isVariableDeclarationList(list) ||\n !(list.flags & ts.NodeFlags.Const) ||\n list.declarations.length !== 1\n )\n this.fail(node, \"PLC1001\", \"for…of binds one const element of a PLC array.\");\n let iterated = node.expression,\n form: \"elements\" | \"entries\" | \"recordValues\" | \"recordEntries\" = \"elements\";\n if (ts.isCallExpression(iterated)) {\n const callee = iterated.expression;\n if (\n ts.isPropertyAccessExpression(callee) &&\n callee.name.text === \"entries\" &&\n !iterated.arguments.length\n ) {\n form = \"entries\";\n iterated = callee.expression;\n } else if (iterated.arguments.length === 1) {\n if (this.sdkCall(iterated) === \"entries\") form = \"recordEntries\";\n else if (\n ts.isPropertyAccessExpression(callee) &&\n callee.name.text === \"values\" &&\n ts.isIdentifier(callee.expression) &&\n this.resolver.standardLibrary(this.resolver.symbol(callee.expression))\n )\n form = \"recordValues\";\n if (form !== \"elements\") iterated = iterated.arguments[0]!;\n }\n }\n const binding = list.declarations[0]!.name,\n keyed = form === \"entries\" || form === \"recordEntries\";\n const names = ts.isArrayBindingPattern(binding)\n ? binding.elements.map((element) =>\n ts.isBindingElement(element) &&\n !element.dotDotDotToken &&\n !element.initializer &&\n ts.isIdentifier(element.name)\n ? element.name\n : undefined,\n )\n : [undefined, ts.isIdentifier(binding) ? binding : undefined];\n const [indexName, elementName] = names;\n if (names.length !== 2 || !elementName || Boolean(indexName) !== keyed)\n this.fail(\n binding,\n \"PLC1001\",\n \"Bind one element, or destructure [index, element] from array.entries() or entries(record).\",\n );\n const place = this.place(iterated),\n array = this.resolver.types.get(\n placeType(place, this.resolver.types, this.byId(), this.ranges).type ?? \"\",\n );\n if (array?.kind !== \"array\" || Boolean(array.index) !== form.startsWith(\"record\"))\n this.fail(\n node.expression,\n \"PLC2001\",\n \"for…of iterates a FixedArray, array.entries(), or an enum-keyed Record through Object.values(record) or entries(record).\",\n );\n for (const segment of place.path)\n if (segment.kind === \"index\" && !this.unchanging(segment.value))\n this.fail(node.expression, \"PLC3003\", \"An iterated array's index must keep its value.\");\n\n const origin = { span: span(node) };\n const local = (declaration: ts.Node, name: string, type: string): Variable => {\n const variable: Variable = {\n id: this.storageId(declaration, name),\n name,\n type,\n storage: \"local\",\n mutable: true,\n retain: false,\n span: span(declaration),\n };\n locals.push(variable);\n return variable;\n };\n const constant = (type: string, value: string): Expression => ({\n ...origin,\n kind: \"constant\",\n type,\n value: { kind: \"integer\", value },\n });\n const counter = local(node, form === \"entries\" && indexName ? indexName.text : \"index\", \"DINT\"),\n index: Expression = {\n ...origin,\n kind: \"load\",\n type: \"DINT\",\n place: { root: counter.id, path: [] },\n };\n const before: Statement[] = [],\n prefix: Statement[] = [];\n const readonly = [counter.id];\n const enumeration = array.index ? this.resolver.types.get(array.index) : undefined;\n if (indexName && enumeration?.kind === \"enum\") {\n // The enum key follows the counter: a CASE at the top of each iteration selects its member.\n const key = local(indexName, indexName.text, enumeration.id);\n const assign = (value: string): Statement => ({\n ...origin,\n kind: \"assign\",\n destination: { root: key.id, path: [] },\n value: constant(key.type, value),\n });\n before.push(assign(String(array.lowerBound)));\n prefix.push({\n ...origin,\n kind: \"switch\",\n value: index,\n cases: enumeration.members.map((member) => ({\n values: [{ kind: \"integer\", value: member.value }],\n body: [assign(member.value)],\n })),\n fallback: [],\n });\n readonly.push(key.id);\n this.variables.set(this.resolver.symbol(indexName), key);\n } else if (indexName) this.variables.set(this.resolver.symbol(indexName), counter);\n this.aliases.set(this.resolver.symbol(elementName), {\n root: place.root,\n path: [...place.path, { kind: \"index\", value: index }],\n });\n\n const upper = array.lowerBound + array.length - 1;\n for (const id of readonly) this.loopCounters.add(id);\n this.ranges.set(counter.id, [BigInt(array.lowerBound), BigInt(upper)]);\n this.breakTargets.push(\"loop\");\n try {\n return [\n ...before,\n {\n ...origin,\n kind: \"for\",\n counter: counter.id,\n start: constant(\"DINT\", String(array.lowerBound)),\n limit: constant(\"DINT\", String(upper)),\n step: \"1\",\n maxIterations: array.length,\n body: [...prefix, ...this.body(node.statement, locals)],\n },\n ];\n } finally {\n this.breakTargets.pop();\n for (const id of readonly) this.loopCounters.delete(id);\n this.ranges.delete(counter.id);\n }\n }\n}\n",
|
|
7
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { createHash } from \"node:crypto\";\nimport { dirname } from \"node:path\";\nimport { error, type Diagnostic } from \"@tsplc/compiler/ir\";\n\n/** Telemetry is sampled by its authored task and published read-only by the backend. */\nexport const lowerExposure = (program: ts.Program, sdk: string) => {\n const checker = program.getTypeChecker();\n const sources = new Map<string, string>();\n const diagnostics: Diagnostic[] = [];\n const variables = new Map<string, { name: string; version: string }>();\n const names = new Set<string>();\n const symbol = (node: ts.Node) => {\n let value = checker.getSymbolAtLocation(node);\n while (value && value.flags & ts.SymbolFlags.Alias) value = checker.getAliasedSymbol(value);\n return value;\n };\n for (const source of runtimeSources(program)) {\n if (source.isDeclarationFile) continue;\n const edits: { start: number; end: number; text: string }[] = [];\n const extra: string[] = [];\n const visit = (node: ts.Node): void => {\n if (\n !ts.isCallExpression(node) ||\n symbol(node.expression)?.name !== \"expose\" ||\n !symbol(node.expression)?.declarations?.some((value) =>\n value.getSourceFile().fileName.startsWith(dirname(sdk) + \"/\"),\n )\n ) {\n ts.forEachChild(node, visit);\n return;\n }\n const fail = (message: string) => {\n const start = node.getStart(source),\n position = source.getLineAndCharacterOfPosition(start);\n diagnostics.push(\n error(\"PLC1014\", message, {\n file: source.fileName,\n start,\n end: node.end,\n line: position.line + 1,\n column: position.character + 1,\n }),\n );\n };\n const [label, values] = node.arguments;\n if (\n !label ||\n !ts.isStringLiteral(label) ||\n !/^[A-Za-z_][A-Za-z0-9_]*$/.test(label.text) ||\n label.text === \"__proto__\" ||\n !values ||\n !ts.isObjectLiteralExpression(values) ||\n !ts.isExpressionStatement(node.parent)\n ) {\n fail(\n \"expose requires a literal machine name and a flat telemetry object in a synchronous cyclic routine.\",\n );\n return;\n }\n let owner: ts.Node | undefined = node.parent;\n while (owner && !ts.isFunctionLike(owner)) owner = owner.parent;\n if (\n !owner ||\n (ts.canHaveModifiers(owner) &&\n ts.getModifiers(owner)?.some((value) => value.kind === ts.SyntaxKind.AsyncKeyword))\n ) {\n fail(\"Sample telemetry from a synchronous cyclic routine, outside async continuations.\");\n return;\n }\n if (names.has(label.text)) {\n fail(`Duplicate machine exposure ${label.text}.`);\n return;\n }\n names.add(label.text);\n const fields: { name: string; type: string; value: string }[] = [];\n for (const property of values.properties) {\n if (\n !ts.isPropertyAssignment(property) ||\n !ts.isIdentifier(property.name) ||\n [\"contractVersion\", \"__proto__\"].includes(property.name.text)\n ) {\n fail(\"Telemetry uses named scalar fields; contractVersion and __proto__ are reserved.\");\n return;\n }\n const value = property.initializer;\n const type = checker.getTypeAtLocation(value);\n let annotation: string | undefined;\n if (type.flags & ts.TypeFlags.BooleanLike) annotation = \"BOOL\";\n const declaration = symbol(\n ts.isPropertyAccessExpression(value) ? value.name : value,\n )?.valueDeclaration;\n if (\n declaration &&\n (ts.isPropertySignature(declaration) ||\n ts.isPropertyDeclaration(declaration) ||\n ts.isVariableDeclaration(declaration) ||\n ts.isParameter(declaration)) &&\n declaration.type\n ) {\n const text = declaration.type.getText(declaration.getSourceFile());\n if (/^(BOOL|SINT|USINT|BYTE|INT|UINT|WORD|DINT|UDINT|DWORD|STRING<\\d+>)$/.test(text))\n annotation = text;\n }\n if (!annotation) {\n fail(\n `Telemetry ${property.name.text} needs a concrete BOOL, integer up to 32 bits or bounded STRING annotation.`,\n );\n return;\n }\n fields.push({ name: property.name.text, type: annotation, value: value.getText(source) });\n }\n if (!fields.length) {\n fail(\"Expose at least one telemetry field.\");\n return;\n }\n const name = `tsplcExposed_${label.text}`;\n const record = `TsplcTelemetry_${label.text}`;\n const version = createHash(\"sha256\")\n .update(\n JSON.stringify({\n abi: 1,\n name: label.text,\n fields: fields.map(({ name, type }) => ({ name, type })),\n }),\n )\n .digest(\"hex\");\n extra.push(\n `export interface ${record}{contractVersion:STRING<64>;${fields.map((field) => `${field.name}:${field.type}`).join(\";\")}}\\nexport let ${name}:${record}=defaultValue<${record}>();`,\n );\n variables.set(`${source.fileName}:${name}`, { name: label.text, version });\n edits.push({\n start: node.getStart(source),\n end: node.end,\n text: `{${name}.contractVersion=${JSON.stringify(version)};${fields.map((field) => `${name}.${field.name}=${field.value};`).join(\"\")}}`,\n });\n };\n visit(source);\n if (!edits.length) continue;\n let text = source.text;\n for (const edit of edits.sort((a, b) => b.start - a.start))\n text = text.slice(0, edit.start) + edit.text + text.slice(edit.end);\n sources.set(source.fileName, text + \"\\n\" + extra.join(\"\\n\"));\n }\n return { sources, diagnostics, variables };\n};\n",
|
|
8
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { dirname, join, relative } from \"node:path\";\nimport { error, type Diagnostic } from \"@tsplc/compiler/ir\";\nimport {\n isIntegerType,\n serviceContract,\n servicePath,\n wireLayout,\n wireRecord,\n type ServiceContract,\n type WireField,\n type WireScalar,\n} from \"@tsplc/server\";\n\n/** The server section's transport; each client's type argument names its router. */\nexport interface ServiceOptions {\n transport: \"http\" | \"opcua\";\n baseUrlEnv?: string;\n}\n\n/** A procedure record read from its type, with the PLC enum each enum field names. */\ninterface RecordLayout {\n fields: Record<string, WireField>;\n enums: Record<string, ts.EnumDeclaration>;\n}\n\nconst property = (checker: ts.TypeChecker, type: ts.Type, name: string) => {\n const symbol = type.getProperty(name);\n return symbol && checker.getTypeOfSymbol(symbol);\n};\n\n/** An `iec.*` schema's layout, which its type carries as an optional phantom property. */\nconst layoutNumber = (checker: ts.TypeChecker, type: ts.Type, name: string, label: string) => {\n const brand = property(checker, type, wireLayout);\n const value = brand && property(checker, checker.getNonNullableType(brand), name);\n if (!value) return undefined;\n if (!value.isNumberLiteral()) throw new Error(`${label}: ${name} must be a literal number.`);\n return value.value;\n};\n\nconst scalarLayout = (\n checker: ts.TypeChecker,\n type: ts.Type,\n label: string,\n): { field: WireScalar; enumeration?: ts.EnumDeclaration } => {\n if (type.flags & ts.TypeFlags.Boolean) return { field: { kind: \"boolean\" } };\n // An enum type is the union of its member literals.\n const first = type.isUnion() ? type.types[0] : type;\n const member = first?.symbol?.valueDeclaration;\n if (first && first.flags & ts.TypeFlags.EnumLiteral && member && ts.isEnumMember(member)) {\n const members: Record<string, number> = {};\n for (const item of member.parent.members) {\n const value = checker.getConstantValue(item);\n if (typeof value !== \"number\")\n throw new Error(`${label}: PLC enums require numeric members.`);\n members[item.name.getText()] = value;\n }\n return { field: { kind: \"enum\", members }, enumeration: member.parent };\n }\n const capacity = layoutNumber(checker, type, \"capacity\", label);\n if (capacity !== undefined) return { field: { kind: \"string\", capacity } };\n const brand = property(checker, type, wireLayout);\n const iec = brand && property(checker, checker.getNonNullableType(brand), \"iec\");\n if (iec?.isStringLiteral() && isIntegerType(iec.value)) {\n const minimum = layoutNumber(checker, type, \"minimum\", label);\n const maximum = layoutNumber(checker, type, \"maximum\", label);\n if (minimum !== undefined && maximum !== undefined)\n return { field: { kind: \"integer\", iec: iec.value, minimum, maximum } };\n }\n throw new Error(\n `${label}: use z.boolean(), z.enum() of a numeric enum, iec.STRING(), or an integer such as iec.INT().`,\n );\n};\n\nconst recordLayout = (\n checker: ts.TypeChecker,\n type: ts.Type,\n label: string,\n output: boolean,\n): RecordLayout => {\n const fields: Record<string, WireField> = {};\n const enums: Record<string, ts.EnumDeclaration> = {};\n // A procedure without `.input()` takes `void`.\n if (!(type.flags & ts.TypeFlags.Void)) {\n if (\n !(type.flags & ts.TypeFlags.Object) ||\n type.getStringIndexType() ||\n type.getNumberIndexType() ||\n type.getCallSignatures().length\n )\n throw new Error(`${label}: PLC procedures exchange one closed z.strictObject() record.`);\n for (const field of type.getProperties()) {\n const key = `${label}.${field.name}`;\n if (field.flags & ts.SymbolFlags.Optional)\n throw new Error(`${key}: optional wire fields are unsupported.`);\n const value = checker.getTypeOfSymbol(field);\n const length = layoutNumber(checker, value, \"length\", key);\n const element = length === undefined ? undefined : value.getNumberIndexType();\n const scalar = scalarLayout(checker, element ?? value, key);\n fields[field.name] =\n length === undefined ? scalar.field : { kind: \"array\", length, element: scalar.field };\n if (scalar.enumeration) enums[field.name] = scalar.enumeration;\n }\n }\n return { fields: wireRecord(fields, label, output).fields, enums };\n};\n\n/** Identifies a record by layout, so every name for it lowers to one PLC struct. */\nconst recordKey = (layout: RecordLayout) =>\n JSON.stringify([\n layout.fields,\n Object.entries(layout.enums)\n .map(([field, value]) => [field, value.getSourceFile().fileName, value.name.text])\n .sort(),\n ]);\n\nconst procedureAt = (checker: ts.TypeChecker, router: ts.Type, path: readonly string[]) => {\n let type = property(checker, router, \"_def\");\n type = type && property(checker, type, \"record\");\n for (const part of path) type = type && property(checker, type, part);\n const definition = type && property(checker, type, \"_def\");\n if (!definition || !property(checker, definition, \"procedure\")) return undefined;\n const kind = property(checker, definition, \"type\");\n const types = property(checker, definition, \"$types\");\n const input = types && property(checker, types, \"input\");\n const output = types && property(checker, types, \"output\");\n if (!kind?.isStringLiteral() || !input || !output) return undefined;\n return { kind: kind.value, input, output };\n};\n\nconst pascal = (path: string) =>\n path\n .split(\".\")\n .map((part) => part[0]!.toUpperCase() + part.slice(1))\n .join(\"\");\n\n/**\n * Replaces each `createServiceClient<Router>()` call with an in-memory module of the called\n * procedures, read from the router's type: the server never runs and no file is written.\n */\nexport const lowerServices = (\n program: ts.Program,\n sdk: string,\n options: ServiceOptions | undefined,\n) => {\n const sources = new Map<string, string>();\n const diagnostics: Diagnostic[] = [];\n const records = new Map<string, { name: string; layout: RecordLayout }>();\n const calls = new Map<string, { contract: ServiceContract; input: string; output: string }>();\n const checker = program.getTypeChecker();\n const symbol = (node: ts.Node) => {\n let value = checker.getSymbolAtLocation(node);\n while (value && value.flags & ts.SymbolFlags.Alias) value = checker.getAliasedSymbol(value);\n return value;\n };\n const fail = (node: ts.Node, code: string, message: string) => {\n const source = node.getSourceFile(),\n start = node.getStart(source),\n position = source.getLineAndCharacterOfPosition(start);\n diagnostics.push(\n error(code, message, {\n file: source.fileName,\n start,\n end: node.end,\n line: position.line + 1,\n column: position.character + 1,\n }),\n );\n };\n const record = (layout: RecordLayout, name: string) => {\n const key = recordKey(layout);\n const existing = records.get(key);\n if (existing) return existing.name;\n records.set(key, { name, layout });\n return name;\n };\n\n const clients = new Map<ts.Symbol, ts.Type>();\n let file: string | undefined;\n const sourceFiles = runtimeSources(program).filter((source) => !source.isDeclarationFile);\n for (const source of sourceFiles)\n for (const statement of source.statements) {\n if (!ts.isVariableStatement(statement)) continue;\n for (const declaration of statement.declarationList.declarations) {\n const call = declaration.initializer;\n if (\n !call ||\n !ts.isCallExpression(call) ||\n symbol(call.expression)?.name !== \"createServiceClient\" ||\n !symbol(call.expression)?.declarations?.some((value) =>\n value.getSourceFile().fileName.startsWith(dirname(sdk) + \"/\"),\n )\n )\n continue;\n const router = call.typeArguments?.[0];\n const client = symbol(declaration.name);\n if (!router || !client || !(statement.declarationList.flags & ts.NodeFlags.Const))\n fail(\n declaration,\n \"PLC1013\",\n \"Create a service client as a module constant: const services = createServiceClient<AppRouter>().\",\n );\n else if (!options)\n fail(call, \"PLC1013\", \"Configure server in tsplc.config.ts to call the server.\");\n else if (options.transport === \"http\" && !options.baseUrlEnv)\n fail(call, \"PLC1013\", \"HTTP service transport requires server.baseUrlEnv.\");\n else {\n clients.set(client, checker.getTypeFromTypeNode(router));\n file ??= join(dirname(source.fileName), \".tsplc-services.ts\");\n }\n }\n }\n\n for (const source of sourceFiles) {\n const edits: { start: number; end: number; text: string }[] = [];\n const imports = new Map<string, string>();\n const visit = (node: ts.Node): void => {\n if (ts.isImportDeclaration(node) && ts.isStringLiteral(node.moduleSpecifier)) {\n const clause = node.importClause;\n const bindings = clause?.namedBindings;\n const typeOnly =\n clause?.isTypeOnly ||\n (!clause?.name &&\n bindings &&\n ts.isNamedImports(bindings) &&\n bindings.elements.every((element) => element.isTypeOnly));\n if (!typeOnly && clause && bindings && ts.isNamedImports(bindings)) {\n const elements = bindings.elements.filter((element) => {\n const imported = symbol(element.name);\n return !imported || !clients.has(imported);\n });\n if (elements.length !== bindings.elements.length)\n edits.push({\n start: node.getStart(source),\n end: node.end,\n text:\n elements.length || clause.name\n ? ts\n .createPrinter()\n .printNode(\n ts.EmitHint.Unspecified,\n ts.factory.updateImportDeclaration(\n node,\n node.modifiers,\n ts.factory.updateImportClause(\n clause,\n clause.isTypeOnly,\n clause.name,\n ts.factory.updateNamedImports(bindings, elements),\n ),\n node.moduleSpecifier,\n node.attributes,\n ),\n source,\n )\n : \"\",\n });\n }\n if (\n !typeOnly &&\n (node.moduleSpecifier.text.startsWith(\"node:\") ||\n [\"@tsplc/server\", \"@trpc/server\", \"zod\", \"fs\", \"http\", \"https\", \"net\", \"tls\"].includes(\n node.moduleSpecifier.text,\n ))\n )\n fail(\n node,\n \"PLC1013\",\n `Server runtime import ${node.moduleSpecifier.text} cannot execute in PLC code. Expose a PLC procedure on the server router and call it through createServiceClient instead.`,\n );\n }\n if (ts.isVariableStatement(node)) {\n const clientStatement = node.declarationList.declarations.some((declaration) => {\n const declared = symbol(declaration.name);\n return declared && clients.has(declared);\n });\n if (clientStatement) {\n edits.push({ start: node.getStart(source), end: node.end, text: \"\" });\n return;\n }\n }\n if (clients.size && ts.isPropertyAccessExpression(node)) {\n const parts: string[] = [];\n let root: ts.Expression = node;\n while (ts.isPropertyAccessExpression(root)) {\n parts.unshift(root.name.text);\n root = root.expression;\n }\n const client = symbol(root);\n const router = client && clients.get(client);\n const procedure = router && procedureAt(checker, router, parts);\n if (router) {\n const path = parts.join(\".\");\n if (!procedure) {\n fail(node, \"PLC1013\", `${path} is not a procedure of the client's router.`);\n return;\n }\n let call = calls.get(path);\n if (!call) {\n try {\n if (procedure.kind !== \"query\" && procedure.kind !== \"mutation\")\n throw new Error(\n `${path}: subscriptions use a different transport; expose a query or mutation to the PLC.`,\n );\n const input = recordLayout(checker, procedure.input, `${path}.input`, false);\n const output = recordLayout(checker, procedure.output, `${path}.output`, true);\n call = {\n contract: serviceContract(\n path,\n procedure.kind,\n { fields: input.fields },\n { fields: output.fields },\n ),\n input: record(input, `${pascal(path)}Input`),\n output: record(output, `${pascal(path)}Output`),\n };\n calls.set(path, call);\n } catch (cause) {\n fail(node, \"PLC2001\", cause instanceof Error ? cause.message : String(cause));\n return;\n }\n }\n const name = `tsplcService_${path.replaceAll(\".\", \"_\")}`;\n const local = imports.get(name) ?? `tsplcRemote${imports.size}`;\n imports.set(name, local);\n edits.push({ start: node.getStart(source), end: node.end, text: local });\n return;\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n if (!edits.length) continue;\n let text = source.text;\n for (const edit of edits.sort((a, b) => b.start - a.start))\n text = text.slice(0, edit.start) + edit.text + text.slice(edit.end);\n if (imports.size && file) {\n const path = relative(dirname(source.fileName), file).replaceAll(\"\\\\\", \"/\");\n text += `\\nimport {${[...imports].map(([name, local]) => `${name} as ${local}`).join(\",\")}} from ${JSON.stringify(path.startsWith(\"../\") ? path : `./${path}`)};\\n`;\n }\n sources.set(source.fileName, text);\n }\n if (file && options) sources.set(file, serviceModule(records, calls, options));\n return {\n sources,\n diagnostics,\n file,\n records: new Map([...records].map(([key, { name }]) => [key, name])),\n };\n};\n\nconst serviceModule = (\n records: ReadonlyMap<string, { name: string; layout: RecordLayout }>,\n calls: ReadonlyMap<string, { contract: ServiceContract; input: string; output: string }>,\n options: ServiceOptions,\n) => {\n const enums = new Map<ts.EnumDeclaration, string>();\n const enumName = (declaration: ts.EnumDeclaration) => {\n const name = enums.get(declaration) ?? `tsplcEnum${enums.size}`;\n enums.set(declaration, name);\n return name;\n };\n const scalar = (field: WireScalar, enumeration: ts.EnumDeclaration | undefined) => {\n switch (field.kind) {\n case \"boolean\":\n return \"BOOL\";\n case \"integer\":\n return field.iec;\n case \"string\":\n return `STRING<${field.capacity}>`;\n case \"enum\":\n return enumName(enumeration!);\n }\n };\n const interfaces = [...records.values()].map(({ name, layout }) => {\n const fields = Object.entries(layout.fields).map(([key, field]) => {\n const enumeration = layout.enums[key];\n const type =\n field.kind === \"array\"\n ? `FixedArray<${scalar(field.element, enumeration)},${field.length}>`\n : scalar(field, enumeration);\n return `${key}:${type}`;\n });\n return `export interface ${name}{${fields.join(\";\")}}`;\n });\n const functions = [...calls.values()]\n .sort((left, right) => left.contract.path.localeCompare(right.contract.path))\n .map(({ contract, input, output }) => {\n const hasInput = Object.keys(contract.input.fields).length > 0;\n const request = hasInput ? \"input\" : `defaultValue<${input}>()`;\n const operation =\n options.transport === \"http\"\n ? `tsplcServiceFetch<${output}>(\\`\\${tsplcServiceBaseUrl}${servicePath(contract)}\\`,{method:\"POST\",json:${request}})`\n : `tsplcServiceCall<${output},${input}>(${JSON.stringify(servicePath(contract))},${request})`;\n return `export const tsplcService_${contract.path.replaceAll(\".\", \"_\")}=async(${hasInput ? `input:${input}` : \"\"}):Promise<${output}>=>{return await ${operation};};`;\n });\n const transport =\n options.transport === \"http\"\n ? `import {fetch as tsplcServiceFetch} from \"@tsplc/compiler/async\";\\nimport {env as tsplcServiceEnv} from \"@tsplc/compiler/config\";`\n : `import {opcuaCall as tsplcServiceCall} from \"@tsplc/compiler/async\";`;\n const enumImports = [...enums].map(\n ([declaration, name]) =>\n `import type {${declaration.name.text} as ${name}} from ${JSON.stringify(declaration.getSourceFile().fileName)};`,\n );\n const baseUrl =\n options.transport === \"http\"\n ? `const tsplcServiceBaseUrl:STRING<512>=tsplcServiceEnv<STRING<512>>(${JSON.stringify(options.baseUrlEnv)});`\n : \"\";\n return [transport, ...enumImports, baseUrl, ...interfaces, ...functions].join(\"\\n\") + \"\\n\";\n};\n\n/** Lowers a type that names a called procedure's record, such as `inferRouterOutputs<AppRouter>[\"a\"][\"b\"]`. */\nexport const serviceRecords = (\n program: ts.Program,\n lowering: { file: string | undefined; records: ReadonlyMap<string, string> },\n) => {\n const source = lowering.file && program.getSourceFile(lowering.file);\n if (!source) return undefined;\n const checker = program.getTypeChecker();\n const declarations = new Map(\n source.statements.filter(ts.isInterfaceDeclaration).map((value) => [value.name.text, value]),\n );\n return (type: ts.Type): ts.Symbol | undefined => {\n let key: string;\n try {\n key = recordKey(recordLayout(checker, type, \"record\", false));\n } catch {\n return undefined;\n }\n const name = lowering.records.get(key);\n const declaration = name === undefined ? undefined : declarations.get(name);\n return declaration && checker.getSymbolAtLocation(declaration.name);\n };\n};\n",
|
|
9
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { dirname, relative } from \"node:path\";\nimport { error, type Diagnostic } from \"@tsplc/compiler/ir\";\n\ntype Routine = ts.FunctionDeclaration | ts.MethodDeclaration;\ntype Handler = ts.ArrowFunction | ts.FunctionExpression | Routine;\ninterface Edit {\n start: number;\n end: number;\n text: string;\n}\ninterface Part {\n kind: \"then\" | \"catch\";\n handlers: readonly ts.Expression[];\n}\n\n/** Normalize promise syntax into named coroutines; scheduling stays in async lowering. */\nexport const lowerPromises = (program: ts.Program, sdk: string) => {\n const checker = program.getTypeChecker();\n const sources = new Map<string, string>(),\n diagnostics: Diagnostic[] = [];\n const runtimeBlocks = new Map<string, { kind: \"mailbox\" }>();\n const files = runtimeSources(program).filter((source) => !source.isDeclarationFile);\n const additions = new Map<ts.SourceFile, string[]>(),\n edits = new Map<ts.SourceFile, Edit[]>();\n const methods = new Map<ts.ClassDeclaration, string[]>();\n let sequence = 0;\n const symbol = (node: ts.Node): ts.Symbol | undefined => {\n let value = checker.getSymbolAtLocation(node);\n while (value && value.flags & ts.SymbolFlags.Alias) value = checker.getAliasedSymbol(value);\n return value;\n };\n const official = (node: ts.Node, name: string) => {\n const value = symbol(node);\n return (\n value?.name === name &&\n value.declarations?.some((declaration) =>\n declaration.getSourceFile().fileName.startsWith(dirname(sdk) + \"/\"),\n )\n );\n };\n const diagnosticFor = (node: ts.Node, message: string) => {\n const source = node.getSourceFile(),\n start = node.getStart(source),\n position = source.getLineAndCharacterOfPosition(start);\n return error(\"PLC1012\", message, {\n file: source.fileName,\n start,\n end: node.end,\n line: position.line + 1,\n column: position.character + 1,\n });\n };\n const fail: (node: ts.Node, message: string) => never = (node, message) => {\n throw { promiseDiagnostic: diagnosticFor(node, message) };\n };\n const append = (source: ts.SourceFile, text: string) =>\n additions.set(source, [...(additions.get(source) ?? []), text]);\n const edit = (node: ts.Node, text: string) => {\n const source = node.getSourceFile();\n edits.set(source, [\n ...(edits.get(source) ?? []),\n { start: node.getStart(source), end: node.end, text },\n ]);\n };\n const routines = new Map<ts.Symbol, Routine>();\n for (const source of files)\n for (const statement of source.statements) {\n const candidates = ts.isClassDeclaration(statement)\n ? statement.members.filter(ts.isMethodDeclaration)\n : [statement];\n for (const candidate of candidates)\n if (\n (ts.isFunctionDeclaration(candidate) || ts.isMethodDeclaration(candidate)) &&\n candidate.name\n )\n routines.set(symbol(candidate.name)!, candidate);\n }\n const asyncRoutine = (node: ts.Node) => {\n const fn = routines.get(symbol(node)!);\n return fn?.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword)\n ? fn\n : undefined;\n };\n const job = (node: ts.Node) => {\n const declaration = symbol(node)?.declarations?.find(\n (value) => ts.isVariableDeclaration(value) || ts.isPropertyDeclaration(value),\n );\n if (\n !declaration ||\n (!ts.isVariableDeclaration(declaration) && !ts.isPropertyDeclaration(declaration))\n )\n return;\n const init = declaration.initializer;\n if (\n !init ||\n !ts.isCallExpression(init) ||\n !ts.isPropertyAccessExpression(init.expression) ||\n !official(init.expression.expression, \"backgroundTasks\") ||\n init.expression.name.text !== \"define\"\n )\n return;\n return asyncRoutine(init.arguments[0]!);\n };\n const operation = (call: ts.CallExpression) =>\n asyncRoutine(\n ts.isPropertyAccessExpression(call.expression) ? call.expression.name : call.expression,\n ) ??\n job(ts.isPropertyAccessExpression(call.expression) ? call.expression.name : call.expression);\n const isSdk = (call: ts.CallExpression, name: string) =>\n official(\n ts.isPropertyAccessExpression(call.expression) ? call.expression.name : call.expression,\n name,\n );\n const split = (\n expression: ts.Expression,\n ): { root: ts.CallExpression; parts: Part[] } | undefined => {\n if (!ts.isCallExpression(expression)) return;\n if (\n ts.isPropertyAccessExpression(expression.expression) &&\n [\"then\", \"catch\"].includes(expression.expression.name.text)\n ) {\n const prefix = split(expression.expression.expression);\n if (!prefix) return;\n return {\n root: prefix.root,\n parts: [\n ...prefix.parts,\n {\n kind: expression.expression.name.text === \"then\" ? \"then\" : \"catch\",\n handlers: expression.arguments,\n },\n ],\n };\n }\n if (operation(expression) || isSdk(expression, \"sleep\") || isSdk(expression, \"fetch\"))\n return { root: expression, parts: [] };\n };\n const aliases = new Map<ts.Node, string>();\n const typeImports = new Map<ts.SourceFile, Set<string>>();\n const typeText = (node: ts.TypeNode, source: ts.SourceFile): string => {\n if (node.kind === ts.SyntaxKind.VoidKeyword) return \"void\";\n if (node.getSourceFile() === source) return node.getText(source);\n let alias = aliases.get(node);\n if (!alias) {\n alias = `TsplcPromiseType${sequence++}`;\n aliases.set(node, alias);\n append(node.getSourceFile(), `export type ${alias}=${node.getText(node.getSourceFile())};`);\n }\n const path = relative(dirname(source.fileName), node.getSourceFile().fileName).replaceAll(\n \"\\\\\",\n \"/\",\n );\n const importedAliases = typeImports.get(source) ?? new Set<string>();\n if (importedAliases.has(alias)) return alias;\n importedAliases.add(alias);\n typeImports.set(source, importedAliases);\n append(\n source,\n `import type {${alias}} from ${JSON.stringify(path.startsWith(\".\") ? path : `./${path}`)};`,\n );\n return alias;\n };\n const expressionType = (node: ts.Expression, source: ts.SourceFile): string => {\n if (\n ts.isCallExpression(node) &&\n node.typeArguments?.[0] &&\n (official(node.expression, \"defaultValue\") ||\n official(node.expression, \"copy\") ||\n [\"exact\", \"wrap\", \"wrapAdd\", \"wrapMultiply\", \"saturate\"].some((name) =>\n official(node.expression, name),\n ))\n )\n return typeText(node.typeArguments[0], source);\n const name = ts.isPropertyAccessExpression(node) ? node.name : node;\n const declaration = symbol(name)?.declarations?.find(\n (value) =>\n (ts.isVariableDeclaration(value) ||\n ts.isParameter(value) ||\n ts.isPropertyDeclaration(value) ||\n ts.isPropertySignature(value)) &&\n value.type,\n );\n if (\n declaration &&\n (ts.isVariableDeclaration(declaration) ||\n ts.isParameter(declaration) ||\n ts.isPropertyDeclaration(declaration) ||\n ts.isPropertySignature(declaration)) &&\n declaration.type\n )\n return typeText(declaration.type, source);\n const type = checker.getTypeAtLocation(node);\n if (type.flags & ts.TypeFlags.BooleanLike) return \"BOOL\";\n if (type.flags & ts.TypeFlags.Void) return \"void\";\n if (type.symbol && type.symbol.name !== \"__type\" && type.flags & ts.TypeFlags.Object)\n return checker.typeToString(\n type,\n node,\n ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope,\n );\n fail(\n node,\n \"Annotate this value with its concrete PLC type before using it in an async continuation.\",\n );\n };\n const isAggregate = (type: ts.Type | undefined) =>\n Boolean(type && type.flags & ts.TypeFlags.Object);\n const isPromise = (node: ts.Node) => {\n const type = checker.getTypeAtLocation(node);\n return checker.getAwaitedType(type) !== type;\n };\n const printer = ts.createPrinter();\n const replaceNames = (node: ts.Node, names: ReadonlyMap<ts.Symbol, string>): string => {\n const transformed = ts.transform(node, [\n (context) => (root) => {\n const visit = (value: ts.Node): ts.VisitResult<ts.Node> => {\n if (\n ts.isReturnStatement(value) &&\n value.expression &&\n !ts.isAwaitExpression(value.expression) &&\n isPromise(value.expression)\n ) {\n return ts.factory.updateReturnStatement(\n value,\n ts.factory.createAwaitExpression(\n ts.visitNode(value.expression, visit) as ts.Expression,\n ),\n );\n }\n if (ts.isShorthandPropertyAssignment(value)) {\n const key = checker.getShorthandAssignmentValueSymbol(value);\n const name = key && names.get(key);\n if (name)\n return ts.factory.createPropertyAssignment(\n value.name,\n ts.factory.createIdentifier(name),\n );\n }\n if (\n ts.isIdentifier(value) &&\n !(ts.isPropertyAccessExpression(value.parent) && value.parent.name === value) &&\n !(ts.isPropertyAssignment(value.parent) && value.parent.name === value)\n ) {\n const name = names.get(symbol(value)!);\n if (name) return ts.factory.createIdentifier(name);\n }\n return ts.visitEachChild(value, visit, context);\n };\n return ts.visitNode(root, visit) as typeof root;\n },\n ]);\n const value = printer.printNode(\n ts.EmitHint.Unspecified,\n transformed.transformed[0]!,\n node.getSourceFile(),\n );\n transformed.dispose();\n return value;\n };\n const hasBorrow = (node: ts.TypeNode, seen = new Set<ts.Symbol>()): boolean => {\n if (ts.isTypeReferenceNode(node)) {\n if (official(node.typeName, \"InOut\")) return true;\n const key = symbol(node.typeName);\n if (key && !seen.has(key)) {\n seen.add(key);\n for (const declaration of key.declarations ?? []) {\n if (\n ts.isInterfaceDeclaration(declaration) &&\n declaration.members.some(\n (member) =>\n ts.isPropertySignature(member) && member.type && hasBorrow(member.type, seen),\n )\n )\n return true;\n if (ts.isTypeAliasDeclaration(declaration) && hasBorrow(declaration.type, seen))\n return true;\n }\n }\n }\n return node.getChildren().some((child) => ts.isTypeNode(child) && hasBorrow(child, seen));\n };\n let diagnosticSource: ts.SourceFile | undefined;\n const diag = () => {\n if (!diagnosticSource) throw new Error(\"Missing async diagnostics owner\");\n return \"tsplcPromiseDiagnostics\";\n };\n const imported = new Set<ts.SourceFile>();\n const ensureImports = (source: ts.SourceFile) => {\n if (imported.has(source)) return;\n imported.add(source);\n append(\n source,\n `import {cooperativeTasks as tsplcCooperative,errorCode as tsplcErrorCode} from \"@tsplc/compiler/async\";import {wrapAdd as tsplcAsyncWrapAdd} from \"@tsplc/compiler/types\";`,\n );\n };\n const scopes = new Map<ts.SourceFile | ts.ClassDeclaration, string[]>();\n const make = (\n expression: ts.Expression,\n owner: ts.FunctionDeclaration | ts.MethodDeclaration,\n detached: boolean,\n ): string => {\n const parsed = split(expression);\n if (!parsed) fail(expression, \"Expected a statically resolved async call.\");\n const source = expression.getSourceFile();\n const classOwner =\n ts.isMethodDeclaration(owner) && ts.isClassDeclaration(owner.parent)\n ? owner.parent\n : undefined;\n ensureImports(source);\n diagnosticSource ??= source;\n const captures = new Map<ts.Symbol, { name: string; type: string; argument: string }>();\n const collectCaptures = (handler: Handler) => {\n const visit = (node: ts.Node): void => {\n if (\n ts.isIdentifier(node) &&\n !(ts.isPropertyAccessExpression(node.parent) && node.parent.name === node) &&\n !(ts.isPropertyAssignment(node.parent) && node.parent.name === node)\n ) {\n const key = ts.isShorthandPropertyAssignment(node.parent)\n ? checker.getShorthandAssignmentValueSymbol(node.parent)\n : symbol(node);\n const declaration = key?.valueDeclaration;\n if (\n declaration &&\n (ts.isVariableDeclaration(declaration) || ts.isParameter(declaration))\n ) {\n let scope: ts.Node | undefined = declaration.parent;\n while (scope && !ts.isFunctionLike(scope)) scope = scope.parent;\n if (scope === owner && !captures.has(key!)) {\n if (\n ts.isVariableDeclaration(declaration) &&\n (!ts.isVariableDeclarationList(declaration.parent) ||\n !(declaration.parent.flags & ts.NodeFlags.Const))\n )\n fail(\n node,\n \"Continuation captures must be const values; store mutable state on the controller instead.\",\n );\n if (!declaration.type)\n fail(node, \"Annotate a captured value with its concrete PLC type.\");\n if (hasBorrow(declaration.type))\n fail(\n node,\n \"A continuation cannot capture borrowed InOut storage; capture values or use controller state.\",\n );\n captures.set(key!, {\n name: `capture${captures.size}`,\n type: typeText(declaration.type, source),\n argument: node.text,\n });\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(handler.body!);\n };\n for (const part of parsed.parts)\n for (const value of part.handlers) {\n if (\n value.kind === ts.SyntaxKind.UndefinedKeyword ||\n value.kind === ts.SyntaxKind.NullKeyword\n )\n continue;\n if (ts.isArrowFunction(value) || ts.isFunctionExpression(value)) collectCaptures(value);\n }\n const captureNames = new Map([...captures].map(([key, value]) => [key, value.name]));\n const root = parsed.root,\n fn = operation(root);\n let resultAggregate = isAggregate(checker.getAwaitedType(checker.getTypeAtLocation(root)));\n const arguments_: { name: string; type: string; expression: string }[] = [];\n let invocation: string, resultType: string;\n if (fn) {\n const node = fn.type;\n if (!node || !ts.isTypeReferenceNode(node) || !node.typeArguments?.[0])\n fail(fn, \"Async calls need an explicit Promise<T> result.\");\n resultType = typeText(node.typeArguments[0], source);\n fn.parameters.forEach((parameter, index) => {\n if (!parameter.type || !root.arguments[index])\n fail(root, \"Async argument count differs from its concrete signature.\");\n arguments_.push({\n name: `argument${index}`,\n type: typeText(parameter.type, source),\n expression: root.arguments[index]!.getText(source),\n });\n });\n invocation = `${root.expression.getText(source)}(${arguments_.map((value) => value.name).join(\",\")})`;\n } else if (isSdk(root, \"sleep\")) {\n if (root.arguments.length !== 1) fail(root, \"sleep requires one TIME argument.\");\n arguments_.push({\n name: \"argument0\",\n type: \"TIME\",\n expression: root.arguments[0]!.getText(source),\n });\n invocation = `${root.expression.getText(source)}(argument0)`;\n resultType = \"void\";\n } else {\n const response = root.typeArguments?.[0];\n if (!response) fail(root, \"fetch requires a typed response.\");\n resultType = typeText(response, source);\n const options = root.arguments[1];\n if (options && !ts.isObjectLiteralExpression(options))\n fail(options, \"fetch options must be an inline object.\");\n let optionText = \"\";\n if (options && ts.isObjectLiteralExpression(options))\n optionText = options.properties\n .map((property) => {\n if (!ts.isPropertyAssignment(property)) fail(property, \"fetch requires named options.\");\n if (property.name.getText(source) !== \"json\") return property.getText(source);\n arguments_.push({\n name: \"argument0\",\n type: expressionType(property.initializer, source),\n expression: property.initializer.getText(source),\n });\n return \"json:argument0\";\n })\n .join(\",\");\n invocation = `${root.expression.getText(source)}<${root.typeArguments!.map((type) => type.getText(source)).join(\",\")}>(${root.arguments[0]!.getText(source)}${options ? `,{${optionText}}` : \"\"})`;\n }\n const params = [\n ...arguments_,\n ...[...captures.values()].map((value) => ({\n name: value.name,\n type: value.type,\n expression: value.argument,\n })),\n ];\n const signature = params.map((value) => `${value.name}:${value.type}`).join(\",\"),\n args = params.map((value) => value.name).join(\",\");\n const addHelper = (\n name: string,\n body: string,\n type: string,\n extra?: { type: string; argument: string },\n ) => {\n const text = `${classOwner ? \"private \" : \"export \"}async ${classOwner ? \"\" : \"function \"}${name}(${[signature, extra ? `promiseInput:${extra.type}` : \"\"].filter(Boolean).join(\",\")}):Promise<${type}>{${body}}`;\n if (classOwner) methods.set(classOwner, [...(methods.get(classOwner) ?? []), text]);\n else append(source, text);\n return `${classOwner ? \"this.\" : \"\"}${name}(${[args, extra?.argument ?? \"\"].filter(Boolean).join(\",\")})`;\n };\n const finish = (call: string, type: string, discard = false) =>\n type === \"void\" || discard ? `await ${call};return;` : `return await ${call};`;\n let prefix = addHelper(\n `tsplcPromiseOperation${sequence++}`,\n finish(invocation, resultType),\n resultType,\n );\n const handler = (\n expression: ts.Expression | undefined,\n inputType: string,\n input: string,\n ): { call: string; type: string; aggregate: boolean } | undefined => {\n if (\n !expression ||\n expression.kind === ts.SyntaxKind.NullKeyword ||\n (ts.isIdentifier(expression) && expression.text === \"undefined\")\n )\n return;\n let declaration: Handler;\n if (ts.isArrowFunction(expression) || ts.isFunctionExpression(expression))\n declaration = expression;\n else {\n const named = routines.get(symbol(expression)!);\n if (!named || !ts.isFunctionDeclaration(named))\n fail(\n expression,\n \"Use a named function or inline arrow; bind instance methods with an arrow.\",\n );\n declaration = named;\n }\n const callbackSignature = checker.getSignatureFromDeclaration(declaration);\n const aggregate = isAggregate(\n callbackSignature &&\n checker.getAwaitedType(checker.getReturnTypeOfSignature(callbackSignature)),\n );\n if (!declaration.body || declaration.parameters.length > 1)\n fail(declaration, \"Promise callbacks take at most one value.\");\n if (declaration.getSourceFile() !== source) {\n const result = declaration.type;\n if (!result) fail(declaration, \"Annotate callback results with their concrete PLC type.\");\n let output = result;\n if (\n ts.isTypeReferenceNode(result) &&\n result.typeName.getText(declaration.getSourceFile()) === \"Promise\"\n )\n output = result.typeArguments![0]!;\n // Named callbacks retain their original module and access to its private state.\n const callbackType = typeText(output, source);\n const name = expression.getText(source);\n if (declaration.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword))\n return {\n call: `${name}(${declaration.parameters.length ? input : \"\"})`,\n type: callbackType,\n aggregate,\n };\n return {\n call: addHelper(\n `tsplcPromiseNamed${sequence++}`,\n callbackType === \"void\"\n ? `${name}(${declaration.parameters.length ? \"promiseInput\" : \"\"});return;`\n : `return ${name}(${declaration.parameters.length ? \"promiseInput\" : \"\"});`,\n callbackType,\n declaration.parameters.length ? { type: inputType, argument: input } : undefined,\n ),\n type: callbackType,\n aggregate,\n };\n }\n const names = new Map(captureNames);\n const parameter = declaration.parameters[0];\n if (parameter) {\n if (!ts.isIdentifier(parameter.name))\n fail(parameter, \"Promise callback parameters need names.\");\n names.set(symbol(parameter.name)!, \"promiseValue\");\n }\n let type: string;\n if (declaration.type) {\n const annotation = declaration.type;\n type =\n ts.isTypeReferenceNode(annotation) && annotation.typeName.getText(source) === \"Promise\"\n ? typeText(annotation.typeArguments![0]!, source)\n : typeText(annotation, source);\n } else {\n const resolved = checker.getSignatureFromDeclaration(declaration);\n const inferred =\n resolved && checker.getAwaitedType(checker.getReturnTypeOfSignature(resolved));\n if (inferred?.flags && inferred.flags & ts.TypeFlags.Void) type = \"void\";\n else if (\n !ts.isBlock(declaration.body) &&\n ts.isIdentifier(declaration.body) &&\n parameter &&\n symbol(declaration.body) === symbol(parameter.name)\n )\n type = inputType;\n else if (!ts.isBlock(declaration.body)) {\n const returned = ts.isCallExpression(declaration.body)\n ? operation(declaration.body)\n : undefined;\n type =\n returned?.type && ts.isTypeReferenceNode(returned.type)\n ? typeText(returned.type.typeArguments![0]!, source)\n : expressionType(declaration.body, source);\n } else\n fail(declaration, \"Annotate a callback that returns a value with its concrete PLC type.\");\n }\n const name = `tsplcPromiseHandler${sequence++}`;\n const body = replaceNames(declaration.body, names);\n const code = ts.isBlock(declaration.body)\n ? body.slice(1, -1)\n : type === \"void\"\n ? `${body};return;`\n : `return ${isPromise(declaration.body) ? \"await \" : \"\"}${body};`;\n const handlerParams = [\n ...(parameter && inputType !== \"void\" ? [`promiseValue:${inputType}`] : []),\n ...params.map((value) => `${value.name}:${value.type}`),\n ].join(\",\");\n const text = `${classOwner ? \"private \" : \"export \"}async ${classOwner ? \"\" : \"function \"}${name}(${handlerParams}):Promise<${type}>{${code}}`;\n if (classOwner) methods.set(classOwner, [...(methods.get(classOwner) ?? []), text]);\n else append(source, text);\n return {\n call: `${classOwner ? \"this.\" : \"\"}${name}(${[...(parameter && inputType !== \"void\" ? [input] : []), ...params.map((value) => value.name)].join(\",\")})`,\n type,\n aggregate,\n };\n };\n for (const [index, part] of parsed.parts.entries()) {\n const terminal = detached && index === parsed.parts.length - 1;\n const fulfilled =\n part.kind === \"then\" ? handler(part.handlers[0], resultType, \"promiseResult\") : undefined;\n const rejected = handler(\n part.handlers[part.kind === \"catch\" ? 0 : 1],\n \"UDINT\",\n \"tsplcErrorCode(promiseError)\",\n );\n if (!fulfilled && !rejected) continue;\n const output = terminal ? \"void\" : (fulfilled?.type ?? resultType);\n if (rejected && !terminal && rejected.type !== output)\n fail(\n expression,\n \"A recovery callback must return the same PLC type as the fulfilled branch.\",\n );\n const success = fulfilled\n ? finish(fulfilled.call, fulfilled.type, terminal)\n : resultType === \"void\" || terminal\n ? \"return;\"\n : \"return promiseResult;\";\n const load =\n resultType === \"void\"\n ? `await ${prefix};`\n : `const promiseResult:${resultType}=await ${prefix};`;\n let body: string;\n if (rejected && fulfilled) {\n const stored =\n resultType === \"void\"\n ? \"\"\n : `let promiseResult:${resultType}=defaultValue<${resultType}>();`;\n const attempt =\n resultType === \"void\"\n ? `await ${prefix};`\n : `const loaded:${resultType}=await ${prefix};promiseResult=${resultAggregate ? \"copy(loaded)\" : \"loaded\"};`;\n body = `${stored}let succeeded:BOOL=false;let rejection:UDINT=0;try{${attempt}succeeded=true;}catch(promiseError){rejection=tsplcErrorCode(promiseError);}if(!succeeded){${finish(rejected.call.replace(\"tsplcErrorCode(promiseError)\", \"rejection\"), rejected.type, terminal)}}${success}`;\n } else if (rejected)\n body = `try{${load}${success}}catch(promiseError){${finish(rejected.call, rejected.type, terminal)}}`;\n else body = `${load}${success}`;\n prefix = addHelper(`tsplcPromiseChain${sequence++}`, body, output);\n resultType = output;\n resultAggregate = terminal ? false : (fulfilled?.aggregate ?? resultAggregate);\n }\n if (!detached)\n return prefix.replace(`(${args})`, `(${params.map((value) => value.expression).join(\",\")})`);\n const site = `tsplcPromiseSite${sequence++}`;\n const callable = prefix.slice(0, prefix.indexOf(\"(\"));\n const declaration = `${classOwner ? \"private \" : \"const \"}${site}=tsplcCooperative.define(${callable});`;\n if (classOwner) methods.set(classOwner, [...(methods.get(classOwner) ?? []), declaration]);\n else append(source, declaration);\n const scope = classOwner ?? source;\n scopes.set(scope, [...(scopes.get(scope) ?? []), site]);\n return `${classOwner ? \"this.\" : \"\"}${site}.start(${params.map((value) => value.expression).join(\",\")});`;\n };\n const diagnosticsCalls: ts.CallExpression[] = [],\n cancelCalls: {\n node: ts.CallExpression;\n owner: ts.FunctionDeclaration | ts.MethodDeclaration;\n }[] = [];\n for (const source of files) {\n const visit = (node: ts.Node, owner?: ts.FunctionDeclaration | ts.MethodDeclaration): void => {\n if (ts.isFunctionDeclaration(node) || ts.isMethodDeclaration(node)) {\n if (node.body) ts.forEachChild(node.body, (child) => visit(child, node));\n return;\n }\n if (!owner) {\n ts.forEachChild(node, (child) => visit(child));\n return;\n }\n if (ts.isCallExpression(node) && official(node.expression, \"asyncDiagnostics\")) {\n diagnosticSource ??= source;\n diagnosticsCalls.push(node);\n return;\n }\n if (ts.isCallExpression(node) && official(node.expression, \"cancelAsync\")) {\n cancelCalls.push({ node, owner });\n return;\n }\n const asynchronous = owner.modifiers?.some(\n (modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword,\n );\n if (ts.isExpressionStatement(node)) {\n const expression = ts.isVoidExpression(node.expression)\n ? node.expression.expression\n : node.expression;\n if (split(expression)) {\n if (asynchronous) {\n diagnostics.push(\n diagnosticFor(\n node,\n \"Await async work inside an async routine; detached calls belong in synchronous controllers.\",\n ),\n );\n return;\n }\n try {\n edit(node, make(expression, owner, true));\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"promiseDiagnostic\" in cause)\n diagnostics.push(cause.promiseDiagnostic as Diagnostic);\n else throw cause;\n }\n return;\n }\n }\n if (ts.isCallExpression(node)) {\n const chain = split(node);\n if (chain?.parts.length) {\n try {\n edit(node, make(node, owner, false));\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"promiseDiagnostic\" in cause)\n diagnostics.push(cause.promiseDiagnostic as Diagnostic);\n else throw cause;\n }\n return;\n }\n }\n ts.forEachChild(node, (child) => visit(child, owner));\n };\n visit(source);\n }\n for (const { node, owner } of cancelCalls) {\n const scope =\n ts.isMethodDeclaration(owner) && ts.isClassDeclaration(owner.parent)\n ? owner.parent\n : owner.getSourceFile();\n if (\n node.arguments.length &&\n (node.arguments.length !== 1 || node.arguments[0]!.kind !== ts.SyntaxKind.ThisKeyword)\n )\n diagnostics.push(\n diagnosticFor(node, \"cancelAsync takes this in a controller, or no argument in a module.\"),\n );\n const name = `tsplcCancelScope${sequence++}`;\n const body = (scopes.get(scope) ?? [])\n .map((site) => `${ts.isClassDeclaration(scope) ? \"this.\" : \"\"}${site}.cancel();`)\n .join(\"\");\n if (ts.isClassDeclaration(scope))\n methods.set(scope, [...(methods.get(scope) ?? []), `private ${name}():void{${body}}`]);\n else append(scope, `function ${name}():void{${body}}`);\n edit(node, `${ts.isClassDeclaration(scope) ? \"this.\" : \"\"}${name}()`);\n }\n if (diagnosticSource) {\n const source = diagnosticSource;\n ensureImports(source);\n append(\n source,\n `export class TsplcPromiseDiagnostics extends FunctionBlock<{}>{private count:UDINT=0;private lastError:UDINT=0;public report(code:UDINT,count:UDINT):BOOL{this.count=tsplcAsyncWrapAdd<UDINT>(this.count,count);this.lastError=code;return true;}public snapshot():{valid:BOOL;count:UDINT;lastError:UDINT}{return {valid:true,count:this.count,lastError:this.lastError};}protected execute(input:{}):void{}}\nexport const tsplcPromiseDiagnostics=new TsplcPromiseDiagnostics();`,\n );\n runtimeBlocks.set(`${source.fileName}:TsplcPromiseDiagnostics`, { kind: \"mailbox\" });\n for (const file of new Set([\n ...additions.keys(),\n ...diagnosticsCalls.map((node) => node.getSourceFile()),\n ])) {\n if (file !== source) {\n const path = relative(dirname(file.fileName), source.fileName).replaceAll(\"\\\\\", \"/\");\n append(\n file,\n `import {${diag()}} from ${JSON.stringify(path.startsWith(\".\") ? path : `./${path}`)};`,\n );\n }\n }\n for (const call of diagnosticsCalls) edit(call, `${diag()}.snapshot()`);\n }\n for (const [owner, texts] of methods) {\n const source = owner.getSourceFile();\n edits.set(source, [\n ...(edits.get(source) ?? []),\n { start: owner.end - 1, end: owner.end - 1, text: \"\\n\" + texts.join(\"\\n\") },\n ]);\n }\n for (const source of files) {\n const changes = edits.get(source) ?? [],\n extra = additions.get(source) ?? [];\n if (!changes.length && !extra.length) continue;\n let text = source.text;\n for (const change of changes.sort((left, right) => right.start - left.start))\n text = text.slice(0, change.start) + change.text + text.slice(change.end);\n sources.set(source.fileName, text + \"\\n\" + extra.join(\"\\n\"));\n }\n return { sources, diagnostics, runtimeBlocks };\n};\n",
|
|
10
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { dirname, resolve, relative } from \"node:path\";\nimport { cooperativeSite, taskSite } from \"./cooperative.ts\";\nimport { staticString } from \"./configuration.ts\";\nimport { error, type Diagnostic, type FunctionBlock, type PlcProgram } from \"@tsplc/compiler/ir\";\n\nexport interface AsyncLowering {\n sources: Map<string, string>;\n blocks: Map<string, NonNullable<FunctionBlock[\"runtime\"]>>;\n programs: Record<string, { module: string; export: string }>;\n schedules: Map<string, NonNullable<PlcProgram[\"background\"]>>;\n diagnostics: Diagnostic[];\n continuations: Map<string, NonNullable<PlcProgram[\"continuation\"]>>;\n}\n\nconst copyValue = (value: string, aggregate: boolean) => (aggregate ? `copy(${value})` : value);\n\n/** Lower suspension into ordinary typed blocks before the PLC semantic pass. */\nexport const lowerAsync = (program: ts.Program, sdk: string): AsyncLowering => {\n const result: AsyncLowering = {\n sources: new Map(),\n blocks: new Map(),\n programs: {},\n schedules: new Map(),\n diagnostics: [],\n continuations: new Map(),\n };\n const checker = program.getTypeChecker();\n const symbol = (node: ts.Node): ts.Symbol | undefined => {\n let s = checker.getSymbolAtLocation(node);\n while (s && s.flags & ts.SymbolFlags.Alias) s = checker.getAliasedSymbol(s);\n return s;\n };\n const official = (node: ts.Node, name: string) => {\n const s = symbol(node);\n return (\n s?.name === name &&\n s.declarations?.some((d) => d.getSourceFile().fileName.startsWith(dirname(sdk) + \"/\"))\n );\n };\n const diagnosticFor = (node: ts.Node, message: string): Diagnostic => {\n const source = node.getSourceFile();\n const start = node.getStart(source);\n const position = source.getLineAndCharacterOfPosition(start);\n return error(\"PLC1010\", message, {\n file: source.fileName,\n start,\n end: node.end,\n line: position.line + 1,\n column: position.character + 1,\n });\n };\n const fail: (node: ts.Node, message: string) => never = (node, message) => {\n throw { asyncDiagnostic: diagnosticFor(node, message) };\n };\n type Routine = ts.FunctionDeclaration | ts.MethodDeclaration;\n const functions = new Map<ts.Symbol, Routine>();\n const methods = new Map<\n ts.Symbol,\n { start: string; reset: string; snapshot: string; advance: string }\n >();\n for (const source of runtimeSources(program)) {\n if (source.isDeclarationFile) continue;\n for (const statement of source.statements) {\n const routines = ts.isClassDeclaration(statement)\n ? statement.members.filter(ts.isMethodDeclaration)\n : [statement];\n for (const fn of routines) {\n if (\n (!ts.isFunctionDeclaration(fn) && !ts.isMethodDeclaration(fn)) ||\n !fn.name ||\n !fn.modifiers?.some((m) => m.kind === ts.SyntaxKind.AsyncKeyword)\n )\n continue;\n functions.set(symbol(fn.name)!, fn);\n if (ts.isMethodDeclaration(fn)) {\n const prefix = `tsplcAsync${fn.name.getText(source)}${fn.getStart(source)}`;\n methods.set(symbol(fn.name)!, {\n start: prefix + \"Start\",\n reset: prefix + \"Reset\",\n snapshot: prefix + \"Snapshot\",\n advance: prefix + \"Advance\",\n });\n }\n }\n }\n }\n if (!functions.size) return result;\n const aliasPrefix = (fn: Routine) =>\n `TsplcAsync${fn.name!.getText(fn.getSourceFile())}${fn.getStart(fn.getSourceFile())}`;\n const printer = ts.createPrinter({ removeComments: false });\n let sequence = 0;\n const ownedContinuations = new Map<ts.Symbol, string[]>();\n const ownedJobs = new Map<\n ts.Symbol,\n { method: string; schedule: NonNullable<PlcProgram[\"background\"]> }[]\n >();\n for (const source of runtimeSources(program)) {\n if (source.isDeclarationFile) continue;\n try {\n const replacements: { start: number; end: number; text: string }[] = [],\n extra: string[] = [];\n const text = (node: ts.Node) => node.getText(source);\n for (const fn of functions.values()) {\n if (fn.getSourceFile() !== source) continue;\n const method = methods.get(symbol(fn.name!)!);\n if (!fn.name || !functions.has(symbol(fn.name)!)) continue;\n if (\n !fn.body ||\n fn.typeParameters?.length ||\n !fn.type ||\n !ts.isTypeReferenceNode(fn.type) ||\n fn.type.typeName.getText(source) !== \"Promise\" ||\n fn.type.typeArguments?.length !== 1\n )\n fail(\n fn,\n \"Async functions require concrete parameters and an explicit Promise<T> result.\",\n );\n const returnsVoid = fn.type.typeArguments[0]!.kind === ts.SyntaxKind.VoidKeyword;\n const returnType = returnsVoid ? \"BOOL\" : text(fn.type.typeArguments[0]!);\n const resultAggregate = Boolean(\n checker.getTypeFromTypeNode(fn.type.typeArguments[0]!).flags & ts.TypeFlags.Object,\n );\n const fields = new Map<ts.Symbol, { name: string; type: string; aggregate: boolean }>();\n const parameters = fn.parameters.map((p, index) => {\n if (\n !ts.isIdentifier(p.name) ||\n !p.type ||\n p.initializer ||\n p.questionToken ||\n p.dotDotDotToken\n )\n fail(p, \"Async parameters require explicit concrete value types.\");\n if (/\\bInOut\\b/.test(text(p.type)))\n fail(p, \"InOut cannot cross an async suspension; pass a value snapshot.\");\n fields.set(symbol(p.name)!, {\n name: `argument${index}`,\n type: text(p.type),\n aggregate: Boolean(checker.getTypeFromTypeNode(p.type).flags & ts.TypeFlags.Object),\n });\n return {\n name: p.name.text,\n type: text(p.type),\n aggregate: Boolean(checker.getTypeFromTypeNode(p.type).flags & ts.TypeFlags.Object),\n field: `argument${index}`,\n };\n });\n const containsAwait = (node: ts.Node): boolean =>\n ts.isAwaitExpression(node) || node.getChildren(source).some(containsAwait);\n const collect = (node: ts.Node) => {\n if (ts.isForStatement(node)) {\n if (containsAwait(node))\n fail(node, \"Await inside loops is not supported yet; use bounded async calls.\");\n return;\n }\n if (ts.isFunctionLike(node) && node !== fn)\n fail(node, \"Closures and nested functions are not supported in async PLC routines.\");\n if (ts.isCatchClause(node)) {\n const declaration = node.variableDeclaration;\n if (declaration) {\n if (!ts.isIdentifier(declaration.name))\n fail(declaration, \"Catch requires a named error code or no binding.\");\n fields.set(symbol(declaration.name)!, {\n name: `caught${fields.size}`,\n type: \"UDINT\",\n aggregate: false,\n });\n }\n collect(node.block);\n return;\n }\n if (ts.isVariableDeclaration(node)) {\n if (!ts.isIdentifier(node.name) || !node.initializer)\n fail(node, \"Async locals need names and initializers.\");\n let type = node.type ? text(node.type) : undefined;\n if (!type) {\n if (\n node.initializer.kind === ts.SyntaxKind.TrueKeyword ||\n node.initializer.kind === ts.SyntaxKind.FalseKeyword\n )\n type = \"BOOL\";\n else if (\n ts.isAwaitExpression(node.initializer) &&\n ts.isCallExpression(node.initializer.expression)\n ) {\n const call = node.initializer.expression;\n const target = ts.isPropertyAccessExpression(call.expression)\n ? call.expression.name\n : call.expression;\n const called = functions.get(symbol(target)!);\n if (called?.type && ts.isTypeReferenceNode(called.type)) {\n type = called.type.typeArguments![0]!.getText(called.getSourceFile());\n if (called.getSourceFile() !== source) {\n type = `${aliasPrefix(called)}Result`;\n const path = relative(\n dirname(source.fileName),\n called.getSourceFile().fileName,\n ).replaceAll(\"\\\\\", \"/\");\n const statement = `import type {${type}} from ${JSON.stringify(path.startsWith(\".\") ? path : `./${path}`)};`;\n if (!extra.includes(statement)) extra.push(statement);\n }\n }\n }\n if (!type) fail(node, \"Annotate async locals with their concrete PLC type.\");\n }\n fields.set(symbol(node.name)!, {\n name: `local${fields.size}`,\n type,\n aggregate: Boolean(checker.getTypeAtLocation(node).flags & ts.TypeFlags.Object),\n });\n }\n ts.forEachChild(node, collect);\n };\n collect(fn.body);\n const rewrite = (node: ts.Node): string => {\n const transformed = ts.transform(node, [\n (context) => (root) => {\n const visit = (n: ts.Node): ts.VisitResult<ts.Node> => {\n if (\n method &&\n ts.isPropertyAccessExpression(n) &&\n n.expression.kind === ts.SyntaxKind.ThisKeyword\n ) {\n return ts.factory.createElementAccessExpression(\n ts.factory.createThis(),\n ts.factory.createStringLiteral(n.name.text),\n );\n }\n if (ts.isIdentifier(n)) {\n const field = fields.get(symbol(n)!);\n if (\n field &&\n !(ts.isPropertyAccessExpression(n.parent) && n.parent.name === n) &&\n !(ts.isPropertyAssignment(n.parent) && n.parent.name === n)\n )\n return ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n field.name,\n );\n }\n if (ts.isShorthandPropertyAssignment(n)) {\n const value = checker.getShorthandAssignmentValueSymbol(n),\n field = value && fields.get(value);\n if (field)\n return ts.factory.createPropertyAssignment(\n n.name,\n ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n field.name,\n ),\n );\n }\n return ts.visitEachChild(n, visit, context);\n };\n return ts.visitNode(root, visit) as typeof root;\n },\n ]);\n const value = printer.printNode(\n ts.EmitHint.Unspecified,\n transformed.transformed[0]!,\n source,\n );\n transformed.dispose();\n return value;\n };\n const nodes = new Map<number, string>();\n const yielding = new Set<number>();\n let nextId = 1;\n const state = (body: string, yields = false) => {\n const id = nextId++;\n nodes.set(id, body);\n if (yields) yielding.add(id);\n return id;\n };\n const children: string[] = [],\n resets: string[] = [],\n cancels: string[] = [];\n const finish = (value: string) =>\n `this.value = ${copyValue(value, resultAggregate)}; this.busy = false; this.done = true; this.step = 0;`;\n const failure = (error: string) =>\n `this.error = ${error}; if(this.error === 0)this.error=4; this.busy = false; this.done = true; this.step = 0;`;\n const awaitState = (\n awaited: ts.AwaitExpression | ts.CallExpression,\n target: string | undefined,\n next: number,\n reject: (error: string, cancellable?: boolean) => string,\n ): number => {\n const expression = ts.isAwaitExpression(awaited) ? awaited.expression : awaited;\n if (!ts.isCallExpression(expression))\n fail(awaited, \"Await requires a tsPLC operation or a statically named async function.\");\n const call = expression,\n name = ts.isPropertyAccessExpression(call.expression)\n ? call.expression.name\n : call.expression;\n const child = `child${children.length}`;\n if (official(name, \"sleep\")) {\n if (call.arguments.length !== 1 || call.typeArguments?.length || target)\n fail(call, \"sleep takes one TIME and returns void.\");\n children.push(`private ${child} = new OnDelayTimer();`);\n resets.push(`this.${child}.update({enabled:false,duration:ms(0)});`);\n const poll = state(\n `this.${child}.update({enabled:true,duration:${rewrite(call.arguments[0]!)}}); if(this.${child}.out.done) { this.step = ${next}; }`,\n );\n return state(\n `this.${child}.update({enabled:true,duration:${rewrite(call.arguments[0]!)}});this.step=${poll};`,\n true,\n );\n }\n if (official(name, \"fetch\") || official(name, \"opcuaCall\")) {\n const rpc = official(name, \"opcuaCall\");\n if (\n call.arguments.length < 1 ||\n call.arguments.length > 2 ||\n !call.typeArguments?.length ||\n call.typeArguments.length > 2\n )\n fail(\n call,\n \"fetch<Response, Request?> requires a URL and optional { method, json } options.\",\n );\n const url = staticString(checker, call.arguments[0]!);\n if (url === undefined)\n fail(\n call.arguments[0]!,\n \"fetch URL must be a literal or compile-time const string; configuration properties must be readonly.\",\n );\n const options = rpc ? undefined : call.arguments[1];\n if (options && !ts.isObjectLiteralExpression(options))\n fail(options, \"fetch options must be an inline { method, json } object.\");\n let method: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\" = rpc ? \"POST\" : \"GET\";\n let json: ts.Expression | undefined = rpc ? call.arguments[1] : undefined;\n if (options && ts.isObjectLiteralExpression(options))\n for (const property of options.properties) {\n if (!ts.isPropertyAssignment(property) || !ts.isIdentifier(property.name))\n fail(property, \"fetch options require named properties.\");\n if (property.name.text === \"method\") {\n const value = staticString(checker, property.initializer);\n if (\n value !== \"GET\" &&\n value !== \"POST\" &&\n value !== \"PUT\" &&\n value !== \"PATCH\" &&\n value !== \"DELETE\"\n )\n fail(property, \"Unsupported fetch method.\");\n method = value;\n } else if (property.name.text === \"json\") json = property.initializer;\n else fail(property, \"Unsupported fetch option.\");\n }\n if (method === \"GET\" && json) fail(call, \"GET requests cannot contain json.\");\n const responseType = text(call.typeArguments[0]!),\n httpName = `Tsplc${rpc ? \"Rpc\" : \"Http\"}${sequence++}`;\n let requestType = `${httpName}Request`;\n if (!json) extra.push(`interface ${requestType} {reserved:BOOL}`);\n if (json) {\n if (call.typeArguments[1]) requestType = text(call.typeArguments[1]);\n else {\n const layout = checker.getTypeAtLocation(json);\n if (!layout.aliasSymbol && (!layout.symbol || layout.symbol.name === \"__type\"))\n fail(\n json,\n \"Annotate json with a named PLC record or supply the Request type argument.\",\n );\n requestType = checker.typeToString(\n layout,\n json,\n ts.TypeFormatFlags.NoTruncation |\n ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope,\n );\n }\n }\n extra.push(`interface ${httpName}Input {start:BOOL;cancel:BOOL;request:${requestType}}\ninterface ${httpName}Output {busy:BOOL;done:BOOL;error:UDINT;result:${responseType}}\nclass ${httpName} extends FunctionBlock<${httpName}Input,${httpName}Output> { protected execute(input:${httpName}Input):${httpName}Output {return {busy:false,done:false,error:0,result:defaultValue<${responseType}>()};} }`);\n result.blocks.set(\n `${source.fileName}:${httpName}`,\n rpc\n ? { kind: \"rpc\", path: url }\n : {\n kind: \"http\",\n url,\n method,\n json: Boolean(json),\n },\n );\n children.push(`private ${child} = new ${httpName}();`);\n resets.push(\n `this.${child}.update({start:false,cancel:false,request:defaultValue<${requestType}>()});`,\n );\n cancels.push(\n `this.${child}.update({start:false,cancel:true,request:defaultValue<${requestType}>()});`,\n );\n return state(\n `this.${child}.update({start:true,cancel:false,request:${json ? rewrite(json) : `defaultValue<${requestType}>()`}}); if(this.${child}.out.done) { if(this.${child}.out.error !== 0) {${reject(`this.${child}.out.error`, true)}} else {${target ? `${target} = ${copyValue(`this.${child}.out.result`, Boolean(checker.getAwaitedType(checker.getTypeAtLocation(call))!.flags & ts.TypeFlags.Object))};` : \"\"}this.step = ${next};} }`,\n );\n }\n const jobDeclaration = symbol(name)?.declarations?.find(\n (node) => ts.isVariableDeclaration(node) || ts.isPropertyDeclaration(node),\n );\n const jobInitializer =\n jobDeclaration &&\n (ts.isVariableDeclaration(jobDeclaration) || ts.isPropertyDeclaration(jobDeclaration))\n ? jobDeclaration.initializer\n : undefined;\n if (\n jobInitializer &&\n ts.isCallExpression(jobInitializer) &&\n ts.isPropertyAccessExpression(jobInitializer.expression) &&\n official(jobInitializer.expression.expression, \"backgroundTasks\") &&\n jobInitializer.expression.name.text === \"define\"\n ) {\n const receiver = rewrite(call.expression),\n borrow = `borrow${children.length}`;\n children.push(`private ${borrow}:BOOL=false;`);\n resets.push(`this.${borrow}=false;`);\n cancels.push(\n `if(this.${borrow}){${receiver}.cancel();const borrowed=${receiver}.snapshot();if(!borrowed.valid||borrowed.busy)return;if(!${receiver}.reset())return;this.${borrow}=false;}`,\n );\n const poll = state(\n `const borrowed=${receiver}.snapshot();if(borrowed.valid&&borrowed.done){if(${receiver}.reset()){this.${borrow}=false;if(borrowed.error!==0){${reject(\"borrowed.error\", true)}}else{${target ? `${target}=${copyValue(\"borrowed.result\", Boolean(checker.getAwaitedType(checker.getTypeAtLocation(call))!.flags & ts.TypeFlags.Object))};` : \"\"}this.step=${next};}}}`,\n );\n return state(\n `const available=${receiver}.snapshot();if(!available.valid)return;if(available.busy||available.done){${reject(\"7\")}}else{const accepted:BOOL=${receiver}.start(${call.arguments.map(rewrite).join(\",\")});if(accepted){this.${borrow}=true;this.step=${poll};}}`,\n true,\n );\n }\n const called = functions.get(symbol(name)!);\n if (!called) fail(call, \"Await requires a known async helper or SDK operation.\");\n const calledMethod = methods.get(symbol(name)!);\n if (calledMethod) {\n if (!ts.isPropertyAccessExpression(call.expression))\n fail(call, \"Async methods require a static receiver.\");\n const receiver = rewrite(call.expression.expression);\n const borrow = `methodBorrow${children.length}`;\n children.push(`private ${borrow}:BOOL=false;`);\n resets.push(\n `if(this.${borrow}){${receiver}.${calledMethod.reset}();this.${borrow}=false;}`,\n );\n cancels.push(\n `if(this.${borrow}){${receiver}.${calledMethod.advance}({cancel:true});const cancellingChild=${receiver}.${calledMethod.snapshot}();if(cancellingChild.busy)return;${receiver}.${calledMethod.reset}();this.${borrow}=false;}`,\n );\n const poll = state(\n `${receiver}.${calledMethod.advance}({cancel:false});const childState=${receiver}.${calledMethod.snapshot}();if(childState.done){${receiver}.${calledMethod.reset}();this.${borrow}=false;if(childState.error!==0){${reject(\"childState.error\", true)}}else{${target ? `${target}=${copyValue(\"childState.result\", Boolean(checker.getAwaitedType(checker.getTypeAtLocation(call))!.flags & ts.TypeFlags.Object))};` : \"\"}this.step=${next};}}`,\n );\n return state(\n `const accepted:BOOL=${receiver}.${calledMethod.start}(${call.arguments.map(rewrite).join(\",\")});if(!accepted){${reject(\"7\")}}else{this.${borrow}=true;${receiver}.${calledMethod.advance}({cancel:false});this.step=${poll};}`,\n true,\n );\n }\n if (!ts.isIdentifier(call.expression))\n fail(call, \"Async helpers require a static function.\");\n children.push(`private ${child} = new ${text(call.expression)}();`);\n resets.push(`this.${child}.reset();`);\n cancels.push(\n `this.${child}.update({cancel:true});const cancellingChild=this.${child}.snapshot();if(cancellingChild.busy)return;`,\n );\n const poll = state(\n `this.${child}.update({cancel:false}); const childState = this.${child}.snapshot(); if(childState.done) {if(childState.error !== 0) {${reject(\"childState.error\", true)}} else {${target ? `${target} = ${copyValue(\"childState.result\", Boolean(checker.getAwaitedType(checker.getTypeAtLocation(call))!.flags & ts.TypeFlags.Object))};` : \"\"}this.step = ${next};} }`,\n );\n return state(\n `const accepted:BOOL = this.${child}.start(${call.arguments.map(rewrite).join(\",\")}); if(accepted){this.${child}.update({cancel:false});this.step = ${poll};}`,\n true,\n );\n };\n const block = (\n statements: readonly ts.Statement[],\n next: number,\n reject: (error: string, cancellable?: boolean) => string = failure,\n ): number => {\n let entry = next;\n for (const stmt of [...statements].reverse()) {\n if (ts.isBlock(stmt)) {\n entry = block(stmt.statements, entry, reject);\n continue;\n }\n if (ts.isIfStatement(stmt)) {\n const yes = block([stmt.thenStatement], entry, reject),\n no = stmt.elseStatement ? block([stmt.elseStatement], entry, reject) : entry;\n entry = state(\n `if(${rewrite(stmt.expression)}) this.step = ${yes}; else this.step = ${no};`,\n );\n continue;\n }\n if (ts.isTryStatement(stmt)) {\n if (!stmt.catchClause || stmt.finallyBlock)\n fail(stmt, \"Async try requires catch; finally is not supported yet.\");\n const caught = block(stmt.catchClause.block.statements, entry, reject);\n const declaration = stmt.catchClause.variableDeclaration;\n const field = declaration && fields.get(symbol(declaration.name)!);\n entry = block(stmt.tryBlock.statements, entry, (error, cancellable) => {\n const recover = `${field ? `this.${field.name} = ${error};` : \"\"}this.step = ${caught};`;\n return cancellable\n ? `if(${error} === 1) {${failure(error)}} else {${recover}}`\n : recover;\n });\n continue;\n }\n if (ts.isThrowStatement(stmt)) {\n if (\n !checker.isTypeAssignableTo(\n checker.getTypeAtLocation(stmt.expression),\n checker.getNumberType(),\n )\n )\n fail(stmt, \"Async throw requires a numeric error code.\");\n entry = state(reject(rewrite(stmt.expression)));\n continue;\n }\n if (ts.isReturnStatement(stmt)) {\n if (!stmt.expression) {\n if (!returnsVoid) fail(stmt, \"Async routines must return a value.\");\n entry = state(finish(\"true\"));\n continue;\n }\n const adopted =\n ts.isCallExpression(stmt.expression) &&\n checker.getAwaitedType(checker.getTypeAtLocation(stmt.expression)) !==\n checker.getTypeAtLocation(stmt.expression)\n ? stmt.expression\n : undefined;\n const suspension = ts.isAwaitExpression(stmt.expression) ? stmt.expression : adopted;\n entry = suspension\n ? awaitState(\n suspension,\n returnsVoid ? undefined : \"this.value\",\n state(finish(returnsVoid ? \"true\" : \"this.value\")),\n reject,\n )\n : state(finish(rewrite(stmt.expression)));\n continue;\n }\n if (ts.isVariableStatement(stmt)) {\n for (const dec of [...stmt.declarationList.declarations].reverse()) {\n const field = fields.get(symbol(dec.name)!);\n if (!field || !dec.initializer) fail(dec, \"Invalid async local.\");\n const target = `this.${field.name}`;\n entry = ts.isAwaitExpression(dec.initializer)\n ? awaitState(dec.initializer, target, entry, reject)\n : state(\n `${target} = ${copyValue(rewrite(dec.initializer), field.aggregate)}; this.step = ${entry};`,\n );\n }\n continue;\n }\n if (ts.isExpressionStatement(stmt) && ts.isAwaitExpression(stmt.expression)) {\n entry = awaitState(stmt.expression, undefined, entry, reject);\n continue;\n }\n if (containsAwait(stmt))\n fail(\n stmt,\n \"This suspension position is not supported; await into a named local or return.\",\n );\n if (ts.isWhileStatement(stmt) || ts.isDoStatement(stmt))\n fail(stmt, \"Unbounded loops are not supported in async routines.\");\n entry = state(`${rewrite(stmt)} this.step = ${entry};`);\n }\n return entry;\n };\n const entry = block(fn.body.statements, state(returnsVoid ? finish(\"true\") : failure(\"4\")));\n const exported = fn.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword)\n ? \"export \"\n : \"\";\n const aliases = `export type ${aliasPrefix(fn)}Result = ${returnType};\\n${parameters.map((p, i) => `export type ${aliasPrefix(fn)}Argument${i} = ${p.type};`).join(\"\\n\")}`;\n const generated = `${aliases}\\n${exported}class ${fn.name!.getText(source)} extends FunctionBlock<{cancel:BOOL}> {\nprivate step:UINT=0; private cancelling:BOOL=false; private busy:BOOL=false; private done:BOOL=false; private error:UDINT=0; private value:${returnType}=defaultValue<${returnType}>();\n${[...fields.values()].map((f) => `private ${f.name}:${f.type}=defaultValue<${f.type}>();`).join(\"\\n\")}\n${children.join(\"\\n\")}\nstart(${parameters.map((p) => `${p.name}:${p.type}`).join(\",\")}):BOOL {if(this.busy || this.done)return false; ${parameters.map((p) => `this.${p.field} = ${copyValue(p.name, p.aggregate)};`).join(\" \")} ${resets.join(\" \")} this.value = defaultValue<${returnType}>(); this.error=0;this.cancelling=false;this.busy=true;this.done=false;this.step=${entry};return true;}\nreset():void {${resets.join(\" \")} this.busy=false;this.cancelling=false;this.done=false;this.error=0;this.step=0;}\nsnapshot():{busy:BOOL;done:BOOL;error:UDINT;result:${returnType}} {return {busy:this.busy,done:this.done,error:this.error,result:${copyValue(\"this.value\", resultAggregate)}};}\nprotected execute(input:{cancel:BOOL}):void {if(!this.busy)return;if(input.cancel)this.cancelling=true;if(this.cancelling){${cancels.map((cancel) => `{${cancel}}`).join(\" \")}${failure(\"1\")}return;}for(let transition:DINT=0;transition<${nodes.size + 1};transition++){const previous:UINT=this.step;switch(this.step){${[...nodes].map(([id, body]) => `case ${id}: {${body}} break;`).join(\"\\n\")} }if(!this.busy||this.step===previous${[...yielding].map((id) => `||previous===${id}`).join(\"\")})return;}}\n\n}`;\n if (!method)\n replacements.push({ start: fn.getStart(source), end: fn.end, text: generated });\n else {\n const parsed = ts.createSourceFile(\n source.fileName,\n generated,\n ts.ScriptTarget.Latest,\n true,\n );\n const worker = parsed.statements.find(ts.isClassDeclaration)!;\n const names = new Map(\n worker.members.map((member) => [\n member.name!.getText(parsed),\n `tsplcAsync${fn.getStart(source)}_${member.name!.getText(parsed)}`,\n ]),\n );\n names.set(\"start\", method.start);\n names.set(\"reset\", method.reset);\n names.set(\"snapshot\", method.snapshot);\n names.set(\"execute\", method.advance);\n const transformed = ts.transform(worker, [\n (context) => (root) => {\n const visit = (node: ts.Node): ts.VisitResult<ts.Node> => {\n if (\n ts.isElementAccessExpression(node) &&\n node.expression.kind === ts.SyntaxKind.ThisKeyword &&\n ts.isStringLiteral(node.argumentExpression)\n )\n return ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n node.argumentExpression.text,\n );\n if (\n ts.isPropertyAccessExpression(node) &&\n node.expression.kind === ts.SyntaxKind.ThisKeyword &&\n names.has(node.name.text)\n )\n return ts.factory.createPropertyAccessExpression(\n ts.factory.createThis(),\n names.get(node.name.text)!,\n );\n if (\n (ts.isPropertyDeclaration(node) || ts.isMethodDeclaration(node)) &&\n ts.isIdentifier(node.name) &&\n names.has(node.name.text)\n ) {\n const updated = ts.visitEachChild(node, visit, context);\n const name = ts.factory.createIdentifier(names.get(node.name.text)!);\n if (ts.isPropertyDeclaration(updated))\n return ts.factory.updatePropertyDeclaration(\n updated,\n updated.modifiers,\n name,\n updated.questionToken ?? updated.exclamationToken,\n updated.type,\n updated.initializer,\n );\n if (ts.isMethodDeclaration(updated))\n return ts.factory.updateMethodDeclaration(\n updated,\n [ts.factory.createModifier(ts.SyntaxKind.PublicKeyword)],\n updated.asteriskToken,\n name,\n updated.questionToken,\n updated.typeParameters,\n updated.parameters,\n updated.type,\n updated.body,\n );\n }\n return ts.visitEachChild(node, visit, context);\n };\n return ts.visitNode(root, visit) as typeof root;\n },\n ]);\n const generatedClass = transformed.transformed[0]!;\n replacements.push({\n start: fn.getStart(source),\n end: fn.end,\n text: generatedClass.members\n .map((member) => printer.printNode(ts.EmitHint.Unspecified, member, parsed))\n .join(\"\\n\"),\n });\n transformed.dispose();\n }\n }\n const workTypes = (fn: Routine, dec: ts.VariableDeclaration | ts.PropertyDeclaration) => {\n const reference = fn.type as ts.TypeReferenceNode;\n const returnType =\n reference.typeArguments![0]!.kind === ts.SyntaxKind.VoidKeyword\n ? \"BOOL\"\n : reference.typeArguments![0]!.getText(fn.getSourceFile());\n // Types in the job module must be visible: use the original inferred Promise result annotation at the definition boundary.\n const signature = checker.getSignatureFromDeclaration(fn)!;\n const promised = checker.getAwaitedType(checker.getReturnTypeOfSignature(signature))!;\n const resultType =\n promised.flags & ts.TypeFlags.Void\n ? \"BOOL\"\n : checker.typeToString(\n promised,\n dec,\n ts.TypeFormatFlags.NoTruncation |\n ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope,\n );\n const params = fn.parameters.map((p, i) => ({\n field: `argument${i}`,\n name: `argument${i}`,\n aggregate: Boolean(checker.getTypeAtLocation(p).flags & ts.TypeFlags.Object),\n type: checker.typeToString(\n checker.getTypeAtLocation(p),\n dec,\n ts.TypeFormatFlags.NoTruncation | ts.TypeFormatFlags.UseAliasDefinedOutsideCurrentScope,\n ),\n }));\n // Preserve PLC widths erased by the TS checker when declarations share the module.\n for (let i = 0; i < params.length; i++)\n if (fn.getSourceFile() === source)\n params[i]!.type = fn.parameters[i]!.type!.getText(source);\n let valueType = fn.getSourceFile() === source ? returnType : resultType;\n if (fn.getSourceFile() !== source) {\n const prefix = aliasPrefix(fn);\n valueType = `${prefix}Result`;\n for (let i = 0; i < params.length; i++) params[i]!.type = `${prefix}Argument${i}`;\n const path = relative(dirname(source.fileName), fn.getSourceFile().fileName).replaceAll(\n \"\\\\\",\n \"/\",\n );\n extra.push(\n `import type {${valueType},${params.map((p) => p.type).join(\",\")}} from ${JSON.stringify(path.startsWith(\".\") ? path : `./${path}`)};`,\n );\n }\n const valueAggregate = Boolean(promised.flags & ts.TypeFlags.Object);\n return { params, valueType, valueAggregate };\n };\n const definitions = source.statements.flatMap<\n ts.VariableDeclaration | ts.PropertyDeclaration\n >((stmt) => {\n if (ts.isVariableStatement(stmt)) return [...stmt.declarationList.declarations];\n if (ts.isClassDeclaration(stmt)) return stmt.members.filter(ts.isPropertyDeclaration);\n return [];\n });\n for (const dec of definitions) {\n const owner = ts.isPropertyDeclaration(dec) ? dec.parent : undefined;\n const init = dec.initializer;\n if (\n !init ||\n !ts.isCallExpression(init) ||\n !ts.isPropertyAccessExpression(init.expression) ||\n (!official(init.expression.expression, \"backgroundTasks\") &&\n !official(init.expression.expression, \"cooperativeTasks\") &&\n !official(init.expression.expression, \"tasks\")) ||\n init.expression.name.text !== \"define\"\n )\n continue;\n if (official(init.expression.expression, \"tasks\")) {\n const fn = functions.get(symbol(init.arguments[0] ?? init)!);\n if (!ts.isIdentifier(dec.name) || init.arguments.length !== 1 || !fn?.type)\n fail(init, \"tasks.define requires one named async function with a return type.\");\n const { params, valueType, valueAggregate } = workTypes(fn, dec);\n const worker = `tsplcTaskWorker${sequence++}`;\n const receiver = `this.${worker}`;\n const site = taskSite(\n dec.name.text,\n params,\n {\n start: `${receiver}.start`,\n advance: `${receiver}.update`,\n snapshot: `${receiver}.snapshot`,\n reset: `${receiver}.reset`,\n declaration: `private ${worker}=new ${init.arguments[0]!.getText(source)}();`,\n },\n Boolean(owner),\n { type: valueType, aggregate: valueAggregate },\n );\n if (owner) {\n if (!owner.name) fail(owner, \"Task owners require a named block.\");\n replacements.push({ start: dec.getStart(source), end: dec.end, text: site.body });\n ownedContinuations.set(symbol(owner.name)!, [\n ...(ownedContinuations.get(symbol(owner.name)!) ?? []),\n site.poll,\n ]);\n const visit = (node: ts.Node): void => {\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n ts.isPropertyAccessExpression(node.expression.expression) &&\n node.expression.expression.expression.kind === ts.SyntaxKind.ThisKeyword &&\n symbol(node.expression.expression.name) === symbol(dec.name)\n ) {\n const renamed = site.renames.get(node.expression.name.text);\n if (renamed)\n replacements.push({\n start: node.expression.getStart(source),\n end: node.expression.end,\n text: `this.${renamed}`,\n });\n }\n ts.forEachChild(node, visit);\n };\n visit(owner);\n } else {\n const name = `TsplcTaskSite${sequence++}`,\n entry = `tsplcContinuation${sequence++}`;\n extra.push(`class ${name} extends FunctionBlock<{}>{${site.body}protected execute(input:{}):void{}}\nexport function ${entry}():void{${dec.name.text}.poll();}`);\n replacements.push({\n start: init.getStart(source),\n end: init.end,\n text: `new ${name}()`,\n });\n result.programs[entry] = { module: resolve(source.fileName), export: entry };\n result.continuations.set(entry, { instance: dec.name.text, file: source.fileName });\n }\n continue;\n }\n const cooperative = official(init.expression.expression, \"cooperativeTasks\");\n if (cooperative) {\n if (!ts.isIdentifier(dec.name) || init.arguments.length !== 1)\n fail(init, \"Invalid compiler-owned continuation slot.\");\n const workNode = init.arguments[0]!;\n const work = functions.get(\n symbol(ts.isPropertyAccessExpression(workNode) ? workNode.name : workNode)!,\n );\n if (!work) fail(workNode, \"A continuation requires a named async routine.\");\n const params = work.parameters.map((parameter, index) => ({\n name: `argument${index}`,\n type: parameter.type!.getText(work.getSourceFile()),\n aggregate: Boolean(checker.getTypeAtLocation(parameter).flags & ts.TypeFlags.Object),\n }));\n const workMethod = methods.get(symbol(work.name!)!);\n const worker = `tsplcCooperativeWorker${sequence++}`;\n const receiver = workMethod ? \"this\" : `this.${worker}`;\n const site = cooperativeSite(\n dec.name.text,\n params,\n {\n start: `${receiver}.${workMethod?.start ?? \"start\"}`,\n advance: `${receiver}.${workMethod?.advance ?? \"update\"}`,\n snapshot: `${receiver}.${workMethod?.snapshot ?? \"snapshot\"}`,\n reset: `${receiver}.${workMethod?.reset ?? \"reset\"}`,\n declaration: workMethod ? \"\" : `private ${worker}=new ${workNode.getText(source)}();`,\n },\n Boolean(owner),\n );\n if (owner) {\n if (!owner.name) fail(owner, \"Continuation owners require a named block.\");\n replacements.push({ start: dec.getStart(source), end: dec.end, text: site.body });\n ownedContinuations.set(symbol(owner.name)!, [\n ...(ownedContinuations.get(symbol(owner.name)!) ?? []),\n site.poll,\n ]);\n const visit = (node: ts.Node): void => {\n if (\n ts.isCallExpression(node) &&\n ts.isPropertyAccessExpression(node.expression) &&\n ts.isPropertyAccessExpression(node.expression.expression) &&\n node.expression.expression.expression.kind === ts.SyntaxKind.ThisKeyword &&\n symbol(node.expression.expression.name) === symbol(dec.name)\n ) {\n const renamed =\n node.expression.name.text === \"start\"\n ? site.start\n : node.expression.name.text === \"cancel\"\n ? site.cancel\n : undefined;\n if (renamed)\n replacements.push({\n start: node.expression.getStart(source),\n end: node.expression.end,\n text: `this.${renamed}`,\n });\n }\n ts.forEachChild(node, visit);\n };\n visit(owner);\n } else {\n const name = `TsplcCooperativeSite${sequence++}`,\n entry = `tsplcContinuation${sequence++}`;\n extra.push(`class ${name} extends FunctionBlock<{}>{${site.body}protected execute(input:{}):void{}}\nexport function ${entry}():void{${dec.name.text}.poll();}`);\n replacements.push({\n start: init.getStart(source),\n end: init.end,\n text: `new ${name}()`,\n });\n result.programs[entry] = { module: resolve(source.fileName), export: entry };\n result.continuations.set(entry, { instance: dec.name.text, file: source.fileName });\n }\n continue;\n }\n if (\n !ts.isIdentifier(dec.name) ||\n init.arguments.length !== 2 ||\n !ts.isObjectLiteralExpression(init.arguments[1]!)\n )\n fail(\n dec,\n \"Define background tasks at module scope or as function-block fields with a named async function and scheduling options.\",\n );\n const fn = functions.get(symbol(init.arguments[0]!)!);\n if (!fn?.type || !ts.isTypeReferenceNode(fn.type))\n fail(init, \"backgroundTasks.define requires a named async function.\");\n const { params, valueType, valueAggregate } = workTypes(fn, dec);\n const mailbox = `TsplcMailbox${sequence++}`,\n worker = `tsplcWorker${sequence++}`,\n entry = `tsplcBackground${sequence++}`;\n const requestType = `{ready:BOOL;${params.map((p) => `${p.field}:${p.type}`).join(\";\")}}`;\n const snapshotType = `{valid:BOOL;busy:BOOL;done:BOOL;cancelRequested:BOOL;error:UDINT;result:${valueType}}`;\n const emptySnapshot = `{valid:true,busy:this.pending || this.active,done:this.completed,cancelRequested:this.cancelRequested,error:this.failure,result:${copyValue(\"this.value\", valueAggregate)}}`;\n extra.push(`class ${mailbox} extends FunctionBlock<{}> {\nprivate pending:BOOL=false;private active:BOOL=false;private completed:BOOL=false;private cancelRequested:BOOL=false;private failure:UDINT=0;private value:${valueType}=defaultValue<${valueType}>();\n${params.map((p) => `private ${p.field}:${p.type}=defaultValue<${p.type}>();`).join(\"\\n\")}\nstart(${params.map((p) => `${p.name}:${p.type}`).join(\",\")}):BOOL {if(this.pending || this.active || this.completed)return false;${params.map((p) => `this.${p.field}=${copyValue(p.name, p.aggregate)};`).join(\"\")}this.pending=true;return true;}\ntake():${requestType} {const ready:BOOL=this.pending; if(ready){this.pending=false;this.active=true;}return {ready,${params.map((p) => `${p.field}:${copyValue(`this.${p.field}`, p.aggregate)}`).join(\",\")}};}\npublish(value:${valueType},error:UDINT):BOOL {if(!this.active)return false;if(this.cancelRequested){this.value=defaultValue<${valueType}>();this.failure=1;}else{this.value=${copyValue(\"value\", valueAggregate)};this.failure=error;}this.active=false;this.completed=true;this.cancelRequested=false;return true;}\nsnapshot():${snapshotType} {return ${emptySnapshot};}\ncancel():BOOL {if(this.pending){this.pending=false;this.completed=true;this.failure=1;return true;}if(this.active){this.cancelRequested=true;return true;}return false;}\nreset():BOOL {if(this.pending || this.active)return false;this.completed=false;this.failure=0;this.cancelRequested=false;this.value=defaultValue<${valueType}>();return true;}\nprotected execute(input:{}):void {}\n}\n`);\n const receiver = owner ? `this.${dec.name.text}` : dec.name.text;\n const workerReceiver = owner ? `this.${worker}` : worker;\n const run = `const request=${receiver}.take();if(request.ready){const accepted:BOOL=${workerReceiver}.start(${params.map((p) => `request.${p.field}`).join(\",\")});}const control=${receiver}.snapshot();if(!control.valid)return;${workerReceiver}.update({cancel:control.cancelRequested});const state=${workerReceiver}.snapshot();if(state.done){const published:BOOL=${receiver}.publish(state.result,state.error);if(published)${workerReceiver}.reset();}`;\n if (owner) {\n if (!owner.name) fail(owner, \"Background job owners need a named function block.\");\n replacements.push({\n start: owner.end - 1,\n end: owner.end - 1,\n text: `private ${worker}=new ${text(init.arguments[0]!)}();public ${entry}():void{${run}}`,\n });\n result.blocks.set(`${source.fileName}:${owner.name.text}`, { kind: \"backgroundHost\" });\n } else\n extra.push(\n `const ${worker}=new ${text(init.arguments[0]!)}();export function ${entry}():void{${run}}`,\n );\n result.blocks.set(`${source.fileName}:${mailbox}`, { kind: \"mailbox\" });\n const opts = new Map(\n init.arguments[1]!.properties.filter(ts.isPropertyAssignment).map((p) => [\n p.name.getText(source),\n p.initializer,\n ]),\n );\n const interval = opts.get(\"interval\"),\n priority = opts.get(\"priority\");\n if (\n !interval ||\n !ts.isCallExpression(interval) ||\n interval.arguments.length !== 1 ||\n !ts.isNumericLiteral(interval.arguments[0]!) ||\n !priority ||\n !ts.isNumericLiteral(priority) ||\n ![\"ms\", \"seconds\"].some((n) => official(interval.expression, n))\n )\n fail(init, \"Background schedules require a literal ms/seconds interval and priority.\");\n const milliseconds =\n Number(interval.arguments[0]!.text) *\n (official(interval.expression, \"seconds\") ? 1000 : 1);\n if (\n !Number.isSafeInteger(milliseconds) ||\n milliseconds <= 0 ||\n milliseconds > 4294967295 ||\n Number(priority.text) < 1 ||\n Number(priority.text) > 31\n )\n fail(init, \"Background interval must be positive and priority must be 1..31.\");\n const schedule = {\n intervalNanoseconds: String(BigInt(milliseconds) * 1000000n),\n priority: Number(priority.text),\n mailbox: dec.name.text,\n worker,\n };\n if (owner) {\n const key = symbol(owner.name!)!;\n ownedJobs.set(key, [...(ownedJobs.get(key) ?? []), { method: entry, schedule }]);\n } else {\n result.programs[entry] = { module: resolve(source.fileName), export: entry };\n result.schedules.set(entry, schedule);\n }\n replacements.push({\n start: init.getStart(source),\n end: init.end,\n text: `new ${mailbox}()`,\n });\n }\n if (replacements.length) {\n let changed = source.text;\n for (const edit of replacements.sort((a, b) => b.start - a.start))\n changed = changed.slice(0, edit.start) + edit.text + changed.slice(edit.end);\n const generated = ts.createSourceFile(\n source.fileName,\n extra.join(\"\\n\"),\n ts.ScriptTarget.Latest,\n true,\n );\n const before = generated.statements\n .filter(ts.isClassDeclaration)\n .map((n) => n.getText(generated))\n .join(\"\\n\");\n const after = generated.statements\n .filter((n) => !ts.isClassDeclaration(n))\n .map((n) => n.getText(generated))\n .join(\"\\n\");\n result.sources.set(source.fileName, before + \"\\n\" + changed + \"\\n\" + after);\n }\n } catch (cause) {\n if (typeof cause === \"object\" && cause !== null && \"asyncDiagnostic\" in cause)\n result.diagnostics.push(cause.asyncDiagnostic as Diagnostic);\n else throw cause;\n }\n }\n for (const source of runtimeSources(program)) {\n if (source.isDeclarationFile) continue;\n const entries: string[] = [];\n // `new Block()` allocates one instance; `defaultValue<FixedArray<Block, N, Lower>>()` one per element.\n const allocated = (node: ts.Node) => {\n if (ts.isNewExpression(node)) return { block: node.expression };\n const type = ts.isCallExpression(node) ? node.typeArguments?.[0] : undefined;\n const [element, length, lower] =\n type && ts.isTypeReferenceNode(type) && type.typeName.getText(source) === \"FixedArray\"\n ? (type.typeArguments ?? [])\n : [];\n if (!element || !ts.isTypeReferenceNode(element) || !length) return undefined;\n // A literal, or a table's `(typeof table)[\"length\"]`.\n const integer = (node: ts.TypeNode) => {\n const type = checker.getTypeFromTypeNode(node);\n return type.isNumberLiteral() ? type.value : NaN;\n };\n const first = lower ? integer(lower) : 0;\n return { block: element.typeName, first, last: first + integer(length) - 1 };\n };\n const visit = (node: ts.Node): void => {\n const instance = allocated(node);\n if (instance) {\n const jobs = ownedJobs.get(symbol(instance.block)!);\n const polls = ownedContinuations.get(symbol(instance.block)!);\n if (jobs || polls) {\n const declaration = node.parent;\n if (\n !ts.isVariableDeclaration(declaration) ||\n !ts.isIdentifier(declaration.name) ||\n !ts.isVariableDeclarationList(declaration.parent) ||\n !ts.isVariableStatement(declaration.parent.parent) ||\n !ts.isSourceFile(declaration.parent.parent.parent) ||\n (jobs && instance.first !== undefined)\n ) {\n result.diagnostics.push(\n diagnosticFor(\n node,\n \"Function blocks with background jobs require module-level named instances.\",\n ),\n );\n return;\n }\n const name = declaration.name.text;\n for (const poll of polls ?? []) {\n const entry = `tsplcContinuation${sequence++}`;\n entries.push(\n instance.first === undefined\n ? `export function ${entry}():void{${name}.${poll}();}`\n : `export function ${entry}():void{for(let element:DINT=${instance.first};element<=${instance.last};element++){${name}[element].${poll}();}}`,\n );\n result.programs[entry] = { module: resolve(source.fileName), export: entry };\n result.continuations.set(entry, { instance: name, file: source.fileName });\n }\n for (const job of jobs ?? []) {\n const entry = `tsplcBackground${sequence++}`;\n entries.push(`export function ${entry}():void{${name}.${job.method}();}`);\n result.programs[entry] = { module: resolve(source.fileName), export: entry };\n result.schedules.set(entry, { ...job.schedule, worker: name });\n }\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n if (entries.length)\n result.sources.set(\n source.fileName,\n (result.sources.get(source.fileName) ?? source.text) + \"\\n\" + entries.join(\"\\n\"),\n );\n }\n return result;\n};\n",
|
|
11
|
+
"interface Parameter {\n name: string;\n type: string;\n aggregate: boolean;\n}\ninterface Worker {\n start: string;\n advance: string;\n snapshot: string;\n reset: string;\n declaration: string;\n}\n\n/** A fixed call-site frame; callbacks and ordinary state stay in the caller task. */\nexport const cooperativeSite = (\n name: string,\n parameters: readonly Parameter[],\n worker: Worker,\n inline: boolean,\n) => {\n const prefix = inline ? name : \"site\";\n const field = (label: string) => `${prefix}_${label}`;\n const member = (label: string) => `this.${field(label)}`;\n const method = (label: string) => (inline ? `${name}_${label}` : label);\n const invoke = (label: string, args = \"\") => `this.${method(label)}(${args})`;\n const copy = (value: string, aggregate: boolean) => (aggregate ? `copy(${value})` : value);\n const faults = `${member(\"faults\")}=tsplcAsyncWrapAdd<UDINT>(${member(\"faults\")},1);${member(\"lastError\")}=7;`;\n const signature = parameters.map((parameter) => `${parameter.name}:${parameter.type}`).join(\",\");\n const args = parameters.map((parameter) => parameter.name).join(\",\");\n const queued = parameters.map((parameter) => member(`queued_${parameter.name}`)).join(\",\");\n const fields = `private ${field(\"active\")}:BOOL=false;private ${field(\"fresh\")}:BOOL=false;private ${field(\"cancelled\")}:BOOL=false;private ${field(\"queued\")}:BOOL=false;private ${field(\"faults\")}:UDINT=0;private ${field(\"lastError\")}:UDINT=0;\n${parameters.map((parameter) => `private ${field(`queued_${parameter.name}`)}:${parameter.type}=defaultValue<${parameter.type}>();`).join(\"\\n\")}\n${worker.declaration}`;\n const body = `${fields}\npublic ${method(\"begin\")}(${signature}):void{const accepted:BOOL=${worker.start}(${args});if(!accepted){${faults}return;}${member(\"active\")}=true;${member(\"fresh\")}=true;${member(\"cancelled\")}=false;${worker.advance}({cancel:false});}\npublic ${method(\"start\")}(${signature}):void{if(${member(\"active\")}){if(${member(\"cancelled\")}&&!${member(\"queued\")}){${parameters.map((parameter) => `${member(`queued_${parameter.name}`)}=${copy(parameter.name, parameter.aggregate)};`).join(\"\")}${member(\"queued\")}=true;}else{${faults}}return;}${invoke(\"begin\", args)};}\npublic ${method(\"cancel\")}():void{${member(\"cancelled\")}=true;${member(\"queued\")}=false;}\npublic ${method(\"poll\")}():void{\nif(${member(\"faults\")}>0&&tsplcPromiseDiagnostics.report(${member(\"lastError\")},${member(\"faults\")}))${member(\"faults\")}=0;\nif(!${member(\"active\")})return;\nif(${member(\"fresh\")}&&!${member(\"cancelled\")}){${member(\"fresh\")}=false;return;}\n${worker.advance}({cancel:${member(\"cancelled\")}});const state=${worker.snapshot}();if(!state.done)return;\nif(!${member(\"cancelled\")}&&state.error!==0&&state.error!==1){${member(\"faults\")}=tsplcAsyncWrapAdd<UDINT>(${member(\"faults\")},1);${member(\"lastError\")}=state.error;}\n${worker.reset}();${member(\"active\")}=false;\nif(${member(\"queued\")}){${member(\"queued\")}=false;${invoke(\"begin\", queued)};}\n}`;\n return { body, start: method(\"start\"), cancel: method(\"cancel\"), poll: method(\"poll\") };\n};\n\n/** A named task: the owner reads its state and result instead of attaching a callback. */\nexport const taskSite = (\n name: string,\n parameters: readonly Parameter[],\n worker: Worker,\n inline: boolean,\n value: { type: string; aggregate: boolean },\n) => {\n const method = (label: string) => (inline ? `${name}_${label}` : label);\n const cancelled = `this.${inline ? `${name}_cancelled` : \"cancelled\"}`;\n const signature = parameters.map((parameter) => `${parameter.name}:${parameter.type}`).join(\",\");\n const args = parameters.map((parameter) => parameter.name).join(\",\");\n const result = value.aggregate ? \"copy(state.result)\" : \"state.result\";\n const body = `private ${cancelled.slice(5)}:BOOL=false;\n${worker.declaration}\npublic ${method(\"start\")}(${signature}):BOOL{const accepted:BOOL=${worker.start}(${args});if(accepted){${cancelled}=false;${worker.advance}({cancel:false});}return accepted;}\npublic ${method(\"cancel\")}():BOOL{const state=${worker.snapshot}();if(!state.busy&&!state.done)return false;${cancelled}=true;return true;}\npublic ${method(\"snapshot\")}():{valid:BOOL;busy:BOOL;done:BOOL;cancelRequested:BOOL;error:UDINT;result:${value.type}}{const state=${worker.snapshot}();if(${cancelled}&&state.done)return {valid:true,busy:false,done:true,cancelRequested:false,error:1,result:defaultValue<${value.type}>()};return {valid:true,busy:state.busy,done:state.done,cancelRequested:${cancelled},error:state.error,result:${result}};}\npublic ${method(\"reset\")}():BOOL{const state=${worker.snapshot}();if(state.busy)return false;${worker.reset}();${cancelled}=false;return true;}\npublic ${method(\"poll\")}():void{${worker.advance}({cancel:${cancelled}});}`;\n return {\n body,\n poll: method(\"poll\"),\n renames: new Map([\"start\", \"cancel\", \"snapshot\", \"reset\"].map((m) => [m, method(m)])),\n };\n};\n",
|
|
12
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { dirname } from \"node:path\";\nimport { error, type Diagnostic } from \"@tsplc/compiler/ir\";\n\nconst symbolAt = (checker: ts.TypeChecker, node: ts.Node) => {\n let symbol = checker.getSymbolAtLocation(node);\n while (symbol && symbol.flags & ts.SymbolFlags.Alias) symbol = checker.getAliasedSymbol(symbol);\n return symbol;\n};\n\nexport const lowerEnvironment = (program: ts.Program, sdk: string) => {\n const checker = program.getTypeChecker();\n const sources = new Map<string, string>();\n const diagnostics: Diagnostic[] = [];\n for (const source of runtimeSources(program)) {\n if (source.isDeclarationFile) continue;\n const edits: { start: number; end: number; text: string }[] = [];\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node)) {\n const symbol = symbolAt(checker, node.expression);\n if (\n symbol?.name === \"env\" &&\n symbol.declarations?.some((declaration) =>\n declaration.getSourceFile().fileName.startsWith(dirname(sdk) + \"/\"),\n )\n ) {\n const name = node.arguments[0];\n let owner: ts.Node | undefined = node.parent;\n while (owner && !ts.isVariableDeclaration(owner) && !ts.isFunctionLike(owner))\n owner = owner.parent;\n const moduleConst =\n owner &&\n ts.isVariableDeclaration(owner) &&\n ts.isVariableDeclarationList(owner.parent) &&\n Boolean(owner.parent.flags & ts.NodeFlags.Const) &&\n ts.isVariableStatement(owner.parent.parent) &&\n ts.isSourceFile(owner.parent.parent.parent);\n const value = name && ts.isStringLiteral(name) ? process.env[name.text] : undefined;\n let message: string | undefined;\n if (\n !moduleConst ||\n node.arguments.length !== 1 ||\n !name ||\n !ts.isStringLiteral(name) ||\n node.typeArguments?.length !== 1\n )\n message =\n \"env<STRING<N>> requires a literal environment name in module-level const configuration.\";\n else if (value === undefined || value.length === 0)\n message = `Required environment value ${name.text} is missing.`;\n else if (value.includes(\"\\0\"))\n message = `Environment value ${name.text} contains an unsupported NUL byte.`;\n if (message) {\n const start = node.getStart(source),\n position = source.getLineAndCharacterOfPosition(start);\n diagnostics.push(\n error(\"PLC1011\", message, {\n file: source.fileName,\n start,\n end: node.end,\n line: position.line + 1,\n column: position.character + 1,\n }),\n );\n } else if (value !== undefined)\n edits.push({\n start: node.getStart(source),\n end: node.end,\n text: JSON.stringify(value),\n });\n return;\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(source);\n if (!edits.length) continue;\n let text = source.text;\n for (const edit of edits.sort((a, b) => b.start - a.start))\n text = text.slice(0, edit.start) + edit.text + text.slice(edit.end);\n sources.set(source.fileName, text);\n }\n return { sources, diagnostics };\n};\n\n/** URL expressions are compile-time values, never reads from mutable PLC state. */\nexport const staticString = (checker: ts.TypeChecker, root: ts.Expression): string | undefined => {\n const active = new Set<ts.Node>();\n const valueNode = (node: ts.Node): ts.Node | undefined => {\n if (ts.isParenthesizedExpression(node)) return node.expression;\n if (ts.isIdentifier(node)) {\n const declaration = symbolAt(checker, node)?.declarations?.find(ts.isVariableDeclaration);\n if (\n declaration &&\n ts.isVariableDeclarationList(declaration.parent) &&\n declaration.parent.flags & ts.NodeFlags.Const\n )\n return declaration.initializer;\n }\n if (ts.isPropertyAccessExpression(node)) {\n const field = symbolAt(checker, node.name);\n if (\n !field?.declarations?.some(\n (declaration) =>\n ts.canHaveModifiers(declaration) &&\n ts\n .getModifiers(declaration)\n ?.some((modifier) => modifier.kind === ts.SyntaxKind.ReadonlyKeyword),\n )\n )\n return;\n const object = resolve(node.expression);\n if (object && ts.isObjectLiteralExpression(object)) {\n for (const property of object.properties) {\n if (\n ts.isPropertyAssignment(property) &&\n (ts.isIdentifier(property.name) || ts.isStringLiteral(property.name)) &&\n property.name.text === node.name.text\n )\n return property.initializer;\n }\n }\n return;\n }\n return node;\n };\n const resolve = (node: ts.Node): ts.Node | undefined => {\n if (active.has(node)) return;\n active.add(node);\n try {\n const next = valueNode(node);\n return next && next !== node ? resolve(next) : next;\n } finally {\n active.delete(node);\n }\n };\n const read = (node: ts.Node): string | undefined => {\n const resolved = resolve(node);\n if (!resolved || active.has(resolved)) return;\n active.add(resolved);\n try {\n if (ts.isStringLiteral(resolved) || ts.isNoSubstitutionTemplateLiteral(resolved))\n return resolved.text;\n if (ts.isTemplateExpression(resolved)) {\n let value = resolved.head.text;\n for (const part of resolved.templateSpans) {\n const item = read(part.expression);\n if (item === undefined) return;\n value += item + part.literal.text;\n }\n return value;\n }\n if (\n ts.isBinaryExpression(resolved) &&\n resolved.operatorToken.kind === ts.SyntaxKind.PlusToken\n ) {\n const left = read(resolved.left),\n right = read(resolved.right);\n if (left !== undefined && right !== undefined) return left + right;\n }\n } finally {\n active.delete(resolved);\n }\n };\n return read(root);\n};\n",
|
|
13
|
+
"import { runtimeSources } from \"./module-graph.ts\";\nimport ts from \"typescript\";\nimport { error, type Diagnostic } from \"@tsplc/compiler/ir\";\n\n/** Normalize static arrow bindings so all routine forms use the same PLC analysis. */\nexport const lowerConstFunctions = (program: ts.Program) => {\n const checker = program.getTypeChecker();\n const printer = ts.createPrinter();\n const sources = new Map<string, string>();\n const diagnostics: Diagnostic[] = [];\n\n for (const source of runtimeSources(program)) {\n if (source.isDeclarationFile) continue;\n const edits: { start: number; end: number; text: string }[] = [];\n for (const statement of source.statements) {\n const routines = ts.isClassDeclaration(statement)\n ? statement.members.filter(ts.isMethodDeclaration)\n : [statement];\n for (const routine of routines) {\n if (\n (!ts.isFunctionDeclaration(routine) && !ts.isMethodDeclaration(routine)) ||\n routine.type ||\n !routine.body ||\n !routine.modifiers?.some((item) => item.kind === ts.SyntaxKind.AsyncKeyword)\n )\n continue;\n const signature = checker.getSignatureFromDeclaration(routine);\n const result =\n signature && checker.getAwaitedType(checker.getReturnTypeOfSignature(signature));\n if (result && result.flags & ts.TypeFlags.Void) {\n const position = routine.body.getStart(source);\n edits.push({ start: position, end: position, text: \":Promise<void> \" });\n }\n }\n }\n for (const statement of source.statements) {\n if (\n !ts.isVariableStatement(statement) ||\n !statement.declarationList.declarations.some(\n (declaration) => declaration.initializer && ts.isArrowFunction(declaration.initializer),\n )\n )\n continue;\n\n const declarations: ts.Statement[] = [];\n for (const declaration of statement.declarationList.declarations) {\n const arrow = declaration.initializer;\n if (!arrow || !ts.isArrowFunction(arrow)) {\n declarations.push(\n ts.factory.updateVariableStatement(\n statement,\n statement.modifiers,\n ts.factory.updateVariableDeclarationList(statement.declarationList, [declaration]),\n ),\n );\n continue;\n }\n if (\n !(statement.declarationList.flags & ts.NodeFlags.Const) ||\n !ts.isIdentifier(declaration.name)\n ) {\n const start = declaration.getStart(source);\n const position = source.getLineAndCharacterOfPosition(start);\n diagnostics.push(\n error(\n \"PLC1007\",\n \"PLC routines require named const bindings; mutable function values are unsupported.\",\n {\n file: source.fileName,\n start,\n end: declaration.end,\n line: position.line + 1,\n column: position.character + 1,\n },\n ),\n );\n continue;\n }\n\n const contextual =\n declaration.type && ts.isFunctionTypeNode(declaration.type)\n ? declaration.type\n : undefined;\n const signature = checker.getTypeAtLocation(declaration.name).getCallSignatures()[0];\n const returnsVoid =\n signature &&\n Boolean(checker.getReturnTypeOfSignature(signature).flags & ts.TypeFlags.Void);\n const inferredResult =\n signature && checker.getAwaitedType(checker.getReturnTypeOfSignature(signature));\n const asyncVoid =\n arrow.modifiers?.some((item) => item.kind === ts.SyntaxKind.AsyncKeyword) &&\n inferredResult &&\n inferredResult.flags & ts.TypeFlags.Void;\n const inferredType = asyncVoid\n ? ts.factory.createTypeReferenceNode(\"Promise\", [\n ts.factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword),\n ])\n : undefined;\n const result =\n arrow.type ??\n contextual?.type ??\n (returnsVoid\n ? ts.factory.createKeywordTypeNode(ts.SyntaxKind.VoidKeyword)\n : inferredType);\n const parameters = arrow.parameters.map((parameter, index) =>\n ts.factory.updateParameterDeclaration(\n parameter,\n parameter.modifiers,\n parameter.dotDotDotToken,\n parameter.name,\n parameter.questionToken,\n parameter.type ?? contextual?.parameters[index]?.type,\n parameter.initializer,\n ),\n );\n const body = ts.isBlock(arrow.body)\n ? arrow.body\n : ts.factory.createBlock(\n [\n result?.kind === ts.SyntaxKind.VoidKeyword\n ? ts.factory.createExpressionStatement(arrow.body)\n : ts.factory.createReturnStatement(arrow.body),\n ],\n true,\n );\n declarations.push(\n ts.factory.createFunctionDeclaration(\n [...(statement.modifiers ?? []), ...(arrow.modifiers ?? [])],\n undefined,\n declaration.name,\n arrow.typeParameters ?? contextual?.typeParameters,\n parameters,\n result,\n body,\n ),\n );\n }\n edits.push({\n start: statement.getStart(source),\n end: statement.end,\n text: declarations\n .map((declaration) => printer.printNode(ts.EmitHint.Unspecified, declaration, source))\n .join(\"\\n\"),\n });\n }\n if (!edits.length) continue;\n let text = source.text;\n for (const edit of edits.reverse())\n text = text.slice(0, edit.start) + edit.text + text.slice(edit.end);\n sources.set(source.fileName, text);\n }\n return { sources, diagnostics };\n};\n",
|
|
14
|
+
"import ts from \"typescript\";\nimport { dirname, join, relative, resolve } from \"node:path\";\nimport { error, type Diagnostic } from \"@tsplc/compiler/ir\";\nimport { runtimeSources } from \"../module-graph.ts\";\nimport { captureGraph } from \"./graph.ts\";\nimport { Model, type Root } from \"./model.ts\";\nimport { setterName, Specializer, SpecializeError } from \"./specialize.ts\";\n\n/** Directory of the modules elaboration generates, beside the entry module. */\nconst generatedDirectory = \".tsplc\";\n\n/**\n * A module the compiled program keeps as written: only types, enums, constants and the service\n * client. Everything else is plain TypeScript that elaboration compiles from its setup graph.\n */\nconst keptModule = (source: ts.SourceFile, sdk: string): boolean =>\n source.statements.every((statement) => {\n if (\n ts.isImportDeclaration(statement) ||\n ts.isExportDeclaration(statement) ||\n ts.isInterfaceDeclaration(statement) ||\n ts.isTypeAliasDeclaration(statement) ||\n ts.isEnumDeclaration(statement)\n )\n return true;\n if (!ts.isVariableStatement(statement)) return false;\n return statement.declarationList.declarations.every(\n (declaration) => declaration.initializer && constantInitializer(declaration.initializer, sdk),\n );\n });\n\nconst constantInitializer = (node: ts.Expression, sdk: string): boolean => {\n if (\n ts.isNumericLiteral(node) ||\n ts.isStringLiteral(node) ||\n ts.isNoSubstitutionTemplateLiteral(node) ||\n ts.isBigIntLiteral(node) ||\n node.kind === ts.SyntaxKind.TrueKeyword ||\n node.kind === ts.SyntaxKind.FalseKeyword\n )\n return true;\n if (ts.isPrefixUnaryExpression(node)) return constantInitializer(node.operand, sdk);\n if (\n ts.isAsExpression(node) ||\n ts.isSatisfiesExpression(node) ||\n ts.isParenthesizedExpression(node)\n )\n return constantInitializer(node.expression, sdk);\n if (ts.isPropertyAccessExpression(node)) return ts.isIdentifier(node.expression);\n if (ts.isIdentifier(node)) return true;\n if (ts.isObjectLiteralExpression(node))\n return node.properties.every(\n (property) =>\n (ts.isPropertyAssignment(property) && constantInitializer(property.initializer, sdk)) ||\n ts.isShorthandPropertyAssignment(property),\n );\n if (ts.isArrayLiteralExpression(node))\n return node.elements.every((element) => constantInitializer(element, sdk));\n if (ts.isCallExpression(node))\n return ts.isIdentifier(node.expression) && node.expression.text === \"createServiceClient\";\n return false;\n};\n\n/** Whether the program is plain TypeScript: classes with constructors, or setup code building state. */\nconst needsElaboration = (sources: readonly ts.SourceFile[], sdk: string): boolean =>\n sources.some(\n (source) =>\n !source.isDeclarationFile &&\n !source.fileName.startsWith(`${dirname(sdk)}/`) &&\n !keptModule(source, sdk) &&\n source.statements.some(\n (statement) =>\n ts.isClassDeclaration(statement) &&\n !statement.heritageClauses?.some((clause) =>\n clause.types.some((type) => type.expression.getText().startsWith(\"FunctionBlock\")),\n ),\n ),\n );\n\nconst importPath = (from: string, to: string): string => {\n const path = relative(dirname(from), to)\n .replace(/\\\\/g, \"/\")\n .replace(/\\.tsx?$/, \"\");\n return path.startsWith(\"./\") || path.startsWith(\"../\") ? path : `./${path}`;\n};\n\n/**\n * Compiles a plain TypeScript program: runs its setup, then specializes its scan code against\n * the objects setup built. The result is tsPLC dialect source the rest of the compiler reads.\n */\nexport const lowerElaboration = (\n program: ts.Program,\n sdk: string,\n entries: Readonly<Record<string, { module: string; export: string }>>,\n root: string,\n): { sources: Map<string, string>; diagnostics: Diagnostic[] } => {\n const sources = new Map<string, string>();\n const diagnostics: Diagnostic[] = [];\n const runtime = runtimeSources(program).filter(\n (source) => !source.isDeclarationFile && !source.fileName.startsWith(`${dirname(sdk)}/`),\n );\n if (!needsElaboration(runtime, sdk)) return { sources, diagnostics };\n const programEntries = Object.values(entries);\n if (programEntries.length !== 1)\n return {\n sources,\n diagnostics: [error(\"PLC1001\", \"A plain TypeScript program has one entry function.\")],\n };\n const [entry] = programEntries as [{ module: string; export: string }];\n const entryFile = resolve(root, entry.module).replace(/\\\\/g, \"/\");\n const entrySource = program.getSourceFile(entryFile);\n if (!entrySource)\n return {\n sources,\n diagnostics: [error(\"PLC1001\", `${entry.module} is not part of the program.`)],\n };\n const checker = program.getTypeChecker();\n const kept = new Set(\n runtime.filter((source) => keptModule(source, sdk)).map((source) => source.fileName),\n );\n const isKept = (file: string) => kept.has(file);\n const directory = join(dirname(entryFile), generatedDirectory).replace(/\\\\/g, \"/\");\n const rootModule = (item: Root) => `${directory}/${item.name}.ts`;\n\n try {\n const graph = captureGraph(entryFile, runtime);\n const model = new Model(graph, checker, program, entryFile);\n const specializer = new Specializer(model, checker, runtime, isKept, rootModule);\n const main = findEntry(entrySource, entry.export);\n const body = specializer.entry(main);\n\n // Exported data the hardware, HMI and server address is stored whether or not code reads it.\n for (const item of model.roots)\n if (item.exported && !isKept(item.file) && item.file === entryFile) specializer.use(item);\n\n const typesFile = `${directory}/types.ts`;\n const storage = new Map<string, string[]>();\n for (const item of specializer.roots) {\n const value = model.rootValues.get(item)!;\n const node = model.node(value)!;\n const lines: string[] = [];\n // Other modules can't assign an imported binding, so each global comes with a setter.\n const global = (name: string, layout: string, initial: string) =>\n lines.push(\n `export let ${name}: ${layout} = ${initial};`,\n `export function ${setterName(name)}(value: ${layout}): void { ${name} = value; }`,\n );\n if (specializer.flattened(item)) {\n const captured = node.captured;\n if (captured.kind === \"instance\") {\n for (const [name, layout] of specializer.instanceFields(node))\n global(name, layout, specializer.instanceFieldInitializer(node, name, layout));\n } else if (captured.kind === \"object\") {\n for (const [name, field] of Object.entries(captured.fields)) {\n const inner = model.node(field);\n const declared = node.type && model.fieldType(node.type, name, captured);\n if (!declared) continue;\n const stored = item.exported || specializer.stored(node, name);\n if (!stored && !inner) continue;\n const layout =\n inner && !item.exported\n ? specializer.storageType(inner)\n : specializer.layouts.declaredText(\n node.type?.getProperty(name)?.valueDeclaration,\n declared,\n field,\n name.charAt(0).toUpperCase() + name.slice(1),\n );\n if (!layout) continue;\n global(name, layout, specializer.valueText(field, declared, layout));\n }\n }\n } else {\n const declared = checker.getTypeAtLocation(item.declaration.name);\n const layout = specializer.layouts.declaredText(item.declaration, declared, value);\n global(item.name, layout, specializer.valueText(value, declared, layout));\n }\n storage.set(rootModule(item), lines);\n }\n\n const typeImports = (file: string) => [\n ...[...specializer.layouts.imports].map(\n ([module, names]) =>\n `import { ${[...names].join(\", \")} } from \"${importPath(file, module)}\";`,\n ),\n ...[...specializer.layouts.typeImports].map(\n ([module, names]) =>\n `import type { ${[...names].join(\", \")} } from \"${importPath(file, module)}\";`,\n ),\n ];\n const enums = specializer.layouts.enumNames;\n const interfaces = [...specializer.layouts.declarations.keys()].filter(\n (name) => !enums.includes(name),\n );\n const importTypes = (file: string) => [\n ...(enums.length\n ? [`import { ${enums.join(\", \")} } from \"${importPath(file, typesFile)}\";`]\n : []),\n ...(interfaces.length\n ? [`import type { ${interfaces.join(\", \")} } from \"${importPath(file, typesFile)}\";`]\n : []),\n ];\n sources.set(\n typesFile,\n [...typeImports(typesFile), ...specializer.layouts.declarations.values()].join(\"\\n\"),\n );\n for (const [file, lines] of storage)\n sources.set(file, [...typeImports(file), ...importTypes(file), ...lines].join(\"\\n\"));\n\n const header = [\n ...typeImports(entryFile),\n ...importTypes(entryFile),\n ...[...specializer.namespaces].map(\n ([name, file]) => `import * as ${name} from \"${importPath(entryFile, file)}\";`,\n ),\n ...[...specializer.imports].map(\n ([file, names]) =>\n `import { ${[...names].join(\", \")} } from \"${importPath(entryFile, file)}\";`,\n ),\n ...(specializer.sdkImports.size\n ? [`import { ${[...specializer.sdkImports].join(\", \")} } from \"@tsplc/compiler/clock\";`]\n : []),\n ...(specializer.typeImports.size\n ? [`import { ${[...specializer.typeImports].join(\", \")} } from \"@tsplc/compiler/types\";`]\n : []),\n ];\n sources.set(\n entryFile,\n [\n ...header,\n ...specializer.tableDeclarations,\n ...specializer.routines,\n `export function ${entry.export}(): void {`,\n ...body,\n \"}\",\n ].join(\"\\n\"),\n );\n // The plain modules now live in the generated code; keep only their types for type importers.\n for (const source of runtime)\n if (source.fileName !== entryFile && !isKept(source.fileName))\n sources.set(\n source.fileName,\n [\n ...source.statements\n .filter(\n (statement) =>\n ts.isInterfaceDeclaration(statement) ||\n ts.isTypeAliasDeclaration(statement) ||\n (ts.isImportDeclaration(statement) && statement.importClause?.isTypeOnly),\n )\n .map((statement) => statement.getText()),\n \"export {};\",\n ].join(\"\\n\"),\n );\n } catch (cause) {\n if (cause instanceof SpecializeError) {\n const start = cause.node.getStart();\n const source = cause.node.getSourceFile();\n const position = source.getLineAndCharacterOfPosition(start);\n diagnostics.push(\n error(\"PLC1010\", cause.message, {\n file: source.fileName,\n start,\n end: cause.node.getEnd(),\n line: position.line + 1,\n column: position.character + 1,\n }),\n );\n } else\n diagnostics.push(\n error(\n \"PLC1010\",\n cause instanceof Error\n ? process.env.TSPLC_DEBUG\n ? String(cause.stack)\n : cause.message\n : String(cause),\n ),\n );\n }\n return { sources, diagnostics };\n};\n\nconst findEntry = (\n source: ts.SourceFile,\n name: string,\n): ts.FunctionDeclaration | ts.ArrowFunction => {\n for (const statement of source.statements) {\n if (ts.isFunctionDeclaration(statement) && statement.name?.text === name && statement.body)\n return statement;\n if (ts.isVariableStatement(statement))\n for (const declaration of statement.declarationList.declarations)\n if (\n ts.isIdentifier(declaration.name) &&\n declaration.name.text === name &&\n declaration.initializer &&\n ts.isArrowFunction(declaration.initializer)\n )\n return declaration.initializer;\n }\n throw new Error(`${source.fileName} exports no function ${name}.`);\n};\n",
|
|
15
|
+
"import ts from \"typescript\";\nimport { spawnSync } from \"node:child_process\";\nimport { existsSync, mkdtempSync, rmSync, writeFileSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n/** What capture.ts needs: the program's runtime files and the bindings each declares. */\nexport interface CaptureRequest {\n entry: string;\n files: string[];\n bindings: Record<string, { values: string[]; classes: string[]; functions: string[] }>;\n}\n\nexport type CapturedValue =\n | { kind: \"undefined\" }\n | { kind: \"number\"; value: number }\n | { kind: \"boolean\"; value: boolean }\n | { kind: \"string\"; value: string }\n | { kind: \"bigint\"; value: string }\n | { kind: \"node\"; id: number };\n\nexport type CapturedNode =\n | { kind: \"object\"; fields: Record<string, CapturedValue> }\n | { kind: \"instance\"; file: string; name: string; fields: Record<string, CapturedValue> }\n | { kind: \"array\"; items: CapturedValue[] }\n | { kind: \"function\"; file: string; name: string }\n | { kind: \"service\"; path: string };\n\nexport interface CapturedGraph {\n nodes: CapturedNode[];\n /** Every module-level value binding, in module evaluation order. */\n bindings: { file: string; name: string; value: CapturedValue }[];\n}\n\nconst names = (source: ts.SourceFile) => {\n const found: CaptureRequest[\"bindings\"][string] = { values: [], classes: [], functions: [] };\n const bind = (name: ts.BindingName): void => {\n if (ts.isIdentifier(name)) found.values.push(name.text);\n else\n for (const element of name.elements) if (!ts.isOmittedExpression(element)) bind(element.name);\n };\n for (const statement of source.statements) {\n if (ts.isVariableStatement(statement))\n for (const declaration of statement.declarationList.declarations) bind(declaration.name);\n else if (ts.isClassDeclaration(statement) && statement.name)\n found.classes.push(statement.name.text);\n else if (ts.isFunctionDeclaration(statement) && statement.name && statement.body)\n found.functions.push(statement.name.text);\n }\n // Arrow functions bound to consts are functions too: a stored callback names its binding.\n for (const statement of source.statements)\n if (ts.isVariableStatement(statement))\n for (const declaration of statement.declarationList.declarations)\n if (\n ts.isIdentifier(declaration.name) &&\n declaration.initializer &&\n (ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer))\n ) {\n found.values = found.values.filter((name) => name !== declaration.name.getText());\n found.functions.push(declaration.name.text);\n }\n return found;\n};\n\n/** Runs the program's setup in a Bun subprocess and returns the object graph it built. */\nexport const captureGraph = (entry: string, sources: readonly ts.SourceFile[]): CapturedGraph => {\n const files = sources.filter((source) => !source.isDeclarationFile);\n const request: CaptureRequest = {\n entry,\n files: files.map((source) => source.fileName),\n bindings: Object.fromEntries(files.map((source) => [source.fileName, names(source)])),\n };\n const directory = mkdtempSync(join(tmpdir(), \"tsplc-capture-\"));\n try {\n const file = join(directory, \"request.json\");\n writeFileSync(file, JSON.stringify(request));\n // The source tree runs capture.ts; a built package ships it beside the bundle.\n const script = [\"./capture.ts\", \"./elaborate-capture.js\"]\n .map((path) => fileURLToPath(new URL(path, import.meta.url)))\n .find((path) => existsSync(path));\n if (!script) throw new Error(\"The elaboration capture script is missing from this build.\");\n const result = spawnSync(process.execPath, [script, file], {\n encoding: \"utf8\",\n maxBuffer: 256 * 1024 * 1024,\n });\n if (result.status !== 0)\n throw new Error(`Running the program's setup failed:\\n${result.stderr.trim()}`);\n return JSON.parse(result.stdout) as CapturedGraph;\n } finally {\n rmSync(directory, { recursive: true, force: true });\n }\n};\n",
|
|
16
|
+
"import ts from \"typescript\";\nimport type { CapturedGraph, CapturedNode, CapturedValue } from \"./graph.ts\";\n\n/** One step from an owner to the object it holds. */\nexport type Step = { kind: \"field\"; name: string } | { kind: \"index\"; index: number };\n\n/** Where a captured object is stored: a root binding and the steps to it. */\nexport interface Owner {\n root: Root;\n steps: readonly Step[];\n}\n\nexport interface Root {\n file: string;\n name: string;\n declaration: ts.VariableDeclaration;\n exported: boolean;\n}\n\nexport interface ModelNode {\n id: number;\n captured: CapturedNode;\n /** The declared type where the object is stored; undefined for functions and services. */\n type?: ts.Type;\n /** The first place setup reached it. Every other place holding it refers to this one. */\n owner?: Owner;\n}\n\n/** The captured setup graph with each object's owner and declared type. */\nexport class Model {\n readonly nodes: ModelNode[];\n readonly roots: Root[] = [];\n readonly rootValues = new Map<Root, CapturedValue>();\n\n constructor(\n readonly graph: CapturedGraph,\n readonly checker: ts.TypeChecker,\n readonly program: ts.Program,\n entry: string,\n ) {\n this.nodes = graph.nodes.map((captured, id) => ({ id, captured }));\n // Dependencies own what they build before the entry module's instances refer to it.\n const ordered = [\n ...graph.bindings.filter((binding) => binding.file !== entry),\n ...graph.bindings.filter((binding) => binding.file === entry),\n ];\n for (const binding of ordered) {\n const declaration = this.binding(binding.file, binding.name);\n const root: Root = {\n file: binding.file,\n name: binding.name,\n declaration,\n exported: Boolean(ts.getCombinedModifierFlags(declaration) & ts.ModifierFlags.Export),\n };\n this.roots.push(root);\n this.rootValues.set(root, binding.value);\n this.own(binding.value, { root, steps: [] }, checker.getTypeAtLocation(declaration.name));\n }\n }\n\n node(value: CapturedValue): ModelNode | undefined {\n return value.kind === \"node\" ? this.nodes[value.id] : undefined;\n }\n\n private binding(file: string, name: string): ts.VariableDeclaration {\n const source = this.program.getSourceFile(file);\n for (const statement of source?.statements ?? [])\n if (ts.isVariableStatement(statement))\n for (const declaration of statement.declarationList.declarations)\n if (ts.isIdentifier(declaration.name) && declaration.name.text === name)\n return declaration;\n throw new Error(`${file}: no module binding ${name}.`);\n }\n\n /** The class a captured instance belongs to. */\n classOf(node: ModelNode): ts.ClassDeclaration {\n const captured = node.captured;\n if (captured.kind !== \"instance\") throw new Error(\"Not a class instance.\");\n const source = this.program.getSourceFile(captured.file);\n const found = source?.statements.find(\n (statement): statement is ts.ClassDeclaration =>\n ts.isClassDeclaration(statement) && statement.name?.text === captured.name,\n );\n if (!found) throw new Error(`${captured.file}: no class ${captured.name}.`);\n return found;\n }\n\n /** A class field's declaration: a property, or a constructor parameter property. */\n member(\n declaration: ts.ClassDeclaration,\n name: string,\n ): ts.PropertyDeclaration | ts.ParameterDeclaration | undefined {\n for (const member of declaration.members) {\n if (ts.isPropertyDeclaration(member) && member.name.getText() === name) return member;\n if (ts.isConstructorDeclaration(member))\n for (const parameter of member.parameters)\n if (\n ts.isParameterPropertyDeclaration(parameter, member) &&\n parameter.name.getText() === name\n )\n return parameter;\n }\n return undefined;\n }\n\n /** The declared type of a field of `type` holding `value`, choosing the union member it matches. */\n fieldType(type: ts.Type, name: string, holder: CapturedNode): ts.Type | undefined {\n const variant = this.variant(type, holder);\n const property = variant.getProperty(name) ?? this.checker.getPropertyOfType(variant, name);\n return property && this.checker.getTypeOfSymbol(property);\n }\n\n /** The member of a union of object types that a captured object is, by its literal fields. */\n variant(type: ts.Type, value: CapturedNode): ts.Type {\n const candidates = (type.isUnion() ? type.types : [type]).filter(\n (member) => !(member.flags & ts.TypeFlags.Undefined),\n );\n if (candidates.length === 1 || value.kind !== \"object\") return candidates[0] ?? type;\n return (\n candidates.find((candidate) =>\n Object.entries(value.fields).every(([name, field]) => {\n const property = candidate.getProperty(name);\n if (!property) return false;\n const fieldType = this.checker.getTypeOfSymbol(property);\n return (\n !fieldType.isLiteral() || field.kind !== \"string\" || fieldType.value === field.value\n );\n }),\n ) ?? candidates[0]!\n );\n }\n\n elementType(type: ts.Type): ts.Type | undefined {\n const target = this.checker.getNonNullableType(type);\n return (\n this.checker.getIndexTypeOfType(target, ts.IndexKind.Number) ??\n (this.checker.isTupleType(target)\n ? this.checker.getTypeArguments(target as ts.TypeReference)[0]\n : undefined)\n );\n }\n\n private own(value: CapturedValue, owner: Owner, type: ts.Type | undefined): void {\n const node = this.node(value);\n if (!node || node.owner) return;\n node.owner = owner;\n node.type = type;\n const captured = node.captured;\n if (captured.kind === \"array\") {\n const element = type && this.elementType(type);\n captured.items.forEach((item, index) =>\n this.own(\n item,\n { root: owner.root, steps: [...owner.steps, { kind: \"index\", index }] },\n element,\n ),\n );\n } else if (captured.kind === \"object\") {\n for (const [name, field] of Object.entries(captured.fields))\n this.own(\n field,\n { root: owner.root, steps: [...owner.steps, { kind: \"field\", name }] },\n type && this.fieldType(type, name, captured),\n );\n } else if (captured.kind === \"instance\") {\n const declaration = this.classOf(node);\n for (const [name, field] of Object.entries(captured.fields)) {\n const member = this.member(declaration, name);\n this.own(\n field,\n { root: owner.root, steps: [...owner.steps, { kind: \"field\", name }] },\n member && this.checker.getTypeAtLocation(member.name),\n );\n }\n }\n }\n}\n",
|
|
17
|
+
"import ts from \"typescript\";\nimport { Layouts, type LiteralEnum } from \"./layouts.ts\";\nimport type { CapturedValue } from \"./graph.ts\";\nimport type { Model, ModelNode, Root, Step } from \"./model.ts\";\n\ntype FunctionLike =\n | ts.FunctionDeclaration\n | ts.MethodDeclaration\n | ts.ArrowFunction\n | ts.FunctionExpression\n | ts.GetAccessorDeclaration;\n\n/** What an expression is while specializing: known now, or code the PLC runs. */\nexport type Value =\n /** An object setup built: a class instance, record, array, function or service. */\n | { kind: \"static\"; node: ModelNode }\n /** A literal or folded primitive. `undefined` is a value too. */\n | { kind: \"const\"; value: number | boolean | string | undefined | bigint }\n /** An array or record built in scan code from known parts, used before it needs storage. */\n | { kind: \"virtual\"; items?: Value[]; fields?: Map<string, Value> }\n /** A function value: a module function, method of a known instance, or a local arrow. */\n | { kind: \"function\"; declaration: FunctionLike; self?: ModelNode; env?: Env }\n /** Code the PLC runs. `declared` is the storage's declared type, before narrowing. */\n | {\n kind: \"code\";\n text: string;\n declared?: ts.Type;\n place?: boolean;\n iec?: string;\n /** A module global another module stores into through its setter; an import is read-only. */\n setter?: string;\n };\n\ntype Env = Map<ts.Symbol, Value>;\n\nconst constant = (value: number | boolean | string | undefined | bigint): Value => ({\n kind: \"const\",\n value,\n});\n\nexport class SpecializeError extends Error {\n constructor(\n readonly node: ts.Node,\n message: string,\n ) {\n super(message);\n }\n}\n\n/** Indented lines of one generated routine, with the local names it has used. */\nclass Emitter {\n readonly lines: string[] = [];\n private depth = 1;\n private readonly used = new Set<string>();\n private temporaries = 0;\n\n line(text: string): void {\n this.lines.push(`${\" \".repeat(this.depth)}${text}`);\n }\n open(text: string): void {\n this.line(text);\n this.depth++;\n }\n close(text = \"}\"): void {\n this.depth--;\n this.line(text);\n }\n local(name: string): string {\n let candidate = name;\n for (let index = 2; this.used.has(candidate); index++) candidate = `${name}_${index}`;\n this.used.add(candidate);\n return candidate;\n }\n temporary(): string {\n return this.local(`tsplcTemp${++this.temporaries}`);\n }\n}\n\ninterface Frame {\n emitter: Emitter;\n env: Env;\n self?: ModelNode;\n /** The routine's declared return type, for literal and optional results. */\n returns?: ts.Type;\n async: boolean;\n}\n\n/**\n * Evaluates the program's scan code against the setup graph. Everything setup decided (which\n * instance `this` is, what a field refers to, array lengths, config never written in scan code)\n * resolves at compile time; what is left becomes tsPLC dialect code over the stored state.\n */\nexport class Specializer {\n readonly layouts: Layouts;\n readonly routines: string[] = [];\n /** Modules generated code reads through a namespace import, by import name. */\n readonly namespaces = new Map<string, string>();\n /** Value imports from kept modules, by file. */\n readonly imports = new Map<string, Set<string>>();\n private readonly specialized = new Map<string, string>();\n private readonly routineNames = new Set<string>();\n private readonly assigned = new Set<ts.Symbol>();\n private readonly storedRoots = new Set<Root>();\n\n constructor(\n readonly model: Model,\n readonly checker: ts.TypeChecker,\n readonly sources: readonly ts.SourceFile[],\n readonly kept: (file: string) => boolean,\n readonly rootModule: (root: Root) => string,\n ) {\n this.layouts = new Layouts(\n model,\n checker,\n kept,\n sources.filter((source) => kept(source.fileName)),\n );\n for (const source of sources) this.collectAssignments(source);\n }\n\n // ---- Which fields scan code writes ----\n\n /** Fields scan code writes are state; the rest keep what setup gave them. */\n private collectAssignments(node: ts.Node, inConstructor = false): void {\n if (ts.isConstructorDeclaration(node)) inConstructor = true;\n if (!inConstructor) {\n const write = (target: ts.Expression): void => {\n while (ts.isParenthesizedExpression(target) || ts.isNonNullExpression(target))\n target = target.expression;\n if (ts.isPropertyAccessExpression(target)) this.markAssigned(target.name);\n else if (ts.isElementAccessExpression(target)) {\n let base: ts.Expression = target.expression;\n while (ts.isElementAccessExpression(base)) base = base.expression;\n if (ts.isPropertyAccessExpression(base)) this.markAssigned(base.name);\n }\n };\n if (ts.isBinaryExpression(node) && isAssignment(node.operatorToken.kind)) write(node.left);\n if (\n (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) &&\n (node.operator === ts.SyntaxKind.PlusPlusToken ||\n node.operator === ts.SyntaxKind.MinusMinusToken)\n )\n write(node.operand);\n }\n ts.forEachChild(node, (child) => this.collectAssignments(child, inConstructor));\n }\n\n private markAssigned(name: ts.MemberName): void {\n const symbol = this.checker.getSymbolAtLocation(name);\n if (!symbol) return;\n this.assigned.add(symbol);\n // A property of a union is a synthetic symbol over each member's own property.\n for (const declaration of symbol.declarations ?? []) {\n const own = (declaration as { symbol?: ts.Symbol }).symbol;\n if (own) this.assigned.add(own);\n }\n }\n\n /** The declaration symbol of a captured field, to ask whether scan code writes it. */\n private fieldSymbol(holder: ModelNode, name: string): ts.Symbol | undefined {\n if (holder.captured.kind === \"instance\") {\n const member = this.model.member(this.model.classOf(holder), name);\n return member && this.checker.getSymbolAtLocation(member.name);\n }\n if (!holder.type) return undefined;\n const variant = this.model.variant(holder.type, holder.captured);\n return variant.getProperty(name) ?? this.checker.getPropertyOfType(variant, name);\n }\n\n /** Whether a field holds state the PLC stores, rather than a value fixed at setup. */\n stored(holder: ModelNode, name: string): boolean {\n if (holder.owner?.root.exported) return true;\n return this.written(holder, name);\n }\n\n /** Whether scan code assigns the field itself. */\n private written(holder: ModelNode, name: string): boolean {\n const symbol = this.fieldSymbol(holder, name);\n if (!symbol) return false;\n if (this.assigned.has(symbol)) return true;\n // A union's property is written through any member's declaration of it.\n return (symbol.declarations ?? []).some((declaration) => {\n const own = (declaration as { symbol?: ts.Symbol }).symbol;\n return own !== undefined && this.assigned.has(own);\n });\n }\n\n /** Array elements are stored when the field holding the array is, or its root is exported. */\n private storedArray(array: ModelNode): boolean {\n const owner = array.owner;\n if (!owner) return false;\n if (owner.root.exported) return true;\n const last = owner.steps.at(-1);\n if (!last) return false;\n const holder = this.at(owner.root, owner.steps.slice(0, -1));\n return last.kind === \"field\" && holder !== undefined && this.stored(holder, last.name);\n }\n\n /** The node at a path from a root, following captured values. */\n private at(root: Root, steps: readonly Step[]): ModelNode | undefined {\n let value: CapturedValue | undefined = this.model.rootValues.get(root);\n for (const step of steps) {\n const node = value && this.model.node(value);\n if (!node) return undefined;\n const captured = node.captured;\n value =\n step.kind === \"index\"\n ? captured.kind === \"array\"\n ? captured.items[step.index]\n : undefined\n : captured.kind === \"object\" || captured.kind === \"instance\"\n ? captured.fields[step.name]\n : undefined;\n }\n return value && this.model.node(value);\n }\n\n // ---- Storage ----\n\n /** Dialect text for a stored node's place. */\n pathText(node: ModelNode): string {\n const owner = node.owner;\n if (!owner) throw new Error(\"An object with no owner has no storage.\");\n this.storedRoots.add(owner.root);\n const namespace = this.namespace(owner.root);\n let text = this.flattened(owner.root) ? namespace : `${namespace}.${owner.root.name}`;\n owner.steps.forEach((step, index) => {\n const holder = this.at(owner.root, owner.steps.slice(0, index));\n if (step.kind === \"index\") text += `[${step.index}]`;\n else if (/^\\d+$/.test(step.name) && holder?.type)\n text += `[${this.keyText(holder.type, step.name)}]`;\n else text += `.${step.name}`;\n });\n return text;\n }\n\n /** The enum member naming a key of a `Record<Enum, T>`. */\n private keyText(type: ts.Type, key: string): string {\n const keyType = type.aliasSymbol?.name === \"Record\" ? type.aliasTypeArguments?.[0] : undefined;\n const member = keyType && this.enumMemberName(keyType, Number(key));\n return member ? `${this.layouts.text(keyType!)}.${member}` : key;\n }\n\n /** A record or instance root becomes its own global list, one global per field. */\n flattened(root: Root): boolean {\n const node = this.model.node(this.model.rootValues.get(root)!);\n return node?.captured.kind === \"object\" || node?.captured.kind === \"instance\";\n }\n\n private namespace(root: Root): string {\n const name = pascal(root.name);\n this.namespaces.set(name, this.rootModule(root));\n return name;\n }\n\n /** Stores a root whether or not scan code reads it, as exported data must be. */\n use(root: Root): void {\n this.storedRoots.add(root);\n this.namespace(root);\n }\n\n /** Roots generated code reached, which need storage declarations. */\n get roots(): ReadonlySet<Root> {\n return this.storedRoots;\n }\n\n /** Whether anything inside a node is state the PLC stores. */\n private hasState(node: ModelNode): boolean {\n const captured = node.captured;\n if (node.owner?.root.exported) return true;\n if (captured.kind === \"instance\") return this.instanceFields(node).length > 0;\n if (captured.kind === \"array\")\n return (\n this.storedArray(node) ||\n captured.items.some((item) => {\n const inner = this.model.node(item);\n return inner !== undefined && isChild(inner, node) && this.hasState(inner);\n })\n );\n if (captured.kind === \"object\")\n return Object.entries(captured.fields).some(([name, value]) => {\n if (this.stored(node, name)) return true;\n const inner = this.model.node(value);\n return inner !== undefined && isChild(inner, node, name) && this.hasState(inner);\n });\n return false;\n }\n\n /**\n * The stored layout of a node, or undefined when nothing in it is stored. Records and arrays\n * keep their declared type; an instance stores a record of the fields that hold its state.\n */\n storageType(node: ModelNode): string | undefined {\n const captured = node.captured;\n if (!this.hasState(node)) return undefined;\n if (captured.kind === \"instance\") {\n const fields = this.instanceFields(node);\n return this.layoutName(\n `${captured.name}State`,\n fields.map(([field, text]) => `${field}: ${text};`).join(\" \"),\n );\n }\n if (captured.kind === \"array\") {\n const first = captured.items[0] && this.model.node(captured.items[0]);\n if (first?.captured.kind === \"instance\") {\n const states = captured.items.map((item) => this.storageType(this.model.node(item)!));\n if (new Set(states).size !== 1)\n throw new Error(\"Instances in one array must hold the same kinds of state.\");\n return `FixedArray<${states[0]}, ${captured.items.length}>`;\n }\n }\n if (!node.type) throw new Error(\"Stored state needs a declared type.\");\n return this.layouts.text(node.type, { kind: \"node\", id: node.id });\n }\n\n /** Records stored as a whole: anything in them is state. */\n private storedWhole(node: ModelNode): boolean {\n return node.captured.kind !== \"instance\" && this.hasState(node);\n }\n\n /** An instance's stored fields: what scan code writes, and owned objects holding state. */\n instanceFields(node: ModelNode): [string, string][] {\n const captured = node.captured;\n if (captured.kind !== \"instance\") return [];\n const declaration = this.model.classOf(node);\n return this.fieldNames(declaration).flatMap((name): [string, string][] => {\n const value = captured.fields[name] ?? { kind: \"undefined\" };\n const inner = this.model.node(value);\n const member = this.model.member(declaration, name);\n const type = member && this.checker.getTypeAtLocation(member.name);\n if (inner) {\n if (inner.captured.kind === \"function\" || inner.captured.kind === \"service\") return [];\n if (!isChild(inner, node, name)) {\n if (!this.stored(node, name)) return [];\n // A stored field holds its own copy of the record setup gave it.\n return type ? [[name, this.layouts.text(type, value)]] : [];\n }\n if (inner.captured.kind !== \"instance\" && this.stored(node, name) && type)\n return [[name, this.layouts.text(type, value)]];\n const text = this.storageType(inner);\n return text ? [[name, text]] : [];\n }\n if (!this.stored(node, name)) return [];\n if (!type) throw new Error(`${captured.name}.${name} has no declared type.`);\n return [[name, this.layouts.declaredText(member, type, value)]];\n });\n }\n\n /** A class's fields in declaration order: properties and constructor parameter properties. */\n private fieldNames(declaration: ts.ClassDeclaration): string[] {\n const names: string[] = [];\n for (const member of declaration.members) {\n if (ts.isPropertyDeclaration(member)) names.push(member.name.getText());\n if (ts.isConstructorDeclaration(member))\n for (const parameter of member.parameters)\n if (ts.isParameterPropertyDeclaration(parameter, member))\n names.push(parameter.name.getText());\n }\n return names;\n }\n\n private readonly layoutNames = new Map<string, string>();\n private layoutName(base: string, body: string): string {\n const known = this.layoutNames.get(body);\n if (known) return known;\n let name = base;\n for (\n let index = 2;\n [...this.layoutNames.values()].includes(name) || this.layouts.declarations.has(name);\n index++\n )\n name = `${base}_${index}`;\n this.layoutNames.set(body, name);\n this.layouts.declarations.set(name, `export interface ${name} { ${body} }`);\n return name;\n }\n\n private fieldInitializer(\n holder: ModelNode,\n name: string,\n value: CapturedValue,\n type: string,\n ): string {\n const declaredType =\n holder.captured.kind === \"instance\"\n ? (() => {\n const member = this.model.member(this.model.classOf(holder), name);\n return member && this.checker.getTypeAtLocation(member.name);\n })()\n : holder.type && this.model.fieldType(holder.type, name, holder.captured);\n if (!declaredType) throw new Error(`${name} has no declared type.`);\n return this.valueText(value, declaredType, type);\n }\n\n /** A captured value as dialect text of its declared type. */\n valueText(value: CapturedValue, declared: ts.Type, layout?: string): string {\n const node = this.model.node(value);\n const literal = this.layouts.literalEnum(declared);\n if (literal)\n return this.layouts.member(literal, value.kind === \"string\" ? value.value : undefined);\n const optional = this.isOptionalRecord(declared);\n if (optional) {\n const inner = this.checker.getNonNullableType(declared);\n const name = layout ?? this.layouts.text(declared, value);\n return value.kind === \"undefined\"\n ? `defaultValue<${name}>()`\n : `{ has: true, value: ${this.valueText(value, inner)} }`;\n }\n if (this.layouts.enumDeclaration(declared) && value.kind === \"number\") {\n const enumName = this.layouts.text(declared);\n const member = this.enumMemberName(declared, value.value);\n return member ? `${enumName}.${member}` : String(value.value);\n }\n if (!node) return this.literal(value);\n if (node.captured.kind === \"array\") {\n const element = this.model.elementType(declared);\n const items = node.captured.items;\n if (!items.length) return `defaultValue<${layout ?? this.layouts.text(declared, value)}>()`;\n return `[${items.map((item) => (element ? this.valueText(item, element) : this.literal(item))).join(\", \")}]`;\n }\n if (node.captured.kind === \"object\") return this.recordInitializer(node, declared);\n if (node.captured.kind === \"instance\") {\n const text = this.storageType(node);\n return text ? this.instanceInitializer(node) : \"{}\";\n }\n throw new Error(\"A function has no stored value.\");\n }\n\n instanceInitializer(node: ModelNode): string {\n return `{ ${this.instanceFields(node)\n .map(([name, layout]) => `${name}: ${this.instanceFieldInitializer(node, name, layout)}`)\n .join(\", \")} }`;\n }\n\n /** The initial value of one of an instance's stored fields. */\n instanceFieldInitializer(node: ModelNode, name: string, layout: string): string {\n const captured = node.captured;\n if (captured.kind !== \"instance\") throw new Error(\"Not an instance.\");\n const value = captured.fields[name] ?? { kind: \"undefined\" as const };\n const inner = this.model.node(value);\n if (inner?.captured.kind === \"instance\") return this.instanceInitializer(inner);\n if (\n inner?.captured.kind === \"array\" &&\n inner.captured.items.some((item) => this.model.node(item)?.captured.kind === \"instance\")\n )\n return `[${inner.captured.items.map((item) => this.instanceInitializer(this.model.node(item)!)).join(\", \")}]`;\n return this.fieldInitializer(node, name, value, layout);\n }\n\n private recordInitializer(node: ModelNode, declared: ts.Type): string {\n const captured = node.captured;\n if (captured.kind !== \"object\") throw new Error(\"Not a record.\");\n const tagged = this.layouts.tagged(declared);\n const variant = this.model.variant(declared, captured);\n const enumRecord = declared.aliasSymbol?.name === \"Record\";\n const properties = tagged\n ? this.taggedFields(tagged)\n : this.checker\n .getPropertiesOfType(enumRecord ? declared : variant)\n .map((property) => property.name);\n const parts = properties.map((name) => {\n const field = captured.fields[name];\n const fieldType =\n tagged && name === tagged.tag\n ? undefined\n : this.model.fieldType(enumRecord ? declared : variant, name, captured);\n if (tagged && name === tagged.tag) {\n const tag = this.layouts.literalEnum(this.tagType(declared, tagged))!;\n return `${name}: ${this.layouts.member(tag, field?.kind === \"string\" ? field.value : undefined)}`;\n }\n const memberType = fieldType ?? this.taggedFieldType(declared, tagged!, name);\n if (!field) return `${name}: defaultValue<${this.layouts.text(memberType)}>()`;\n return `${enumRecord ? `[${name}]` : name}: ${this.valueText(field, memberType)}`;\n });\n if (enumRecord) {\n const [keyType, valueType] = declared.aliasTypeArguments as [ts.Type, ts.Type];\n const literal = this.layouts.literalEnum(keyType);\n const entries = properties.map((name, index) => {\n const key = literal\n ? this.layouts.member(literal, name)\n : `${this.layouts.text(keyType)}.${this.enumMemberName(keyType, Number(name))}`;\n return `[${key}]: ${parts[index]!.slice(parts[index]!.indexOf(\": \") + 2)}`;\n });\n // An enum that is also optional elsewhere has an Undefined member the table must cover.\n if (literal?.optional)\n entries.unshift(\n `[${this.layouts.member(literal, undefined)}]: ${this.defaultOf(valueType)}`,\n );\n return `{ ${entries.join(\", \")} }`;\n }\n return `{ ${parts.join(\", \")} }`;\n }\n\n private taggedFields(tagged: { tag: string; variants: ts.Type[] }): string[] {\n const names = [tagged.tag];\n for (const variant of tagged.variants)\n for (const property of variant.getProperties())\n if (!names.includes(property.name)) names.push(property.name);\n return names;\n }\n\n private taggedFieldType(\n declared: ts.Type,\n tagged: { tag: string; variants: ts.Type[] },\n name: string,\n ): ts.Type {\n for (const variant of tagged.variants) {\n const property = variant.getProperty(name);\n if (property) return this.checker.getTypeOfSymbol(property);\n }\n throw new Error(`${name} is in no variant of ${this.checker.typeToString(declared)}.`);\n }\n\n private tagType(declared: ts.Type, tagged: { tag: string; variants: ts.Type[] }): ts.Type {\n this.layouts.text(declared);\n const property = this.checker.getPropertyOfType(declared, tagged.tag);\n return property ? this.checker.getTypeOfSymbol(property) : declared;\n }\n\n private enumMemberName(type: ts.Type, value: number): string | undefined {\n return this.layouts\n .enumDeclaration(type)\n ?.members.find((member) => this.checker.getConstantValue(member) === value)\n ?.name.getText();\n }\n\n private literal(value: CapturedValue): string {\n switch (value.kind) {\n case \"number\":\n return String(value.value);\n case \"boolean\":\n return String(value.value);\n case \"string\":\n return JSON.stringify(value.value);\n case \"bigint\":\n return `${value.value}n`;\n default:\n throw new Error(`A captured ${value.kind} has no literal.`);\n }\n }\n\n private isOptionalRecord(type: ts.Type): boolean {\n if (!type.isUnion() || !type.types.some((part) => part.flags & ts.TypeFlags.Undefined))\n return false;\n return !this.layouts.literalEnum(type);\n }\n\n // ---- Routines ----\n\n /** Specializes the entry function, returning its body. */\n entry(declaration: ts.FunctionDeclaration | ts.ArrowFunction): string[] {\n const frame: Frame = {\n emitter: new Emitter(),\n env: new Map(),\n returns: undefined,\n async: false,\n };\n this.body(declaration.body!, frame);\n return frame.emitter.lines;\n }\n\n /** The name of `declaration` specialized for `self` and these known arguments. */\n routine(\n declaration: FunctionLike,\n self: ModelNode | undefined,\n args: Value[],\n closure?: Env,\n ): {\n name: string;\n args: string[];\n returns: ts.Type | undefined;\n } {\n const signature = this.checker.getSignatureFromDeclaration(declaration);\n const returnType = signature && this.checker.getReturnTypeOfSignature(signature);\n const isAsync = Boolean(\n ts.canHaveModifiers(declaration) &&\n ts\n .getModifiers(declaration)\n ?.some((modifier) => modifier.kind === ts.SyntaxKind.AsyncKeyword),\n );\n const frame: Frame = {\n emitter: new Emitter(),\n env: new Map(closure),\n self,\n returns: returnType && (isAsync ? this.checker.getAwaitedType(returnType) : returnType),\n async: isAsync,\n };\n const parameters: string[] = [];\n const runtimeArgs: string[] = [];\n const keys: string[] = [];\n const parameterList = ts.isGetAccessorDeclaration(declaration) ? [] : declaration.parameters;\n parameterList.forEach((parameter, index) => {\n const arg = args[index] ?? constant(undefined);\n const declared = this.checker.getTypeAtLocation(parameter);\n this.bindParameter(parameter.name, arg, declared, frame, parameters, runtimeArgs, keys);\n });\n // Captured runtime locals become parameters of the specialized routine.\n for (const [symbol, value] of closure ?? [])\n if (value.kind === \"code\") {\n const name = frame.emitter.local(symbol.name);\n const type = value.declared ? this.layouts.text(value.declared) : \"number\";\n parameters.push(`${name}: ${type}`);\n runtimeArgs.push(value.text);\n frame.env.set(symbol, { kind: \"code\", text: name, declared: value.declared, place: true });\n keys.push(`${symbol.name}=code`);\n }\n const key = `${declarationKey(declaration)}|${self?.id ?? \"\"}|${keys.join(\",\")}`;\n const known = this.specialized.get(key);\n if (known) return { name: known, args: runtimeArgs, returns: frame.returns };\n const name = this.routineName(declaration, self);\n this.specialized.set(key, name);\n if (ts.isArrowFunction(declaration) && !ts.isBlock(declaration.body)) {\n const result = this.expression(declaration.body, frame, frame.returns);\n frame.emitter.line(`return ${this.code(result, frame.returns, frame)};`);\n } else this.body(declaration.body!, frame);\n const resultText =\n frame.returns && !(frame.returns.flags & ts.TypeFlags.Void)\n ? this.layouts.text(frame.returns)\n : \"void\";\n const head = `${frame.async ? \"async \" : \"\"}function ${name}(${parameters.join(\", \")}): ${\n frame.async ? `Promise<${resultText}>` : resultText\n } {`;\n const where = self?.owner\n ? ` /* ${self.owner.root.name}${self.owner.steps.map(stepText).join(\"\")} */`\n : \"\";\n this.routines.push([`${head}${where}`, ...frame.emitter.lines, \"}\"].join(\"\\n\"));\n return { name, args: runtimeArgs, returns: frame.returns };\n }\n\n private routineName(declaration: FunctionLike, self: ModelNode | undefined): string {\n const own =\n declaration.name && ts.isIdentifier(declaration.name) ? declaration.name.text : undefined;\n const variable =\n !own &&\n declaration.parent &&\n ts.isVariableDeclaration(declaration.parent) &&\n ts.isIdentifier(declaration.parent.name)\n ? declaration.parent.name.text\n : undefined;\n const owner = self?.captured.kind === \"instance\" ? self.captured.name : undefined;\n const base = [owner, own ?? variable ?? \"callback\"].filter(Boolean).join(\"_\");\n let name = base;\n for (let index = 2; this.routineNames.has(name); index++) name = `${base}_${index}`;\n this.routineNames.add(name);\n return name;\n }\n\n private bindParameter(\n name: ts.BindingName,\n arg: Value,\n declared: ts.Type,\n frame: Frame,\n parameters: string[],\n runtimeArgs: string[],\n keys: string[],\n ): void {\n if (ts.isObjectBindingPattern(name)) {\n for (const element of name.elements) {\n const field = (element.propertyName ?? element.name).getText();\n const inner = this.member(arg, field, element, frame);\n this.bindParameter(\n element.name,\n inner,\n this.checker.getTypeAtLocation(element),\n frame,\n parameters,\n runtimeArgs,\n keys,\n );\n }\n return;\n }\n if (ts.isArrayBindingPattern(name))\n throw new SpecializeError(name, \"Array patterns are not supported in parameters.\");\n const symbol = this.checker.getSymbolAtLocation(name)!;\n if (arg.kind === \"code\" || (arg.kind === \"virtual\" && !this.isKnownShape(arg))) {\n const local = frame.emitter.local(name.text);\n const iec = this.layouts.iecName(name.parent);\n parameters.push(`${local}: ${iec ?? this.layouts.text(declared)}`);\n runtimeArgs.push(this.assignmentText(arg, declared, frame, iec));\n frame.env.set(symbol, { kind: \"code\", text: local, declared, place: true });\n keys.push(`${name.text}=code`);\n return;\n }\n if (\n arg.kind === \"const\" &&\n !(declared.flags & ts.TypeFlags.Undefined) &&\n typeof arg.value !== \"undefined\"\n ) {\n // Runtime primitives stay parameters, so one routine serves every value.\n const local = frame.emitter.local(name.text);\n parameters.push(`${local}: ${this.layouts.text(declared)}`);\n runtimeArgs.push(this.code(arg, declared, frame));\n frame.env.set(symbol, { kind: \"code\", text: local, declared, place: true });\n keys.push(`${name.text}=code`);\n return;\n }\n frame.env.set(symbol, arg);\n keys.push(`${name.text}=${valueKey(arg)}`);\n }\n\n private isKnownShape(value: Value): boolean {\n return (\n value.kind === \"virtual\" &&\n [...(value.fields?.values() ?? []), ...(value.items ?? [])].some(\n (inner) => inner.kind === \"static\" || inner.kind === \"function\",\n )\n );\n }\n\n // ---- Statements ----\n\n private body(node: ts.ConciseBody, frame: Frame): void {\n if (ts.isBlock(node)) for (const statement of node.statements) this.statement(statement, frame);\n else frame.emitter.line(`${this.code(this.expression(node, frame), undefined, frame)};`);\n }\n\n private statement(node: ts.Statement, frame: Frame): void {\n const { emitter } = frame;\n if (ts.isBlock(node)) {\n emitter.open(\"{\");\n for (const statement of node.statements) this.statement(statement, frame);\n emitter.close();\n return;\n }\n if (ts.isVariableStatement(node)) {\n const mutable = !(node.declarationList.flags & ts.NodeFlags.Const);\n for (const declaration of node.declarationList.declarations)\n this.declare(declaration, mutable, frame);\n return;\n }\n if (ts.isExpressionStatement(node)) {\n this.effect(node.expression, frame);\n return;\n }\n if (ts.isIfStatement(node)) {\n const condition = this.expression(node.expression, frame);\n if (\n condition.kind === \"const\" ||\n condition.kind === \"static\" ||\n condition.kind === \"function\"\n ) {\n const truthy = condition.kind === \"const\" ? Boolean(condition.value) : true;\n if (truthy) this.statement(node.thenStatement, frame);\n else if (node.elseStatement) this.statement(node.elseStatement, frame);\n return;\n }\n emitter.open(`if (${this.condition(condition, node.expression, frame)}) {`);\n this.inner(node.thenStatement, frame);\n if (node.elseStatement) {\n emitter.close(\"} else {\");\n emitter.open(\"\");\n emitter.lines.pop();\n this.inner(node.elseStatement, frame);\n }\n emitter.close();\n return;\n }\n if (ts.isReturnStatement(node)) {\n if (!node.expression) {\n emitter.line(\"return;\");\n return;\n }\n if (ts.isSatisfiesExpression(node.expression) && this.isNever(node.expression.type)) {\n emitter.line(`return ${this.defaultOf(frame.returns)};`);\n return;\n }\n const value = this.expression(node.expression, frame, frame.returns);\n emitter.line(`return ${this.code(value, frame.returns, frame)};`);\n return;\n }\n if (ts.isForOfStatement(node)) {\n this.forOf(node, frame);\n return;\n }\n if (ts.isSwitchStatement(node)) {\n this.switch(node, frame);\n return;\n }\n if (ts.isForStatement(node) || ts.isWhileStatement(node)) {\n throw new SpecializeError(\n node,\n \"Use for…of over an array; counted and while loops are not lowered yet.\",\n );\n }\n if (ts.isTryStatement(node)) {\n emitter.open(\"try {\");\n for (const statement of node.tryBlock.statements) this.statement(statement, frame);\n if (node.catchClause) {\n emitter.close(\n `} catch${node.catchClause.variableDeclaration ? ` (${node.catchClause.variableDeclaration.name.getText()})` : \"\"} {`,\n );\n emitter.open(\"\");\n emitter.lines.pop();\n for (const statement of node.catchClause.block.statements) this.statement(statement, frame);\n }\n emitter.close();\n return;\n }\n if (ts.isBreakStatement(node) || ts.isContinueStatement(node)) {\n emitter.line(node.getText());\n return;\n }\n if (ts.isEmptyStatement(node)) return;\n throw new SpecializeError(node, `${ts.SyntaxKind[node.kind]} is not supported in scan code.`);\n }\n\n /** A branch body: blocks keep their statements without another brace level. */\n private inner(node: ts.Statement, frame: Frame): void {\n if (ts.isBlock(node)) for (const statement of node.statements) this.statement(statement, frame);\n else this.statement(node, frame);\n }\n\n private isNever(type: ts.TypeNode): boolean {\n return type.kind === ts.SyntaxKind.NeverKeyword;\n }\n\n private defaultOf(type: ts.Type | undefined): string {\n if (!type || type.flags & ts.TypeFlags.Void) return \"\";\n if (type.flags & ts.TypeFlags.BooleanLike) return \"false\";\n if (type.flags & ts.TypeFlags.NumberLike) return \"0\";\n return `defaultValue<${this.layouts.text(type)}>()`;\n }\n\n private declare(declaration: ts.VariableDeclaration, mutable: boolean, frame: Frame): void {\n const initializer = declaration.initializer;\n if (!initializer)\n throw new SpecializeError(declaration, \"Initialize locals where they are declared.\");\n const value = this.expression(\n initializer,\n frame,\n declaration.type && this.checker.getTypeAtLocation(declaration.type),\n );\n this.bind(\n declaration.name,\n value,\n mutable,\n frame,\n this.checker.getTypeAtLocation(declaration.name),\n );\n }\n\n /** Binds a local, or each name of a destructuring pattern, to a value. */\n private bind(\n name: ts.BindingName,\n value: Value,\n mutable: boolean,\n frame: Frame,\n declared: ts.Type,\n ): void {\n if (!ts.isIdentifier(name) && value.kind === \"code\" && !value.place)\n value = this.temporaryOf(value, frame);\n if (ts.isObjectBindingPattern(name)) {\n for (const element of name.elements) {\n const field = (element.propertyName ?? element.name).getText();\n const inner = this.member(value, field, element, frame);\n this.bind(\n element.name,\n inner,\n mutable,\n frame,\n this.checker.getTypeAtLocation(element.name),\n );\n }\n return;\n }\n if (ts.isArrayBindingPattern(name)) {\n name.elements.forEach((element, index) => {\n if (ts.isOmittedExpression(element)) return;\n const inner = this.element(value, constant(index), element, frame);\n this.bind(\n element.name,\n inner,\n mutable,\n frame,\n this.checker.getTypeAtLocation(element.name),\n );\n });\n return;\n }\n const symbol = this.checker.getSymbolAtLocation(name)!;\n if (!mutable && value.kind !== \"code\") {\n frame.env.set(symbol, value);\n return;\n }\n if (!mutable && value.kind === \"code\" && value.place) {\n // A const naming a place is an alias, as an object binding is in TypeScript.\n if (this.isAggregate(declared)) {\n frame.env.set(symbol, value);\n return;\n }\n }\n const local = frame.emitter.local(name.text);\n const type = value.kind === \"code\" && value.iec ? value.iec : this.localType(declared);\n frame.emitter.line(\n `${mutable ? \"let\" : \"const\"} ${local}: ${type} = ${this.code(value, declared, frame)};`,\n );\n frame.env.set(symbol, {\n kind: \"code\",\n text: local,\n declared,\n place: true,\n iec: value.kind === \"code\" ? value.iec : undefined,\n });\n }\n\n /** A local's dialect type: a literal union keeps its enum; a lone literal widens to its base type. */\n private localType(declared: ts.Type): string {\n if (this.layouts.literalEnum(declared)) return this.layouts.text(declared);\n return this.layouts.text(this.checker.getBaseTypeOfLiteralType(declared));\n }\n\n private isAggregate(type: ts.Type): boolean {\n return Boolean(type.flags & ts.TypeFlags.Object) && !this.layouts.literalEnum(type);\n }\n\n private forOf(node: ts.ForOfStatement, frame: Frame): void {\n const iterable = this.expression(node.expression, frame);\n const items = this.items(iterable);\n const declaration = node.initializer;\n if (!ts.isVariableDeclarationList(declaration) || declaration.declarations.length !== 1)\n throw new SpecializeError(node.initializer, \"Declare one const in for…of.\");\n const name = declaration.declarations[0]!.name;\n const declared = this.checker.getTypeAtLocation(name);\n if (items) {\n for (const item of items) {\n frame.emitter.open(\"{\");\n this.bind(name, item, false, frame, declared);\n this.inner(node.statement, frame);\n frame.emitter.close();\n }\n return;\n }\n if (iterable.kind !== \"code\")\n throw new SpecializeError(node.expression, \"for…of needs an array.\");\n if (!ts.isIdentifier(name))\n throw new SpecializeError(name, \"Destructure a runtime element inside the loop.\");\n const local = frame.emitter.local(name.text);\n frame.emitter.open(`for (const ${local} of ${iterable.text}) {`);\n frame.env.set(this.checker.getSymbolAtLocation(name)!, {\n kind: \"code\",\n text: local,\n declared,\n place: true,\n });\n this.inner(node.statement, frame);\n frame.emitter.close();\n }\n\n /**\n * The elements of an array setup built or scan code assembled from known parts; undefined for\n * a runtime array. Known arrays unroll, so each element's identity stays known.\n */\n private items(value: Value): Value[] | undefined {\n if (value.kind === \"virtual\" && value.items) return value.items;\n if (value.kind !== \"static\") return undefined;\n const array = value.node;\n const captured = array.captured;\n if (captured.kind !== \"array\") return undefined;\n return captured.items.map((item, index) =>\n this.fromCaptured(item, array, { kind: \"index\", index }),\n );\n }\n\n private switch(node: ts.SwitchStatement, frame: Frame): void {\n const subject = this.expression(node.expression, frame);\n const declared = subject.kind === \"code\" ? subject.declared : undefined;\n if (subject.kind === \"const\") {\n let matched = false;\n for (const clause of node.caseBlock.clauses) {\n if (!matched) {\n if (ts.isDefaultClause(clause)) matched = true;\n else {\n const label = this.expression(clause.expression, frame);\n matched = label.kind === \"const\" && label.value === subject.value;\n }\n }\n if (!matched) continue;\n for (const statement of clause.statements) {\n if (ts.isBreakStatement(statement)) return;\n this.statement(statement, frame);\n }\n if (clause.statements.some((statement) => ts.isReturnStatement(statement))) return;\n }\n return;\n }\n frame.emitter.open(`switch (${this.code(subject, declared, frame)}) {`);\n for (const clause of node.caseBlock.clauses) {\n if (ts.isDefaultClause(clause)) {\n const unreachable = clause.statements.some(\n (statement) =>\n ts.isReturnStatement(statement) &&\n statement.expression &&\n ts.isSatisfiesExpression(statement.expression) &&\n this.isNever(statement.expression.type),\n );\n frame.emitter.open(\"default: {\");\n if (unreachable)\n frame.emitter.line(\n frame.returns && !(frame.returns.flags & ts.TypeFlags.Void)\n ? `return ${this.defaultOf(frame.returns)};`\n : \"break;\",\n );\n else for (const statement of clause.statements) this.statement(statement, frame);\n frame.emitter.close();\n continue;\n }\n const label = this.expression(clause.expression, frame, declared);\n frame.emitter.open(`case ${this.code(label, declared, frame)}: {`);\n for (const statement of clause.statements) this.statement(statement, frame);\n frame.emitter.close();\n }\n frame.emitter.close();\n }\n\n /** An expression evaluated for its effect. */\n private effect(node: ts.Expression, frame: Frame): void {\n if (ts.isVoidExpression(node)) {\n const value = this.expression(node.expression, frame);\n if (value.kind === \"code\") frame.emitter.line(`void ${value.text};`);\n return;\n }\n if (ts.isBinaryExpression(node) && isAssignment(node.operatorToken.kind)) {\n this.assign(node, frame);\n return;\n }\n if (\n (ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) &&\n (node.operator === ts.SyntaxKind.PlusPlusToken ||\n node.operator === ts.SyntaxKind.MinusMinusToken)\n ) {\n const target = this.expression(node.operand, frame);\n const text = this.placeText(target, node.operand);\n frame.emitter.line(\n this.store(\n target,\n `${text} ${node.operator === ts.SyntaxKind.PlusPlusToken ? \"+\" : \"-\"} 1`,\n ),\n );\n return;\n }\n const value = this.expression(node, frame);\n if (value.kind === \"code\" && value.text.includes(\"(\")) frame.emitter.line(`${value.text};`);\n }\n\n private assign(node: ts.BinaryExpression, frame: Frame): void {\n const target = this.expression(node.left, frame);\n const text = this.placeText(target, node.left);\n const declared = target.kind === \"code\" ? target.declared : undefined;\n const operator = node.operatorToken.kind;\n if (operator === ts.SyntaxKind.QuestionQuestionEqualsToken) {\n const value = this.expression(\n node.right,\n frame,\n declared && this.checker.getNonNullableType(declared),\n );\n frame.emitter.open(`if (${this.isUndefinedText(text, declared)}) {`);\n frame.emitter.line(\n this.store(\n target,\n this.wrapDefined(\n this.code(value, declared && this.checker.getNonNullableType(declared), frame),\n declared,\n ),\n ),\n );\n frame.emitter.close();\n return;\n }\n const value = this.expression(node.right, frame, declared);\n if (operator === ts.SyntaxKind.EqualsToken) {\n frame.emitter.line(\n this.store(\n target,\n this.assignmentText(\n value,\n declared,\n frame,\n target.kind === \"code\" ? target.iec : undefined,\n ),\n ),\n );\n return;\n }\n const binary = compoundOperator(operator);\n if (!binary)\n throw new SpecializeError(node, `${node.operatorToken.getText()} is not supported.`);\n frame.emitter.line(\n this.store(target, `${text} ${binary} ${this.code(value, declared, frame)}`),\n );\n }\n\n /** A statement storing `text` into a place, through its module's setter when it has one. */\n private store(target: Value, text: string): string {\n if (target.kind !== \"code\") throw new Error(\"Not a place.\");\n return target.setter ? `${target.setter}(${text});` : `${target.text} = ${text};`;\n }\n\n /** The text stored into a place of `declared` type, wrapping an optional's value. */\n private assignmentText(\n value: Value,\n declared: ts.Type | undefined,\n frame: Frame,\n iec?: string,\n ): string {\n const target = iec ?? (declared && declared.flags & ts.TypeFlags.Number ? \"DINT\" : undefined);\n if (target && value.kind === \"code\" && needsConversion(value.iec ?? \"DINT\", target)) {\n // A TypeScript number holds any of these; in the PLC a value converts as an IEC assignment does.\n this.typeImports.add(\"wrap\");\n return `wrap<${target}>(${this.code(value, undefined, frame)})`;\n }\n if (declared && this.isOptionalRecord(declared)) {\n if (value.kind === \"const\" && value.value === undefined)\n return `defaultValue<${this.layouts.text(declared)}>()`;\n if (value.kind === \"code\" && value.declared && this.isOptionalRecord(value.declared))\n return value.text;\n return this.wrapDefined(\n this.code(value, this.checker.getNonNullableType(declared), frame),\n declared,\n );\n }\n return this.code(value, declared, frame);\n }\n\n private wrapDefined(text: string, declared: ts.Type | undefined): string {\n return declared && this.isOptionalRecord(declared) ? `{ has: true, value: ${text} }` : text;\n }\n\n private isUndefinedText(text: string, declared: ts.Type | undefined): string {\n if (declared && this.isOptionalRecord(declared)) return `!${text}.has`;\n const literal = declared && this.layouts.literalEnum(declared);\n if (literal) return `${text} === ${this.layouts.member(literal, undefined)}`;\n throw new Error(\"Only optional values can be undefined.\");\n }\n\n private placeText(value: Value, node: ts.Node): string {\n if (value.kind === \"code\" && value.place) return value.text;\n throw new SpecializeError(node, \"Assign to stored state: a field scan code owns, or a let.\");\n }\n\n // ---- Expressions ----\n\n expression(node: ts.Expression, frame: Frame, expected?: ts.Type): Value {\n if (\n ts.isParenthesizedExpression(node) ||\n ts.isNonNullExpression(node) ||\n ts.isAsExpression(node) ||\n ts.isSatisfiesExpression(node)\n )\n return this.expression(node.expression, frame, expected);\n if (ts.isNumericLiteral(node)) return constant(Number(node.text));\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node))\n return constant(node.text);\n if (node.kind === ts.SyntaxKind.TrueKeyword) return constant(true);\n if (node.kind === ts.SyntaxKind.FalseKeyword) return constant(false);\n if (ts.isBigIntLiteral(node)) return constant(BigInt(node.text.slice(0, -1)));\n if (node.kind === ts.SyntaxKind.ThisKeyword) {\n if (!frame.self) throw new SpecializeError(node, \"`this` outside a method.\");\n return { kind: \"static\", node: frame.self };\n }\n if (ts.isIdentifier(node)) return this.identifier(node, frame);\n if (ts.isPropertyAccessExpression(node)) {\n const object = this.expression(node.expression, frame);\n if (node.questionDotToken && object.kind === \"const\" && object.value === undefined)\n return constant(undefined);\n return this.narrowed(this.member(object, node.name.text, node, frame), node);\n }\n if (ts.isElementAccessExpression(node)) {\n const object = this.expression(node.expression, frame);\n const index = this.expression(node.argumentExpression, frame);\n return this.element(object, index, node, frame);\n }\n if (ts.isCallExpression(node)) return this.call(node, frame, expected);\n if (ts.isAwaitExpression(node)) {\n const value = this.expression(node.expression, frame);\n return {\n kind: \"code\",\n text: `await ${this.code(value, undefined, frame)}`,\n declared: this.checker.getTypeAtLocation(node),\n };\n }\n if (ts.isPrefixUnaryExpression(node)) return this.unary(node, frame);\n if (ts.isBinaryExpression(node)) return this.binary(node, frame, expected);\n if (ts.isConditionalExpression(node)) {\n const condition = this.expression(node.condition, frame);\n if (condition.kind === \"const\")\n return this.expression(condition.value ? node.whenTrue : node.whenFalse, frame, expected);\n const declared = expected ?? this.checker.getTypeAtLocation(node);\n const whenTrue = this.expression(node.whenTrue, frame, declared);\n const whenFalse = this.expression(node.whenFalse, frame, declared);\n return {\n kind: \"code\",\n text: `(${this.condition(condition, node.condition, frame)} ? ${this.code(whenTrue, declared, frame)} : ${this.code(whenFalse, declared, frame)})`,\n declared,\n };\n }\n if (ts.isArrowFunction(node) || ts.isFunctionExpression(node))\n return { kind: \"function\", declaration: node, self: frame.self, env: frame.env };\n if (ts.isObjectLiteralExpression(node)) return this.objectLiteral(node, frame);\n if (ts.isArrayLiteralExpression(node)) {\n const items: Value[] = [];\n for (const element of node.elements) {\n if (ts.isSpreadElement(element)) {\n const spread = this.items(this.expression(element.expression, frame));\n if (!spread) throw new SpecializeError(element, \"Spread an array setup built.\");\n items.push(...spread);\n } else items.push(this.expression(element, frame));\n }\n return { kind: \"virtual\", items };\n }\n if (ts.isTemplateExpression(node))\n throw new SpecializeError(node, \"Template strings are not supported in scan code.\");\n throw new SpecializeError(node, `${ts.SyntaxKind[node.kind]} is not supported in scan code.`);\n }\n\n private identifier(node: ts.Identifier, frame: Frame): Value {\n if (node.text === \"undefined\") return constant(undefined);\n let symbol = this.checker.getSymbolAtLocation(node);\n if (!symbol) throw new SpecializeError(node, `${node.text} is not declared.`);\n const local = frame.env.get(symbol);\n if (local) return this.narrowed(local, node);\n while (symbol.flags & ts.SymbolFlags.Alias) symbol = this.checker.getAliasedSymbol(symbol);\n const own = frame.env.get(symbol);\n if (own) return own;\n const declaration = symbol.valueDeclaration ?? symbol.declarations?.[0];\n if (!declaration) throw new SpecializeError(node, `${node.text} has no declaration.`);\n if (ts.isFunctionDeclaration(declaration)) return { kind: \"function\", declaration };\n if (ts.isVariableDeclaration(declaration)) {\n const initializer = declaration.initializer;\n if (initializer && (ts.isArrowFunction(initializer) || ts.isFunctionExpression(initializer)))\n return { kind: \"function\", declaration: initializer };\n const root = this.model.roots.find((item) => item.declaration === declaration);\n if (root) return this.rootValue(root, node);\n if (\n ts.isVariableStatement(declaration.parent.parent) &&\n declaration.parent.parent.parent &&\n ts.isSourceFile(declaration.parent.parent.parent)\n ) {\n if (initializer) return this.expression(initializer, { ...frame, env: new Map() });\n }\n }\n if (ts.isEnumMember(declaration))\n return constant(this.checker.getConstantValue(declaration) as number);\n throw new SpecializeError(node, `${node.text} is not available in scan code.`);\n }\n\n private rootValue(root: Root, at: ts.Node): Value {\n const value = this.model.rootValues.get(root)!;\n const node = this.model.node(value);\n if (node) {\n if (this.kept(root.file) && node.captured.kind !== \"service\") return this.keptRoot(root);\n return { kind: \"static\", node };\n }\n if (this.kept(root.file) || root.declaration.parent.flags & ts.NodeFlags.Const)\n return this.capturedConstant(value, at);\n // A module `let` of a plain module is state in its own global list.\n const namespace = this.namespace(root);\n this.storedRoots.add(root);\n return {\n kind: \"code\",\n text: `${namespace}.${root.name}`,\n declared: this.checker.getTypeAtLocation(root.declaration.name),\n place: true,\n iec: this.layouts.iecName(root.declaration),\n setter: `${namespace}.${setterName(root.name)}`,\n };\n }\n\n /** A binding in a module the program keeps, read by its own name. */\n private keptRoot(root: Root): Value {\n const names = this.imports.get(root.file) ?? new Set<string>();\n names.add(root.name);\n this.imports.set(root.file, names);\n return {\n kind: \"code\",\n text: root.name,\n declared: this.checker.getTypeAtLocation(root.declaration.name),\n place: !(root.declaration.parent.flags & ts.NodeFlags.Const),\n };\n }\n\n private capturedConstant(value: CapturedValue, at: ts.Node): Value {\n if (value.kind === \"node\") throw new SpecializeError(at, \"Not a primitive.\");\n return constant(\n value.kind === \"undefined\"\n ? undefined\n : value.kind === \"bigint\"\n ? BigInt(value.value)\n : value.value,\n );\n }\n\n /** A known node or primitive read from a captured object at one step. */\n private fromCaptured(value: CapturedValue, holder: ModelNode, step: Step): Value {\n const node = this.model.node(value);\n if (node) {\n // A field scan code assigns as a whole is a place, holding its own copy of what setup gave it.\n if (\n (node.captured.kind === \"object\" || node.captured.kind === \"array\") &&\n step.kind === \"field\" &&\n this.written(holder, step.name)\n )\n return this.storedField(holder, step);\n return { kind: \"static\", node };\n }\n const stored =\n step.kind === \"field\" ? this.stored(holder, step.name) : this.storedArray(holder);\n if (stored) return this.storedField(holder, step);\n return this.capturedConstant(value, holder.type?.symbol?.valueDeclaration ?? this.sources[0]!);\n }\n\n /** The IEC width a captured field's declaration names. */\n private fieldIec(holder: ModelNode, name: string): string | undefined {\n if (holder.captured.kind === \"instance\")\n return this.layouts.iecName(this.model.member(this.model.classOf(holder), name));\n return this.layouts.iecName(this.fieldSymbol(holder, name)?.valueDeclaration);\n }\n\n /** The IEC width of an array's elements, from the declaration holding the array. */\n private elementIec(array: ModelNode): string | undefined {\n const owner = array.owner;\n const last = owner?.steps.at(-1);\n if (!owner || last?.kind !== \"field\") return undefined;\n const holder = this.at(owner.root, owner.steps.slice(0, -1));\n const declaration =\n holder &&\n (holder.captured.kind === \"instance\"\n ? this.model.member(this.model.classOf(holder), last.name)\n : this.fieldSymbol(holder, last.name)?.valueDeclaration);\n const node = declaration && (declaration as { type?: ts.TypeNode }).type;\n const element =\n node && ts.isArrayTypeNode(node)\n ? node.elementType\n : node && ts.isTypeReferenceNode(node)\n ? node.typeArguments?.[0]\n : undefined;\n return element ? this.layouts.iecName({ type: element } as unknown as ts.Node) : undefined;\n }\n\n private storedField(holder: ModelNode, step: Step): Value {\n const declared =\n step.kind === \"index\"\n ? holder.type && this.model.elementType(holder.type)\n : holder.captured.kind === \"instance\"\n ? (() => {\n const member = this.model.member(this.model.classOf(holder), step.name);\n return member && this.checker.getTypeAtLocation(member.name);\n })()\n : holder.type && this.model.fieldType(holder.type, step.name, holder.captured);\n const global =\n step.kind === \"field\" &&\n holder.owner?.steps.length === 0 &&\n this.flattened(holder.owner.root);\n return {\n kind: \"code\",\n text: `${this.pathText(holder)}${step.kind === \"index\" ? `[${step.index}]` : `.${step.name}`}`,\n declared,\n place: true,\n iec: step.kind === \"field\" ? this.fieldIec(holder, step.name) : this.elementIec(holder),\n ...(global && { setter: `${this.pathText(holder)}.${setterName(step.name)}` }),\n };\n }\n\n member(object: Value, name: string, at: ts.Node, frame: Frame): Value {\n if (object.kind === \"static\") {\n const node = object.node;\n const captured = node.captured;\n if (captured.kind === \"service\")\n return {\n kind: \"static\",\n node: this.serviceNode(captured.path ? `${captured.path}.${name}` : name),\n };\n if (captured.kind === \"instance\") {\n const declaration = this.model.classOf(node);\n const accessor = declaration.members.find(\n (member): member is ts.GetAccessorDeclaration =>\n ts.isGetAccessorDeclaration(member) && member.name.getText() === name,\n );\n if (accessor)\n return this.invoke(\n { kind: \"function\", declaration: accessor, self: node },\n [],\n at,\n frame,\n );\n const method = declaration.members.find(\n (member): member is ts.MethodDeclaration =>\n ts.isMethodDeclaration(member) && member.name.getText() === name,\n );\n if (method) return { kind: \"function\", declaration: method, self: node };\n }\n if (captured.kind === \"array\" && name === \"length\") return constant(captured.items.length);\n if (captured.kind === \"object\" || captured.kind === \"instance\") {\n const field = captured.fields[name];\n if (!field) {\n if (captured.kind === \"object\") return constant(undefined);\n throw new SpecializeError(at, `${name} is not set during setup.`);\n }\n return this.fromCaptured(field, node, { kind: \"field\", name });\n }\n throw new SpecializeError(at, `${name} cannot be read from this value.`);\n }\n if (object.kind === \"virtual\") {\n if (name === \"length\" && object.items) return constant(object.items.length);\n const field = object.fields?.get(name);\n if (field) return field;\n throw new SpecializeError(at, `${name} is not set.`);\n }\n if (object.kind === \"code\") {\n const declared = object.declared && this.fieldDeclared(object.declared, name, at);\n const property =\n object.declared &&\n this.checker.getPropertyOfType(this.checker.getNonNullableType(object.declared), name);\n return {\n kind: \"code\",\n text: `${object.text}.${name}`,\n declared,\n place: object.place,\n iec: this.layouts.iecName(property?.valueDeclaration),\n };\n }\n if (object.kind === \"const\" && object.value === undefined)\n throw new SpecializeError(at, `Reading ${name} of undefined.`);\n throw new SpecializeError(at, `${name} cannot be read from this value.`);\n }\n\n /** An optional's value where TypeScript has narrowed out undefined, as `x` reads after `x !== undefined`. */\n private narrowed(value: Value, at: ts.Node): Value {\n if (value.kind !== \"code\" || !value.declared || !this.isOptionalRecord(value.declared))\n return value;\n const type = this.checker.getTypeAtLocation(at);\n if (type.isUnion() && type.types.some((part) => part.flags & ts.TypeFlags.Undefined))\n return value;\n if (type.flags & ts.TypeFlags.Undefined) return value;\n return {\n kind: \"code\",\n text: `${value.text}.value`,\n declared: this.checker.getNonNullableType(value.declared),\n place: value.place,\n };\n }\n\n /** The declared type of a field of a runtime record, through optionals and tagged unions. */\n private fieldDeclared(type: ts.Type, name: string, at: ts.Node): ts.Type | undefined {\n const defined = this.checker.getNonNullableType(type);\n const tagged = this.layouts.tagged(defined);\n if (tagged)\n return name === tagged.tag\n ? this.tagType(defined, tagged)\n : this.taggedFieldType(defined, tagged, name);\n const property = this.checker.getPropertyOfType(defined, name);\n if (!property)\n throw new SpecializeError(\n at,\n `${name} is not a field of ${this.checker.typeToString(type)}.`,\n );\n return this.checker.getTypeOfSymbol(property);\n }\n\n private readonly services = new Map<string, ModelNode>();\n private serviceNode(path: string): ModelNode {\n const known = this.services.get(path);\n if (known) return known;\n const node: ModelNode = { id: -1 - this.services.size, captured: { kind: \"service\", path } };\n this.services.set(path, node);\n return node;\n }\n\n element(object: Value, index: Value, at: ts.Node, frame: Frame): Value {\n if (index.kind === \"const\" && typeof index.value === \"number\") {\n if (object.kind === \"virtual\" && object.items) {\n const item = object.items[index.value];\n if (!item) throw new SpecializeError(at, `Index ${index.value} is past the end.`);\n return item;\n }\n if (object.kind === \"static\" && object.node.captured.kind === \"array\") {\n const item = object.node.captured.items[index.value];\n if (!item) return constant(undefined);\n return this.fromCaptured(item, object.node, { kind: \"index\", index: index.value });\n }\n if (object.kind === \"static\" && object.node.captured.kind === \"object\") {\n const field = object.node.captured.fields[String(index.value)];\n if (!field) return constant(undefined);\n return this.fromCaptured(field, object.node, { kind: \"field\", name: String(index.value) });\n }\n }\n if (object.kind === \"static\") {\n const node = object.node;\n // A runtime index into stored data, or into a fixed table of plain values.\n const declared =\n node.type &&\n (node.captured.kind === \"array\"\n ? this.model.elementType(node.type)\n : this.recordElement(node.type));\n const text = this.storedNode(node) ? this.pathText(node) : this.table(node);\n return {\n kind: \"code\",\n text: `${text}[${this.code(index, undefined, frame)}]`,\n declared,\n place: true,\n };\n }\n if (object.kind === \"code\") {\n const declared =\n object.declared &&\n (this.model.elementType(object.declared) ?? this.recordElement(object.declared));\n return {\n kind: \"code\",\n text: `${object.text}[${this.code(index, undefined, frame)}]`,\n declared,\n place: object.place,\n };\n }\n if (object.kind === \"virtual\" && object.items) {\n const text = this.materialize(object, at, frame);\n return {\n kind: \"code\",\n text: `${text}[${this.code(index, undefined, frame)}]`,\n declared: this.checker.getTypeAtLocation(at),\n };\n }\n throw new SpecializeError(at, \"This value cannot be indexed.\");\n }\n\n private recordElement(type: ts.Type): ts.Type | undefined {\n return type.aliasSymbol?.name === \"Record\" ? type.aliasTypeArguments?.[1] : undefined;\n }\n\n private storedNode(node: ModelNode): boolean {\n return node.captured.kind === \"array\" ? this.storedArray(node) : this.storedWhole(node);\n }\n\n private readonly tables = new Map<number, string>();\n readonly tableDeclarations: string[] = [];\n /** A fixed table setup built, emitted once for scan code that indexes it at runtime. */\n private table(node: ModelNode): string {\n const known = this.tables.get(node.id);\n if (known) return known;\n if (!node.type) throw new Error(\"A table needs a declared type.\");\n const name = `tsplcTable${this.tables.size + 1}`;\n this.tables.set(node.id, name);\n const type = this.layouts.text(node.type, { kind: \"node\", id: node.id });\n this.tableDeclarations.push(\n `const ${name}: ${type} = ${this.valueText({ kind: \"node\", id: node.id }, node.type, type)};`,\n );\n return name;\n }\n\n /** Stores a scan-built array in a local, for indexing at runtime. */\n private materialize(value: Value, at: ts.Node, frame: Frame): string {\n const type = this.checker.getTypeAtLocation(at);\n const element = this.model.elementType(type);\n if (!element || value.kind !== \"virtual\" || !value.items)\n throw new SpecializeError(at, \"Not an array.\");\n const local = frame.emitter.temporary();\n frame.emitter.line(\n `const ${local}: FixedArray<${this.layouts.text(element)}, ${Math.max(value.items.length, 1)}> = [${value.items\n .map((item) => this.code(item, element, frame))\n .join(\", \")}];`,\n );\n return local;\n }\n\n private objectLiteral(node: ts.ObjectLiteralExpression, frame: Frame): Value {\n const fields = new Map<string, Value>();\n for (const property of node.properties) {\n if (ts.isPropertyAssignment(property))\n fields.set(\n property.name.getText(),\n this.expression(\n property.initializer,\n frame,\n this.checker.getContextualType(property.initializer),\n ),\n );\n else if (ts.isShorthandPropertyAssignment(property)) {\n const symbol = this.checker.getShorthandAssignmentValueSymbol(property);\n const local = symbol && frame.env.get(symbol);\n fields.set(property.name.text, local ?? this.expression(property.name, frame));\n } else throw new SpecializeError(property, \"Write each field of a record.\");\n }\n return { kind: \"virtual\", fields };\n }\n\n private unary(node: ts.PrefixUnaryExpression, frame: Frame): Value {\n const operand = this.expression(node.operand, frame);\n switch (node.operator) {\n case ts.SyntaxKind.ExclamationToken:\n if (operand.kind === \"const\") return constant(!operand.value);\n if (operand.kind === \"static\" || operand.kind === \"function\") return constant(false);\n return {\n kind: \"code\",\n text: `!${this.condition(operand, node.operand, frame)}`,\n declared: this.checker.getBooleanType(),\n };\n case ts.SyntaxKind.MinusToken:\n if (operand.kind === \"const\" && typeof operand.value === \"number\")\n return constant(-operand.value);\n return {\n kind: \"code\",\n text: `-${this.code(operand, undefined, frame)}`,\n declared: this.checker.getTypeAtLocation(node),\n };\n case ts.SyntaxKind.PlusToken:\n return operand;\n default:\n throw new SpecializeError(node, `${ts.tokenToString(node.operator)} is not supported.`);\n }\n }\n\n private binary(node: ts.BinaryExpression, frame: Frame, expected?: ts.Type): Value {\n const kind = node.operatorToken.kind;\n if (kind === ts.SyntaxKind.AmpersandAmpersandToken || kind === ts.SyntaxKind.BarBarToken) {\n const left = this.expression(node.left, frame);\n const and = kind === ts.SyntaxKind.AmpersandAmpersandToken;\n if (left.kind === \"const\") {\n if (Boolean(left.value) !== and) return left;\n return this.expression(node.right, frame, expected);\n }\n if (left.kind === \"static\" || left.kind === \"function\")\n return and ? this.expression(node.right, frame, expected) : left;\n const right = this.expression(node.right, frame, expected);\n if (right.kind === \"const\" && typeof right.value === \"boolean\") {\n if (right.value === and)\n return {\n kind: \"code\",\n text: this.condition(left, node.left, frame),\n declared: this.checker.getBooleanType(),\n };\n return constant(!and);\n }\n return {\n kind: \"code\",\n text: `(${this.condition(left, node.left, frame)} ${and ? \"&&\" : \"||\"} ${this.condition(right, node.right, frame)})`,\n declared: this.checker.getBooleanType(),\n };\n }\n if (kind === ts.SyntaxKind.QuestionQuestionToken) {\n const left = this.expression(node.left, frame);\n if (left.kind === \"const\")\n return left.value === undefined ? this.expression(node.right, frame, expected) : left;\n if (left.kind === \"static\") return left;\n const declared = left.kind === \"code\" ? left.declared : undefined;\n const right = this.expression(\n node.right,\n frame,\n declared && this.checker.getNonNullableType(declared),\n );\n return {\n kind: \"code\",\n text: `(${this.isUndefinedText(this.code(left, declared, frame), declared)} ? ${this.code(right, declared && this.checker.getNonNullableType(declared), frame)} : ${this.code(left, undefined, frame)}${declared && this.isOptionalRecord(declared) ? \".value\" : \"\"})`,\n declared: declared && this.checker.getNonNullableType(declared),\n };\n }\n if (isAssignment(kind)) throw new SpecializeError(node, \"Assign in a statement of its own.\");\n const equality = [\n ts.SyntaxKind.EqualsEqualsEqualsToken,\n ts.SyntaxKind.ExclamationEqualsEqualsToken,\n ts.SyntaxKind.EqualsEqualsToken,\n ts.SyntaxKind.ExclamationEqualsToken,\n ].includes(kind);\n const left = this.expression(node.left, frame);\n const right = this.expression(\n node.right,\n frame,\n left.kind === \"code\" ? left.declared : undefined,\n );\n const negate =\n kind === ts.SyntaxKind.ExclamationEqualsEqualsToken ||\n kind === ts.SyntaxKind.ExclamationEqualsToken;\n if (equality) {\n const folded = this.equal(left, right);\n if (folded !== undefined) return constant(negate ? !folded : folded);\n const [code, other] = left.kind === \"code\" ? [left, right] : [right as Value, left];\n if (code.kind === \"code\" && other.kind === \"const\" && other.value === undefined) {\n const test = this.isUndefinedText(code.text, code.declared);\n return {\n kind: \"code\",\n text: negate ? `!(${test})` : test,\n declared: this.checker.getBooleanType(),\n };\n }\n const declared = code.kind === \"code\" ? code.declared : undefined;\n const [leftText, rightText] = this.comparable(left, right, declared, frame);\n const text = `${leftText} ${negate ? \"!==\" : \"===\"} ${rightText}`;\n return { kind: \"code\", text: `(${text})`, declared: this.checker.getBooleanType() };\n }\n if (\n left.kind === \"const\" &&\n right.kind === \"const\" &&\n typeof left.value === \"number\" &&\n typeof right.value === \"number\"\n ) {\n const folded = foldNumber(kind, left.value, right.value);\n if (folded !== undefined) return constant(folded);\n }\n const operator = binaryToken(kind);\n if (!operator)\n throw new SpecializeError(node, `${node.operatorToken.getText()} is not supported.`);\n const declared = this.checker.getTypeAtLocation(node);\n const [leftText, rightText] = [\"<\", \"<=\", \">\", \">=\"].includes(operator)\n ? this.comparable(left, right, undefined, frame)\n : [this.code(left, undefined, frame), this.code(right, undefined, frame)];\n return { kind: \"code\", text: `(${leftText} ${operator} ${rightText})`, declared };\n }\n\n /**\n * Both sides of a comparison as text. Integers of different signedness, which TypeScript\n * compares as numbers, both widen to LINT so the PLC compares them exactly.\n */\n private comparable(\n left: Value,\n right: Value,\n declared: ts.Type | undefined,\n frame: Frame,\n ): [string, string] {\n const leftText = this.code(left, declared, frame),\n rightText = this.code(right, declared, frame);\n if (left.kind !== \"code\" || right.kind !== \"code\") return [leftText, rightText];\n const from = left.iec ?? \"DINT\",\n to = right.iec ?? \"DINT\";\n if (!needsConversion(from, to) || !needsConversion(to, from)) return [leftText, rightText];\n this.typeImports.add(\"wrap\");\n return [`wrap<LINT>(${leftText})`, `wrap<LINT>(${rightText})`];\n }\n\n /** Equality known now: two known objects, or a known object against undefined. */\n private equal(left: Value, right: Value): boolean | undefined {\n if (left.kind === \"const\" && right.kind === \"const\") return left.value === right.value;\n if (left.kind === \"static\" && right.kind === \"static\") return left.node === right.node;\n if (\n (left.kind === \"static\" && right.kind === \"const\") ||\n (left.kind === \"const\" && right.kind === \"static\")\n )\n return false;\n return undefined;\n }\n\n /** A boolean condition, including JavaScript truthiness of optionals and enums. */\n private condition(value: Value, at: ts.Node, frame: Frame): string {\n if (value.kind === \"code\" && value.declared) {\n const declared = value.declared;\n if (this.isOptionalRecord(declared) && !ts.isPrefixUnaryExpression(at)) {\n const type = this.checker.getTypeAtLocation(at);\n if (!(type.flags & ts.TypeFlags.BooleanLike)) return `${value.text}.has`;\n }\n const literal = this.layouts.literalEnum(declared);\n if (literal?.optional) return `${value.text} !== ${this.layouts.member(literal, undefined)}`;\n }\n return this.code(value, undefined, frame);\n }\n\n // ---- Calls ----\n\n private call(node: ts.CallExpression, frame: Frame, expected?: ts.Type): Value {\n const callee = node.expression;\n // Array methods and other calls the language provides.\n if (ts.isPropertyAccessExpression(callee) || ts.isPropertyAccessChain(callee)) {\n const name = callee.name.text;\n if (ts.isIdentifier(callee.expression) && callee.expression.text === \"Math\")\n return this.math(name, node, frame);\n if (\n ts.isIdentifier(callee.expression) &&\n callee.expression.text === \"Object\" &&\n name === \"values\"\n ) {\n const object = this.expression(node.arguments[0]!, frame);\n if (object.kind === \"static\" && object.node.captured.kind === \"object\")\n return {\n kind: \"virtual\",\n items: Object.entries(object.node.captured.fields).map(([field, value]) =>\n this.fromCaptured(value, object.node, { kind: \"field\", name: field }),\n ),\n };\n throw new SpecializeError(node, \"Object.values needs a record setup built.\");\n }\n const receiver = this.expression(callee.expression, frame);\n const items = this.items(receiver);\n if (items && isArrayMethod(name)) return this.arrayMethod(name, items, node, frame);\n if (receiver.kind === \"static\" && receiver.node.captured.kind === \"service\") {\n const path = receiver.node.captured.path ? `${receiver.node.captured.path}.${name}` : name;\n return this.serviceCall(path, node, frame);\n }\n const method = this.member(receiver, name, callee, frame);\n if (method.kind === \"static\" && method.node.captured.kind === \"service\")\n return this.serviceCall(method.node.captured.path, node, frame);\n return this.invoke(\n method,\n node.arguments.map((argument, index) => this.argument(argument, method, index, frame)),\n node,\n frame,\n expected,\n );\n }\n const target = this.expression(callee, frame);\n if (target.kind === \"static\" && target.node.captured.kind === \"service\")\n return this.serviceCall(target.node.captured.path, node, frame);\n if (target.kind === \"static\" && target.node.captured.kind === \"function\") {\n const fn = this.functionDeclaration(target.node.captured.file, target.node.captured.name);\n return this.invoke(\n { kind: \"function\", declaration: fn },\n node.arguments.map((argument, index) =>\n this.argument(argument, { kind: \"function\", declaration: fn }, index, frame),\n ),\n node,\n frame,\n expected,\n );\n }\n if (ts.isIdentifier(callee) && this.sdkCall(callee)) return this.sdk(callee.text, node, frame);\n return this.invoke(\n target,\n node.arguments.map((argument, index) => this.argument(argument, target, index, frame)),\n node,\n frame,\n expected,\n );\n }\n\n private argument(node: ts.Expression, callee: Value, index: number, frame: Frame): Value {\n let expected: ts.Type | undefined;\n if (callee.kind === \"function\" && !ts.isGetAccessorDeclaration(callee.declaration)) {\n const parameter = callee.declaration.parameters[index];\n expected = parameter && this.checker.getTypeAtLocation(parameter);\n }\n return this.expression(node, frame, expected);\n }\n\n private functionDeclaration(file: string, name: string): FunctionLike {\n const source = this.sources.find((item) => item.fileName === file);\n for (const statement of source?.statements ?? []) {\n if (ts.isFunctionDeclaration(statement) && statement.name?.text === name) return statement;\n if (ts.isVariableStatement(statement))\n for (const declaration of statement.declarationList.declarations)\n if (\n ts.isIdentifier(declaration.name) &&\n declaration.name.text === name &&\n declaration.initializer &&\n (ts.isArrowFunction(declaration.initializer) ||\n ts.isFunctionExpression(declaration.initializer))\n )\n return declaration.initializer;\n }\n throw new Error(`${file}: no function ${name}.`);\n }\n\n /** SDK functions scan code calls, such as the PLC clock. */\n private sdkCall(callee: ts.Identifier): boolean {\n let symbol = this.checker.getSymbolAtLocation(callee);\n while (symbol && symbol.flags & ts.SymbolFlags.Alias)\n symbol = this.checker.getAliasedSymbol(symbol);\n const file = symbol?.declarations?.[0]?.getSourceFile().fileName ?? \"\";\n return file.includes(\"/@tsplc/compiler/\") || file.includes(\"/packages/compiler/\");\n }\n\n private sdk(name: string, node: ts.CallExpression, frame: Frame): Value {\n const args = node.arguments.map((argument) =>\n this.code(this.expression(argument, frame), undefined, frame),\n );\n this.sdkImports.add(name);\n return {\n kind: \"code\",\n text: `${name}(${args.join(\", \")})`,\n declared: this.checker.getTypeAtLocation(node),\n };\n }\n\n readonly sdkImports = new Set<string>();\n /** Conversions generated code imports from `@tsplc/compiler/types`. */\n readonly typeImports = new Set<string>();\n\n private math(name: string, node: ts.CallExpression, frame: Frame): Value {\n const args = node.arguments.map((argument) => this.expression(argument, frame));\n if (args.every((arg) => arg.kind === \"const\" && typeof arg.value === \"number\")) {\n const values = args.map((arg) => (arg as { value: number }).value);\n const folded = (Math as unknown as Record<string, (...items: number[]) => number>)[name]?.(\n ...values,\n );\n if (typeof folded === \"number\") return constant(folded);\n }\n const texts = args.map((arg) => this.code(arg, undefined, frame));\n const declared = this.checker.getTypeAtLocation(node);\n switch (name) {\n case \"abs\": {\n const local = frame.emitter.temporary();\n frame.emitter.line(`const ${local}: number = ${texts[0]};`);\n return { kind: \"code\", text: `(${local} < 0 ? 0 - ${local} : ${local})`, declared };\n }\n case \"min\":\n case \"max\":\n if (texts.length !== 2) throw new SpecializeError(node, `Math.${name} takes two values.`);\n return {\n kind: \"code\",\n text: `(${texts[0]} ${name === \"min\" ? \"<\" : \">\"} ${texts[1]} ? ${texts[0]} : ${texts[1]})`,\n declared,\n };\n default:\n throw new SpecializeError(node, `Math.${name} is not supported.`);\n }\n }\n\n private serviceCall(path: string, node: ts.CallExpression, frame: Frame): Value {\n const client = this.model.roots.find((root) => {\n const value = this.model.node(this.model.rootValues.get(root)!);\n return value?.captured.kind === \"service\" && value.captured.path === \"\";\n });\n if (!client)\n throw new SpecializeError(node, \"Create the service client in a module of its own.\");\n const names = this.imports.get(client.file) ?? new Set<string>();\n names.add(client.name);\n this.imports.set(client.file, names);\n const args = node.arguments.map((argument) =>\n this.code(\n this.expression(argument, frame, this.checker.getContextualType(argument)),\n this.checker.getContextualType(argument),\n frame,\n ),\n );\n return {\n kind: \"code\",\n text: `${client.name}.${path}(${args.join(\", \")})`,\n declared: this.checker.getTypeAtLocation(node),\n };\n }\n\n /** Calls a function value: specializes it, or inlines a one-expression arrow. */\n private invoke(\n target: Value,\n args: Value[],\n at: ts.Node,\n frame: Frame,\n expected?: ts.Type,\n ): Value {\n if (target.kind !== \"function\") throw new SpecializeError(at, \"Only functions can be called.\");\n const declaration = target.declaration;\n if (\n (ts.isArrowFunction(declaration) || ts.isFunctionExpression(declaration)) &&\n target.env &&\n ts.isArrowFunction(declaration) &&\n !ts.isBlock(declaration.body)\n ) {\n // A callback with one expression inlines with its arguments bound.\n const inline: Frame = { ...frame, env: new Map(target.env), self: target.self ?? frame.self };\n declaration.parameters.forEach((parameter, index) => {\n const arg = args[index] ?? constant(undefined);\n const value = arg.kind === \"code\" && !arg.place ? this.temporaryOf(arg, frame) : arg;\n this.bind(parameter.name, value, false, inline, this.checker.getTypeAtLocation(parameter));\n });\n return this.expression(declaration.body, inline, expected);\n }\n const called = this.routine(declaration, target.self, args, target.env);\n const text = `${called.name}(${called.args.join(\", \")})`;\n const returns = called.returns;\n if (!returns || returns.flags & ts.TypeFlags.Void) {\n if (ts.isExpressionStatement(at.parent)) return { kind: \"code\", text, declared: returns };\n frame.emitter.line(`${text};`);\n return constant(undefined);\n }\n return { kind: \"code\", text, declared: returns };\n }\n\n /** A runtime value held in a const, so inlining doesn't evaluate it twice. */\n private temporaryOf(value: Value & { kind: \"code\" }, frame: Frame): Value {\n if (/^[\\w.[\\]]+$/.test(value.text)) return value;\n const local = frame.emitter.temporary();\n const type = value.declared ? this.localType(value.declared) : \"number\";\n frame.emitter.line(`const ${local}: ${type} = ${value.text};`);\n return { kind: \"code\", text: local, declared: value.declared, place: true };\n }\n\n private arrayMethod(name: string, items: Value[], node: ts.CallExpression, frame: Frame): Value {\n const callback = node.arguments[0] ? this.expression(node.arguments[0], frame) : undefined;\n const apply = (args: Value[]): Value => {\n if (!callback) throw new SpecializeError(node, `${name} needs a callback.`);\n return this.invoke(callback, args, node, frame);\n };\n switch (name) {\n case \"entries\":\n return {\n kind: \"virtual\",\n items: items.map((item, index) => ({ kind: \"virtual\", items: [constant(index), item] })),\n };\n case \"slice\": {\n const [start, end] = node.arguments.map((argument) => this.expression(argument, frame));\n if ((start && start.kind !== \"const\") || (end && end.kind !== \"const\"))\n throw new SpecializeError(node, \"slice needs constant bounds.\");\n return {\n kind: \"virtual\",\n items: items.slice(start?.value as number | undefined, end?.value as number | undefined),\n };\n }\n case \"map\":\n return {\n kind: \"virtual\",\n items: items.map((item, index) => this.settle(apply([item, constant(index)]), frame)),\n };\n case \"filter\": {\n const kept: Value[] = [];\n items.forEach((item, index) => {\n const test = apply([item, constant(index)]);\n if (test.kind !== \"const\")\n throw new SpecializeError(node, \"filter must decide from what setup built.\");\n if (test.value) kept.push(item);\n });\n return { kind: \"virtual\", items: kept };\n }\n case \"forEach\":\n items.forEach((item, index) => {\n const result = apply([item, constant(index)]);\n if (result.kind === \"code\") frame.emitter.line(`${result.text};`);\n });\n return constant(undefined);\n case \"some\":\n case \"every\": {\n const some = name === \"some\";\n const tests = items.map((item, index) => apply([item, constant(index)]));\n const runtime: string[] = [];\n for (const test of tests) {\n if (test.kind === \"const\") {\n if (Boolean(test.value) === some) return constant(some);\n continue;\n }\n runtime.push(this.condition(test, node.arguments[0] ?? node, frame));\n }\n if (!runtime.length) return constant(!some);\n return {\n kind: \"code\",\n text: `(${runtime.join(some ? \" || \" : \" && \")})`,\n declared: this.checker.getBooleanType(),\n };\n }\n case \"reduce\":\n case \"reduceRight\": {\n const order = name === \"reduce\" ? items : [...items].reverse();\n let accumulator = node.arguments[1]\n ? this.expression(node.arguments[1], frame)\n : order.shift()!;\n for (const item of order) accumulator = this.settle(apply([accumulator, item]), frame);\n return accumulator;\n }\n case \"find\": {\n for (const [index, item] of items.entries()) {\n const test = apply([item, constant(index)]);\n if (test.kind !== \"const\")\n throw new SpecializeError(node, \"find must decide from what setup built.\");\n if (test.value) return item;\n }\n return constant(undefined);\n }\n case \"includes\": {\n const target = this.expression(node.arguments[0]!, frame);\n const tests = items.map((item) => this.equal(item, target));\n if (tests.some((test) => test === true)) return constant(true);\n if (tests.every((test) => test === false)) return constant(false);\n throw new SpecializeError(node, \"includes must decide from what setup built.\");\n }\n default:\n throw new SpecializeError(node, `${name} is not supported.`);\n }\n }\n\n /** Keeps a runtime result in a local, so later code reads it rather than repeating it. */\n private settle(value: Value, frame: Frame): Value {\n if (value.kind !== \"code\" || /^[\\w.[\\]]+$/.test(value.text)) return value;\n const local = frame.emitter.temporary();\n frame.emitter.line(\n `const ${local}: ${value.declared ? this.localType(value.declared) : \"boolean\"} = ${value.text};`,\n );\n return { kind: \"code\", text: local, declared: value.declared, place: true };\n }\n\n // ---- Values as code ----\n\n /** Dialect text for a value, in a place of `expected` type when known. */\n code(value: Value, expected: ts.Type | undefined, frame: Frame): string {\n switch (value.kind) {\n case \"code\":\n if (\n expected &&\n value.declared &&\n this.isOptionalRecord(value.declared) &&\n !this.isOptionalRecord(expected)\n )\n return `${value.text}.value`;\n return value.text;\n case \"const\": {\n const literal = expected && this.layouts.literalEnum(expected);\n if (literal && (typeof value.value === \"string\" || value.value === undefined))\n return this.layouts.member(literal, value.value as string | undefined);\n if (expected && this.isOptionalRecord(expected) && value.value === undefined)\n return `defaultValue<${this.layouts.text(expected)}>()`;\n if (expected && this.layouts.enumDeclaration(expected) && typeof value.value === \"number\") {\n const member = this.enumMemberName(expected, value.value);\n if (member) return `${this.layouts.text(expected)}.${member}`;\n }\n if (value.value === undefined) throw new Error(\"undefined has no PLC value here.\");\n if (typeof value.value === \"string\") return JSON.stringify(value.value);\n if (typeof value.value === \"bigint\") return `${value.value}n`;\n return String(value.value);\n }\n case \"static\": {\n const node = value.node;\n if (this.storedNode(node)) return this.pathText(node);\n if (node.type) return this.valueText({ kind: \"node\", id: node.id }, expected ?? node.type);\n throw new Error(\"This object has no PLC value.\");\n }\n case \"virtual\": {\n if (value.fields) {\n const type = expected && this.checker.getNonNullableType(expected);\n if (!type) throw new Error(\"A record literal needs a declared type.\");\n return this.recordLiteral(value.fields, type, frame);\n }\n if (value.items) {\n const element = expected && this.model.elementType(expected);\n return `[${value.items.map((item) => this.code(item, element, frame)).join(\", \")}]`;\n }\n throw new Error(\"Empty value.\");\n }\n case \"function\":\n throw new Error(\"A function has no PLC value; call it.\");\n }\n }\n\n /** A record literal of `type`, every field written; a tagged union fills the other variants' fields. */\n private recordLiteral(fields: Map<string, Value>, type: ts.Type, frame: Frame): string {\n const tagged = this.layouts.tagged(type);\n const names = tagged\n ? this.taggedFields(tagged)\n : this.checker.getPropertiesOfType(type).map((property) => property.name);\n return `{ ${names\n .map((name) => {\n const fieldType = tagged\n ? name === tagged.tag\n ? this.tagType(type, tagged)\n : this.taggedFieldType(type, tagged, name)\n : this.checker.getTypeOfSymbol(this.checker.getPropertyOfType(type, name)!);\n const value = fields.get(name);\n if (!value) return `${name}: ${this.defaultOf(fieldType)}`;\n const property = this.checker.getPropertyOfType(type, name);\n return `${name}: ${this.assignmentText(value, fieldType, frame, this.layouts.iecName(property?.valueDeclaration))}`;\n })\n .join(\", \")} }`;\n }\n}\n\n/** IEC integer and bit-string widths: [bits, signed, bit string]. */\nconst integerWidths: Readonly<Record<string, readonly [number, boolean, boolean]>> = {\n SINT: [8, true, false],\n INT: [16, true, false],\n DINT: [32, true, false],\n LINT: [64, true, false],\n USINT: [8, false, false],\n UINT: [16, false, false],\n UDINT: [32, false, false],\n ULINT: [64, false, false],\n BYTE: [8, false, true],\n WORD: [16, false, true],\n DWORD: [32, false, true],\n LWORD: [64, false, true],\n};\n\n/** Whether IEC needs an explicit conversion from one integer type to another; widening is implicit. */\nconst needsConversion = (from: string, to: string): boolean => {\n const source = integerWidths[from],\n target = integerWidths[to];\n if (!source || !target || from === to) return false;\n if (source[2] || target[2]) return true;\n if (source[1] === target[1]) return source[0] > target[0];\n return source[1] || source[0] >= target[0];\n};\n\nconst isChild = (node: ModelNode, holder: ModelNode, field?: string): boolean => {\n const owner = node.owner;\n const parent = holder.owner;\n if (!owner || !parent || owner.root !== parent.root) return false;\n if (owner.steps.length !== parent.steps.length + 1) return false;\n if (!parent.steps.every((step, index) => stepText(step) === stepText(owner.steps[index]!)))\n return false;\n const last = owner.steps.at(-1)!;\n return field === undefined || (last.kind === \"field\" && last.name === field);\n};\n\n/** The function a storage module exports to set one of its globals. */\nexport const setterName = (name: string): string => `tsplcSet_${name}`;\n\nconst stepText = (step: Step): string =>\n step.kind === \"index\" ? `[${step.index}]` : `.${step.name}`;\n\nconst declarationKey = (declaration: ts.Node): string =>\n `${declaration.getSourceFile().fileName}:${declaration.pos}`;\n\nconst valueKey = (value: Value): string => {\n switch (value.kind) {\n case \"static\":\n return `#${value.node.id}`;\n case \"const\":\n return `=${String(value.value)}`;\n case \"function\":\n return `fn:${declarationKey(value.declaration)}:${value.self?.id ?? \"\"}`;\n case \"virtual\":\n return value.items\n ? `[${value.items.map(valueKey).join(\",\")}]`\n : `{${[...(value.fields ?? [])].map(([name, inner]) => `${name}:${valueKey(inner)}`).join(\",\")}}`;\n case \"code\":\n return \"code\";\n }\n};\n\nconst isAssignment = (kind: ts.SyntaxKind): boolean =>\n kind >= ts.SyntaxKind.FirstAssignment && kind <= ts.SyntaxKind.LastAssignment;\n\nconst compoundOperator = (kind: ts.SyntaxKind): string | undefined =>\n ({\n [ts.SyntaxKind.PlusEqualsToken]: \"+\",\n [ts.SyntaxKind.MinusEqualsToken]: \"-\",\n [ts.SyntaxKind.AsteriskEqualsToken]: \"*\",\n [ts.SyntaxKind.BarEqualsToken]: \"|\",\n [ts.SyntaxKind.AmpersandEqualsToken]: \"&\",\n })[kind as number];\n\nconst binaryToken = (kind: ts.SyntaxKind): string | undefined =>\n ({\n [ts.SyntaxKind.PlusToken]: \"+\",\n [ts.SyntaxKind.MinusToken]: \"-\",\n [ts.SyntaxKind.AsteriskToken]: \"*\",\n [ts.SyntaxKind.LessThanToken]: \"<\",\n [ts.SyntaxKind.LessThanEqualsToken]: \"<=\",\n [ts.SyntaxKind.GreaterThanToken]: \">\",\n [ts.SyntaxKind.GreaterThanEqualsToken]: \">=\",\n [ts.SyntaxKind.AmpersandToken]: \"&\",\n [ts.SyntaxKind.BarToken]: \"|\",\n [ts.SyntaxKind.CaretToken]: \"^\",\n [ts.SyntaxKind.LessThanLessThanToken]: \"<<\",\n [ts.SyntaxKind.GreaterThanGreaterThanToken]: \">>\",\n })[kind as number];\n\nconst foldNumber = (\n kind: ts.SyntaxKind,\n left: number,\n right: number,\n): number | boolean | undefined => {\n switch (kind) {\n case ts.SyntaxKind.PlusToken:\n return left + right;\n case ts.SyntaxKind.MinusToken:\n return left - right;\n case ts.SyntaxKind.AsteriskToken:\n return left * right;\n case ts.SyntaxKind.LessThanToken:\n return left < right;\n case ts.SyntaxKind.LessThanEqualsToken:\n return left <= right;\n case ts.SyntaxKind.GreaterThanToken:\n return left > right;\n case ts.SyntaxKind.GreaterThanEqualsToken:\n return left >= right;\n default:\n return undefined;\n }\n};\n\nconst isArrayMethod = (name: string): boolean =>\n [\n \"entries\",\n \"slice\",\n \"map\",\n \"filter\",\n \"forEach\",\n \"some\",\n \"every\",\n \"reduce\",\n \"reduceRight\",\n \"find\",\n \"includes\",\n ].includes(name);\n\nconst pascal = (text: string): string =>\n text.replace(/(^|[^A-Za-z0-9]+)([A-Za-z0-9])/g, (_, __, letter: string) => letter.toUpperCase());\n\nexport type { LiteralEnum };\n",
|
|
18
|
+
"import ts from \"typescript\";\nimport type { CapturedValue } from \"./graph.ts\";\nimport type { Model } from \"./model.ts\";\n\n/** IEC names a program can write as types; they keep their width rather than becoming DINT. */\nconst iecNames = new Set([\n \"BOOL\",\n \"SINT\",\n \"INT\",\n \"DINT\",\n \"LINT\",\n \"USINT\",\n \"UINT\",\n \"UDINT\",\n \"ULINT\",\n \"BYTE\",\n \"WORD\",\n \"DWORD\",\n \"LWORD\",\n \"REAL\",\n \"LREAL\",\n \"TIME\",\n \"DATE\",\n \"TIME_OF_DAY\",\n \"DATE_AND_TIME\",\n]);\n\n/** A union of string literals: a PLC enum. */\nexport interface LiteralEnum {\n name: string;\n members: string[];\n /** The union also allows undefined, stored as this extra member. */\n optional: boolean;\n}\n\n/**\n * Turns the program's TypeScript types into the PLC dialect's: string-literal unions become enums,\n * unions of objects become one record tagged by their literal field, `T | undefined` becomes an\n * optional record, and arrays take their captured length. Declarations it needs collect in `declarations`.\n */\nexport class Layouts {\n readonly declarations = new Map<string, string>();\n /** Enums the declarations need from kept modules, by module file. */\n readonly imports = new Map<string, Set<string>>();\n /** Types the declarations need from kept modules, by module file. */\n readonly typeImports = new Map<string, Set<string>>();\n private readonly enums = new Map<string, LiteralEnum>();\n private readonly records = new Map<string, string>();\n private readonly names = new Map<string, number>();\n\n /** Exported types of kept modules by the type they declare, for types that lost their alias name. */\n private readonly keptTypes = new Map<ts.Type, { file: string; name: string }>();\n\n constructor(\n private readonly model: Model,\n private readonly checker: ts.TypeChecker,\n /** Modules the compiled program keeps, whose named types and enums it imports rather than copies. */\n private readonly kept: (file: string) => boolean,\n keptSources: readonly ts.SourceFile[] = [],\n ) {\n for (const source of keptSources)\n for (const statement of source.statements)\n if (\n (ts.isTypeAliasDeclaration(statement) || ts.isInterfaceDeclaration(statement)) &&\n isExported(statement)\n ) {\n const symbol = checker.getSymbolAtLocation(statement.name);\n if (symbol)\n this.keptTypes.set(checker.getDeclaredTypeOfSymbol(symbol), {\n file: source.fileName,\n name: statement.name.text,\n });\n }\n }\n\n private unique(base: string): string {\n const count = this.names.get(base) ?? 0;\n this.names.set(base, count + 1);\n return count ? `${base}_${count + 1}` : base;\n }\n\n private import(file: string, name: string, kind: \"value\" | \"type\" = \"value\"): string {\n const imports = kind === \"value\" ? this.imports : this.typeImports;\n const names = imports.get(file) ?? new Set<string>();\n names.add(name);\n imports.set(file, names);\n return name;\n }\n\n /** Generated enums, which modules import as values. */\n get enumNames(): string[] {\n return [...this.declarations]\n .filter(([, text]) => text.startsWith(\"export enum\"))\n .map(([name]) => name);\n }\n\n /** The string literals of a union of them, without undefined. */\n literals(type: ts.Type): { members: string[]; optional: boolean } | undefined {\n const parts = type.isUnion() ? type.types : [type];\n const members: string[] = [];\n let optional = false;\n for (const part of parts) {\n if (part.flags & ts.TypeFlags.Undefined) optional = true;\n else if (part.isStringLiteral()) members.push(part.value);\n else return undefined;\n }\n return members.length ? { members, optional } : undefined;\n }\n\n /** The enum a string-literal union compiles to. */\n literalEnum(type: ts.Type): LiteralEnum | undefined {\n const literals = this.literals(type);\n if (!literals) return undefined;\n const key = [...literals.members].sort().join(\"|\");\n const existing = this.enums.get(key);\n if (existing) {\n existing.optional ||= literals.optional;\n this.writeEnum(existing);\n return existing;\n }\n const alias = (type.aliasSymbol ?? this.checker.getNonNullableType(type).aliasSymbol)?.name;\n const declared: LiteralEnum = {\n name: this.unique(alias ?? pascal(literals.members.join(\"_or_\"))),\n members: literals.members,\n optional: literals.optional,\n };\n this.enums.set(key, declared);\n this.writeEnum(declared);\n return declared;\n }\n\n private writeEnum(declared: LiteralEnum): void {\n const members = [\n ...(declared.optional ? [\"Undefined = 0\"] : []),\n ...declared.members.map((member, index) => `${enumMember(member)} = ${index + 1}`),\n ];\n this.declarations.set(declared.name, `export enum ${declared.name} { ${members.join(\", \")} }`);\n }\n\n /** `Enum.Member` text for a string literal of a literal union. */\n member(declared: LiteralEnum, value: string | undefined): string {\n return `${declared.name}.${value === undefined ? \"Undefined\" : enumMember(value)}`;\n }\n\n /** The object types of a union of them, without undefined, when it has a literal tag field. */\n tagged(type: ts.Type): { tag: string; variants: ts.Type[]; optional: boolean } | undefined {\n if (!type.isUnion()) return undefined;\n const variants = type.types.filter((part) => !(part.flags & ts.TypeFlags.Undefined));\n if (variants.length < 2 || variants.some((part) => !(part.flags & ts.TypeFlags.Object)))\n return undefined;\n const first = variants[0]!;\n for (const property of first.getProperties()) {\n const literal = (variant: ts.Type) => {\n const own = variant.getProperty(property.name);\n const value = own && this.checker.getTypeOfSymbol(own);\n return value?.isStringLiteral() ? value.value : undefined;\n };\n if (variants.every((variant) => literal(variant) !== undefined))\n return {\n tag: property.name,\n variants,\n optional: variants.length !== type.types.length,\n };\n }\n return undefined;\n }\n\n /** The dialect type text for `type`, holding `value` when it was captured. */\n text(type: ts.Type, value?: CapturedValue, hint?: string): string {\n const checker = this.checker;\n const alias = type.aliasSymbol?.name;\n if (alias && iecNames.has(alias)) return alias;\n if (type.flags & ts.TypeFlags.BooleanLike) return \"boolean\";\n const enumDeclaration = this.enumDeclaration(type);\n if (enumDeclaration) return this.enumName(enumDeclaration);\n if (type.flags & ts.TypeFlags.NumberLike) return \"number\";\n if (type.flags & ts.TypeFlags.BigIntLike) return \"LINT\";\n const literal = this.literalEnum(type);\n if (literal) return literal.name;\n const named = this.namedKept(type);\n if (named) return named;\n if (type.flags & ts.TypeFlags.StringLike) return \"string\";\n const tagged = this.tagged(type);\n if (tagged) return this.taggedRecord(type, tagged);\n if (type.isUnion()) {\n const defined = checker.getNonNullableType(type);\n if (defined !== type) return this.optional(defined, value);\n }\n const element = this.model.elementType(type);\n if (\n element &&\n (checker.isArrayType(type) || checker.isTupleType(type) || isReadonlyArray(type))\n ) {\n const node = value && this.model.node(value);\n if (!node || node.captured.kind !== \"array\")\n throw new Error(`${checker.typeToString(type)} needs a length: build it during setup.`);\n const items = node.captured.items;\n return `FixedArray<${this.text(element, items[0] ?? this.sample(element))}, ${Math.max(items.length, 1)}>`;\n }\n const enumKey = this.enumRecord(type);\n if (enumKey) return enumKey;\n if (type.flags & ts.TypeFlags.Object) return this.record(type, value, hint);\n throw new Error(`${checker.typeToString(type)} has no PLC layout.`);\n }\n\n /** The TypeScript enum a type is, or is a union of members of. */\n enumDeclaration(type: ts.Type): ts.EnumDeclaration | undefined {\n const parts = type.isUnion() ? type.types : [type];\n if (!parts.length || !parts.every((part) => part.flags & ts.TypeFlags.EnumLike))\n return undefined;\n const symbol = parts[0]!.symbol;\n const declaration =\n symbol?.declarations?.find(ts.isEnumDeclaration) ?? symbol?.valueDeclaration?.parent;\n return declaration && ts.isEnumDeclaration(declaration) ? declaration : undefined;\n }\n\n /**\n * The IEC type a declaration names, such as `WORD`: TypeScript keeps no alias name for an alias\n * of a primitive, so the width is read from the declaration's annotation.\n */\n iecName(declaration: ts.Node | undefined): string | undefined {\n const node = declaration && (declaration as { type?: ts.TypeNode }).type;\n return node && ts.isTypeReferenceNode(node) && iecNames.has(node.typeName.getText())\n ? node.typeName.getText()\n : undefined;\n }\n\n /** A declared field's layout, keeping the IEC widths its annotation names. */\n declaredText(\n declaration: ts.Node | undefined,\n type: ts.Type,\n value?: CapturedValue,\n hint?: string,\n ): string {\n const iec = this.iecName(declaration);\n if (iec) return iec;\n const node = declaration && (declaration as { type?: ts.TypeNode }).type;\n const element =\n node && ts.isArrayTypeNode(node)\n ? node.elementType\n : node &&\n ts.isTypeReferenceNode(node) &&\n [\"Array\", \"ReadonlyArray\"].includes(node.typeName.getText())\n ? node.typeArguments?.[0]\n : undefined;\n const elementName =\n element && ts.isTypeReferenceNode(element) ? element.typeName.getText() : undefined;\n if (elementName && iecNames.has(elementName)) {\n const captured = value && this.model.node(value);\n if (captured?.captured.kind !== \"array\")\n throw new Error(\n `${this.checker.typeToString(type)} needs a length: build it during setup.`,\n );\n return `FixedArray<${elementName}, ${Math.max(captured.captured.items.length, 1)}>`;\n }\n return this.text(type, value, hint);\n }\n\n /** A captured value of a field, from any captured record that has it. */\n private fieldSample(property: ts.Symbol): CapturedValue | undefined {\n for (const node of this.model.nodes) {\n const captured = node.captured;\n if (\n (captured.kind === \"object\" || captured.kind === \"instance\") &&\n node.type?.getProperty(property.name) === property\n )\n return captured.fields[property.name];\n }\n return undefined;\n }\n\n /** Some captured value of `type`, giving the lengths of an empty array's element. */\n private sample(type: ts.Type): CapturedValue | undefined {\n const node = this.model.nodes.find((candidate) => candidate.type === type);\n return node && { kind: \"node\", id: node.id };\n }\n\n /** A named type from a module the program keeps, such as a service's procedure record. */\n private namedKept(type: ts.Type): string | undefined {\n const declared = this.keptTypes.get(type);\n if (declared) return this.import(declared.file, declared.name, \"type\");\n const symbol = type.aliasSymbol ?? type.getSymbol();\n const declaration = symbol?.declarations?.[0];\n if (!symbol || !declaration) return undefined;\n if (!ts.isTypeAliasDeclaration(declaration) && !ts.isInterfaceDeclaration(declaration))\n return undefined;\n const file = declaration.getSourceFile().fileName;\n if (!this.kept(file) || !isExported(declaration)) return undefined;\n return this.import(file, symbol.name, \"type\");\n }\n\n private enumName(declaration: ts.EnumDeclaration): string {\n const file = declaration.getSourceFile().fileName;\n if (!this.kept(file))\n throw new Error(\n `${declaration.name.text}: declare PLC enums in a module of enums and constants, so the server and PLC share them.`,\n );\n return this.import(file, declaration.name.text);\n }\n\n /** `Record<Enum, T>`: an object type whose properties are exactly an enum's members. */\n private enumRecord(type: ts.Type): string | undefined {\n const alias = type.aliasSymbol;\n if (alias?.name !== \"Record\" || type.aliasTypeArguments?.length !== 2) return undefined;\n const [key, element] = type.aliasTypeArguments;\n if (!this.enumDeclaration(key!) && !this.literalEnum(key!)) return undefined;\n return `Record<${this.text(key!)}, ${this.text(element!, undefined)}>`;\n }\n\n /** `{ has, value }` for `T | undefined`. */\n private optional(defined: ts.Type, value: CapturedValue | undefined): string {\n const inner = this.text(defined, value?.kind === \"undefined\" ? undefined : value);\n const name = `Optional_${inner.replace(/\\W+/g, \"_\")}`;\n if (!this.declarations.has(name))\n this.declarations.set(name, `export interface ${name} { has: boolean; value: ${inner}; }`);\n return name;\n }\n\n /** One record for a tagged union: the tag as an enum, and every variant's fields. */\n private taggedRecord(\n type: ts.Type,\n tagged: { tag: string; variants: ts.Type[]; optional: boolean },\n ): string {\n const key = `tagged:${this.checker.typeToString(type)}`;\n const known = this.records.get(key);\n if (known) return known;\n const name = this.unique(type.aliasSymbol?.name ?? \"Variant\");\n this.records.set(key, name);\n const tags = tagged.variants.map((variant) => {\n const property = variant.getProperty(tagged.tag)!;\n return (this.checker.getTypeOfSymbol(property) as ts.StringLiteralType).value;\n });\n const tagEnum: LiteralEnum = { name: `${name}Kind`, members: tags, optional: tagged.optional };\n this.enums.set([...tags].sort().join(\"|\"), tagEnum);\n this.writeEnum(tagEnum);\n const fields = new Map<string, string>();\n for (const variant of tagged.variants)\n for (const property of variant.getProperties()) {\n if (property.name === tagged.tag || fields.has(property.name)) continue;\n fields.set(\n property.name,\n this.declaredText(property.valueDeclaration, this.checker.getTypeOfSymbol(property)),\n );\n }\n this.declarations.set(\n name,\n `export interface ${name} { ${tagged.tag}: ${tagEnum.name}; ${[...fields]\n .map(([field, text]) => `${field}: ${text};`)\n .join(\" \")} }`,\n );\n return name;\n }\n\n /** A record of an object type; captured arrays inside it can give it distinct variants. */\n private record(type: ts.Type, value: CapturedValue | undefined, hint?: string): string {\n const node = value && this.model.node(value);\n const fields = this.checker.getPropertiesOfType(type).map((property) => {\n const captured =\n node && (node.captured.kind === \"object\" || node.captured.kind === \"instance\")\n ? node.captured.fields[property.name]\n : undefined;\n return `${property.name}: ${this.declaredText(property.valueDeclaration, this.checker.getTypeOfSymbol(property), captured ?? this.fieldSample(property), pascal(property.name))};`;\n });\n const body = fields.join(\" \");\n const base = type.aliasSymbol?.name ?? type.getSymbol()?.name;\n const key = `${base}:${body}`;\n const known = this.records.get(key);\n if (known) return known;\n const name = this.unique(\n base && base !== \"__type\" && base !== \"__object\" ? base : (hint ?? \"Fields\"),\n );\n this.records.set(key, name);\n this.declarations.set(name, `export interface ${name} { ${body} }`);\n return name;\n }\n}\n\nconst isExported = (declaration: ts.Declaration): boolean =>\n Boolean(ts.getCombinedModifierFlags(declaration) & ts.ModifierFlags.Export);\n\nconst isReadonlyArray = (type: ts.Type): boolean => type.getSymbol()?.name === \"ReadonlyArray\";\n\nconst pascal = (text: string): string =>\n text.replace(/(^|[^A-Za-z0-9]+)([A-Za-z0-9])/g, (_, __, letter: string) => letter.toUpperCase());\n\n/** A string literal as an enum member name. */\nexport const enumMember = (value: string): string => {\n const name = pascal(value);\n return /^[A-Za-z_]/.test(name) ? name : `_${name}`;\n};\n",
|
|
19
|
+
"import ts from \"typescript\";\nimport {\n aggregate,\n defaultValue,\n instancedBlock,\n standardBlocks,\n type StandardBlock,\n type FunctionBlock,\n type Variable,\n type SourceSpan,\n type PlcType,\n} from \"@tsplc/compiler/ir\";\nimport { calleeName, numericLiteralType, type Fail, type TypeResolver } from \"./types.ts\";\n\nexport interface BlockSource {\n block: FunctionBlock;\n method: ts.MethodDeclaration;\n methods: readonly ts.MethodDeclaration[];\n inputSymbol: ts.Symbol;\n inputBindings: ReadonlyMap<string, Variable>;\n fieldBindings: ReadonlyMap<ts.Symbol, Variable>;\n initializers: ReadonlyMap<Variable, ts.Expression>;\n}\nexport function storageInitializer(\n node: ts.Expression,\n types: TypeResolver,\n fail: Fail,\n): { value: ts.Expression; retain: boolean } {\n if (!ts.isCallExpression(node)) return { value: node, retain: false };\n const callee = calleeName(node.expression);\n if (!callee || types.sdkName(callee) !== \"retain\") return { value: node, retain: false };\n if (node.arguments.length !== 1 || (node.typeArguments?.length ?? 0) > 1)\n fail(node, \"PLC3004\", \"retain requires one static storage initializer.\");\n return { value: node.arguments[0]!, retain: true };\n}\n\nexport class BlockResolver {\n readonly definitions = new Map<string, FunctionBlock>();\n readonly sources = new Map<ts.Symbol, BlockSource>();\n private readonly declarations = new Map<ts.Symbol, ts.ClassDeclaration>();\n private readonly active = new Set<ts.Symbol>();\n constructor(\n private readonly types: TypeResolver,\n private readonly origin: (node: ts.Node) => SourceSpan,\n private readonly fail: Fail,\n sdkSpan: SourceSpan,\n ) {\n for (const name of Object.keys(standardBlocks) as StandardBlock[]) {\n const schema = standardBlocks[name],\n id = `stdlib:${name}`,\n output = `${id}:out`;\n const variable = (label: string, type: string, storage: Variable[\"storage\"]): Variable => ({\n id: `${id}:${label}`,\n name: label,\n type,\n storage,\n mutable: false,\n retain: false,\n span: sdkSpan,\n ...(storage === \"blockOutput\" && { initial: defaultValue(type, types.types) }),\n });\n const block: FunctionBlock = {\n id,\n name,\n inputs: schema.inputs.map(([label, , type]) => variable(label, type, \"parameter\")),\n outputs: schema.outputs.map(([label, , type]) => variable(label, type, \"blockOutput\")),\n state: [],\n locals: [],\n body: [],\n result: output,\n standard: name,\n span: sdkSpan,\n };\n this.definitions.set(id, block);\n types.types.set(output, {\n id: output,\n kind: \"record\",\n fields: block.outputs.map((field) => ({\n name: field.name,\n type: field.type,\n readonly: true,\n })),\n });\n const type: PlcType = { id: `block:${id}`, kind: \"block\", block: id, output };\n types.types.set(type.id, type);\n types.standardTypes.set(name, type.id);\n }\n }\n\n index(nodes: readonly ts.ClassDeclaration[]): void {\n for (const node of nodes) {\n if (!node.name) this.fail(node, \"PLC1001\", \"Function block classes need names.\");\n this.declarations.set(this.types.symbol(node.name), node);\n }\n }\n\n instanceType(node: ts.NewExpression): string {\n const name = calleeName(node.expression);\n if (node.arguments?.length || node.typeArguments?.length || !name)\n this.fail(\n node,\n \"PLC1007\",\n \"Block instances use a concrete zero-argument constructor at static storage declarations.\",\n );\n const official = this.types.sdkName(name),\n standard = official && this.types.standardTypes.get(official);\n if (standard) return standard;\n const symbol = this.types.symbol(name),\n declaration = this.declarations.get(symbol);\n if (!declaration)\n this.fail(node, \"PLC1007\", \"Only recognized static function block allocation is supported.\");\n this.collect(declaration);\n // Successful collection registers this class identity before publishing its source.\n return this.types.blockTypes.get(symbol)!;\n }\n\n /**\n * `FixedArray<Block, N>` storage allocated with `defaultValue`; its elements are static\n * instances. The allocation names the type, so an annotation is optional but must agree.\n */\n instanceArrayType(annotation: ts.TypeNode | undefined, value: ts.Expression): string | undefined {\n const blockArray = (type: string) =>\n this.types.types.get(type)?.kind === \"array\" && instancedBlock(type, this.types.types)\n ? type\n : undefined;\n const declared = annotation && this.types.resolve(annotation).type;\n if (declared && !blockArray(declared)) return undefined;\n const callee = ts.isCallExpression(value) && calleeName(value.expression);\n const allocation =\n callee && this.types.sdkName(callee) === \"defaultValue\" && value.typeArguments?.length === 1\n ? this.types.resolve(value.typeArguments[0]!).type\n : undefined;\n if (!declared) return allocation && blockArray(allocation);\n if (allocation !== declared)\n this.fail(\n value,\n \"PLC1007\",\n \"Block arrays allocate with defaultValue<FixedArray<Block, N>>() of their declared type.\",\n );\n return declared;\n }\n\n collect(node: ts.ClassDeclaration): void {\n if (!node.name) this.fail(node, \"PLC1001\", \"Function block classes need names.\");\n const symbol = this.types.symbol(node.name);\n if (this.sources.has(symbol)) return;\n if (this.active.has(symbol) || this.active.size >= 64)\n this.fail(node, \"PLC1007\", \"Recursive or excessively nested block instance layout.\");\n if (\n node.typeParameters?.length ||\n node.modifiers?.some(\n (modifier) =>\n modifier.kind === ts.SyntaxKind.Decorator ||\n modifier.kind === ts.SyntaxKind.AbstractKeyword,\n )\n )\n this.fail(\n node,\n \"PLC1001\",\n \"Block classes are concrete; generic classes and decorators are unsupported.\",\n );\n const heritage = node.heritageClauses;\n if (\n heritage?.length !== 1 ||\n heritage[0]?.token !== ts.SyntaxKind.ExtendsKeyword ||\n heritage[0].types.length !== 1\n )\n this.fail(\n node,\n \"PLC1001\",\n \"Function block classes extend the canonical FunctionBlock marker only.\",\n );\n const base = heritage[0].types[0]!;\n if (\n this.types.sdkName(base.expression) !== \"FunctionBlock\" ||\n !base.typeArguments ||\n base.typeArguments.length < 1 ||\n base.typeArguments.length > 2\n )\n this.fail(base, \"PLC1001\", \"Extend FunctionBlock<Inputs, Outputs> with concrete schemas.\");\n // Register identity before nested fields; the active set rejects recursive allocation.\n this.active.add(symbol);\n const id = this.types.id(node, node.name.text),\n typeId = `block:${id}`;\n this.types.types.set(typeId, { id: typeId, kind: \"block\", block: id });\n this.types.blockTypes.set(symbol, typeId);\n try {\n const inputFields = this.types.inputFields(base.typeArguments[0]!);\n let result: string | undefined;\n const outputNode = base.typeArguments[1];\n if (outputNode && !(ts.isTypeLiteralNode(outputNode) && !outputNode.members.length)) {\n const resolved = this.types.resolve(outputNode),\n layout = this.types.types.get(resolved.type);\n if (\n resolved.io ||\n resolved.mode ||\n this.types.hasReferences(resolved.type) ||\n layout?.kind !== \"record\"\n )\n this.fail(outputNode, \"PLC2001\", \"Block outputs require a closed value record.\");\n result = resolved.type;\n }\n const fieldBindings = new Map<ts.Symbol, Variable>(),\n initializers = new Map<Variable, ts.Expression>(),\n state: Variable[] = [];\n let method: ts.MethodDeclaration | undefined;\n const methods: ts.MethodDeclaration[] = [];\n for (const member of node.members) {\n if (ts.isMethodDeclaration(member)) {\n if (ts.isIdentifier(member.name) && member.name.text !== \"execute\") {\n if (\n !member.body ||\n member.asteriskToken ||\n member.questionToken ||\n member.typeParameters?.length ||\n [\"update\", \"out\"].includes(member.name.text) ||\n member.modifiers?.some(\n (modifier) =>\n ![\n ts.SyntaxKind.PublicKeyword,\n ts.SyntaxKind.PrivateKeyword,\n ts.SyntaxKind.ProtectedKeyword,\n ].includes(modifier.kind),\n )\n )\n this.fail(\n member,\n \"PLC1001\",\n \"Block methods require concrete instance implementations without generics or overloads.\",\n );\n methods.push(member);\n continue;\n }\n if (\n method ||\n !ts.isIdentifier(member.name) ||\n member.name.text !== \"execute\" ||\n !member.body ||\n member.asteriskToken ||\n member.modifiers?.some(\n (modifier) =>\n ![ts.SyntaxKind.ProtectedKeyword, ts.SyntaxKind.OverrideKeyword].includes(\n modifier.kind,\n ),\n ) ||\n !member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ProtectedKeyword)\n )\n this.fail(member, \"PLC1001\", \"A block implements one protected execute method.\");\n method = member;\n continue;\n }\n const field = this.collectStateField(member, id);\n state.push(field.variable);\n fieldBindings.set(field.symbol, field.variable);\n if (field.initializer) initializers.set(field.variable, field.initializer);\n }\n if (method?.parameters.length !== 1 || method.typeParameters?.length)\n this.fail(node, \"PLC1001\", \"Block execute requires one concrete input record parameter.\");\n const parameter = method.parameters[0]!;\n if (\n !ts.isIdentifier(parameter.name) ||\n !parameter.type ||\n parameter.initializer ||\n parameter.questionToken ||\n parameter.dotDotDotToken\n )\n this.fail(\n parameter,\n \"PLC2001\",\n \"Block execute requires one named, explicitly typed input parameter.\",\n );\n const methodFields = this.types.inputFields(parameter.type);\n if (JSON.stringify(methodFields) !== JSON.stringify(inputFields))\n this.fail(\n parameter,\n \"PLC2001\",\n \"execute input schema differs from its FunctionBlock marker.\",\n );\n if (\n !method.type ||\n (result\n ? this.types.resolve(method.type).type !== result\n : method.type.kind !== ts.SyntaxKind.VoidKeyword)\n )\n this.fail(\n method,\n \"PLC2001\",\n \"execute return annotation must match the complete output record, or void when there are no outputs.\",\n );\n const inputs = inputFields.map((field) => {\n // Records and arrays pass by reference, as objects do in TypeScript.\n const mode =\n field.mode ?? (aggregate(this.types.types.get(field.type)) ? \"inOut\" : undefined);\n return {\n id: `${id}:input:${field.name}`,\n name: field.name,\n type: field.type,\n storage: \"parameter\" as const,\n mutable: mode === \"inOut\",\n retain: false,\n span: this.origin(parameter),\n ...(mode && { mode }),\n };\n });\n const outputType = result && this.types.types.get(result),\n outputs: Variable[] =\n outputType && outputType.kind === \"record\"\n ? outputType.fields.map((field) => ({\n id: `${id}:output:${field.name}`,\n name: field.name,\n type: field.type,\n storage: \"blockOutput\",\n mutable: false,\n retain: false,\n initial: defaultValue(field.type, this.types.types),\n span: this.origin(method!),\n }))\n : [];\n const block: FunctionBlock = {\n id,\n name: node.name.text,\n inputs,\n outputs,\n state,\n locals: [],\n body: [],\n span: this.origin(node),\n ...(result && { result }),\n };\n this.definitions.set(id, block);\n this.types.types.set(typeId, {\n id: typeId,\n kind: \"block\",\n block: id,\n ...(result && { output: result }),\n });\n this.sources.set(symbol, {\n block,\n method,\n methods,\n inputSymbol: this.types.symbol(parameter.name),\n inputBindings: new Map(inputs.map((variable) => [variable.name, variable])),\n fieldBindings,\n initializers,\n });\n } finally {\n this.active.delete(symbol);\n }\n }\n // Private state fields own storage admission, constructor allocation and initializer capture.\n // The enclosing collection keeps schema/execute validation separate from this field policy.\n private collectStateField(\n member: ts.ClassElement,\n id: string,\n ): {\n variable: Variable;\n symbol: ts.Symbol;\n initializer?: ts.Expression;\n } {\n if (\n !ts.isPropertyDeclaration(member) ||\n !ts.isIdentifier(member.name) ||\n !member.initializer ||\n member.questionToken ||\n member.exclamationToken ||\n !member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.PrivateKeyword) ||\n member.modifiers.some(\n (modifier) =>\n ![ts.SyntaxKind.PrivateKeyword, ts.SyntaxKind.ReadonlyKeyword].includes(modifier.kind),\n )\n )\n this.fail(\n member,\n \"PLC1001\",\n \"Block state uses private initialized instance fields; constructors, static fields and decorators are unsupported.\",\n );\n const initial = storageInitializer(member.initializer, this.types, this.fail);\n const instanceArray = ts.isNewExpression(initial.value)\n ? undefined\n : this.instanceArrayType(member.type, initial.value);\n let type: string;\n if (ts.isNewExpression(initial.value)) type = this.instanceType(initial.value);\n else if (instanceArray) type = instanceArray;\n else if (member.type) {\n const annotation = this.types.resolve(member.type);\n if (annotation.io || annotation.mode || this.types.hasReferences(annotation.type))\n this.fail(member, \"PLC2001\", \"Borrow and I/O wrappers cannot be stored in block state.\");\n type = annotation.type;\n } else if (\n initial.value.kind === ts.SyntaxKind.TrueKeyword ||\n initial.value.kind === ts.SyntaxKind.FalseKeyword\n )\n type = \"BOOL\";\n else if (/^-?\\d/.test(initial.value.getText()))\n type = numericLiteralType(initial.value.getText());\n else this.fail(member, \"PLC2001\", \"Annotate private numeric and aggregate state explicitly.\");\n if (member.type && this.types.resolve(member.type).type !== type)\n this.fail(member, \"PLC2001\", \"Instance annotation differs from its constructor.\");\n const instance = Boolean(instancedBlock(type, this.types.types));\n if (this.types.types.get(type)?.kind === \"block\" && !ts.isNewExpression(initial.value))\n this.fail(member, \"PLC1007\", \"Block instances require static constructor initialization.\");\n const variable: Variable = {\n id: `${id}:field:${member.name.text}`,\n name: member.name.text,\n type,\n storage: instance ? \"instance\" : \"field\",\n mutable:\n !instance &&\n !member.modifiers.some((modifier) => modifier.kind === ts.SyntaxKind.ReadonlyKeyword),\n retain: initial.retain,\n span: this.origin(member),\n };\n return {\n variable,\n symbol: this.types.symbol(member.name),\n ...(!instance && { initializer: initial.value }),\n };\n }\n}\n",
|
|
20
|
+
"import ts from \"typescript\";\nimport { dirname, relative, resolve } from \"node:path\";\nimport {\n instancedBlock,\n primitiveTypes,\n parseInteger,\n type PlcType,\n type Field,\n type MathHelper,\n} from \"@tsplc/compiler/ir\";\n\nexport interface ResolvedType {\n type: string;\n io?: \"input\" | \"output\";\n mode?: \"inOut\";\n}\nexport type TypeArgument =\n { kind: \"type\"; value: ResolvedType } | { kind: \"integer\"; value: number };\nexport type TypeEnvironment = ReadonlyMap<ts.Symbol, TypeArgument>;\nexport type Fail = (node: ts.Node, code: string, message: string) => never;\n\n// The PLC type of an unannotated numeric literal: `number` means DINT unless it is fractional.\nexport const numericLiteralType = (text: string) =>\n text.endsWith(\"n\") ? \"LINT\" : /[.e]/i.test(text) && !/^[-]?0[xob]/i.test(text) ? \"LREAL\" : \"DINT\";\n\n// The statically named callee of `name(...)` or `namespace.name(...)`.\nexport function calleeName(node: ts.Expression): ts.MemberName | undefined {\n if (ts.isIdentifier(node)) return node;\n return ts.isPropertyAccessExpression(node) ? node.name : undefined;\n}\n\n// This is the sole owner of TypeScript annotation substitution and PLC layouts.\n// The checker resolves declarations; it never supplies erased numeric widths.\n// Service records are the exception: `iec.*` schemas carry their widths as literal types.\nexport class TypeResolver {\n readonly types = new Map<string, PlcType>(primitiveTypes.map((type) => [type.id, type]));\n readonly blockTypes = new Map<ts.Symbol, string>();\n readonly standardTypes = new Map<string, string>();\n readonly unions = new Set<string>();\n private readonly active = new Set<string>();\n constructor(\n private readonly checker: ts.TypeChecker,\n private readonly root: string,\n private readonly sdk: string,\n private readonly fail: Fail,\n /** The service client's struct for a type naming a called procedure's record. */\n private readonly serviceRecord?: (type: ts.Type) => ts.Symbol | undefined,\n ) {}\n symbol(node: ts.Node): ts.Symbol {\n // An object shorthand has a property symbol and a separate value binding.\n // PLC loads and intrinsic provenance must follow the value, including imports.\n let symbol =\n ts.isShorthandPropertyAssignment(node.parent) && node.parent.name === node\n ? this.checker.getShorthandAssignmentValueSymbol(node.parent)\n : this.checker.getSymbolAtLocation(node);\n if (!symbol) this.fail(node, \"PLC1002\", \"This name has no PLC declaration.\");\n while (symbol.flags & ts.SymbolFlags.Alias) symbol = this.checker.getAliasedSymbol(symbol);\n return symbol;\n }\n\n /** Declared by TypeScript's default library, such as `Record` or `Object`. */\n standardLibrary(symbol: ts.Symbol): boolean {\n return Boolean(\n symbol.declarations?.every(\n (declaration) =>\n dirname(declaration.getSourceFile().fileName) === dirname(ts.getDefaultLibFilePath({})),\n ),\n );\n }\n\n sdkName(node: ts.Node): string | undefined {\n const symbol = this.symbol(node);\n return symbol.declarations?.some((declaration) =>\n declaration.getSourceFile().fileName.startsWith(`${dirname(this.sdk)}/`),\n )\n ? symbol.getName()\n : undefined;\n }\n\n /** `min`, `max` or `clamp` from the SDK's `@tsplc/compiler/math`. */\n mathHelper(node: ts.Node, name: string): MathHelper | undefined {\n return resolve(node.getSourceFile().fileName) ===\n resolve(dirname(this.sdk), \"../stdlib/math.ts\") &&\n (name === \"min\" || name === \"max\" || name === \"clamp\")\n ? name\n : undefined;\n }\n\n id(node: ts.Node, name: string): string {\n return `${relative(this.root, node.getSourceFile().fileName).replaceAll(\"\\\\\", \"/\")}:${node.getStart()}:${name}`;\n }\n\n argument(node: ts.TypeNode, environment: TypeEnvironment): TypeArgument {\n if (ts.isTypeReferenceNode(node)) {\n const bound = environment.get(this.symbol(node.typeName));\n if (bound && !node.typeArguments?.length) return bound;\n }\n // `(typeof table)[\"length\"]` or `typeof table.length` has the literal type of an `as const` table.\n const queried =\n ts.isIndexedAccessTypeNode(node) || ts.isTypeQueryNode(node)\n ? this.checker.getTypeFromTypeNode(node)\n : undefined;\n const text = queried?.isNumberLiteral()\n ? String(queried.value)\n : ts.isLiteralTypeNode(node) &&\n (ts.isNumericLiteral(node.literal) || ts.isPrefixUnaryExpression(node.literal))\n ? node.literal.getText()\n : undefined;\n if (text !== undefined) {\n let value: bigint;\n try {\n value = parseInteger(text);\n } catch {\n this.fail(node, \"PLC2001\", \"Layout arguments must be exact integer literals.\");\n }\n if (value < -2147483648n || value > 2147483647n)\n this.fail(node, \"PLC2001\", \"Layout argument is outside signed DINT range.\");\n return { kind: \"integer\", value: Number(value) };\n }\n return { kind: \"type\", value: this.resolve(node, environment) };\n }\n\n bindings(\n parameters: readonly ts.TypeParameterDeclaration[] | undefined,\n arguments_: readonly ts.TypeNode[] | undefined,\n outer: TypeEnvironment,\n node: ts.Node,\n ): Map<ts.Symbol, TypeArgument> {\n const result = new Map(outer),\n params = parameters ?? [],\n args = arguments_ ?? [];\n if (args.length > params.length)\n this.fail(node, \"PLC2001\", \"Too many concrete type arguments.\");\n params.forEach((parameter, index) => {\n const argument = args[index] ?? parameter.default;\n if (!argument)\n this.fail(\n node,\n \"PLC2001\",\n \"Generic PLC declarations require explicit concrete type arguments.\",\n );\n result.set(this.symbol(parameter.name), this.argument(argument, result));\n });\n return result;\n }\n\n resolve(node: ts.TypeNode, environment: TypeEnvironment = new Map()): ResolvedType {\n if (node.kind === ts.SyntaxKind.BooleanKeyword) return { type: \"BOOL\" };\n if (node.kind === ts.SyntaxKind.NumberKeyword) return { type: \"DINT\" };\n if (node.kind === ts.SyntaxKind.StringKeyword) {\n const id = \"STRING<80>\";\n this.types.set(id, { id, kind: \"string\", capacity: 80, encoding: \"utf8\" });\n return { type: id };\n }\n if (ts.isParenthesizedTypeNode(node)) return this.resolve(node.type, environment);\n if (ts.isTypeLiteralNode(node)) {\n // Environment keys are admitted, declared type parameters with concrete bindings.\n const arguments_ = [...environment]\n .map(\n ([symbol, value]) =>\n `${this.id(symbol.declarations![0]!, symbol.name)}=${this.key(value)}`,\n )\n .sort()\n .join(\",\");\n return this.record(\n node,\n `${this.id(node, \"record\")}${arguments_ ? `<${arguments_}>` : \"\"}`,\n node.members,\n environment,\n );\n }\n if (ts.isUnionTypeNode(node)) return this.union(node, this.id(node, \"Union\"), environment);\n if (ts.isIndexedAccessTypeNode(node)) {\n const record = this.serviceRecord?.(this.checker.getTypeFromTypeNode(node));\n if (record) return this.declaration(record, undefined, environment, node);\n }\n if (!ts.isTypeReferenceNode(node))\n this.fail(\n node,\n \"PLC2001\",\n \"Use an explicit supported PLC type; optional and dynamic layouts are unsupported.\",\n );\n const symbol = this.symbol(node.typeName),\n bound = environment.get(symbol);\n if (bound) {\n if (bound.kind !== \"type\" || node.typeArguments?.length)\n this.fail(node, \"PLC2001\", \"An integer layout argument is not a storage type.\");\n return bound.value;\n }\n const official = this.sdkName(node.typeName);\n const block =\n this.blockTypes.get(symbol) ?? (official ? this.standardTypes.get(official) : undefined);\n if (block) {\n if (node.typeArguments?.length)\n this.fail(\n node,\n \"PLC2001\",\n \"Function block classes are concrete and take no type arguments.\",\n );\n return { type: block };\n }\n if (official === \"InOut\") {\n if (node.typeArguments?.length !== 1)\n this.fail(node, \"PLC2001\", \"InOut requires one concrete value type.\");\n const inner = this.resolve(node.typeArguments[0]!, environment);\n if (inner.io || !this.isValue(inner))\n this.fail(node, \"PLC2001\", \"InOut cannot nest or borrow a block instance.\");\n return { type: inner.type, mode: \"inOut\" };\n }\n if (official && this.types.has(official)) {\n if (node.typeArguments?.length)\n this.fail(node, \"PLC2001\", \"Scalar types take no type arguments.\");\n return { type: official };\n }\n if (official === \"Input\" || official === \"Output\") {\n if (node.typeArguments?.length !== 1)\n this.fail(node, \"PLC2001\", \"I/O types need exactly one PLC type argument.\");\n const inner = this.resolve(node.typeArguments[0]!, environment);\n if (inner.io || inner.mode || this.hasReferences(inner.type))\n this.fail(node, \"PLC2001\", \"I/O type wrappers cannot be nested.\");\n return { type: inner.type, io: official === \"Input\" ? \"input\" : \"output\" };\n }\n if (official === \"FixedArray\") {\n const args = node.typeArguments;\n if (!args || args.length < 2 || args.length > 3)\n this.fail(node, \"PLC2001\", \"FixedArray needs element, length and optional lower bound.\");\n return this.fixedArray(\n node,\n this.resolve(args[0]!, environment),\n this.argument(args[1]!, environment),\n args[2] ? this.argument(args[2], environment) : { kind: \"integer\", value: 0 },\n );\n }\n // TypeScript's own `Record`; its keys are a contiguous enum.\n if (symbol.name === \"Record\" && this.standardLibrary(symbol)) {\n const [key, value] = node.typeArguments ?? [];\n const index =\n key && ts.isTypeReferenceNode(key)\n ? this.types.get(this.resolve(key, environment).type)\n : undefined;\n if (index?.kind !== \"enum\")\n this.fail(\n node,\n \"PLC2001\",\n \"Record keys must be a numeric PLC enum; dynamic index signatures are unsupported.\",\n );\n const values = index.members.map((member) => Number(member.value));\n const lower = Math.min(...values);\n if (Math.max(...values) - lower + 1 !== values.length)\n this.fail(node, \"PLC2001\", \"Record<Enum, T> needs enum member values without gaps.\");\n const element = this.resolve(value!, environment);\n if (element.io || !this.isValue(element))\n this.fail(node, \"PLC2001\", \"Enum-keyed records need a plain value element.\");\n const id = `array<${element.type},${values.length},${lower},${index.id}>`;\n this.types.set(id, {\n id,\n kind: \"array\",\n element: element.type,\n length: values.length,\n lowerBound: lower,\n index: index.id,\n });\n this.checkSize(id, node);\n return { type: id };\n }\n if (official === \"STRING\" || official === \"WSTRING\") {\n if (node.typeArguments?.length !== 1)\n this.fail(node, \"PLC2001\", \"Bounded strings require one capacity argument.\");\n const capacity = this.argument(node.typeArguments[0]!, environment);\n if (capacity.kind !== \"integer\" || capacity.value < 1 || capacity.value > 65535)\n this.fail(node, \"PLC2001\", \"String capacity must be 1..65535.\");\n const id = `${official}<${capacity.value}>`;\n this.types.set(id, {\n id,\n kind: \"string\",\n capacity: capacity.value,\n encoding: official === \"STRING\" ? \"utf8\" : \"utf16\",\n });\n return { type: id };\n }\n return this.declaration(symbol, node.typeArguments, environment, node);\n }\n\n fixedArray(\n node: ts.Node,\n element: ResolvedType,\n length: TypeArgument,\n lower: TypeArgument,\n ): ResolvedType {\n if (\n element.io ||\n !(this.isValue(element) || this.types.get(element.type)?.kind === \"block\") ||\n length.kind !== \"integer\" ||\n lower.kind !== \"integer\" ||\n length.value < 1 ||\n length.value > 1_000_000 ||\n lower.value + length.value - 1 > 2147483647\n )\n this.fail(\n node,\n \"PLC2001\",\n \"Fixed arrays need a supported element, positive bounded length and signed DINT bounds.\",\n );\n const id = `array<${element.type},${length.value},${lower.value}>`;\n this.types.set(id, {\n id,\n kind: \"array\",\n element: element.type,\n length: length.value,\n lowerBound: lower.value,\n });\n this.checkSize(id, node);\n return { type: id };\n }\n\n private declaration(\n symbol: ts.Symbol,\n arguments_: readonly ts.TypeNode[] | undefined,\n environment: TypeEnvironment,\n node: ts.Node,\n ): ResolvedType {\n const declarations = symbol.declarations ?? [];\n if (declarations.filter(ts.isInterfaceDeclaration).length > 1)\n this.fail(\n node,\n \"PLC2001\",\n \"Interface declaration merging is unsupported; use one closed layout declaration.\",\n );\n const declaration = declarations.find(\n (item) =>\n ts.isTypeAliasDeclaration(item) ||\n ts.isInterfaceDeclaration(item) ||\n ts.isEnumDeclaration(item),\n );\n if (!declaration)\n this.fail(node, \"PLC2001\", \"This type is not implemented by the PLC frontend.\");\n if (ts.isEnumDeclaration(declaration)) {\n if (arguments_?.length) this.fail(node, \"PLC2001\", \"Enums take no type arguments.\");\n return this.enumeration(declaration);\n }\n const bindings = this.bindings(declaration.typeParameters, arguments_, environment, node);\n const suffix = (declaration.typeParameters ?? [])\n .map((parameter) => this.key(bindings.get(this.symbol(parameter.name))!))\n .join(\",\");\n const id = `${this.id(declaration, declaration.name.text)}${suffix ? `<${suffix}>` : \"\"}`;\n if (this.active.has(id))\n this.fail(node, \"PLC2001\", \"Recursive by-value PLC layouts are unsupported.\");\n if (this.types.has(id)) return { type: id };\n if (this.active.size >= 64)\n this.fail(\n node,\n \"PLC2001\",\n \"Type substitution exceeds 64 levels; recursive expansion is unsupported.\",\n );\n this.active.add(id);\n try {\n if (ts.isTypeAliasDeclaration(declaration)) {\n if (ts.isTypeLiteralNode(declaration.type))\n return this.record(declaration, id, declaration.type.members, bindings);\n if (ts.isUnionTypeNode(declaration.type)) return this.union(declaration.type, id, bindings);\n return this.resolve(declaration.type, bindings);\n }\n const inherited: Field[] = [];\n for (const heritage of declaration.heritageClauses ?? []) {\n for (const base of heritage.types) {\n const baseSymbol = this.symbol(base.expression);\n const baseType = this.declaration(baseSymbol, base.typeArguments, bindings, base);\n const layout = this.types.get(baseType.type);\n if (layout?.kind !== \"record\")\n this.fail(base, \"PLC2001\", \"Inherited layout must be a record.\");\n inherited.push(...layout.fields);\n }\n }\n return this.record(declaration, id, declaration.members, bindings, inherited);\n } finally {\n this.active.delete(id);\n }\n }\n // Specialization identity includes I/O and InOut modes: equal value widths alone\n // must not merge a readonly value parameter with a mutable borrowed input.\n key(argument: TypeArgument): string {\n if (argument.kind === \"integer\") return String(argument.value);\n const { type, io, mode } = argument.value;\n return `${type}${io ? `:${io}` : \"\"}${mode ? `:${mode}` : \"\"}`;\n }\n\n /**\n * A discriminated union is one fixed layout: a `kind` enum plus the fields of every variant.\n * TypeScript's narrowing guards which fields a branch can read; a literal's unset fields are zero.\n */\n private union(node: ts.UnionTypeNode, id: string, environment: TypeEnvironment): ResolvedType {\n const fields = new Map<string, Field>();\n const kinds: string[] = [];\n for (const variant of node.types) {\n const members = ts.isTypeLiteralNode(variant) ? variant.members : undefined;\n const tag = members?.find(\n (member) => ts.isPropertySignature(member) && member.name.getText() === \"kind\",\n );\n const literal =\n tag && ts.isPropertySignature(tag) && tag.type && ts.isLiteralTypeNode(tag.type)\n ? tag.type.literal\n : undefined;\n if (\n !members ||\n !literal ||\n !ts.isStringLiteral(literal) ||\n !/^[A-Za-z]\\w*$/.test(literal.text)\n )\n this.fail(\n variant,\n \"PLC2001\",\n 'Union variants are object types with an identifier string literal `kind`, such as { kind: \"idle\" }.',\n );\n if (kinds.includes(literal.text)) this.fail(variant, \"PLC2001\", \"Duplicate union kind.\");\n kinds.push(literal.text);\n for (const field of this.fields(\n members.filter((member) => member !== tag),\n environment,\n )) {\n const existing = fields.get(field.name);\n if (existing && existing.type !== field.type)\n this.fail(\n variant,\n \"PLC2001\",\n \"Union variants may share a field only with the same type.\",\n );\n fields.set(field.name, field);\n }\n }\n const kindId = `${id}Kind`;\n this.types.set(kindId, {\n id: kindId,\n kind: \"enum\",\n base: \"DINT\",\n members: kinds.map((name, value) => ({ name, value: String(value) })),\n });\n this.types.set(id, {\n id,\n kind: \"record\",\n fields: [{ name: \"kind\", type: kindId, readonly: false }, ...fields.values()],\n });\n this.unions.add(id);\n this.checkSize(id, node);\n return { type: id };\n }\n\n private record(\n node: ts.Node,\n id: string,\n members: readonly ts.TypeElement[],\n environment: TypeEnvironment,\n inherited: readonly Field[] = [],\n ): ResolvedType {\n const fields = this.fields(members, environment, inherited);\n if (!fields.length) this.fail(node, \"PLC2001\", \"PLC records require at least one field.\");\n this.types.set(id, { id, kind: \"record\", fields });\n this.checkSize(id, node);\n return { type: id };\n }\n\n private fields(\n members: readonly ts.TypeElement[],\n environment: TypeEnvironment,\n inherited: readonly Field[] = [],\n ): Field[] {\n const fields = [...inherited],\n names = new Set(fields.map((field) => field.name));\n for (const member of members) {\n if (\n !ts.isPropertySignature(member) ||\n !member.type ||\n member.questionToken ||\n !member.name ||\n !ts.isIdentifier(member.name)\n )\n this.fail(\n member,\n \"PLC2001\",\n \"PLC records have named, required, explicitly typed fields; methods and index signatures are unsupported.\",\n );\n if (names.has(member.name.text)) this.fail(member, \"PLC2001\", \"Duplicate record field.\");\n const type = this.resolve(member.type, environment);\n if (instancedBlock(type.type, this.types))\n this.fail(\n member,\n \"PLC2001\",\n \"Block instances belong in module or private block fields, not value records.\",\n );\n if (type.io)\n this.fail(\n member,\n \"PLC2001\",\n \"Logical I/O wrappers belong on ambient bindings, not fields.\",\n );\n fields.push({\n name: member.name.text,\n type: type.type,\n ...(type.mode && { mode: type.mode }),\n readonly: Boolean(\n member.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ReadonlyKeyword),\n ),\n });\n names.add(member.name.text);\n }\n return fields;\n }\n\n inputFields(node: ts.TypeNode): readonly Field[] {\n if (ts.isTypeLiteralNode(node) && !node.members.length) return [];\n const resolved = this.resolve(node),\n type = this.types.get(resolved.type);\n if (resolved.io || resolved.mode || type?.kind !== \"record\")\n this.fail(node, \"PLC2001\", \"Block inputs require one closed record schema.\");\n if (type.fields.some((field) => this.hasReferences(field.type)))\n this.fail(node, \"PLC2001\", \"InOut belongs directly on input fields, not nested records.\");\n return type.fields;\n }\n\n // A plain value layout: no InOut borrow, nested borrow schema or block instance.\n isValue(resolved: ResolvedType): boolean {\n return (\n !resolved.mode &&\n !this.hasReferences(resolved.type) &&\n !instancedBlock(resolved.type, this.types)\n );\n }\n\n hasReferences(id: string, seen = new Set<string>()): boolean {\n if (seen.has(id)) return false;\n seen.add(id);\n const type = this.types.get(id);\n return type?.kind === \"record\"\n ? type.fields.some((field) => field.mode || this.hasReferences(field.type, seen))\n : type?.kind === \"array\"\n ? this.hasReferences(type.element, seen)\n : false;\n }\n\n enumeration(node: ts.EnumDeclaration): ResolvedType {\n const id = this.id(node, node.name.text);\n if (this.types.has(id)) return { type: id };\n if (!node.members.length) this.fail(node, \"PLC2001\", \"PLC enums cannot be empty.\");\n const members = node.members.map((member) => {\n if (!ts.isIdentifier(member.name))\n this.fail(member, \"PLC2001\", \"Enum members require identifier names.\");\n const value = this.checker.getConstantValue(member);\n if (\n typeof value !== \"number\" ||\n !Number.isInteger(value) ||\n value < -2147483648 ||\n value > 2147483647\n )\n this.fail(member, \"PLC2001\", \"PLC enum values must be compile-time DINT integers.\");\n return { name: member.name.text, value: String(value) };\n });\n if (new Set(members.map((member) => member.value)).size !== members.length)\n this.fail(node, \"PLC2001\", \"PLC enum members require distinct values.\");\n this.types.set(id, { id, kind: \"enum\", base: \"DINT\", members });\n return { type: id };\n }\n\n private checkSize(id: string, node: ts.Node): void {\n const count = (typeId: string, depth: number): number => {\n if (depth > 64) this.fail(node, \"PLC2001\", \"PLC layout nesting exceeds 64 levels.\");\n const type = this.types.get(typeId)!;\n const size =\n type.kind === \"array\"\n ? type.length * count(type.element, depth + 1)\n : type.kind === \"record\"\n ? type.fields.reduce((total, field) => total + count(field.type, depth + 1), 0)\n : 1;\n if (size > 1_000_000)\n this.fail(node, \"PLC2001\", \"PLC layout exceeds one million scalar elements.\");\n return size;\n };\n count(id, 0);\n }\n}\n"
|
|
21
|
+
],
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "73256814D883503164756E2164756E21",
|
|
24
|
+
"names": []
|
|
25
|
+
}
|