From a915a44bccfaf8cc3982e77ad6864d3641fa7506 Mon Sep 17 00:00:00 2001 From: Johannes Stein Date: Sun, 24 May 2026 18:32:01 +0100 Subject: [PATCH 01/12] Centralize source pipeline parser policy --- AGENTS.md | 10 +- CONTEXT.md | 44 +- README.md | 8 +- docs/architecture.md | 27 +- docs/build-system.md | 13 +- docs/built-ins.md | 4 +- docs/bytecode-vm.md | 4 +- docs/decision-log.md | 10 +- docs/embedding.md | 31 +- docs/interpreter.md | 4 +- docs/language-tables.md | 2 +- docs/language.md | 24 +- .../lexer-performance-simplification.md | 2 +- .../spikes/parser-hot-dispatch-performance.md | 2 +- docs/testing.md | 2 +- scripts/fetch-e2e.sh | 2 +- scripts/run_test262_suite.ts | 2 +- scripts/test-cli-apps.ts | 31 +- scripts/test-cli-config.ts | 88 +-- scripts/test-cli-lexer.ts | 2 +- scripts/test-cli-parser.ts | 6 +- scripts/test-cli.ts | 118 +++- source/app/Goccia.CLI.Application.pas | 137 +++-- source/app/Goccia.CLI.EngineSetup.pas | 8 +- source/app/Goccia.CLI.Help.pas | 8 +- source/app/Goccia.CLI.Options.pas | 335 ++++++++++++ source/app/GocciaBenchmarkRunner.dpr | 163 ++---- source/app/GocciaBundler.dpr | 153 ++---- source/app/GocciaREPL.dpr | 99 ++-- source/app/GocciaScriptLoader.dpr | 146 ++--- source/app/GocciaScriptLoaderBare.dpr | 69 +-- source/app/GocciaTestRunner.dpr | 147 ++--- source/shared/CLI.ConfigFile.Test.pas | 266 ++++----- source/shared/CLI.ConfigFile.pas | 28 +- source/shared/CLI.Options.pas | 396 +++----------- source/shared/CLI.Parser.Test.pas | 114 ++-- source/shared/CLI.Parser.pas | 26 +- source/units/Goccia.Engine.pas | 503 +++++------------- source/units/Goccia.Evaluator.pas | 39 +- source/units/Goccia.FileExtensions.pas | 15 + source/units/Goccia.Modules.Loader.pas | 410 ++++++++------ source/units/Goccia.Parser.pas | 73 +-- source/units/Goccia.Shims.pas | 48 +- source/units/Goccia.SourcePipeline.pas | 488 +++++++++++++++++ tests/language/asi/goccia.json | 2 +- .../modules/mjs-entry-source-type.mjs | 13 + tests/language/with/asi/goccia.json | 2 +- 47 files changed, 2223 insertions(+), 1901 deletions(-) create mode 100644 source/app/Goccia.CLI.Options.pas create mode 100644 source/units/Goccia.SourcePipeline.pas create mode 100644 tests/language/modules/mjs-entry-source-type.mjs diff --git a/AGENTS.md b/AGENTS.md index e5523cf6..a2b1ce07 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -65,7 +65,7 @@ printf "const x = 2 + 2; x;" | ./build/GocciaScriptLoader # Execute stdin source ./build/GocciaScriptLoader example.js --coverage # Execute with line and branch coverage ./build/GocciaScriptLoader example.js --coverage --coverage-format=lcov --coverage-output=coverage.lcov # Coverage with lcov output ./build/GocciaScriptLoader example.js --coverage --coverage-format=json --coverage-output=coverage.json # Coverage with JSON output -./build/GocciaScriptLoader example.js --asi # Execute with automatic semicolon insertion +./build/GocciaScriptLoader example.js --compat-asi # Execute with automatic semicolon insertion ./build/GocciaScriptLoader example.js --strict-types # Enforce type annotations at runtime (interpreter and bytecode) ./build/GocciaScriptLoader example.js --source-type=module # Load entry as a module (top-level this is undefined; default is script) ./build/GocciaScriptLoader example.js --output=json # Execute with structured JSON output @@ -94,7 +94,7 @@ printf '1;\n---\n2;\n' | ./build/GocciaScriptLoader --multifile # Split stdin on ./build/GocciaREPL --mode=bytecode --timing # Bytecode REPL with per-line timing ./build/GocciaREPL --import-map=imports.json # Start the REPL with an explicit import map ./build/GocciaREPL --config=./configs/dev.json # Start the REPL with an explicit config path (skips auto-discovery) -./build/GocciaREPL --asi # Start the REPL with automatic semicolon insertion +./build/GocciaREPL --compat-asi # Start the REPL with automatic semicolon insertion ./build/GocciaREPL --unsafe-ffi # Start the REPL with FFI enabled ./build/GocciaREPL --log=repl.log # Start the REPL with console log capture ./build/GocciaREPL --stack-size=5000 # Start the REPL with custom call stack depth limit @@ -138,7 +138,7 @@ printf 'suite("stdin", () => { bench("sum", { run: () => 1 + 1 }); });\n' | ./bu ./build/GocciaBundler example.js --source-map # Write .map source map alongside .gbc printf "const x = 2 + 2; x;" | ./build/GocciaBundler --output=out.gbc # Compile stdin to .gbc ./build/GocciaBundler src/ --jobs=4 # Compile with 4 parallel workers -./build/GocciaBundler example.js --asi # Compile with automatic semicolon insertion +./build/GocciaBundler example.js --compat-asi # Compile with automatic semicolon insertion ./build/GocciaBundler example.js --multifile --output=dist/ # Split on '---' and emit one .gbc per section into dist/ ./build/GocciaBundler example.js --config=./configs/release.toml # Compile with an explicit config path (skips auto-discovery) ``` @@ -168,12 +168,12 @@ All CLI options can be set via `goccia.json` (or `.json5` / `.toml`) discovered ```json // goccia.json -{ "asi": true, "mode": "bytecode", "timeout": 5000, "allowed-hosts": ["api.example.com"] } +{ "compat-asi": true, "mode": "bytecode", "timeout": 5000, "allowed-hosts": ["api.example.com"] } ``` ```json // tests/language/asi/goccia.json — enables ASI for this subtree -{ "asi": true } +{ "compat-asi": true } ``` ```json diff --git a/CONTEXT.md b/CONTEXT.md index 6c1d3ebf..c8f37c0c 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -23,7 +23,7 @@ An installable host or special-purpose feature added to a runtime, such as conso _Avoid_: Core language built-in when the feature belongs to the optional runtime surface. **Runtime profile**: -A named bundle of runtime extensions used by a CLI frontend or embedding host. +A named bundle of runtime extensions used by a CLI host or embedding host. _Avoid_: Mode, preset. **Runtime surface**: @@ -52,20 +52,24 @@ _Avoid_: Runtime, runtime profile. The implementation object behind an execution mode. GocciaScript has an interpreter executor and a bytecode executor. _Avoid_: Execution backend, runtime. -**Source frontend**: -The shared source-processing pipeline that turns source text into an AST before execution. -_Avoid_: CLI frontend when discussing lexer/parser/AST behavior. +**Source pipeline**: +The shared source-processing pipeline that turns source text into an AST before execution. It owns parser policy and exposes purpose-specific parse entry points for full source, module source, dynamic Function parsing, and expression fragments. +_Avoid_: Source frontend, CLI host when discussing lexer/parser/AST behavior. -**CLI frontend**: +**Parser policy**: +The source-pipeline settings that determine how source text is parsed, including source type and the compatibility flag set. +_Avoid_: Separate parser booleans when discussing the policy as a whole. + +**CLI host**: A command-line program that hosts the engine or runtime for a specific workflow. -_Avoid_: Source frontend. +_Avoid_: CLI frontend, source pipeline. **CLI option**: A named command-line control such as `--mode=bytecode`, `--output=json`, or `--print`. Use it as the umbrella term for named CLI controls, whether they take a value or not. _Avoid_: CLI flag when the option takes a value. **CLI flag**: -A boolean CLI option that toggles behavior by its presence, such as `--print`, `--asi`, or `--unsafe-ffi`. +A boolean CLI option that toggles behavior by its presence, such as `--print`, `--compat-asi`, or `--unsafe-ffi`. _Avoid_: CLI flag for value-taking controls. **Positional argument**: @@ -77,7 +81,7 @@ The initial script or module file path that starts a single program run. It anch _Avoid_: Input file when only the initial program path matters. **Input file**: -Any file processed by a CLI frontend, especially batch-capable tools such as the Test Runner, Benchmark Runner, Bundler, or multifile processing. +Any file processed by a CLI host, especially batch-capable tools such as the Test Runner, Benchmark Runner, Bundler, or multifile processing. _Avoid_: Entry file when referring to a batch member or per-file result. **Config key**: @@ -110,8 +114,12 @@ _Avoid_: Generic VM layer. The textual contents of GocciaScript code, independent of whether it came from a file, stdin, or an embedding host. _Avoid_: Source file when referring to in-memory contents. +**Preprocessor**: +A source-to-source transformation applied before the source pipeline lexes and parses source text. JSX is the current preprocessor. +_Avoid_: JSX flag when referring to the general mechanism. + **Source type**: -The setting that chooses whether an entry file is evaluated as script source or module source. +The setting that chooses whether an entry file is evaluated as script source or module source. It may be explicit or inferred from the entry file name. _Avoid_: Mode, module mode, script mode. **Script source**: @@ -123,15 +131,15 @@ Source evaluated with module entry semantics, including module `this`, imports, _Avoid_: Script source. **Script Loader**: -The CLI frontend that executes source files, stdin, or `.gbc` artifacts. +The CLI host that executes source files, stdin, or `.gbc` artifacts. _Avoid_: Script executor. **Bare Script Loader**: -The CLI frontend that executes through the core engine without attaching the runtime surface. +The CLI host that executes through the core engine without attaching the runtime surface. _Avoid_: Loader profile. **Bundler**: -The CLI frontend that compiles source to `.gbc` artifacts without executing the program. +The CLI host that compiles source to `.gbc` artifacts without executing the program. _Avoid_: Compiler when referring to the user-facing tool. ### Values And Bindings @@ -187,8 +195,12 @@ A class or object shorthand function that receives its call-site receiver as `th _Avoid_: Arrow method. **Compatibility flag**: -An explicit boolean CLI flag or config value that enables an excluded ECMAScript legacy behavior or stricter runtime check. -_Avoid_: Feature flag when the option exists for compatibility or enforcement semantics. +An explicit boolean CLI flag or config value, using canonical `compat-*` spelling, that enables an excluded ECMAScript compatibility behavior. +_Avoid_: Feature flag when the option exists for compatibility semantics. + +**Compatibility flag set**: +The aggregate source-pipeline setting that carries enabled compatibility flags together, such as `compat-asi`, `compat-var`, `compat-function`, or `compat-non-strict-mode`. +_Avoid_: Separate compatibility booleans when a caller is passing the whole parser compatibility policy. ## Flagged Ambiguities @@ -222,8 +234,8 @@ Use **user-defined function** for source-defined functions in general. Use **arr **Script Loader**: Use **Script Loader** for `GocciaScriptLoader`. Avoid **script executor** except when describing the generic act of executing source. -**Frontend**: -Use **source frontend** for lexer/parser/AST work. Use **CLI frontend** for command-line programs. +**Frontend/backend terminology**: +Avoid frontend/backend terminology in GocciaScript architecture. Use **source pipeline** for lexer/parser/AST work and **CLI host** for command-line programs. ## Example Dialogue diff --git a/README.md b/README.md index bc1932f6..d5d8d8d5 100644 --- a/README.md +++ b/README.md @@ -99,10 +99,12 @@ printf "print('hello from bare');" | ./build/GocciaScriptLoaderBare ./build/GocciaScriptLoaderBare example.js ``` -`GocciaScriptLoaderBare` accepts an explicit entry file, `-`, or no positional argument for stdin. It reads source text in the CLI frontend and passes it to `TGocciaEngine`; it exposes a CLI-local `print(...args)` helper for stdout, but does not attach `TGocciaRuntime`. Like `GocciaScriptLoader`, it is silent by default — pass `--print` to emit the script's last value (the explicit `print(...)` helper is unaffected by `--print`). +`GocciaScriptLoaderBare` accepts an explicit entry file, `-`, or no positional argument for stdin. It reads source text in the CLI host and passes it to `TGocciaEngine`; it exposes a CLI-local `print(...args)` helper for stdout, but does not attach `TGocciaRuntime`. Like `GocciaScriptLoader`, it is silent by default — pass `--print` to emit the script's last value (the explicit `print(...)` helper is unaffected by `--print`). Script files may start with a Unix shebang line like `#!/usr/bin/env goccia`; GocciaScript ignores that first line during lexing. +Files ending in `.mjs` are loaded as module source by default, matching JavaScript runtime convention. Use `--source-type=script` to override that inference, or `--source-type=module` / `"source-type": "module"` to force module source for other extensions. + ### Run via Bytecode GocciaScript includes bytecode execution. The public bytecode artifact is `.gbc`. @@ -239,11 +241,11 @@ For a full guided walkthrough, see the [Tutorial](docs/tutorial.md). For the com ## Architecture -GocciaScript supports two execution modes that share the same source frontend (lexer, parser, AST): +GocciaScript supports two execution modes that share the same source pipeline (preprocessors, lexer, parser, AST): ```mermaid flowchart LR - Source["Source Code"] --> Lexer --> Parser --> AST + Source["Source Code"] --> Preprocessors["Preprocessors"] --> Lexer --> Parser --> AST AST --> Interpreter["Tree-Walk Interpreter"] --> Result1["Result"] AST --> Compiler["Bytecode Compiler"] --> VM["Goccia VM"] --> Result2["Result"] ``` diff --git a/docs/architecture.md b/docs/architecture.md index dc9153fa..bd9fe4e1 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,32 +1,34 @@ # Architecture -*How source flows through the engine: shared source frontend, two execution modes, and the main Pascal layers.* +*How source flows through the engine: shared source pipeline, two execution modes, and the main Pascal layers.* ## Executive Summary - **Engine/runtime split** — `TGocciaEngine` orchestrates parsing, execution, core language built-ins, and source text execution; `Goccia.Runtime` attaches runtime globals, file helpers, and extensions - **Execution mode abstraction** — `TGocciaExecutor` is the abstract class; `TGocciaInterpreterExecutor` and `TGocciaBytecodeExecutor` implement it independently -- **Shared source frontend** — Lexer, Parser, and AST are shared between execution modes +- **Shared source pipeline** — Preprocessors, lexer, parser, warning data, source maps, and AST artifacts are shared between execution modes - **Shared execution substrate** — Both execution modes share the same value types, core scope model, runtime extension mechanism, and mark-and-sweep GC - **Goccia-specific** — The bytecode VM operates directly on `TGocciaValue`, not a generic VM abstraction - **No cross-dependency** — The bytecode executor has no dependency on the interpreter or evaluator units ## Overview -GocciaScript has two execution modes: interpreter mode (tree-walk over the AST) and bytecode mode (`TGocciaVM`). A single `TGocciaEngine` class orchestrates both, delegating execution to a pluggable `TGocciaExecutor`. Both execution modes share the same source frontend, value system, core language built-ins, and garbage collector. Runtime globals are attached through runtime extensions; see [Main Layers](#main-layers) for the `Goccia.Engine` / `Goccia.Runtime` split. See [Bytecode VM](bytecode-vm.md) for the bytecode executor's architecture. +GocciaScript has two execution modes: interpreter mode (tree-walk over the AST) and bytecode mode (`TGocciaVM`). A single `TGocciaEngine` class orchestrates both, delegating execution to a pluggable `TGocciaExecutor`. Both execution modes share the same source pipeline, value system, core language built-ins, and garbage collector. Runtime globals are attached through runtime extensions; see [Main Layers](#main-layers) for the `Goccia.Engine` / `Goccia.Runtime` split. See [Bytecode VM](bytecode-vm.md) for the bytecode executor's architecture. + +The source pipeline public API is `TGocciaSourcePipeline` in `Goccia.SourcePipeline`. `Parse` accepts source text plus `TGocciaSourcePipelineOptions` (preprocessors, compatibility flag set, and source type) and returns an owning `TGocciaSourcePipelineResult` containing the AST, generated-source lines, source map, timings, and warnings as data. Narrow source-pipeline entry points cover module source, dynamic `Function` validation/wrapper parsing, and expression fragments so hosts do not construct or configure `TGocciaParser` directly. Embedders that want to run source should continue using `TGocciaEngine.Execute` or the `RunScript*` helpers; direct source-pipeline use is for hosts that need parse artifacts, such as bytecode compilation paths. ## Pipelines ### Interpreter ```text -Source -> JSX Transformer (optional) -> Lexer -> Parser -> Interpreter -> Evaluator -> TGocciaValue +Source -> Preprocessors (optional, e.g. JSX) -> Lexer -> Parser -> Interpreter -> Evaluator -> TGocciaValue ``` ### Bytecode ```text -Source -> JSX Transformer (optional) -> Lexer -> Parser -> Compiler -> Goccia Bytecode -> TGocciaVM -> TGocciaValue +Source -> Preprocessors (optional, e.g. JSX) -> Lexer -> Parser -> Compiler -> Goccia Bytecode -> TGocciaVM -> TGocciaValue ``` ## Main Layers @@ -38,8 +40,7 @@ Source -> JSX Transformer (optional) -> Lexer -> Parser -> Compiler -> Goccia By | Executor abstraction | `Goccia.Executor` | Abstract `TGocciaExecutor` base class | | Interpreter executor | `Goccia.Executor.Interpreter` (`TGocciaInterpreterExecutor`) | Tree-walk execution via `TGocciaInterpreter` | | Bytecode executor | `Goccia.Executor.Bytecode` (`TGocciaBytecodeExecutor`) | Bytecode compile + VM execution; no interpreter dependency | -| JSX | `Goccia.JSX.Transformer` | Optional pre-pass converting JSX to `createElement` calls | -| Source frontend | `Goccia.Lexer`, `Goccia.Parser`, `Goccia.AST.*` | Source text to AST | +| Source pipeline | `Goccia.SourcePipeline`, `Goccia.JSX.Transformer`, `Goccia.Lexer`, `Goccia.Parser`, `Goccia.AST.*` | Source text to AST, including parser policy, preprocessor dispatch, source maps, warning data, and generated-source lines | | Interpreter | `Goccia.Interpreter`, `Goccia.Evaluator.*` | Tree-walk execution | | Bytecode compiler | `Goccia.Compiler*` | AST to bytecode templates/modules | | Bytecode format | `Goccia.Bytecode*` | Opcodes, templates, modules, binary I/O, debug info | @@ -50,7 +51,7 @@ Source -> JSX Transformer (optional) -> Lexer -> Parser -> Compiler -> Goccia By For **tree-walk execution**, see [Interpreter](interpreter.md); for **bytecode execution**, see [Bytecode VM](bytecode-vm.md). For **canonical terminology**, see [GocciaScript Context](../CONTEXT.md). For **recurring implementation patterns** and Define vs Assign implementation details, see [Core patterns](core-patterns.md). -Source type belongs to the `SourceType` property on `TGocciaEngine`, because script source and module source change language execution (`this`, import metadata, and top-level scope lifetime). `TGocciaRuntimeCore` may be attached to an engine, but it does not decide the entry file's source type. File-backed convenience APIs and the default filesystem module content provider live in `Goccia.Runtime`; runtime globals are added by installing concrete `TGocciaRuntimeExtension` classes or by applying a profile such as `TGocciaLoaderRuntimeProfile`. Engine APIs accept source text or caller-provided `TStringList` instances. CLI frontends may still read their entry file or stdin before constructing the engine, as `GocciaScriptLoaderBare` does, but that file read is outside the engine API and does not attach runtime globals. +Source type belongs to the `SourceType` property on `TGocciaEngine`, because script source and module source change language execution (`this`, import metadata, and top-level scope lifetime). File names ending in `.mjs` infer module source unless an explicit source type is provided. `TGocciaRuntimeCore` may be attached to an engine, but it does not decide the entry file's source type. File-backed convenience APIs and the default filesystem module content provider live in `Goccia.Runtime`; runtime globals are added by installing concrete `TGocciaRuntimeExtension` classes or by applying a profile such as `TGocciaLoaderRuntimeProfile`. Engine APIs accept source text or caller-provided `TStringList` instances. CLI hosts may still read their entry file or stdin before constructing the engine, as `GocciaScriptLoaderBare` does, but that file read is outside the engine API and does not attach runtime globals. ## Design Direction @@ -69,12 +70,12 @@ The CLI tools share a two-level application class hierarchy and a declarative op - `TGocciaApplication` (`Goccia.Application.pas`) — embeddable base for any GocciaScript host. Manages GC lifecycle (`Initialize`/`Shutdown`) and unified error handling (`HandleError` virtual). No CLI dependency. - `TGocciaCLIApplication` (`Goccia.CLI.Application.pas`) — extends `TGocciaApplication` with CLI concerns: argument parsing, help generation, option registration, and coverage/profiler singleton lifecycle. Tools override `Configure` (register options) and `ExecuteWithPaths` (business logic). -**Option class hierarchy** (`CLI.Options.pas`): +**Option class hierarchy**: -- `TGocciaOptionBase` → `TGocciaFlagOption`, `TGocciaStringOption`, `TGocciaIntegerOption`, `TGocciaRepeatableOption`, `TGocciaEnumOption` +- `CLI.Options.pas` provides generic primitives: `TOptionBase` → `TFlagOption`, `TStringOption`, `TIntegerOption`, `TRepeatableOption`, `TEnumOption` - The parser calls `Option.Apply(Value)` via virtual dispatch — no pointer arithmetic -- `TGocciaEnumOption` uses RTTI (`GetEnumName` + prefix stripping) to auto-discover valid values -- Predefined option groups (`TGocciaEngineOptions`, `TGocciaCoverageOptions`, `TGocciaProfilerOptions`) bundle related options with owning lifecycle +- `TEnumOption` uses RTTI (`GetEnumName` + prefix stripping) to auto-discover valid values +- `Goccia.CLI.Options.pas` owns Goccia-specific groups (`TGocciaEngineOptions`, `TGocciaCoverageOptions`, `TGocciaProfilerOptions`) and the compatibility flag registry used by each CLI host **CLI lifecycle** (`TGocciaCLIApplication.Execute`): @@ -140,7 +141,7 @@ This replaces a previous `threadvar`-cache approach where intrinsic prototypes s The interpreter and bytecode executors are **intentionally separate control-flow mechanisms** (tree-walk vs register VM). Sharing the **same** `TGocciaValue` model and virtual property access is the architectural consolidation point; you should not try to merge those executors into one execution path. -- **Beneficial separation** — Different layers solving different problems: the lexer/parser/AST source frontend vs `Goccia.Evaluator.*` vs `Goccia.Compiler.*` vs `Goccia.VM.*`; standalone format parsers (`Goccia.JSON`, `Goccia.TOML`, …) vs thin `Goccia.Builtins.*` adapters. Duplication *across* those boundaries is often *different representations of the same spec* (AST vs opcodes vs byte streams), not copy-paste to delete blindly. +- **Beneficial separation** — Different layers solving different problems: the lexer/parser/AST source pipeline vs `Goccia.Evaluator.*` vs `Goccia.Compiler.*` vs `Goccia.VM.*`; standalone format parsers (`Goccia.JSON`, `Goccia.TOML`, …) vs thin `Goccia.Builtins.*` adapters. Duplication *across* those boundaries is often *different representations of the same spec* (AST vs opcodes vs byte streams), not copy-paste to delete blindly. - **Harmful duplication** — The **same rule** maintained twice without a seam: e.g. identical helper functions in two compiler units, or compile-time type compatibility (`TypesAreCompatible`) drifting from runtime `OP_CHECK_TYPE` behavior. That class of duplication should be centralized (shared helpers, single runtime check implementation) so policy stays consistent. diff --git a/docs/build-system.md b/docs/build-system.md index b3815424..b35d5d74 100644 --- a/docs/build-system.md +++ b/docs/build-system.md @@ -211,7 +211,8 @@ The first file found is loaded and applied as the **root config**. When running 1. **CLI options** (highest priority — always win) 2. **Per-file config** (`goccia.toml`, `goccia.json5`, or `goccia.json` nearest to the file being processed) 3. **Root config** (discovered from the entry file's directory at startup, or supplied via `--config`) -4. **System default** (engine defaults) +4. **File extension default** (`.mjs` infers module source) +5. **System default** (engine defaults) **`--config=`** — Override auto-discovery and load the root config from an explicit location. Available on every CLI tool. @@ -228,11 +229,13 @@ The path may be either a **file** (any registered extension — `.json`, `.json5 Relative paths are resolved against the current working directory. A missing file or a directory with no recognised `goccia.*` is a hard error so a typo is not silently ignored. CLI options still take precedence over values from the file, and per-file configs continue to be discovered normally for individual files. +`source-type` follows that same precedence. Without an explicit CLI or config value, `.mjs` entry files are parsed and evaluated as module source; other script extensions default to script source. + ```json { "mode": "bytecode", "source-type": "module", - "asi": true, + "compat-asi": true, "compat-non-strict-mode": true, "compat-loose-equality": true, "compat-traditional-for-loop": true, @@ -265,7 +268,7 @@ This is useful for test subdirectories that need specific flags. For example, `t ```json { - "asi": true + "compat-asi": true } ``` @@ -280,7 +283,7 @@ Likewise, `tests/built-ins/FFI/goccia.json` enables FFI only for the FFI tests: TOML equivalent (`goccia.toml`): ```toml -asi = true +compat-asi = true mode = "bytecode" unsafe-ffi = true timeout = 5000 @@ -349,7 +352,7 @@ printf "const x = 2 + 2; x;" | ./build/GocciaBundler --output=out.gbc ./build/GocciaBundler example.jsx --source-map=out.map # Enable automatic semicolon insertion during parsing -./build/GocciaBundler example.js --asi +./build/GocciaBundler example.js --compat-asi # Parallel compilation (default: CPU count) ./build/GocciaBundler src/ --jobs=4 diff --git a/docs/built-ins.md b/docs/built-ins.md index ce145c0c..5b950fd2 100644 --- a/docs/built-ins.md +++ b/docs/built-ins.md @@ -17,7 +17,7 @@ GocciaScript provides a set of built-in global objects that mirror JavaScript's Core language built-ins (Math, Object, Array, Number, JSON, Symbol, Set, Map, WeakSet, WeakMap, Promise, Temporal, Intl, ArrayBuffer, Proxy, Reflect, etc.) are always registered unconditionally by the engine. -Runtime globals (Console, JSON5, JSONL, TOML, YAML, CSV, TSV, Performance, TextEncoder/TextDecoder, URL, fetch, Headers, Response, SemVer) are registered by runtime extension classes under `source/units/Goccia.RuntimeExtensions.*.pas`. CLI frontends such as `GocciaScriptLoader` and `GocciaREPL` apply `TGocciaLoaderRuntimeProfile`; `GocciaTestRunner` applies the loader runtime profile plus `TGocciaTestingLibraryRuntimeExtension`; `GocciaBenchmarkRunner` applies the loader runtime profile plus `TGocciaBenchmarkRuntimeExtension`. `GocciaScriptLoaderBare` does not attach a runtime and exposes only a CLI-local `print(...args)` helper. +Runtime globals (Console, JSON5, JSONL, TOML, YAML, CSV, TSV, Performance, TextEncoder/TextDecoder, URL, fetch, Headers, Response, SemVer) are registered by runtime extension classes under `source/units/Goccia.RuntimeExtensions.*.pas`. CLI hosts such as `GocciaScriptLoader` and `GocciaREPL` apply `TGocciaLoaderRuntimeProfile`; `GocciaTestRunner` applies the loader runtime profile plus `TGocciaTestingLibraryRuntimeExtension`; `GocciaBenchmarkRunner` applies the loader runtime profile plus `TGocciaBenchmarkRuntimeExtension`. `GocciaScriptLoaderBare` does not attach a runtime and exposes only a CLI-local `print(...args)` helper. FFI is not part of the loader runtime profile. CLI tools install `TGocciaFFIRuntimeExtension` when `--unsafe-ffi` is passed or `"unsafe-ffi": true` is set in config. @@ -53,7 +53,7 @@ Implements the [WHATWG Console Standard](https://developer.mozilla.org/en-US/doc **Output capture:** The console supports an `OutputCallback` hook for capturing output programmatically (see [Embedding — Console Output Capture](embedding.md#console-output-capture)). -Separately, the `TGocciaCLIApplication`-based frontends use `LogCallback` for `--log=`, which writes every console call to the specified file in `[method] line` format while preserving normal stdout output. +Separately, the `TGocciaCLIApplication`-based CLI hosts use `LogCallback` for `--log=`, which writes every console call to the specified file in `[method] line` format while preserving normal stdout output. ### Math (`Goccia.Builtins.Math.pas`) diff --git a/docs/bytecode-vm.md b/docs/bytecode-vm.md index a4caa060..cb9dfb76 100644 --- a/docs/bytecode-vm.md +++ b/docs/bytecode-vm.md @@ -4,7 +4,7 @@ ## Executive Summary -- **Two execution modes** — tree-walk interpreter (default) and bytecode VM (`--mode=bytecode`), sharing the same source frontend, runtime objects, and GC +- **Two execution modes** — tree-walk interpreter (default) and bytecode VM (`--mode=bytecode`), sharing the same source pipeline, runtime objects, and GC - **Executor abstraction** — `TGocciaBytecodeExecutor` implements `TGocciaExecutor` with no dependency on the interpreter or evaluator - **Goccia-owned VM** — executes directly on `TGocciaValue` with tagged `TGocciaRegister` values; not a generic VM layer - **Opcode space** — core instructions (0-127) for hot paths, non-core generic ops (128-166), and semantic/helper instructions (167-255) for colder operations like imports/exports @@ -250,7 +250,7 @@ During code review, the following findings were investigated and determined to b ## Related documents -- [Architecture](architecture.md) — Shared source frontend and both execution modes at a glance +- [Architecture](architecture.md) — Shared source pipeline and both execution modes at a glance - [Interpreter](interpreter.md) — Tree-walk execution (`Goccia.Interpreter`, `Goccia.Evaluator.*`) - [Core patterns](core-patterns.md) — Recurring Pascal conventions - [GocciaScript Context](../CONTEXT.md) — Canonical project terminology diff --git a/docs/decision-log.md b/docs/decision-log.md index 118e7cb3..d8035162 100644 --- a/docs/decision-log.md +++ b/docs/decision-log.md @@ -17,6 +17,10 @@ Chronological record of key architectural and implementation decisions, newest f --- +**2026-05-24** · `parser` — Parser policy now lives behind the source pipeline instead of being repeated at host call sites. `TGocciaSourcePipeline` owns compatibility/source-type mapping and exposes narrow parse entry points for full source, module source, dynamic `Function` validation/wrapping, and expression fragments; module loading consumes a module-specific result rather than the full host-facing parse report. [architecture.md § Overview](architecture.md#overview). [embedding.md § Engine API](embedding.md#engine-api). + +**2026-05-24** · `parser` — ASI now uses the compatibility flag surface as `--compat-asi` / `"compat-asi"` with no legacy alias. Goccia-specific CLI option metadata lives in `Goccia.CLI.Options`, where compatibility flags are table-driven and resolved into the source-pipeline compatibility set; embedders use `TGocciaEngine.Compatibility` rather than per-flag convenience properties. [language.md § Automatic Semicolon Insertion](language.md#automatic-semicolon-insertion). [embedding.md § Preprocessors and Compatibility](embedding.md#preprocessors-and-compatibility). + **2026-05-20** · `parser` — Function declarations use explicit statement nodes. Replaced the temporary `IsFunctionDeclaration` flag on `TGocciaVariableDeclaration` with `TGocciaFunctionDeclaration` and `TGocciaExportFunctionDeclaration`, while keeping function expressions on `TGocciaFunctionExpression`. This keeps declaration paths readable and maintainable, and gives parser, interpreter, bytecode, export, hoisting, and redeclaration logic exact AST semantics instead of inferring declaration intent from variable-declaration shape. **2026-05-18** · `runtime` — Runtime host features are now class-based extensions installed onto `TGocciaRuntimeCore`, rather than a broad runtime-global selector. `GocciaScriptLoader` / `GocciaREPL` apply `TGocciaLoaderRuntimeProfile`; `GocciaTestRunner` layers `TGocciaTestingLibraryRuntimeExtension`; `GocciaBenchmarkRunner` layers `TGocciaBenchmarkRuntimeExtension`; FFI remains an explicit `--unsafe-ffi` extension. Feature-specific APIs such as fetch host restrictions and JSON5/TOML/YAML globals injection live on concrete extensions and are reached through runtime dispatch, keeping the base runtime extension generic and making smaller host surfaces easier to link. [architecture.md](architecture.md#main-layers). [embedding.md](embedding.md#runtime-extensions). @@ -37,7 +41,7 @@ Chronological record of key architectural and implementation decisions, newest f **2026-05-11** · `engine` — Added opt-in loose equality compatibility (`--compat-loose-equality` / `"compat-loose-equality"`). `==` and `!=` remain warning-producing no-ops by default, but when enabled they use the shared ES2026 `IsLooselyEqual` implementation in interpreter and bytecode modes, including string/number/boolean coercion, BigInt mixed comparisons, and object `ToPrimitive`; the bytecode format is bumped to v27 for `OP_LOOSE_EQ` and `OP_LOOSE_NEQ`. [language.md](language.md#loose-equality--and-). -**2026-05-10** · `engine` — Removed the `--compat-all` meta-flag. It was originally added to give test262 a single switch that turns on every `--compat-*` option, but in practice it (a) hides which compatibility surface a given run actually depends on, (b) silently widens its own meaning whenever a new `--compat-*` flag lands, and (c) needs the same fan-out logic kept in sync in three frontends (`GocciaScriptLoaderBare.dpr`, `Goccia.CLI.Application.pas`, `GocciaBundler.dpr`). Consumers now enumerate the specific flags they need; `scripts/run_test262_suite.ts` lists `--compat-var --compat-function --compat-traditional-for-loop` explicitly. The individual compat flags themselves (`--compat-var`, `--compat-function`, `--compat-traditional-for-loop`) and their `goccia.json` keys are unchanged. +**2026-05-10** · `engine` — Removed the `--compat-all` meta-flag. It was originally added to give test262 a single switch that turns on every `--compat-*` option, but in practice it (a) hides which compatibility surface a given run actually depends on, (b) silently widens its own meaning whenever a new `--compat-*` flag lands, and (c) needs the same fan-out logic kept in sync across the CLI hosts (`GocciaScriptLoaderBare.dpr`, `Goccia.CLI.Application.pas`, `GocciaBundler.dpr`). Consumers now enumerate the specific flags they need; `scripts/run_test262_suite.ts` lists `--compat-var --compat-function --compat-traditional-for-loop` explicitly. The individual compat flags themselves (`--compat-var`, `--compat-function`, `--compat-traditional-for-loop`) and their `goccia.json` keys are unchanged. **2026-05-08** · `runtime` — ECMA-402 Intl namespace. Full implementation of the Internationalization API: Intl.Locale, Intl.Collator, Intl.NumberFormat, Intl.DateTimeFormat, Intl.PluralRules, Intl.RelativeTimeFormat, Intl.ListFormat, Intl.DisplayNames, Intl.Segmenter, Intl.DurationFormat, plus Intl.getCanonicalLocales and Intl.supportedValuesOf. Data strategy mirrors Temporal timezone: system ICU library (macOS libicucore, Linux libicui18n, Windows icu.dll shared with Temporal) as primary, embedded CLDR resource as fallback. Shared units in `source/shared/` (ICU.pas, BCP47.pas, IntlTypes.pas, IntlICU.pas, IntlCLDRData.pas, IntlLocaleResolver.pas) provide platform-independent Intl infrastructure. Existing locale stubs on String/Number/Date prototypes wired to Intl formatters. [built-ins-intl.md](built-ins-intl.md). [build-system.md § Generated Intl Data](build-system.md#generated-intl-data). @@ -51,9 +55,9 @@ Chronological record of key architectural and implementation decisions, newest f **2026-05-03** · `bytecode` — Bytecode compilation now has an internal compiler-side constant optimizer for pure primitive folding, primitive `const` propagation, and dead branch/tail removal. The work deliberately stays format-neutral: no new VM opcodes or `.gbc` changes, and coverage mode preserves branch shape so missing branches remain reportable. [bytecode-vm.md § Compiler Optimizer](bytecode-vm.md#compiler-optimizer). -**2026-05-02** · `runtime` · [#493](https://github.com/frostney/GocciaScript/pull/493) — Engine and runtime entry points are split explicitly. `TGocciaEngine` owns language execution, core built-ins, source strings/source lists, and Script-vs-Module entry semantics through `SourceType`; `TGocciaRuntime` owns host/runtime globals, special-purpose opt-ins such as test assertions/benchmarks/FFI, file-backed convenience helpers, and the default filesystem module content provider. `GocciaScriptLoaderBare` remains a core-engine-only frontend that can read file/stdin into source text without attaching runtime globals, and the CLI CI suite now covers that contract. [architecture.md § Main Layers](architecture.md#main-layers). [embedding.md § Engine API](embedding.md#engine-api). +**2026-05-02** · `runtime` · [#493](https://github.com/frostney/GocciaScript/pull/493) — Engine and runtime entry points are split explicitly. `TGocciaEngine` owns language execution, core built-ins, source strings/source lists, and Script-vs-Module entry semantics through `SourceType`; `TGocciaRuntime` owns host/runtime globals, special-purpose opt-ins such as test assertions/benchmarks/FFI, file-backed convenience helpers, and the default filesystem module content provider. `GocciaScriptLoaderBare` remains a core-engine-only CLI host that can read file/stdin into source text without attaching runtime globals, and the CLI CI suite now covers that contract. [architecture.md § Main Layers](architecture.md#main-layers). [embedding.md § Engine API](embedding.md#engine-api). -**2026-04-30** · `runtime` — Strict-types runtime enforcement is now an explicit `--strict-types` CLI / `"strict-types"` config flag (default off) that works in both interpreter and bytecode mode. Previously the bytecode VM implicitly enforced type annotations and the interpreter silently ignored them, with a read-only `Goccia.strictTypes` JS global advertising the mode. The new model: enforcement is opt-in regardless of execution mode, the bytecode compiler gates `OP_CHECK_TYPE` emission on the flag, the interpreter records type hints on lexical bindings (`TLexicalBinding.TypeHint`) and enforces them in `AssignBinding` / variable declaration / parameter binding via the shared `Goccia.Types.Enforcement` unit, and the `Goccia.strictTypes` global is removed in favour of directory-level `goccia.json` config (mirroring `--asi` / `--compat-var`). [language.md § Types as Comments](language.md#types-as-comments-stage-1). +**2026-04-30** · `runtime` — Strict-types runtime enforcement is now an explicit `--strict-types` CLI / `"strict-types"` config flag (default off) that works in both interpreter and bytecode mode. Previously the bytecode VM implicitly enforced type annotations and the interpreter silently ignored them, with a read-only `Goccia.strictTypes` JS global advertising the mode. The new model: enforcement is opt-in regardless of execution mode, the bytecode compiler gates `OP_CHECK_TYPE` emission on the flag, the interpreter records type hints on lexical bindings (`TLexicalBinding.TypeHint`) and enforces them in `AssignBinding` / variable declaration / parameter binding via the shared `Goccia.Types.Enforcement` unit, and the `Goccia.strictTypes` global is removed in favour of directory-level `goccia.json` config (mirroring `--compat-asi` / `--compat-var`). [language.md § Types as Comments](language.md#types-as-comments-stage-1). **2026-04-29** · `parser` — Parser hot paths now avoid repeated cursor-helper and chained `Match(...)` dispatch in `Advance`, `Check`, `Match`, remaining expression operators, call/member continuations, and primary expressions. Same-corpus production timing with `GocciaScriptLoader --output=json` showed 35.1-49.1% parser-phase improvements versus clean `HEAD`, so this supersedes the narrower binary-only parser optimization while keeping recursive descent and avoiding parser unit splits. [spikes/parser-hot-dispatch-performance.md](spikes/parser-hot-dispatch-performance.md). diff --git a/docs/embedding.md b/docs/embedding.md index 7c261688..a5d76778 100644 --- a/docs/embedding.md +++ b/docs/embedding.md @@ -47,7 +47,9 @@ These helpers create, execute, and clean up in a single call. The `TGocciaEngine | `TGocciaRuntime.RunScriptFromStringList(Source, FileName)` | Execute from a `TStringList` through the runtime layer | All methods return `TGocciaScriptResult` — a record containing the result value, per-phase timing (in microseconds), and the filename. -`SourceType` is an engine-level language option, not a runtime option. Set `Engine.SourceType` (or use the CLI `--source-type=script|module`) to choose script source or module source for the entry file. File loading is separate: `TGocciaEngine` one-shot helpers accept source text or caller-provided `TStringList` instances only, while `TGocciaRuntime.RunScriptFromFile` is the runtime convenience API for loading an entry file. +`SourceType` is an engine-level language option, not a runtime option. Set `Engine.SourceType` (or use the CLI `--source-type=script|module`) to choose script source or module source for the entry file. File names ending in `.mjs` infer module source unless an explicit source type is provided. File loading is separate: `TGocciaEngine` one-shot helpers accept source text or caller-provided `TStringList` instances only, while `TGocciaRuntime.RunScriptFromFile` is the runtime convenience API for loading an entry file. + +`TGocciaEngine.Execute` remains the public "run the whole source pipeline and execute" API for embedders. Hosts that need parse artifacts without executing can call `TGocciaSourcePipeline.Parse` directly; its result object owns the AST and source map until the caller frees the result or transfers ownership with `TakeProgramNode` / `TakeSourceMap`. Hosts should use the source-pipeline entry points for module source, dynamic `Function` validation, and expression fragments rather than constructing `TGocciaParser` directly; this keeps parser policy in one place. ### Instance Usage (Long-Lived Engine) @@ -98,13 +100,13 @@ Callers must pass an explicit executor — `TGocciaInterpreterExecutor` (in `Goc ### Automatic Semicolon Insertion -ASI is disabled by default. To enable ECMAScript-compliant automatic semicolon insertion (ES2026 §12.10), set the `ASIEnabled` property after creating the engine: +ASI is disabled by default. To enable ECMAScript-compliant automatic semicolon insertion (ES2026 §12.10), include `cfASI` in the engine compatibility set after creating the engine: ```pascal Executor := TGocciaInterpreterExecutor.Create; try Engine := TGocciaEngine.Create('app.js', Source, Executor); - Engine.ASIEnabled := True; // Semicolons are now optional per ES2026 rules + Engine.Compatibility := [cfASI]; // Semicolons are now optional per ES2026 rules Engine.Execute; finally Engine.Free; @@ -204,7 +206,7 @@ Scripts can then import using the alias: import { formatDate } from "@/utils/dates"; ``` -`TGocciaModuleResolver` also exposes `LoadImportMap(path)` and `DiscoverProjectConfig(startDirectory)` helpers for browser-style import map JSON and `goccia.json` project configuration files. The shared CLI frontends (`GocciaScriptLoader`, `GocciaTestRunner`, and `GocciaBenchmarkRunner`) all use `Goccia.Modules.Configuration.ConfigureModuleResolver(...)` on top of this resolver surface. +`TGocciaModuleResolver` also exposes `LoadImportMap(path)` and `DiscoverProjectConfig(startDirectory)` helpers for browser-style import map JSON and `goccia.json` project configuration files. The shared CLI hosts (`GocciaScriptLoader`, `GocciaTestRunner`, and `GocciaBenchmarkRunner`) all use `Goccia.Modules.Configuration.ConfigureModuleResolver(...)` on top of this resolver surface. **Config file discovery is automatic for CLI apps** — `TGocciaCLIApplication` discovers `goccia.toml` / `goccia.json5` / `goccia.json` (priority order: TOML > JSON5 > JSON) from the entry file's directory upward and applies config values before execution. When embedding the engine directly, this does not happen automatically. To replicate it, use the general-purpose `CLI.ConfigFile` unit (`DiscoverConfigFile`, `ApplyConfigFile`). Note that `ApplyConfigFile` only handles `.json` by default — to support `.json5` and `.toml`, register their parsers first via `RegisterConfigParser` (see `Goccia.CLI.Application.pas` for the pattern). For import-map resolution only, use `TGocciaModuleResolver.DiscoverProjectConfig` and `LoadImportMap`. See [Configuration File](build-system.md#configuration-file-gocciajson) for the full reference. @@ -439,7 +441,7 @@ ConsoleExtension.BuiltinConsole.LogCallback := MyHandler.OnLog; ConsoleExtension.BuiltinConsole.Enabled := False; // no stdout, but LogCallback still fires ``` -The CLI frontends based on `TGocciaCLIApplication` (ScriptLoader, TestRunner, BenchmarkRunner, and REPL) apply a runtime profile and use `LogCallback` internally for `--log=`, which captures console output to a log file in `[method] line` format. The TestRunner silences workers via `Enabled := False` (not by replacing JS methods), so `LogCallback` fires on every console call even in parallel mode. File writes are serialized with a critical section so `--log` is thread-safe even with `--jobs=N`. +The CLI hosts based on `TGocciaCLIApplication` (ScriptLoader, TestRunner, BenchmarkRunner, and REPL) apply a runtime profile and use `LogCallback` internally for `--log=`, which captures console output to a log file in `[method] line` format. The TestRunner silences workers via `Enabled := False` (not by replacing JS methods), so `LogCallback` fires on every console call even in parallel mode. File writes are serialized with a critical section so `--log` is thread-safe even with `--jobs=N`. ## Built-in Registration @@ -505,29 +507,28 @@ Runtime globals can be reduced by installing only a concrete extension, for exam |--------|------|---------|---------| | `Preprocessors` | `TGocciaPreprocessors` | `[ppJSX]` | Source transformations before parsing | | `Compatibility` | `TGocciaCompatibilityFlags` | `[]` | Parser behavior toggles | -| `SourceType` | `TGocciaSourceType` | `stScript` | Load entry as script source (default) or module source | +| `SourceType` | `TGocciaSourceType` | `stScript` | Load entry as script source (default) or module source; `.mjs` file names infer `stModule` | | `StrictTypes` | `Boolean` | `False` | Runtime enforcement of type annotations (works in both interpreter and bytecode); setter propagates to the active executor and interpreter scope | -| `NonStrictModeEnabled` | `Boolean` | `False` | Enables script source compatibility semantics for `arguments`, `with`, silent assignment failures, legacy `delete` return values, and regular-function nullish `this`; module source remains strict | -| `TraditionalForLoopsEnabled` | `Boolean` | `False` | Enables traditional `for(init; test; update)` compatibility semantics | -| `WhileLoopsEnabled` | `Boolean` | `False` | Enables `while` and `do...while` compatibility semantics | ```pascal Executor := TGocciaInterpreterExecutor.Create; try Engine := TGocciaEngine.Create('app.js', Source, Executor); Engine.Preprocessors := []; // Disable JSX - Engine.ASIEnabled := True; // Enable ASI (convenience for cfASI) + Engine.Compatibility := [ + cfASI, + cfNonStrictMode, + cfTraditionalFor, + cfWhileLoops + ]; // Enable selected compatibility semantics Engine.SourceType := stModule; // Run entry as module source (top-level this is undefined; import.meta resolves) - Engine.NonStrictModeEnabled := True; // Enable selected non-strict compatibility semantics - Engine.TraditionalForLoopsEnabled := True; // Enable traditional for-loop compatibility - Engine.WhileLoopsEnabled := True; // Enable while/do-while compatibility Engine.StrictTypes := True; // Enforce type annotations in both execution modes finally Executor.Free; end; ``` -When `SourceType` is `stModule`, `Execute` runs the entry program in a fresh module scope (`skModule`) with `this = undefined`, mirroring the semantics imported modules already receive from the module loader (ES2026 §16.2.1.6.4). The CLI surface for this is `--source-type=script|module` and the matching `goccia.json` key `"source-type"`. +When `SourceType` is `stModule`, `Execute` runs the entry program in a fresh module scope (`skModule`) with `this = undefined`, mirroring the semantics imported modules already receive from the module loader (ES2026 §16.2.1.6.4). The CLI surface for this is `--source-type=script|module` and the matching `goccia.json` key `"source-type"`. Without an explicit source type, `.mjs` entry files are loaded as module source. **Top-level binding persistence differs between source types.** With `SourceType = stScript`, the engine reuses `Interpreter.GlobalScope` across every call to `Execute`, which is what makes the [long-lived engine pattern](#instance-usage-long-lived-engine) above work: `const x = 42` defined in one `Execute` is visible to the next. With `SourceType = stModule`, each `Execute` allocates a brand-new `skModule` child scope, so top-level `let`/`const`/`class` declarations live and die with that single call. If callers need cross-`Execute` persistence, keep `SourceType` at `stScript` (the default) or expose the desired symbols through the global scope (e.g. `Engine.RegisterGlobal(...)` or `Engine.Interpreter.GlobalScope.DefineLexicalBinding(...)`). @@ -926,7 +927,7 @@ The repository includes five embedding examples: | `GocciaREPL` | `source/app/GocciaREPL.dpr` | Interactive read-eval-print loop (long-lived engine) | | `GocciaTestRunner` | `source/app/GocciaTestRunner.dpr` | Runs test suites with the test-runner runtime profile | | `GocciaBenchmarkRunner` | `source/app/GocciaBenchmarkRunner.dpr` | Runs benchmarks with the benchmark-runner runtime profile from files or stdin | -| `GocciaBundler` | `source/app/GocciaBundler.dpr` | Bundler CLI frontend — compiles source files to `.gbc` without execution | +| `GocciaBundler` | `source/app/GocciaBundler.dpr` | Bundler CLI host — compiles source files to `.gbc` without execution | These serve as reference implementations for the patterns described above. diff --git a/docs/interpreter.md b/docs/interpreter.md index da394a9f..893f9658 100644 --- a/docs/interpreter.md +++ b/docs/interpreter.md @@ -94,7 +94,7 @@ Scopes form a tree with parent pointers, implementing lexical scoping: - **`OnError` on scopes** — Each scope carries a reference to the error handler callback, inherited from its parent. This allows closures and callbacks to always find the correct error handler without global state. - **Temporal Dead Zone** — `let`/`const` bindings are registered before initialization, enforcing TDZ semantics (accessing before `=` throws `ReferenceError`). - **Module scope isolation** — Modules execute in `skModule` scopes (children of the global scope), preventing module-internal variables from leaking into the global scope. -- **Module path resolution** — `TGocciaModuleResolver` handles alias expansion via its inherited `Resolve` method using import-map semantics (exact match for keys without `/`, prefix match for keys with `/`, longest matching key wins), resolves `./` and `../` paths relative to the importing file's directory, tries the shared module import extensions (`.js`, `.jsx`, `.ts`, `.tsx`, `.mjs`, `.json`, `.json5`, `.jsonl`, `.toml`, `.yaml`, `.yml`, `.txt`, `.md`) and index files for extensionless imports, then expands to an absolute path. `TGocciaModuleResolver.LoadImportMap` resolves import-map values relative to the map file and `DiscoverProjectConfig` walks parent directories looking for `goccia.json`. CLI applications also discover a project-level `goccia.toml`, `goccia.json5`, or `goccia.json` (in that priority order) starting from the entry file's directory via `CLI.ConfigFile.DiscoverConfigFile`. Config keys mirror CLI option names (for example, `mode`, `asi`, `timeout`), and CLI options override config values. Config files support `"extends"` to inherit from a base config, enabling per-directory overrides (e.g. `tests/language/asi/goccia.json` enables ASI for that subtree). Absolute paths are used as cache keys to prevent loading the same file via different relative paths. Global modules (bare specifiers registered via `Engine.RegisterGlobalModule`) are checked before the resolver runs. Custom resolvers can be injected by subclassing `TGocciaModuleResolver` and overriding the `Resolve` method. +- **Module path resolution** — `TGocciaModuleResolver` handles alias expansion via its inherited `Resolve` method using import-map semantics (exact match for keys without `/`, prefix match for keys with `/`, longest matching key wins), resolves `./` and `../` paths relative to the importing file's directory, tries the shared module import extensions (`.js`, `.jsx`, `.ts`, `.tsx`, `.mjs`, `.json`, `.json5`, `.jsonl`, `.toml`, `.yaml`, `.yml`, `.txt`, `.md`) and index files for extensionless imports, then expands to an absolute path. `TGocciaModuleResolver.LoadImportMap` resolves import-map values relative to the map file and `DiscoverProjectConfig` walks parent directories looking for `goccia.json`. CLI applications also discover a project-level `goccia.toml`, `goccia.json5`, or `goccia.json` (in that priority order) starting from the entry file's directory via `CLI.ConfigFile.DiscoverConfigFile`. Config keys mirror CLI option names (for example, `mode`, `compat-asi`, `timeout`), and CLI options override config values. Config files support `"extends"` to inherit from a base config, enabling per-directory overrides (e.g. `tests/language/asi/goccia.json` enables ASI for that subtree). Absolute paths are used as cache keys to prevent loading the same file via different relative paths. Global modules (bare specifiers registered via `Engine.RegisterGlobalModule`) are checked before the resolver runs. Custom resolvers can be injected by subclassing `TGocciaModuleResolver` and overriding the `Resolve` method. - **Circular dependency handling** — Modules are added to the cache (`FModules`) before execution and to a loading set (`FLoadingModules`) for the duration. If a circular import is encountered, the partially-populated module is returned from cache. Inline exports (`export const`) that execute before the circular import point are available; `export { x }` declarations processed post-execution are not. This matches the observable behavior of ES module live bindings for the common case. - **Namespace imports** — `import * as ns from "./module.js"` now materializes a namespace object from `TGocciaModule.ExportsTable` instead of being skipped by the parser. The namespace object is created with a null prototype, populated with enumerable read-only data properties for each export, then frozen before binding. The result is an import-time snapshot rather than a live export mirror, which keeps namespace imports lightweight while matching the expected read-only shape for both JavaScript modules and structured-data modules. - **JSON module imports** — Files ending in `.json` are handled by `LoadJsonModule`, which parses the file via `TGocciaJSONParser` (`Goccia.JSON` unit) and exposes each top-level object key as a named export. JSON modules bypass the lexer/parser/evaluator pipeline entirely, keeping the import path unified (`import { key } from "./file.json"`). Non-object JSON root values (arrays, primitives) produce a module with no exports. JSON modules participate in the same caching and path resolution as JS modules. @@ -178,7 +178,7 @@ For fetch-backed Promises, these integration points also pump fetch completions ## Related documents -- [Architecture](architecture.md) — Shared source frontend, both execution modes, main layers, design direction +- [Architecture](architecture.md) — Shared source pipeline, both execution modes, main layers, design direction - [Bytecode VM](bytecode-vm.md) — Compiler output, opcodes, `TGocciaVM` - [Core patterns](core-patterns.md) — Recurring implementation patterns - [GocciaScript Context](../CONTEXT.md) — Canonical project terminology diff --git a/docs/language-tables.md b/docs/language-tables.md index d5d28463..0551d944 100644 --- a/docs/language-tables.md +++ b/docs/language-tables.md @@ -25,7 +25,7 @@ | `while` / `do...while` | ES1 | Opt-in for JavaScript compatibility (`--compat-while-loops`); disabled by default | | `with` statement | ES1 | Opt-in for script source (`--compat-non-strict-mode`) for compatibility with object-environment lookup, `Symbol.unscopables`, closure capture, method-call receivers, and non-strict write failures — prefer explicit property access | | `delete` non-strict return values | ES1 | Strict by default; script source `--compat-non-strict-mode` makes `delete identifier` handle declared bindings, configurable global object properties, and unresolvable names with legacy booleans; non-configurable property deletion returns `false` | -| ASI (automatic semicolon insertion) | ES1 | Opt-in (`--asi`) | +| ASI (automatic semicolon insertion) | ES1 | Opt-in (`--compat-asi`) | | Global `parseInt`, `parseFloat`, `isNaN`, `isFinite` | ES1 | Excluded — use `Number.*` | | `let` / `const` | ES2015 | Supported | | Arrow functions | ES2015 | Supported | diff --git a/docs/language.md b/docs/language.md index 5456097d..99a8905e 100644 --- a/docs/language.md +++ b/docs/language.md @@ -9,7 +9,7 @@ - **TC39 proposals** — Decorators, decorator metadata, pattern matching, types as comments, enums, `Math.clamp` - **Excluded by design** — `eval`, wildcard re-exports - **Graceful handling** — Parser-recognized excluded or disabled syntax (`==`/`!=` when `--compat-loose-equality` is off, `while`/`do...while` when `--compat-while-loops` is off, `with` when `--compat-non-strict-mode` is off, traditional `for(;;)` when `--compat-traditional-for-loop` is off) parses successfully but executes as a no-op with a warning and suggestion -- **Opt-in toggles** — ASI (`--asi`), `var` declarations (`--compat-var`), `function` keyword (`--compat-function`), non-strict Script compatibility (`--compat-non-strict-mode` for `arguments`, `with`, silent assignment failures, legacy `delete` returns, and sloppy `this`), loose equality (`--compat-loose-equality`), traditional `for(init; test; update)` loops (`--compat-traditional-for-loop`), `while`/`do...while` loops (`--compat-while-loops`), runtime type enforcement (`--strict-types`) +- **Opt-in toggles** — ASI (`--compat-asi`), `var` declarations (`--compat-var`), `function` keyword (`--compat-function`), non-strict Script compatibility (`--compat-non-strict-mode` for `arguments`, `with`, silent assignment failures, legacy `delete` returns, and sloppy `this`), loose equality (`--compat-loose-equality`), traditional `for(init; test; update)` loops (`--compat-traditional-for-loop`), `while`/`do...while` loops (`--compat-while-loops`), runtime type enforcement (`--strict-types`) - **Default preprocessors** — JSX (enabled by default via `DefaultPreprocessors`) GocciaScript implements a curated subset of ECMAScript. This document details what's supported, what's excluded, and the rationale for each decision. For quick-reference tables of every feature and TC39 proposal, see [Language Tables](language-tables.md). @@ -160,7 +160,7 @@ const fn = async () => { ### Modules -ES module syntax with default, named, and namespace imports/exports. Project code convention prefers named exports for internal modules, but default imports and exports are language-supported. Supported source file extensions: `.js`, `.jsx`, `.ts`, `.tsx`, `.mjs`. Structured-data imports are also supported for `.json`, `.json5`, `.jsonl`, `.toml`, `.yaml`, `.yml`, `.csv`, and `.tsv`, and text-asset imports are supported for `.txt` and `.md`. Module paths are resolved relative to the importing file. File extensions can be omitted — the resolver tries source, structured-data, and text-asset extensions in order. Directory imports resolve to `index` files. The CLI tools support WHATWG-style import maps through `--import-map=`, `--alias key=value`, and implicit `goccia.json` discovery. +ES module syntax with default, named, and namespace imports/exports. Project code convention prefers named exports for internal modules, but default imports and exports are language-supported. Supported source file extensions: `.js`, `.jsx`, `.ts`, `.tsx`, `.mjs`; `.mjs` entry files default to module source. Structured-data imports are also supported for `.json`, `.json5`, `.jsonl`, `.toml`, `.yaml`, `.yml`, `.csv`, and `.tsv`, and text-asset imports are supported for `.txt` and `.md`. Module paths are resolved relative to the importing file. File extensions can be omitted — the resolver tries source, structured-data, and text-asset extensions in order. Directory imports resolve to `index` files. The CLI tools support WHATWG-style import maps through `--import-map=`, `--alias key=value`, and implicit `goccia.json` discovery. ```javascript // Named imports (with or without extension) @@ -656,7 +656,7 @@ console.log(x); // 5 With `let`/`const`, accessing before declaration is a `ReferenceError` (Temporal Dead Zone), which catches bugs early. -When enabled (CLI: `--compat-var`, engine API: `Engine.VarEnabled := True`, config: `{"compat-var": true}`), `var` declarations follow ES2026 §14.3.2 semantics: function-scoped (escapes blocks), hoisted to function top as `undefined`, redeclaration allowed, no TDZ, with destructuring and for-of support. Var bindings are stored in a separate binding map (`FVarBindings`) on function/module/global scopes, distinct from lexical bindings. See [interpreter.md § Scope Chain Design](interpreter.md#scope-chain-design). +When enabled (CLI: `--compat-var`, engine API: include `cfVar` in `Engine.Compatibility`, config: `{"compat-var": true}`), `var` declarations follow ES2026 §14.3.2 semantics: function-scoped (escapes blocks), hoisted to function top as `undefined`, redeclaration allowed, no TDZ, with destructuring and for-of support. Var bindings are stored in a separate binding map (`FVarBindings`) on function/module/global scopes, distinct from lexical bindings. See [interpreter.md § Scope Chain Design](interpreter.md#scope-chain-design). ### `function` Keyword @@ -677,7 +677,7 @@ GocciaScript provides two function definition styles that cover most use cases w - **Arrow functions** (`(x) => x + 1`) — Lexical `this`, no hoisting, no own `arguments`. Use for standalone functions, callbacks, and closures. - **Shorthand methods** (`method() {}`) — Call-site `this`. Use in object literals and class definitions where `this` binding is needed. -When enabled (CLI: `--compat-function`, engine API: `Engine.FunctionEnabled := True`, config: `{"compat-function": true}`), `function` declarations and expressions are supported. Their implicit `arguments` object still requires `--compat-non-strict-mode`. +When enabled (CLI: `--compat-function`, engine API: include `cfFunction` in `Engine.Compatibility`, config: `{"compat-function": true}`), `function` declarations and expressions are supported. Their implicit `arguments` object still requires `--compat-non-strict-mode`. - **Function declarations** (`function name(params) { body }`) parse as `TGocciaFunctionDeclaration` nodes whose body is backed by `TGocciaFunctionExpression`, which produces call-site `this` binding (not lexical). Declarations are hoisted: both the name and the function value are available before the declaration is reached, matching ES2026 §15.2.6 semantics. Uses the same var binding infrastructure (`DefineVariableBinding`) as `--compat-var`. - **Function expressions** (`const f = function(params) { body }`) parse as `TGocciaFunctionExpression` nodes. Named function expressions (`const f = function g(params) { body }`) create a read-only self-binding of the name (`g`) visible only inside the function body for recursion, matching ES2026 §15.2.4 semantics. @@ -687,7 +687,7 @@ When enabled (CLI: `--compat-function`, engine API: `Engine.FunctionEnabled := T ### Loose Equality (`==` and `!=`) -**Opt-in.** Excluded by default; use `===` and `!==` unless you are running compatibility code. Available via `--compat-loose-equality` (CLI flag, `Engine.LooseEqualityEnabled`, or `{"compat-loose-equality": true}` in config). +**Opt-in.** Excluded by default; use `===` and `!==` unless you are running compatibility code. Available via `--compat-loose-equality` (CLI flag, `cfLooseEquality` in `Engine.Compatibility`, or `{"compat-loose-equality": true}` in config). When enabled, `==` and `!=` follow [ES2026 §7.2.13 IsLooselyEqual](https://tc39.es/ecma262/2026/multipage/abstract-operations.html#sec-islooselyequal) in both interpreter and bytecode modes, including `null == undefined`, string/number coercion, boolean-to-number coercion, BigInt/string and BigInt/number comparisons, and object `ToPrimitive` conversion. @@ -720,7 +720,7 @@ Strict equality requires matching types, eliminating this entire class of bugs. ### `arguments` Object -**Opt-in for script source.** Excluded by default; prefer rest parameters. Available via `--compat-non-strict-mode` (CLI flag, `Engine.NonStrictModeEnabled`, or `{"compat-non-strict-mode": true}` in config). Module source remains strict even when this flag is enabled. When enabled in script source, ordinary functions, shorthand methods, accessors, and generators create an unmapped, array-like `arguments` object whose indexed entries and `length` reflect the call's argument list without aliasing parameter variables. Arrow functions do not create their own `arguments`; they resolve it lexically from the nearest enclosing ordinary function or method that has one. `arguments` is an ordinary identifier, not a reserved keyword, so parameters or body-level lexical declarations named `arguments` shadow the implicit object. +**Opt-in for script source.** Excluded by default; prefer rest parameters. Available via `--compat-non-strict-mode` (CLI flag, `cfNonStrictMode` in `Engine.Compatibility`, or `{"compat-non-strict-mode": true}` in config). Module source remains strict even when this flag is enabled. When enabled in script source, ordinary functions, shorthand methods, accessors, and generators create an unmapped, array-like `arguments` object whose indexed entries and `length` reflect the call's argument list without aliasing parameter variables. Arrow functions do not create their own `arguments`; they resolve it lexically from the nearest enclosing ordinary function or method that has one. `arguments` is an ordinary identifier, not a reserved keyword, so parameters or body-level lexical declarations named `arguments` shadow the implicit object. ### Automatic Semicolon Insertion @@ -738,9 +738,9 @@ GocciaScript requires explicit semicolons by default, preventing this class of b ```bash # Enable ASI via CLI, or use a subtree goccia.json for tests -./build/GocciaScriptLoader example.js --asi +./build/GocciaScriptLoader example.js --compat-asi ./build/GocciaTestRunner tests/language/asi -./build/GocciaREPL --asi +./build/GocciaREPL --compat-asi ``` ```pascal @@ -749,7 +749,7 @@ Executor := TGocciaInterpreterExecutor.Create; try Engine := TGocciaEngine.Create(FileName, Source, Executor); try - Engine.ASIEnabled := True; + Engine.Compatibility := [cfASI]; Engine.Execute; finally Engine.Free; @@ -767,7 +767,7 @@ When enabled, GocciaScript follows the ECMAScript ASI rules (ES2026 §12.10): ### Traditional `for(init; test; update)` Loop -**Opt-in for JavaScript compatibility.** Excluded by default. Available via `--compat-traditional-for-loop` (CLI flag, `Engine.TraditionalForLoopsEnabled`, or `{"compat-traditional-for-loop": true}` in config) when a program or conformance suite needs ECMAScript `for(init; test; update)` semantics. +**Opt-in for JavaScript compatibility.** Excluded by default. Available via `--compat-traditional-for-loop` (CLI flag, `cfTraditionalFor` in `Engine.Compatibility`, or `{"compat-traditional-for-loop": true}` in config) when a program or conformance suite needs ECMAScript `for(init; test; update)` semantics. When disabled (default), the parser accepts the syntax but treats it as a no-op and emits a warning. When enabled, `for(init; test; update) body` is fully supported in both interpreter and bytecode modes: @@ -791,7 +791,7 @@ items.reduce((acc, item) => acc + item, 0); ### `while` and `do...while` -**Opt-in for JavaScript compatibility.** Excluded by default. Available via `--compat-while-loops` (CLI flag, `Engine.WhileLoopsEnabled`, or `{"compat-while-loops": true}` in config) when a program or conformance suite needs ECMAScript `while` or `do...while` semantics. +**Opt-in for JavaScript compatibility.** Excluded by default. Available via `--compat-while-loops` (CLI flag, `cfWhileLoops` in `Engine.Compatibility`, or `{"compat-while-loops": true}` in config) when a program or conformance suite needs ECMAScript `while` or `do...while` semantics. When disabled (default), the parser accepts `while` and `do...while` syntax but treats each loop as a no-op and emits a warning. When enabled, both loop forms are supported in interpreter and bytecode modes: @@ -816,7 +816,7 @@ do { ### `with` Statement -**Opt-in for script source.** Excluded by default; use explicit property access. Available via `--compat-non-strict-mode` (CLI flag, `Engine.NonStrictModeEnabled`, or `{"compat-non-strict-mode": true}` in config). Module source remains strict even when this flag is enabled. When enabled in script source, `with (object) statement` evaluates the object expression, converts it with `ToObject`, and resolves unqualified identifiers through that object before falling back to outer lexical scopes. `Symbol.unscopables` is honored. Calls to functions resolved through the object environment use that object as `this`, closures created inside the body retain the object environment, and writes through non-writable or setter-less object properties silently keep the original value instead of throwing. When disabled (default), the parser accepts the syntax but treats the statement as a no-op and emits a warning suggesting explicit property access or the flag. `with` creates ambiguous scope and is forbidden by JavaScript strict mode, so new GocciaScript code should prefer explicit property access. The keyword is reserved (it cannot be used as a variable name), but it can be used as a property name (for example, `obj.with`). +**Opt-in for script source.** Excluded by default; use explicit property access. Available via `--compat-non-strict-mode` (CLI flag, `cfNonStrictMode` in `Engine.Compatibility`, or `{"compat-non-strict-mode": true}` in config). Module source remains strict even when this flag is enabled. When enabled in script source, `with (object) statement` evaluates the object expression, converts it with `ToObject`, and resolves unqualified identifiers through that object before falling back to outer lexical scopes. `Symbol.unscopables` is honored. Calls to functions resolved through the object environment use that object as `this`, closures created inside the body retain the object environment, and writes through non-writable or setter-less object properties silently keep the original value instead of throwing. When disabled (default), the parser accepts the syntax but treats the statement as a no-op and emits a warning suggesting explicit property access or the flag. `with` creates ambiguous scope and is forbidden by JavaScript strict mode, so new GocciaScript code should prefer explicit property access. The keyword is reserved (it cannot be used as a variable name), but it can be used as a property name (for example, `obj.with`). ### Non-Strict Assignment Semantics diff --git a/docs/spikes/lexer-performance-simplification.md b/docs/spikes/lexer-performance-simplification.md index bf48d50c..b2a3fadd 100644 --- a/docs/spikes/lexer-performance-simplification.md +++ b/docs/spikes/lexer-performance-simplification.md @@ -146,6 +146,6 @@ Final verification after the lexer and docs work: ./build.pas clean tests ./build/Goccia.Lexer.Test ./build.pas clean testrunner -./build/GocciaTestRunner tests --asi --unsafe-ffi --no-progress +./build/GocciaTestRunner tests --compat-asi --unsafe-ffi --no-progress git diff --check ``` diff --git a/docs/spikes/parser-hot-dispatch-performance.md b/docs/spikes/parser-hot-dispatch-performance.md index 5f515daf..4fdda694 100644 --- a/docs/spikes/parser-hot-dispatch-performance.md +++ b/docs/spikes/parser-hot-dispatch-performance.md @@ -88,7 +88,7 @@ This was not strong enough to claim as a standalone optimization. It stayed in t ## Final Dispatch Map -Twenty production runs per case. Values are median parser phase duration from `GocciaScriptLoader --output=json --asi`. +Twenty production runs per case. Values are median parser phase duration from `GocciaScriptLoader --output=json --compat-asi`. The baseline loader was built from a temporary detached clean `HEAD` worktree. The final loader was built from this parser branch. Both loaders parsed the same generated files, with runs alternated to reduce ordering bias. diff --git a/docs/testing.md b/docs/testing.md index 8ba9f056..afbad685 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -378,7 +378,7 @@ Pascal unit tests (`*.Test.pas`) exist as a tertiary layer for behavior that can The `GocciaTestRunner` program: 1. Scans the provided path for `.js`, `.jsx`, `.ts`, `.tsx`, and `.mjs` files. -2. For each file, creates a fresh `TGocciaEngine`, attaches `TGocciaRuntimeCore`, applies the test-runner runtime profile, and installs the FFI runtime extension when `--unsafe-ffi` or the file's `goccia.json` enables it. +2. For each file, creates a fresh `TGocciaEngine`, applies source type from CLI/config or `.mjs` inference, attaches `TGocciaRuntimeCore`, applies the test-runner runtime profile, and installs the FFI runtime extension when `--unsafe-ffi` or the file's `goccia.json` enables it. 3. Loads the source and appends a `runTests()` call. 4. Executes the script — `describe`/`test` blocks register themselves during execution. Nested `describe` blocks are supported; suite names are composed with ` > ` separators (e.g., `"Outer > Inner"`). Skip state is inherited by nested describes. 5. `runTests()` executes all registered tests and collects results. diff --git a/scripts/fetch-e2e.sh b/scripts/fetch-e2e.sh index 9c6b2849..b2e36ea0 100755 --- a/scripts/fetch-e2e.sh +++ b/scripts/fetch-e2e.sh @@ -37,7 +37,7 @@ echo "" run_js() { echo "$1" > "$TMPFILE" - "$LOADER" "$TMPFILE" --asi 2>&1 + "$LOADER" "$TMPFILE" --compat-asi 2>&1 } check() { diff --git a/scripts/run_test262_suite.ts b/scripts/run_test262_suite.ts index ffac97cc..95c85ef5 100644 --- a/scripts/run_test262_suite.ts +++ b/scripts/run_test262_suite.ts @@ -672,7 +672,7 @@ interface PerTestRecord { // directives and modules decide strict semantics, while the flag exposes // compatibility-gated syntax and implicit objects needed by the corpus. const TEST262_BARE_FLAGS: readonly string[] = [ - "--asi", + "--compat-asi", "--compat-var", "--compat-function", "--compat-traditional-for-loop", diff --git a/scripts/test-cli-apps.ts b/scripts/test-cli-apps.ts index 60d6e82d..f1e247a6 100644 --- a/scripts/test-cli-apps.ts +++ b/scripts/test-cli-apps.ts @@ -498,6 +498,33 @@ console.log("Bare Loader: module source type..."); if (proc.stdout.toString().trim() !== "true") throw new Error(`Bare module source expected true, got: ${proc.stdout.toString()}`); } +console.log("Bare Loader: .mjs module inference..."); +{ + const tmp = makeTmp(); + try { + const file = join(tmp, "entry.mjs"); + writeFileSync(file, "this === undefined;\n"); + + const proc = Bun.spawnSync([BARE, "--print", file], { + stdout: "pipe", + stderr: "pipe", + }); + if (proc.exitCode !== 0) throw new Error(`Bare .mjs source exited ${proc.exitCode}: ${proc.stderr.toString()}`); + if (proc.stdout.toString().trim() !== "true") throw new Error(`Bare .mjs source expected true, got: ${proc.stdout.toString()}`); + + const scriptOverride = Bun.spawnSync([BARE, "--print", file, "--source-type=script"], { + stdout: "pipe", + stderr: "pipe", + }); + if (scriptOverride.exitCode !== 0) + throw new Error(`Bare .mjs script override exited ${scriptOverride.exitCode}: ${scriptOverride.stderr.toString()}`); + if (scriptOverride.stdout.toString().trim() !== "false") + throw new Error(`Bare .mjs script override expected false, got: ${scriptOverride.stdout.toString()}`); + } finally { + clean(tmp); + } +} + // --mode option: bare loader defaults to interpreter mode; both values must execute. console.log("Bare Loader: --mode=interpreted..."); { @@ -1655,7 +1682,7 @@ console.log("REPL: expression evaluation..."); console.log("REPL: ASI mode..."); { - const out = await $`printf 'const x = 5\nx\n' | ${REPL} --asi 2>&1`.text(); + const out = await $`printf 'const x = 5\nx\n' | ${REPL} --compat-asi 2>&1`.text(); if (!out.includes("5")) throw new Error(`ASI mode should produce 5, got: ${out}`); } @@ -1701,7 +1728,7 @@ console.log("Loader: HTTPS fetch smoke with --allowed-host..."); { const { exitCode, json, stderr } = runLoaderJson( 'const response = await fetch("https://www.gstatic.com/generate_204", { method: "HEAD" });\nresponse.status;\n', - ["--asi", "--allowed-host=www.gstatic.com"], + ["--compat-asi", "--allowed-host=www.gstatic.com"], { timeout: 10_000 }, ); if (exitCode !== 0) throw new Error(`HTTPS fetch should exit 0, got ${exitCode}: ${stderr}`); diff --git a/scripts/test-cli-config.ts b/scripts/test-cli-config.ts index 0cbadb16..e581cc1f 100644 --- a/scripts/test-cli-config.ts +++ b/scripts/test-cli-config.ts @@ -65,7 +65,7 @@ console.log("goccia.json loading..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); writeFileSync(join(tmp, "test.js"), "const x = 2 + 2\nx\n"); const out = await $`${LOADER} --print ${join(tmp, "test.js")} 2>&1`.text(); @@ -82,7 +82,7 @@ console.log("goccia.toml loading..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(tmp, "goccia.toml"), 'compat-asi = true\nmode = "bytecode"\n'); writeFileSync(join(tmp, "test.js"), "const x = 10\nx\n"); const out = await $`${LOADER} --print ${join(tmp, "test.js")} 2>&1`.text(); @@ -99,7 +99,7 @@ console.log("goccia.json5 loading..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.json5"), '{asi: true, mode: "bytecode"}\n'); + writeFileSync(join(tmp, "goccia.json5"), '{"compat-asi": true, mode: "bytecode"}\n'); writeFileSync(join(tmp, "test.js"), "const x = 10\nx\n"); const out = await $`${LOADER} ${join(tmp, "test.js")} 2>&1`.text(); @@ -115,9 +115,9 @@ console.log("Priority: TOML > JSON5 > JSON..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.json"), '{"mode": "interpreted", "asi": true}\n'); - writeFileSync(join(tmp, "goccia.json5"), '{asi: true, mode: "interpreted"}\n'); - writeFileSync(join(tmp, "goccia.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(tmp, "goccia.json"), '{"mode": "interpreted", "compat-asi": true}\n'); + writeFileSync(join(tmp, "goccia.json5"), '{"compat-asi": true, mode: "interpreted"}\n'); + writeFileSync(join(tmp, "goccia.toml"), 'compat-asi = true\nmode = "bytecode"\n'); writeFileSync(join(tmp, "test.js"), "const x = 1\nx\n"); const out = await $`${LOADER} ${join(tmp, "test.js")} 2>&1`.text(); @@ -134,7 +134,7 @@ console.log("Discovery from entry file directory..."); const tmp = makeTmp(); try { mkdirSync(join(tmp, "src"), { recursive: true }); - writeFileSync(join(tmp, "goccia.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); writeFileSync(join(tmp, "src", "test.js"), "const x = 7\nx\n"); const out = await $`${LOADER} --print ${join(tmp, "src", "test.js")} 2>&1`.text(); @@ -171,7 +171,7 @@ console.log("Config stack-size..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.json"), '{"stack-size": 50, "asi": true}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"stack-size": 50, "compat-asi": true}\n'); writeFileSync( join(tmp, "test.js"), "let n=0; const f=()=>{n++;f()}; try{f()}catch(e){console.log(n)};\n", @@ -190,7 +190,7 @@ console.log("Config without imports field..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.json"), '{"asi": true}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true}\n'); writeFileSync(join(tmp, "test.js"), "const x = 42\nx\n"); const out = await $`${LOADER} --print ${join(tmp, "test.js")} 2>&1`.text(); @@ -210,7 +210,7 @@ console.log("Config with imports..."); writeFileSync(join(tmp, "lib", "utils.js"), "export const value = 99;\n"); writeFileSync( join(tmp, "goccia.json"), - '{"asi": true, "imports": {"utils": "./lib/utils.js"}}\n', + '{"compat-asi": true, "imports": {"utils": "./lib/utils.js"}}\n', ); writeFileSync(join(tmp, "test.js"), 'import { value } from "utils"\nvalue\n'); @@ -227,7 +227,7 @@ console.log("Config extends..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "base.json"), '{"asi": true}\n'); + writeFileSync(join(tmp, "base.json"), '{"compat-asi": true}\n'); writeFileSync(join(tmp, "goccia.json"), '{"extends": "base.json", "mode": "bytecode"}\n'); writeFileSync(join(tmp, "test.js"), "const x = 5\nx\n"); @@ -246,7 +246,7 @@ console.log("Config extends from subdirectory..."); const tmp = makeTmp(); try { mkdirSync(join(tmp, "tests", "asi"), { recursive: true }); - writeFileSync(join(tmp, "goccia.json"), '{"asi": true}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true}\n'); writeFileSync( join(tmp, "tests", "asi", "goccia.json"), '{"extends": "../../goccia.json", "mode": "bytecode"}\n', @@ -267,7 +267,7 @@ console.log("TestRunner respects config..."); { const tmp = makeTmp(); try { - writeFileSync(join(tmp, "goccia.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); writeFileSync( join(tmp, "test.js"), [ @@ -336,7 +336,7 @@ console.log("Per-file ASI config across all apps..."); // ASI subdirectory const asiDir = join(tmp, "asi"); mkdirSync(asiDir); - writeFileSync(join(asiDir, "goccia.json"), '{"asi": true}\n'); + writeFileSync(join(asiDir, "goccia.json"), '{"compat-asi": true}\n'); writeFileSync(join(asiDir, "test.js"), "const x = 42\nx\n"); writeFileSync( join(asiDir, "test-runner.js"), @@ -401,8 +401,8 @@ console.log("Per-file ASI config across all apps..."); const bundleStrictBad = await $`${BUNDLER} ${join(strictDir, "bad.js")} 2>&1`.nothrow(); if (bundleStrictBad.exitCode === 0) throw new Error("Bundler strict should reject bad.js"); - await $`${BUNDLER} ${join(strictDir, "bad.js")} --asi`.quiet(); - if (!existsSync(join(strictDir, "bad.gbc"))) throw new Error("Bundler --asi override should compile"); + await $`${BUNDLER} ${join(strictDir, "bad.js")} --compat-asi`.quiet(); + if (!existsSync(join(strictDir, "bad.gbc"))) throw new Error("Bundler --compat-asi override should compile"); // BenchmarkRunner (interpreted) const benchInterp = Bun.spawnSync( @@ -1050,7 +1050,7 @@ console.log("Multi-directory TestRunner..."); // Lenient subdirectory: ASI + compat-var const lenientDir = join(tmp, "lenient"); mkdirSync(lenientDir); - writeFileSync(join(lenientDir, "goccia.json"), '{"asi": true, "compat-var": true}\n'); + writeFileSync(join(lenientDir, "goccia.json"), '{"compat-asi": true, "compat-var": true}\n'); writeFileSync( join(lenientDir, "test.js"), [ @@ -1099,7 +1099,7 @@ console.log("CLI options override file config..."); const noConfigDir = makeTmp(); try { // Config enables ASI - writeFileSync(join(tmp, "goccia.json"), '{"asi": true}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true}\n'); writeFileSync(join(tmp, "test.js"), "const x = 1\nx\n"); // No config dir @@ -1113,22 +1113,22 @@ console.log("CLI options override file config..."); const noConfigRes = await $`${LOADER} ${join(noConfigDir, "test.js")} 2>&1`.nothrow(); if (!noConfigRes.text().includes("SyntaxError")) throw new Error("No config should reject"); - // CLI --asi overrides no-config - const cliAsi = await $`${LOADER} --print ${join(noConfigDir, "test.js")} --asi 2>&1`.text(); - if (!containsLine(cliAsi, "1")) throw new Error(`CLI --asi should override, got: ${cliAsi}`); + // CLI --compat-asi overrides no-config + const cliAsi = await $`${LOADER} --print ${join(noConfigDir, "test.js")} --compat-asi 2>&1`.text(); + if (!containsLine(cliAsi, "1")) throw new Error(`CLI --compat-asi should override, got: ${cliAsi}`); - // CLI --asi bytecode - const cliAsiBc = await $`${LOADER} --print ${join(noConfigDir, "test.js")} --asi --mode=bytecode 2>&1`.text(); - if (!containsLine(cliAsiBc, "1")) throw new Error(`CLI --asi bytecode should override, got: ${cliAsiBc}`); + // CLI --compat-asi bytecode + const cliAsiBc = await $`${LOADER} --print ${join(noConfigDir, "test.js")} --compat-asi --mode=bytecode 2>&1`.text(); + if (!containsLine(cliAsiBc, "1")) throw new Error(`CLI --compat-asi bytecode should override, got: ${cliAsiBc}`); // CLI --mode=interpreted overrides config mode - writeFileSync(join(tmp, "goccia.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); const overrideMode = await $`${LOADER} ${join(tmp, "test.js")} --mode=interpreted 2>&1`.text(); if (!overrideMode.includes("(interpreted)")) throw new Error(`CLI --mode=interpreted should override config, got: ${overrideMode}`); - // Bundler CLI --asi overrides no-config - await $`${BUNDLER} ${join(noConfigDir, "test.js")} --asi`.quiet(); - if (!existsSync(join(noConfigDir, "test.gbc"))) throw new Error("Bundler CLI --asi should compile"); + // Bundler CLI --compat-asi overrides no-config + await $`${BUNDLER} ${join(noConfigDir, "test.js")} --compat-asi`.quiet(); + if (!existsSync(join(noConfigDir, "test.gbc"))) throw new Error("Bundler CLI --compat-asi should compile"); } finally { clean(tmp); clean(noConfigDir); @@ -1263,7 +1263,7 @@ console.log("--config= loads .json explicitly..."); // Script lives in tmp with no goccia.* anywhere on its parent chain. writeFileSync(join(tmp, "test.js"), "const x = 11\nx\n"); // Config lives in a sibling directory; auto-discovery would never find it. - writeFileSync(join(cfgDir, "custom.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(cfgDir, "custom.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); const out = await $`${LOADER} --print ${join(tmp, "test.js")} --config=${join(cfgDir, "custom.json")} 2>&1`.text(); if (!out.includes("(bytecode)")) throw new Error(`--config=.json should enable bytecode, got: ${out}`); @@ -1280,7 +1280,7 @@ console.log("--config= loads .toml explicitly..."); const cfgDir = makeTmp(); try { writeFileSync(join(tmp, "test.js"), "const x = 21\nx\n"); - writeFileSync(join(cfgDir, "custom.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(cfgDir, "custom.toml"), 'compat-asi = true\nmode = "bytecode"\n'); const out = await $`${LOADER} --print ${join(tmp, "test.js")} --config=${join(cfgDir, "custom.toml")} 2>&1`.text(); if (!out.includes("(bytecode)")) throw new Error(`--config=.toml should enable bytecode, got: ${out}`); @@ -1297,7 +1297,7 @@ console.log("--config= loads .json5 explicitly..."); const cfgDir = makeTmp(); try { writeFileSync(join(tmp, "test.js"), "const x = 31\nx\n"); - writeFileSync(join(cfgDir, "custom.json5"), '{asi: true, mode: "bytecode"}\n'); + writeFileSync(join(cfgDir, "custom.json5"), '{"compat-asi": true, mode: "bytecode"}\n'); const out = await $`${LOADER} --print ${join(tmp, "test.js")} --config=${join(cfgDir, "custom.json5")} 2>&1`.text(); if (!out.includes("(bytecode)")) throw new Error(`--config=.json5 should enable bytecode, got: ${out}`); @@ -1313,7 +1313,7 @@ console.log("--config= with relative path resolves against cwd..."); const tmp = makeTmp(); try { writeFileSync(join(tmp, "test.js"), "const x = 41\nx\n"); - writeFileSync(join(tmp, "custom.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(tmp, "custom.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); // Relative path; cwd is tmp. const out = runCwd(LOADER, ["--print", "test.js", "--config=./custom.json"], tmp); @@ -1336,7 +1336,7 @@ console.log("--config= finds goccia.json..."); const cfgDir = makeTmp(); try { writeFileSync(join(tmp, "test.js"), "const x = 51\nx\n"); - writeFileSync(join(cfgDir, "goccia.json"), '{"asi": true, "mode": "bytecode"}\n'); + writeFileSync(join(cfgDir, "goccia.json"), '{"compat-asi": true, "mode": "bytecode"}\n'); const out = await $`${LOADER} --print ${join(tmp, "test.js")} --config=${cfgDir} 2>&1`.text(); if (!out.includes("(bytecode)")) throw new Error(`--config= with goccia.json should enable bytecode, got: ${out}`); @@ -1354,9 +1354,9 @@ console.log("--config= respects priority TOML > JSON5 > JSON..."); try { writeFileSync(join(tmp, "test.js"), "const x = 61\nx\n"); // All three present; TOML must win (matches auto-discovery priority). - writeFileSync(join(cfgDir, "goccia.json"), '{"asi": true, "mode": "interpreted"}\n'); - writeFileSync(join(cfgDir, "goccia.json5"), '{asi: true, mode: "interpreted"}\n'); - writeFileSync(join(cfgDir, "goccia.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(cfgDir, "goccia.json"), '{"compat-asi": true, "mode": "interpreted"}\n'); + writeFileSync(join(cfgDir, "goccia.json5"), '{"compat-asi": true, mode: "interpreted"}\n'); + writeFileSync(join(cfgDir, "goccia.toml"), 'compat-asi = true\nmode = "bytecode"\n'); const out = await $`${LOADER} ${join(tmp, "test.js")} --config=${cfgDir} 2>&1`.text(); if (!out.includes("(bytecode)")) throw new Error(`--config= should pick TOML over JSON5/JSON, got: ${out}`); @@ -1372,7 +1372,7 @@ console.log("--config= with trailing slash works..."); const cfgDir = makeTmp(); try { writeFileSync(join(tmp, "test.js"), "const x = 71\nx\n"); - writeFileSync(join(cfgDir, "goccia.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(cfgDir, "goccia.toml"), 'compat-asi = true\nmode = "bytecode"\n'); // Some shells/users will pass the directory with a trailing slash. const out = await $`${LOADER} ${join(tmp, "test.js")} --config=${cfgDir + "/"} 2>&1`.text(); @@ -1390,7 +1390,7 @@ console.log("--config= does not walk upward..."); // Place a config in tmp; pass an empty subdirectory as --config. // Auto-discovery would walk up and find tmp/goccia.toml, but the // explicit directory form must NOT — it should error out. - writeFileSync(join(tmp, "goccia.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(tmp, "goccia.toml"), 'compat-asi = true\nmode = "bytecode"\n'); const empty = join(tmp, "empty"); mkdirSync(empty); writeFileSync(join(tmp, "test.js"), "const x = 81\nx\n"); @@ -1431,10 +1431,10 @@ console.log("--config skips auto-discovery of nearby goccia.*..."); const cfgDir = makeTmp(); try { // Hostile config alongside the script; auto-discovery would pick this up. - writeFileSync(join(tmp, "goccia.json"), '{"asi": true, "mode": "interpreted"}\n'); + writeFileSync(join(tmp, "goccia.json"), '{"compat-asi": true, "mode": "interpreted"}\n'); writeFileSync(join(tmp, "test.js"), "const x = 101\nx\n"); // Explicit config selects bytecode. - writeFileSync(join(cfgDir, "good.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(cfgDir, "good.toml"), 'compat-asi = true\nmode = "bytecode"\n'); const out = await $`${LOADER} --print ${join(tmp, "test.js")} --config=${join(cfgDir, "good.toml")} 2>&1`.text(); if (!out.includes("(bytecode)")) throw new Error(`--config should skip nearby goccia.json, got: ${out}`); @@ -1454,7 +1454,7 @@ console.log("CLI options override values from --config..."); try { writeFileSync(join(tmp, "test.js"), "const x = 111\nx\n"); // --config says interpreted... - writeFileSync(join(cfgDir, "custom.toml"), 'asi = true\nmode = "interpreted"\n'); + writeFileSync(join(cfgDir, "custom.toml"), 'compat-asi = true\nmode = "interpreted"\n'); // ...but a direct --mode=bytecode on the CLI must win. const out = await $`${LOADER} --print ${join(tmp, "test.js")} --config=${join(cfgDir, "custom.toml")} --mode=bytecode 2>&1`.text(); @@ -1476,7 +1476,7 @@ console.log("--config works on TestRunner..."); const tmp = makeTmp(); const cfgDir = makeTmp(); try { - writeFileSync(join(cfgDir, "ci.toml"), 'asi = true\nmode = "bytecode"\n'); + writeFileSync(join(cfgDir, "ci.toml"), 'compat-asi = true\nmode = "bytecode"\n'); writeFileSync( join(tmp, "test.js"), [ @@ -1503,7 +1503,7 @@ console.log("--config works on Bundler..."); try { // Bad-without-ASI source; --config supplies ASI so compile must succeed. writeFileSync(join(tmp, "test.js"), "const x = 1\nx\n"); - writeFileSync(join(cfgDir, "goccia.json"), '{"asi": true}\n'); + writeFileSync(join(cfgDir, "goccia.json"), '{"compat-asi": true}\n'); // Sanity: without --config, compile rejects (no goccia.* near tmp). const noCfg = await $`${BUNDLER} ${join(tmp, "test.js")} 2>&1`.nothrow(); @@ -1523,7 +1523,7 @@ console.log("--config works on BenchmarkRunner..."); const tmp = makeTmp(); const cfgDir = makeTmp(); try { - writeFileSync(join(cfgDir, "goccia.toml"), 'asi = true\n'); + writeFileSync(join(cfgDir, "goccia.toml"), 'compat-asi = true\n'); writeFileSync( join(tmp, "bench.js"), [ diff --git a/scripts/test-cli-lexer.ts b/scripts/test-cli-lexer.ts index 09ec17a3..daf237ca 100644 --- a/scripts/test-cli-lexer.ts +++ b/scripts/test-cli-lexer.ts @@ -69,7 +69,7 @@ console.log("String allows LS/PS (ES2019)..."); console.log("String line continuation..."); { - const { exitCode, json } = runLoaderJson('"hello\\\nworld";\n', ["--print", "--asi"]); + const { exitCode, json } = runLoaderJson('"hello\\\nworld";\n', ["--print", "--compat-asi"]); if (exitCode !== 0) { throw new Error(`Line continuation should succeed, but failed`); } diff --git a/scripts/test-cli-parser.ts b/scripts/test-cli-parser.ts index b18835b0..422b8f23 100644 --- a/scripts/test-cli-parser.ts +++ b/scripts/test-cli-parser.ts @@ -74,7 +74,7 @@ console.log("Unsupported optional private field access..."); console.log("ASI at EOF..."); { - const asiRes = runLoaderJson("const value = 42", ["--asi"]); + const asiRes = runLoaderJson("const value = 42", ["--compat-asi"]); if (asiRes.exitCode !== 0) throw new Error(`ASI should accept a final declaration at EOF without a semicolon`); if (asiRes.json.ok !== true) throw new Error(`ASI EOF declaration should succeed, got: ${JSON.stringify(asiRes.json)}`); @@ -108,12 +108,12 @@ console.log("Unsupported var recovery (ASI and compat-var flags)..."); "console.log(after);", "", ].join("\n"); - const asiRes = runLoaderJson(sourceBeforeDeclaration, ["--asi"]); + const asiRes = runLoaderJson(sourceBeforeDeclaration, ["--compat-asi"]); if (asiRes.exitCode !== 0) throw new Error(`Unsupported var with ASI should preserve the following declaration`); if (asiRes.json.ok !== true) throw new Error(`Unsupported var with ASI should succeed, got: ${JSON.stringify(asiRes.json)}`); if (normalizeLineEndings(asiRes.json.output) !== "2\n") throw new Error(`Expected ASI recovery output 2, got: ${asiRes.json.output}`); - const compatVarAsiRes = runLoaderJson(sourceBeforeDeclaration, ["--asi", "--compat-var"]); + const compatVarAsiRes = runLoaderJson(sourceBeforeDeclaration, ["--compat-asi", "--compat-var"]); if (compatVarAsiRes.exitCode !== 0) throw new Error(`compat-var with ASI should parse var without an explicit semicolon`); if (compatVarAsiRes.json.ok !== true) throw new Error(`compat-var with ASI should succeed, got: ${JSON.stringify(compatVarAsiRes.json)}`); if (normalizeLineEndings(compatVarAsiRes.json.output) !== "2\n") throw new Error(`Expected compat-var ASI output 2, got: ${compatVarAsiRes.json.output}`); diff --git a/scripts/test-cli.ts b/scripts/test-cli.ts index 842981a1..c9021755 100644 --- a/scripts/test-cli.ts +++ b/scripts/test-cli.ts @@ -3,7 +3,7 @@ * test-cli.ts * * Common CLI options tested across all apps: stdin smoke, --help, --unsafe-ffi, - * --asi, --compat-var, --compat-loose-equality, --compat-non-strict-mode, + * --compat-asi, --source-type, .mjs source-type inference, --compat-var, --compat-loose-equality, --compat-non-strict-mode, * --compat-while-loops, --mode, --timeout, --max-instructions, --max-memory, --stack-size, --log, * example scripts. */ @@ -113,31 +113,39 @@ console.log("--unsafe-ffi gating..."); if (jsonOn.files?.[0]?.result !== "object") throw new Error(`FFI with flag should be "object", got ${jsonOn.files?.[0]?.result}`); } -// -- --asi (Loader + Bundler) --------------------------------------------------- +// -- --compat-asi (Loader + Bundler) --------------------------------------------------- -console.log("--asi (Loader + Bundler)..."); +console.log("--compat-asi (Loader + Bundler)..."); { const tmp = mkdtemp("goccia-asi-"); try { const src = join(tmp, "no-semi.js"); writeFileSync(src, "const x = 42\nx\n"); - // Loader without --asi should fail + // Loader without --compat-asi should fail const noAsi = await $`${LOADER} ${src} 2>&1`.nothrow(); - if (noAsi.exitCode === 0) throw new Error("Loader should reject without --asi"); - if (!noAsi.text().includes("SyntaxError")) throw new Error("Expected SyntaxError without --asi"); + if (noAsi.exitCode === 0) throw new Error("Loader should reject without --compat-asi"); + if (!noAsi.text().includes("SyntaxError")) throw new Error("Expected SyntaxError without --compat-asi"); - // Loader with --asi should succeed - const withAsi = await $`${LOADER} --print ${src} --asi 2>&1`.text(); - if (!containsLine(withAsi, "42")) throw new Error(`Expected 42 with --asi, got: ${withAsi}`); + const oldAsi = await $`${LOADER} ${src} --asi 2>&1`.nothrow(); + if (oldAsi.exitCode === 0) throw new Error("Loader should reject removed --asi alias"); + if (!oldAsi.text().includes("Unknown option: --asi")) throw new Error(`Expected unknown --asi, got: ${oldAsi.text()}`); - // Bundler without --asi should fail + // Loader with --compat-asi should succeed + const withAsi = await $`${LOADER} --print ${src} --compat-asi 2>&1`.text(); + if (!containsLine(withAsi, "42")) throw new Error(`Expected 42 with --compat-asi, got: ${withAsi}`); + + // Bundler without --compat-asi should fail const bundleNoAsi = await $`${BUNDLER} ${src} 2>&1`.nothrow(); - if (bundleNoAsi.exitCode === 0) throw new Error("Bundler should reject without --asi"); + if (bundleNoAsi.exitCode === 0) throw new Error("Bundler should reject without --compat-asi"); + + const bundleOldAsi = await $`${BUNDLER} ${src} --asi 2>&1`.nothrow(); + if (bundleOldAsi.exitCode === 0) throw new Error("Bundler should reject removed --asi alias"); + if (!bundleOldAsi.text().includes("Unknown option: --asi")) throw new Error(`Expected unknown --asi, got: ${bundleOldAsi.text()}`); - // Bundler with --asi should succeed - await $`${BUNDLER} ${src} --asi`.quiet(); - if (!existsSync(join(tmp, "no-semi.gbc"))) throw new Error("Bundler --asi should produce .gbc"); + // Bundler with --compat-asi should succeed + await $`${BUNDLER} ${src} --compat-asi`.quiet(); + if (!existsSync(join(tmp, "no-semi.gbc"))) throw new Error("Bundler --compat-asi should produce .gbc"); } finally { clean(tmp); } @@ -395,6 +403,78 @@ console.log("--mode=bytecode..."); if (!bcOut.includes("(bytecode)")) throw new Error(`Expected (bytecode) in output`); } +// -- --source-type and .mjs module inference ----------------------------------- + +console.log("--source-type and .mjs module inference (Loader + TestRunner + Bundler)..."); +{ + const tmp = mkdtemp("goccia-source-type-"); + try { + const moduleEntry = join(tmp, "entry.mjs"); + writeFileSync(moduleEntry, "this === undefined;\n"); + + const loaderMjs = await $`${LOADER} --print ${moduleEntry} 2>&1`.text(); + if (!containsLine(loaderMjs, "true")) throw new Error(`Loader .mjs should infer module source, got: ${loaderMjs}`); + + const loaderMjsBytecode = await $`${LOADER} --print ${moduleEntry} --mode=bytecode 2>&1`.text(); + if (!containsLine(loaderMjsBytecode, "true")) + throw new Error(`Loader .mjs bytecode should infer module source, got: ${loaderMjsBytecode}`); + + const loaderScriptOverride = await $`${LOADER} --print ${moduleEntry} --source-type=script 2>&1`.text(); + if (!containsLine(loaderScriptOverride, "false")) + throw new Error(`Loader --source-type=script should override .mjs inference, got: ${loaderScriptOverride}`); + + const loaderScriptOverrideBytecode = await $`${LOADER} --print ${moduleEntry} --mode=bytecode --source-type=script 2>&1`.text(); + if (!containsLine(loaderScriptOverrideBytecode, "false")) + throw new Error(`Loader bytecode --source-type=script should override .mjs inference, got: ${loaderScriptOverrideBytecode}`); + + const testModuleEntry = join(tmp, "entry-test.mjs"); + writeFileSync( + testModuleEntry, + [ + "const topLevelThis = this;", + "const metaUrl = import.meta.url;", + 'test(".mjs top-level this", () => { expect(topLevelThis).toBeUndefined(); });', + 'test(".mjs import.meta", () => { expect(metaUrl.endsWith("entry-test.mjs")).toBe(true); });', + ].join("\n") + "\n", + ); + const testRunnerMjs = await $`${TESTRUNNER} ${testModuleEntry} --no-progress 2>&1`.text(); + if (!testRunnerMjs.includes("Passed: 2")) throw new Error(`TestRunner .mjs expected Passed: 2, got: ${testRunnerMjs}`); + + const testRunnerMjsBytecode = await $`${TESTRUNNER} ${testModuleEntry} --mode=bytecode --no-progress 2>&1`.text(); + if (!testRunnerMjsBytecode.includes("Passed: 2")) + throw new Error(`TestRunner .mjs bytecode expected Passed: 2, got: ${testRunnerMjsBytecode}`); + + const testScriptOverride = join(tmp, "entry-test-script.mjs"); + writeFileSync( + testScriptOverride, + [ + "const topLevelThis = this;", + 'test(".mjs script override", () => { expect(topLevelThis === undefined).toBe(false); });', + ].join("\n") + "\n", + ); + const testRunnerScript = await $`${TESTRUNNER} ${testScriptOverride} --source-type=script --no-progress 2>&1`.text(); + if (!testRunnerScript.includes("Passed: 1")) + throw new Error(`TestRunner --source-type=script expected Passed: 1, got: ${testRunnerScript}`); + + const testRunnerScriptBytecode = await $`${TESTRUNNER} ${testScriptOverride} --mode=bytecode --source-type=script --no-progress 2>&1`.text(); + if (!testRunnerScriptBytecode.includes("Passed: 1")) + throw new Error(`TestRunner bytecode --source-type=script expected Passed: 1, got: ${testRunnerScriptBytecode}`); + + const strictModule = join(tmp, "strict-module.mjs"); + writeFileSync(strictModule, "with ({ x: 1 }) { x; }\n"); + const bundleModule = await $`${BUNDLER} ${strictModule} --compat-non-strict-mode 2>&1`.nothrow(); + const bundleModuleOutput = bundleModule.text(); + if (bundleModule.exitCode === 0 || !bundleModuleOutput.includes("'with' statements are not allowed in strict mode")) + throw new Error(`Bundler .mjs should infer strict module source, got: ${bundleModuleOutput}`); + + const bundledScriptOut = join(tmp, "strict-module-script.gbc"); + await $`${BUNDLER} ${strictModule} --source-type=script --compat-non-strict-mode --output=${bundledScriptOut}`.quiet(); + if (!existsSync(bundledScriptOut)) throw new Error("Bundler --source-type=script should override .mjs inference and write bytecode"); + } finally { + clean(tmp); + } +} + // -- --timeout (Loader: infinite loop, both execution modes) -------------------- console.log("--timeout (interpreted)..."); @@ -435,19 +515,19 @@ console.log("--max-instructions (bytecode)..."); console.log("--max-memory (default positive)..."); { - const { json } = runLoaderJson("Goccia.gc.maxBytes\n", ["--asi"]); + const { json } = runLoaderJson("Goccia.gc.maxBytes\n", ["--compat-asi"]); if (typeof json.files?.[0]?.result !== "number" || json.files[0].result <= 0) throw new Error(`Default maxBytes should be positive, got ${json.files?.[0]?.result}`); } console.log("--max-memory (override)..."); { - const { json } = runLoaderJson("Goccia.gc.maxBytes\n", ["--max-memory=5000000", "--asi"]); + const { json } = runLoaderJson("Goccia.gc.maxBytes\n", ["--max-memory=5000000", "--compat-asi"]); if (json.files?.[0]?.result !== 5000000) throw new Error(`Override maxBytes should be 5000000, got ${json.files?.[0]?.result}`); } console.log("--max-memory (OOM triggers RangeError)..."); { - const res = await $`echo 'Array.from({length:5000},(_,i)=>({x:i}));' | ${LOADER} --max-memory=200000 --asi 2>&1`.nothrow(); + const res = await $`echo 'Array.from({length:5000},(_,i)=>({x:i}));' | ${LOADER} --max-memory=200000 --compat-asi 2>&1`.nothrow(); const out = res.text(); if (res.exitCode !== 1) throw new Error(`OOM exit code should be 1, got ${res.exitCode}`); if (!out.includes("RangeError")) throw new Error(`OOM output should contain RangeError`); @@ -468,7 +548,7 @@ console.log("--max-memory (manual gc reclaims inside active calls)..."); for (const modeArgs of [[], ["--mode=bytecode"]] as const) { const label = modeArgs.length > 0 ? modeArgs.join(" ") : "interpreter"; - const { exitCode, json, stderr } = runLoaderJson(src, ["--max-memory=500000", "--asi", ...modeArgs], { timeout: 30_000 }); + const { exitCode, json, stderr } = runLoaderJson(src, ["--max-memory=500000", "--compat-asi", ...modeArgs], { timeout: 30_000 }); if (exitCode !== 0) throw new Error(`Manual GC active-call ${label} exit code should be 0, got ${exitCode}: ${JSON.stringify(json)}${stderr}`); if (typeof json.files?.[0]?.result !== "number" || json.files[0].result <= 0) throw new Error(`Manual GC active-call ${label} should return positive bytesAllocated`); if ((json.memory?.gc?.collections ?? 0) < 30) throw new Error(`Manual GC active-call ${label} should report at least 30 collections, got ${json.memory?.gc?.collections}`); @@ -477,7 +557,7 @@ console.log("--max-memory (manual gc reclaims inside active calls)..."); console.log("--max-memory (maxBytes readonly)..."); { - const res = await $`echo 'Goccia.gc.maxBytes = 999' | ${LOADER} --asi 2>&1`.nothrow(); + const res = await $`echo 'Goccia.gc.maxBytes = 999' | ${LOADER} --compat-asi 2>&1`.nothrow(); if (res.exitCode !== 1) throw new Error(`Read-only exit code should be 1, got ${res.exitCode}`); if (!res.text().includes("TypeError")) throw new Error(`Read-only should mention TypeError`); } diff --git a/source/app/Goccia.CLI.Application.pas b/source/app/Goccia.CLI.Application.pas index d8412322..ec4d980e 100644 --- a/source/app/Goccia.CLI.Application.pas +++ b/source/app/Goccia.CLI.Application.pas @@ -12,6 +12,7 @@ interface CLI.Options, Goccia.Application, + Goccia.CLI.Options, Goccia.Engine, Goccia.Executor, Goccia.Executor.Bytecode, @@ -20,19 +21,19 @@ interface type TGocciaCLIApplication = class(TGocciaApplication) private - FHelp: TGocciaFlagOption; - FJobs: TGocciaIntegerOption; - FLog: TGocciaStringOption; - FMultifile: TGocciaFlagOption; - FConfig: TGocciaStringOption; + FHelp: TFlagOption; + FJobs: TIntegerOption; + FLog: TStringOption; + FMultifile: TFlagOption; + FConfig: TStringOption; FLogFileHandle: TextFile; FLogLock: TRTLCriticalSection; FLogFileOpen: Boolean; FEngineOptions: TGocciaEngineOptions; FCoverageOptions: TGocciaCoverageOptions; FProfilerOptions: TGocciaProfilerOptions; - FOwnedOptions: TGocciaOptionBaseList; - FAllOptions: TGocciaOptionArray; + FOwnedOptions: TOptionBaseList; + FAllOptions: TOptionArray; FSourceRegistry: TGocciaSourceRegistry; procedure BuildAllOptions; procedure InitializeSingletons; @@ -49,11 +50,11 @@ TGocciaCLIApplication = class(TGocciaApplication) function AddEngineOptions: TGocciaEngineOptions; function AddCoverageOptions: TGocciaCoverageOptions; function AddProfilerOptions: TGocciaProfilerOptions; - function AddFlag(const AName, AHelp: string): TGocciaFlagOption; - function AddString(const AName, AHelp: string): TGocciaStringOption; - function AddInteger(const AName, AHelp: string): TGocciaIntegerOption; - function AddRepeatable(const AName, AHelp: string): TGocciaRepeatableOption; - function Add(const AOption: TGocciaOptionBase): TGocciaOptionBase; + function AddFlag(const AName, AHelp: string): TFlagOption; + function AddString(const AName, AHelp: string): TStringOption; + function AddInteger(const AName, AHelp: string): TIntegerOption; + function AddRepeatable(const AName, AHelp: string): TRepeatableOption; + function Add(const AOption: TOptionBase): TOptionBase; procedure ConfigureCreatedEngine(const AEngine: TGocciaEngine; const AFileConfig: TConfigEntryArray); virtual; procedure HandleConsoleLog(const AMethod, ALine: string); @@ -63,7 +64,7 @@ TGocciaCLIApplication = class(TGocciaApplication) function DiscoverFileConfig( const AFileName: string): TConfigEntryArray; function AnyFileConfigEnablesFlag(const AFiles: TStrings; - const AFlag: TGocciaFlagOption): Boolean; + const AFlag: TFlagOption): Boolean; function CreateEngine(const AFileName: string; const ASource: TStringList; const AExecutor: TGocciaExecutor): TGocciaEngine; @@ -105,8 +106,9 @@ TGocciaCLIApplication = class(TGocciaApplication) end; function ResolveSourceTypeOption( - const AOption: TGocciaEnumOption; - const AFileConfig: TConfigEntryArray): Goccia.Engine.TGocciaSourceType; + const AOption: TEnumOption; + const AFileConfig: TConfigEntryArray; + const AFileName: string): Goccia.Engine.TGocciaSourceType; implementation @@ -326,7 +328,7 @@ function GetProcessorCount: Integer; constructor TGocciaCLIApplication.Create(const AName: string); begin inherited Create(AName); - FOwnedOptions := TGocciaOptionBaseList.Create(True); + FOwnedOptions := TOptionBaseList.Create(True); FEngineOptions := nil; FCoverageOptions := nil; FProfilerOptions := nil; @@ -359,7 +361,7 @@ destructor TGocciaCLIApplication.Destroy; procedure TGocciaCLIApplication.BuildAllOptions; var - Combined: array of TGocciaOptionArray; + Combined: array of TOptionArray; Count, I: Integer; begin Count := 0; @@ -416,31 +418,31 @@ function TGocciaCLIApplication.AddProfilerOptions: TGocciaProfilerOptions; Result := FProfilerOptions; end; -function TGocciaCLIApplication.AddFlag(const AName, AHelp: string): TGocciaFlagOption; +function TGocciaCLIApplication.AddFlag(const AName, AHelp: string): TFlagOption; begin - Result := TGocciaFlagOption.Create(AName, AHelp); + Result := TFlagOption.Create(AName, AHelp); FOwnedOptions.Add(Result); end; -function TGocciaCLIApplication.AddString(const AName, AHelp: string): TGocciaStringOption; +function TGocciaCLIApplication.AddString(const AName, AHelp: string): TStringOption; begin - Result := TGocciaStringOption.Create(AName, AHelp); + Result := TStringOption.Create(AName, AHelp); FOwnedOptions.Add(Result); end; -function TGocciaCLIApplication.AddInteger(const AName, AHelp: string): TGocciaIntegerOption; +function TGocciaCLIApplication.AddInteger(const AName, AHelp: string): TIntegerOption; begin - Result := TGocciaIntegerOption.Create(AName, AHelp); + Result := TIntegerOption.Create(AName, AHelp); FOwnedOptions.Add(Result); end; -function TGocciaCLIApplication.AddRepeatable(const AName, AHelp: string): TGocciaRepeatableOption; +function TGocciaCLIApplication.AddRepeatable(const AName, AHelp: string): TRepeatableOption; begin - Result := TGocciaRepeatableOption.Create(AName, AHelp); + Result := TRepeatableOption.Create(AName, AHelp); FOwnedOptions.Add(Result); end; -function TGocciaCLIApplication.Add(const AOption: TGocciaOptionBase): TGocciaOptionBase; +function TGocciaCLIApplication.Add(const AOption: TOptionBase): TOptionBase; begin FOwnedOptions.Add(AOption); Result := AOption; @@ -465,7 +467,7 @@ function TGocciaCLIApplication.DiscoverFileConfig( end; function TGocciaCLIApplication.AnyFileConfigEnablesFlag( - const AFiles: TStrings; const AFlag: TGocciaFlagOption): Boolean; + const AFiles: TStrings; const AFlag: TFlagOption): Boolean; var I: Integer; begin @@ -481,23 +483,32 @@ function TGocciaCLIApplication.AnyFileConfigEnablesFlag( { Resolve --source-type / config "source-type" into the engine's TGocciaSourceType enum. Priority: CLI option > per-file config > root - config > default (script). + config > file-extension default (.mjs is module) > default (script). - CLI option and root config values are validated by TGocciaEnumOption.Apply - before they reach this function (invalid values raise TGocciaParseError + CLI option and root config values are validated by TEnumOption.Apply + before they reach this function (invalid values raise TParseError at parse/apply time). Per-file config values come in as raw strings via FindConfigEntry, so we validate here: 'module' and 'script' are accepted case-insensitively, anything else emits a stderr warning and falls back - to stScript so a typo never silently flips into module source. } + to the file-extension default. } +function DefaultSourceTypeForFileName( + const AFileName: string): Goccia.Engine.TGocciaSourceType; +begin + if IsModuleSourceFileName(AFileName) then + Exit(Goccia.Engine.stModule); + Result := Goccia.Engine.stScript; +end; + function ResolveSourceTypeOption( - const AOption: TGocciaEnumOption; - const AFileConfig: TConfigEntryArray): Goccia.Engine.TGocciaSourceType; + const AOption: TEnumOption; + const AFileConfig: TConfigEntryArray; + const AFileName: string): Goccia.Engine.TGocciaSourceType; var ValueStr, NormalizedValue: string; begin if AOption.FromCommandLine then begin - if AOption.Matches(CLI.Options.stModule) then + if AOption.Matches(Goccia.CLI.Options.stModule) then Exit(Goccia.Engine.stModule); Exit(Goccia.Engine.stScript); end; @@ -511,18 +522,19 @@ function ResolveSourceTypeOption( Exit(Goccia.Engine.stScript); WriteLn(StdErr, Format( 'Warning: invalid per-file config value for "source-type": %s ' - + '(valid: script, module). Falling back to script.', [ValueStr])); - Exit(Goccia.Engine.stScript); + + '(valid: script, module). Falling back to file extension default.', + [ValueStr])); + Exit(DefaultSourceTypeForFileName(AFileName)); end; if AOption.Present then begin - if AOption.Matches(CLI.Options.stModule) then + if AOption.Matches(Goccia.CLI.Options.stModule) then Exit(Goccia.Engine.stModule); Exit(Goccia.Engine.stScript); end; - Result := Goccia.Engine.stScript; + Result := DefaultSourceTypeForFileName(AFileName); end; { Apply per-file config entries to the engine. @@ -531,7 +543,7 @@ function ResolveSourceTypeOption( so that a per-file config can override a root-level config value. } procedure ApplyFileConfigToEngine(const AEngine: TGocciaEngine; const AEngineOptions: TGocciaEngineOptions; - const AFileConfig: TConfigEntryArray); + const AFileConfig: TConfigEntryArray; const AFileName: string); var ValueStr: string; MemoryLimit: Int64; @@ -543,36 +555,13 @@ procedure ApplyFileConfigToEngine(const AEngine: TGocciaEngine; if not Assigned(AEngineOptions) then Exit; - { ASI: CLI flag > per-file config > root config > default (false) } - AEngine.ASIEnabled := ResolveFlagOption(AEngineOptions.ASI, AFileConfig); - - { source-type: CLI option > per-file config > root config > default (script) } + { source-type: CLI option > per-file config > root config > .mjs > script } AEngine.SourceType := ResolveSourceTypeOption( - AEngineOptions.SourceType, AFileConfig); - - { compat-var: CLI flag > per-file config > root config > default (false) } - AEngine.VarEnabled := ResolveFlagOption( - AEngineOptions.CompatVar, AFileConfig); - - { compat-function: CLI flag > per-file config > root config > default (false) } - AEngine.FunctionEnabled := ResolveFlagOption( - AEngineOptions.CompatFunction, AFileConfig); - - { compat-traditional-for-loop: CLI flag > per-file config > root config > default (false) } - AEngine.TraditionalForLoopsEnabled := ResolveFlagOption( - AEngineOptions.CompatTraditionalFor, AFileConfig); - - { compat-while-loops: CLI flag > per-file config > root config > default (false) } - AEngine.WhileLoopsEnabled := ResolveFlagOption( - AEngineOptions.CompatWhileLoops, AFileConfig); - - { compat-loose-equality: CLI flag > per-file config > root config > default (false) } - AEngine.LooseEqualityEnabled := ResolveFlagOption( - AEngineOptions.CompatLooseEquality, AFileConfig); + AEngineOptions.SourceType, AFileConfig, AFileName); - { compat-non-strict-mode: CLI flag > per-file config > root config > default (false) } - AEngine.NonStrictModeEnabled := ResolveFlagOption( - AEngineOptions.CompatNonStrictMode, AFileConfig); + { compatibility flags: CLI flag > per-file config > root config > default (empty) } + AEngine.Compatibility := ResolveCompatibilityFlags( + AEngineOptions, AFileConfig); { strict-types: CLI flag > per-file config > root config > default (false) } AEngine.StrictTypes := ResolveFlagOption( @@ -661,10 +650,10 @@ function TGocciaCLIApplication.CreateEngine(const AFileName: string; end; ConfigureCreatedEngine(Result, FileConfig); if Assigned(FEngineOptions) then - ApplyFileConfigToEngine(Result, FEngineOptions, FileConfig); + ApplyFileConfigToEngine(Result, FEngineOptions, FileConfig, AFileName); if AExecutor is TGocciaBytecodeExecutor then TGocciaBytecodeExecutor(AExecutor).GlobalBackedTopLevel := - Result.SourceType = stScript; + Result.SourceType = Goccia.Engine.stScript; except Result.Free; raise; @@ -965,19 +954,19 @@ procedure TGocciaCLIApplication.Execute; begin Configure; - FHelp := TGocciaFlagOption.Create('help', 'Show this help message'); + FHelp := TFlagOption.Create('help', 'Show this help message'); FHelp.ShortName := 'h'; - FJobs := TGocciaIntegerOption.Create('jobs', 'Number of parallel worker threads'); + FJobs := TIntegerOption.Create('jobs', 'Number of parallel worker threads'); FJobs.ShortName := 'j'; - FLog := TGocciaStringOption.Create('log', 'Write console output to a log file'); + FLog := TStringOption.Create('log', 'Write console output to a log file'); - FMultifile := TGocciaFlagOption.Create('multifile', + FMultifile := TFlagOption.Create('multifile', 'Split each input (file or stdin) on "---" lines and run each ' + 'section as an independent file'); - FConfig := TGocciaStringOption.Create('config', + FConfig := TStringOption.Create('config', 'Path to a config file or a directory containing one (skips auto-discovery)'); BuildAllOptions; diff --git a/source/app/Goccia.CLI.EngineSetup.pas b/source/app/Goccia.CLI.EngineSetup.pas index 5611d85f..adee764c 100644 --- a/source/app/Goccia.CLI.EngineSetup.pas +++ b/source/app/Goccia.CLI.EngineSetup.pas @@ -5,7 +5,7 @@ interface uses - CLI.Options; + Goccia.CLI.Options; procedure InitializeCoverageIfEnabled(const AOptions: TGocciaCoverageOptions); procedure ShutdownCoverageIfEnabled(const AOptions: TGocciaCoverageOptions); @@ -43,11 +43,11 @@ procedure InitializeProfilerIfEnabled(const AOptions: TGocciaProfilerOptions); TGocciaProfiler.Instance.Enabled := True; case AOptions.Mode.Value of - CLI.Options.pmOpcodes: + Goccia.CLI.Options.pmOpcodes: TGocciaProfiler.Instance.Mode := [Goccia.Profiler.pmOpcodes]; - CLI.Options.pmFunctions: + Goccia.CLI.Options.pmFunctions: TGocciaProfiler.Instance.Mode := [Goccia.Profiler.pmFunctions]; - CLI.Options.pmAll: + Goccia.CLI.Options.pmAll: TGocciaProfiler.Instance.Mode := [Goccia.Profiler.pmOpcodes, Goccia.Profiler.pmFunctions]; end; diff --git a/source/app/Goccia.CLI.Help.pas b/source/app/Goccia.CLI.Help.pas index 70381317..e341242c 100644 --- a/source/app/Goccia.CLI.Help.pas +++ b/source/app/Goccia.CLI.Help.pas @@ -8,7 +8,7 @@ interface CLI.Options; function GenerateHelpText(const AProgramName, AUsageLine: string; - const AOptions: TGocciaOptionArray): string; + const AOptions: TOptionArray): string; implementation @@ -39,7 +39,7 @@ function FindOrAddGroup(var AGroups: array of TGroupEntry; end; function GenerateHelpText(const AProgramName, AUsageLine: string; - const AOptions: TGocciaOptionArray): string; + const AOptions: TOptionArray): string; const MAX_GROUPS = 32; COLUMN_GAP = 2; @@ -49,7 +49,7 @@ function GenerateHelpText(const AProgramName, AUsageLine: string; GroupCount: Integer; MaxWidth, I, J, GroupIndex: Integer; FormattedName, Header, Padding: string; - Option: TGocciaOptionBase; + Option: TOptionBase; begin GroupCount := 0; MaxWidth := 0; @@ -84,7 +84,7 @@ function GenerateHelpText(const AProgramName, AUsageLine: string; for J := 0 to Groups[I].Lines.Count - 1 do begin FormattedName := Groups[I].Lines[J]; - Option := TGocciaOptionBase(Groups[I].Lines.Objects[J]); + Option := TOptionBase(Groups[I].Lines.Objects[J]); Padding := StringOfChar(' ', MaxWidth - Length(FormattedName) + COLUMN_GAP); diff --git a/source/app/Goccia.CLI.Options.pas b/source/app/Goccia.CLI.Options.pas new file mode 100644 index 00000000..4937caea --- /dev/null +++ b/source/app/Goccia.CLI.Options.pas @@ -0,0 +1,335 @@ +unit Goccia.CLI.Options; + +{$I Goccia.inc} + +interface + +uses + CLI.ConfigFile, + CLI.Options, + + Goccia.SourcePipeline; + +type + TGocciaExecutionMode = (emInterpreted, emBytecode); + TGocciaSourceType = (stScript, stModule); + + TGocciaCompatibilityFlagDescriptor = record + OptionName: string; + HelpText: string; + end; + + TGocciaEngineOptions = class + private + FMode: TEnumOption; + FSourceType: TEnumOption; + FCompatibilityFlags: array[TGocciaCompatibility] of TFlagOption; + FImportMap: TStringOption; + FAliases: TRepeatableOption; + FTimeout: TIntegerOption; + FMaxMemory: TInt64Option; + FMaxInstructions: TInt64Option; + FUnsafeFFI: TFlagOption; + FUnsafeFunctionConstructor: TFlagOption; + FStackSize: TIntegerOption; + FStrictTypes: TFlagOption; + FAllowedHosts: TRepeatableOption; + FInspectDepth: TIntegerOption; + public + constructor Create; + destructor Destroy; override; + + function Options: TOptionArray; + function CompatibilityFlagOption( + const AFlag: TGocciaCompatibility): TFlagOption; + + property Mode: TEnumOption read FMode; + property SourceType: TEnumOption read FSourceType; + property ImportMap: TStringOption read FImportMap; + property Aliases: TRepeatableOption read FAliases; + property Timeout: TIntegerOption read FTimeout; + property MaxMemory: TInt64Option read FMaxMemory; + property MaxInstructions: TInt64Option read FMaxInstructions; + property UnsafeFFI: TFlagOption read FUnsafeFFI; + property UnsafeFunctionConstructor: TFlagOption read FUnsafeFunctionConstructor; + property StackSize: TIntegerOption read FStackSize; + property StrictTypes: TFlagOption read FStrictTypes; + property AllowedHosts: TRepeatableOption read FAllowedHosts; + property InspectDepth: TIntegerOption read FInspectDepth; + end; + + TGocciaCoverageFormat = (cfLcov, cfJson); + + TGocciaCoverageOptions = class + private + FEnabled: TFlagOption; + FFormat: TEnumOption; + FOutputPath: TStringOption; + public + constructor Create; + destructor Destroy; override; + + function Options: TOptionArray; + + property Enabled: TFlagOption read FEnabled; + property Format: TEnumOption read FFormat; + property OutputPath: TStringOption read FOutputPath; + end; + + TGocciaProfileMode = (pmOpcodes, pmFunctions, pmAll); + TGocciaProfileFormat = (pfFlamegraph); + + TGocciaProfilerOptions = class + private + FMode: TEnumOption; + FOutputPath: TStringOption; + FFormat: TEnumOption; + public + constructor Create; + destructor Destroy; override; + + function Options: TOptionArray; + + property Mode: TEnumOption read FMode; + property OutputPath: TStringOption read FOutputPath; + property Format: TEnumOption read FFormat; + end; + +function CompatibilityFlagDescriptor( + const AFlag: TGocciaCompatibility): TGocciaCompatibilityFlagDescriptor; +function ResolveCompatibilityFlags(const AEngineOptions: TGocciaEngineOptions; + const AFileConfig: TConfigEntryArray): TGocciaCompatibilityFlags; +function TryApplyCompatibilityFlagArg(const AArg: string; + var AFlags: TGocciaCompatibilityFlags): Boolean; + +implementation + +const + ENGINE_FIXED_OPTION_COUNT = 13; + + SOURCE_COMPATIBILITY_FLAGS: array[TGocciaCompatibility] + of TGocciaCompatibilityFlagDescriptor = ( + (OptionName: 'compat-asi'; + HelpText: 'Enable automatic semicolon insertion (compatibility)'), + (OptionName: 'compat-var'; + HelpText: 'Enable var declarations (compatibility)'), + (OptionName: 'compat-function'; + HelpText: 'Enable function declarations and expressions (compatibility)'), + (OptionName: 'compat-traditional-for-loop'; + HelpText: 'Enable traditional C-style for(init; test; update) loops (compatibility)'), + (OptionName: 'compat-while-loops'; + HelpText: 'Enable while and do...while loops (compatibility)'), + (OptionName: 'compat-loose-equality'; + HelpText: 'Enable loose equality and inequality (== and !=) (compatibility)'), + (OptionName: 'compat-non-strict-mode'; + HelpText: 'Enable non-strict-mode compatibility semantics') + ); + +function CompatibilityFlagCount: Integer; +begin + Result := Ord(High(TGocciaCompatibility)) - Ord(Low(TGocciaCompatibility)) + + 1; +end; + +function CompatibilityFlagDescriptor( + const AFlag: TGocciaCompatibility): TGocciaCompatibilityFlagDescriptor; +begin + Result := SOURCE_COMPATIBILITY_FLAGS[AFlag]; +end; + +function ResolveCompatibilityFlags(const AEngineOptions: TGocciaEngineOptions; + const AFileConfig: TConfigEntryArray): TGocciaCompatibilityFlags; +var + Flag: TGocciaCompatibility; +begin + Result := []; + if not Assigned(AEngineOptions) then + Exit; + + for Flag := Low(TGocciaCompatibility) to High(TGocciaCompatibility) do + if ResolveFlagOption(AEngineOptions.CompatibilityFlagOption(Flag), + AFileConfig) then + Include(Result, Flag); +end; + +function TryApplyCompatibilityFlagArg(const AArg: string; + var AFlags: TGocciaCompatibilityFlags): Boolean; +var + Flag: TGocciaCompatibility; +begin + for Flag := Low(TGocciaCompatibility) to High(TGocciaCompatibility) do + if AArg = '--' + SOURCE_COMPATIBILITY_FLAGS[Flag].OptionName then + begin + Include(AFlags, Flag); + Exit(True); + end; + + Result := False; +end; + +{ TGocciaEngineOptions } + +constructor TGocciaEngineOptions.Create; +var + Flag: TGocciaCompatibility; +begin + inherited Create; + FMode := TEnumOption.Create('mode', + 'Execution mode', 'Engine'); + FSourceType := TEnumOption.Create('source-type', + 'Source loading kind (default: script; .mjs infers module)', 'Engine'); + for Flag := Low(TGocciaCompatibility) to High(TGocciaCompatibility) do + FCompatibilityFlags[Flag] := TFlagOption.Create( + SOURCE_COMPATIBILITY_FLAGS[Flag].OptionName, + SOURCE_COMPATIBILITY_FLAGS[Flag].HelpText, 'Engine'); + FImportMap := TStringOption.Create('import-map', + 'Path to import map JSON file', 'Engine'); + FAliases := TRepeatableOption.Create('alias', + 'Import alias (e.g. @/=./src/)', 'Engine'); + FTimeout := TIntegerOption.Create('timeout', + 'Per-file timeout in milliseconds', 'Engine'); + FMaxMemory := TInt64Option.Create('max-memory', + 'GC heap byte limit (RangeError on exceed)', 'Engine'); + FMaxInstructions := TInt64Option.Create('max-instructions', + 'Maximum execution steps before aborting', 'Engine'); + FUnsafeFFI := TFlagOption.Create('unsafe-ffi', + 'Enable the FFI global (foreign function interface)', 'Runtime'); + FUnsafeFunctionConstructor := TFlagOption.Create('unsafe-function-constructor', + 'Enable the Function constructor (dynamic code generation)', 'Engine'); + FStackSize := TIntegerOption.Create('stack-size', + 'Maximum call stack depth (0 = no limit)', 'Engine'); + FStrictTypes := TFlagOption.Create('strict-types', + 'Enforce type annotations at runtime (interpreter and bytecode)', 'Engine'); + FAllowedHosts := TRepeatableOption.Create('allowed-host', + 'Hostname allowed for fetch requests (repeatable)', 'Engine'); + FAllowedHosts.ConfigName := 'allowed-hosts'; + FInspectDepth := TIntegerOption.Create('inspect-depth', + 'Maximum object inspection depth for console output (default: 5)', 'Engine'); +end; + +destructor TGocciaEngineOptions.Destroy; +var + Flag: TGocciaCompatibility; +begin + FMode.Free; + FSourceType.Free; + for Flag := Low(TGocciaCompatibility) to High(TGocciaCompatibility) do + FCompatibilityFlags[Flag].Free; + FImportMap.Free; + FAliases.Free; + FTimeout.Free; + FMaxMemory.Free; + FMaxInstructions.Free; + FUnsafeFFI.Free; + FUnsafeFunctionConstructor.Free; + FStackSize.Free; + FStrictTypes.Free; + FAllowedHosts.Free; + FInspectDepth.Free; + inherited Destroy; +end; + +function TGocciaEngineOptions.Options: TOptionArray; +var + Flag: TGocciaCompatibility; + Index: Integer; +begin + SetLength(Result, ENGINE_FIXED_OPTION_COUNT + CompatibilityFlagCount); + Index := 0; + Result[Index] := FMode; + Inc(Index); + Result[Index] := FSourceType; + Inc(Index); + for Flag := Low(TGocciaCompatibility) to High(TGocciaCompatibility) do + begin + Result[Index] := FCompatibilityFlags[Flag]; + Inc(Index); + end; + Result[Index] := FImportMap; + Inc(Index); + Result[Index] := FAliases; + Inc(Index); + Result[Index] := FTimeout; + Inc(Index); + Result[Index] := FMaxMemory; + Inc(Index); + Result[Index] := FMaxInstructions; + Inc(Index); + Result[Index] := FUnsafeFFI; + Inc(Index); + Result[Index] := FUnsafeFunctionConstructor; + Inc(Index); + Result[Index] := FStackSize; + Inc(Index); + Result[Index] := FStrictTypes; + Inc(Index); + Result[Index] := FAllowedHosts; + Inc(Index); + Result[Index] := FInspectDepth; +end; + +function TGocciaEngineOptions.CompatibilityFlagOption( + const AFlag: TGocciaCompatibility): TFlagOption; +begin + Result := FCompatibilityFlags[AFlag]; +end; + +{ TGocciaCoverageOptions } + +constructor TGocciaCoverageOptions.Create; +begin + inherited Create; + FEnabled := TFlagOption.Create('coverage', + 'Enable line and branch coverage', 'Coverage'); + FFormat := TEnumOption.Create('coverage-format', + 'Coverage output format', 'Coverage'); + FOutputPath := TStringOption.Create('coverage-output', + 'Coverage output file path', 'Coverage'); +end; + +destructor TGocciaCoverageOptions.Destroy; +begin + FEnabled.Free; + FFormat.Free; + FOutputPath.Free; + inherited Destroy; +end; + +function TGocciaCoverageOptions.Options: TOptionArray; +begin + SetLength(Result, 3); + Result[0] := FEnabled; + Result[1] := FFormat; + Result[2] := FOutputPath; +end; + +{ TGocciaProfilerOptions } + +constructor TGocciaProfilerOptions.Create; +begin + inherited Create; + FMode := TEnumOption.Create('profile', + 'Profiling mode', 'Profiler'); + FOutputPath := TStringOption.Create('profile-output', + 'Profile output file path', 'Profiler'); + FFormat := TEnumOption.Create('profile-format', + 'Profile output format', 'Profiler'); +end; + +destructor TGocciaProfilerOptions.Destroy; +begin + FMode.Free; + FOutputPath.Free; + FFormat.Free; + inherited Destroy; +end; + +function TGocciaProfilerOptions.Options: TOptionArray; +begin + SetLength(Result, 3); + Result[0] := FMode; + Result[1] := FOutputPath; + Result[2] := FFormat; +end; + +end. diff --git a/source/app/GocciaBenchmarkRunner.dpr b/source/app/GocciaBenchmarkRunner.dpr index 203260f8..e3d4b047 100644 --- a/source/app/GocciaBenchmarkRunner.dpr +++ b/source/app/GocciaBenchmarkRunner.dpr @@ -5,11 +5,9 @@ program GocciaBenchmarkRunner; uses {$IFDEF UNIX}cthreads,{$ENDIF} Classes, - Generics.Collections, SysUtils, TimingUtils, - TextSemantics, Goccia.Application, Goccia.Arguments.Collection, @@ -18,6 +16,7 @@ uses Goccia.Builtins.Benchmark, Goccia.Bytecode.Module, Goccia.CLI.Application, + Goccia.CLI.Options, CLI.ConfigFile, CLI.Options, Goccia.Constants.PropertyNames, @@ -30,9 +29,6 @@ uses Goccia.FileExtensions, Goccia.GarbageCollector, Goccia.InstructionLimit, - Goccia.JSX.Transformer, - Goccia.Lexer, - Goccia.Parser, Goccia.Profiler, Goccia.Profiler.Report, Goccia.Runtime, @@ -43,11 +39,10 @@ uses Goccia.Scope, Goccia.ScriptLoader.Input, Goccia.CLI.JSON.Reporter, - Goccia.SourceMap, + Goccia.SourcePipeline, Goccia.Terminal.Colors, Goccia.TextFiles, Goccia.Timeout, - Goccia.Token, Goccia.Values.ArrayValue, Goccia.Values.Error, Goccia.Values.ObjectValue, @@ -189,10 +184,10 @@ end; type TBenchmarkRunnerApp = class(TGocciaCLIApplication) private - FNoProgress: TGocciaFlagOption; - FProfileDeterministic: TGocciaFlagOption; - FFormats: TGocciaRepeatableOption; - FOutputFile: TGocciaStringOption; + FNoProgress: TFlagOption; + FProfileDeterministic: TFlagOption; + FFormats: TRepeatableOption; + FOutputFile: TStringOption; FCanPrintProfile: Boolean; FWorkerProgressEnabled: Boolean; function ProfilingEnabled: Boolean; @@ -410,21 +405,19 @@ procedure TBenchmarkRunnerApp.CollectBenchmarkFileBytecode( const AShowProgress: Boolean); var Source: TStringList; - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; - ProgramNode: TGocciaProgram; + PipelineOptions: TGocciaSourcePipelineOptions; + PipelineResult: TGocciaSourcePipelineResult; Module: TGocciaCompiledModule; Executor: TGocciaBytecodeExecutor; Engine: TGocciaEngine; GC: TGarbageCollector; FileResult: TBenchmarkFileResult; ScriptResult: TGocciaObjectValue; - LexStart, LexEnd, ParseEnd, CompileEnd, ExecEnd, BenchStart: Int64; + LexStart, CompileStart, CompileEnd, ExecEnd, BenchStart: Int64; + LexTimeNanoseconds, ParseTimeNanoseconds: Int64; begin Source := nil; + PipelineResult := nil; try try Source := SourceRegistry.Load(AFileName); @@ -437,13 +430,6 @@ begin Exit; end; end; - SourceText := StringListToLFText(Source); - if ppJSX in TGocciaEngine.DefaultPreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - JSXResult.SourceMap.Free; - end; try Executor := TGocciaBytecodeExecutor.Create; @@ -451,35 +437,21 @@ begin Engine := CreateEngine(AFileName, Source, Executor); try LexStart := GetNanoseconds; - Lexer := TGocciaLexer.Create(SourceText, AFileName); + PipelineOptions.Preprocessors := Engine.Preprocessors; + PipelineOptions.Compatibility := Engine.Compatibility; + PipelineOptions.SourceType := Engine.SourceType; + PipelineResult := TGocciaSourcePipeline.Parse(Source, AFileName, + PipelineOptions); + LexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + ParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; + + CompileStart := GetNanoseconds; try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - - Parser := TGocciaParser.Create(Tokens, AFileName, Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := Engine.ASIEnabled; - Parser.VarDeclarationsEnabled := Engine.VarEnabled; - Parser.FunctionDeclarationsEnabled := Engine.FunctionEnabled; - Parser.TraditionalForLoopsEnabled := Engine.TraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := Engine.WhileLoopsEnabled; - Parser.LooseEqualityEnabled := Engine.LooseEqualityEnabled; - Parser.NonStrictModeEnabled := Engine.NonStrictModeEnabled or - (Engine.SourceType = stModule); - try - ProgramNode := Parser.Parse; - ParseEnd := GetNanoseconds; - - try - Module := Engine.CompileModule(ProgramNode); - CompileEnd := GetNanoseconds; - finally - ProgramNode.Free; - end; - finally - Parser.Free; - end; + Module := Engine.CompileModule(PipelineResult.ProgramNode); + CompileEnd := GetNanoseconds; finally - Lexer.Free; + PipelineResult.Free; + PipelineResult := nil; end; ConfigureBenchmarkRuntime(Engine, AShowProgress, True); @@ -495,9 +467,9 @@ begin FileResult.FileName := AFileName; FileResult.DeterministicProfile := FProfileDeterministic.Present; - FileResult.LexTimeNanoseconds := LexEnd - LexStart; - FileResult.ParseTimeNanoseconds := ParseEnd - LexEnd; - FileResult.CompileTimeNanoseconds := CompileEnd - ParseEnd; + FileResult.LexTimeNanoseconds := LexTimeNanoseconds; + FileResult.ParseTimeNanoseconds := ParseTimeNanoseconds; + FileResult.CompileTimeNanoseconds := CompileEnd - CompileStart; BenchStart := GetNanoseconds; ScriptResult := RunRegisteredBenchmarks(Engine, FProfileDeterministic.Present); @@ -549,6 +521,7 @@ begin MakeErrorFileResult(AFileName, E.Message, AReporter); end; finally + PipelineResult.Free; if Assigned(TGarbageCollector.Instance) then TGarbageCollector.Instance.Collect; Source.Free; @@ -646,63 +619,39 @@ procedure TBenchmarkRunnerApp.CollectBenchmarkSourceBytecode( const ASource: TStringList; const AFileName: string; const AReporter: TBenchmarkReporter; const AShowProgress: Boolean); var - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; - ProgramNode: TGocciaProgram; + PipelineOptions: TGocciaSourcePipelineOptions; + PipelineResult: TGocciaSourcePipelineResult; Module: TGocciaCompiledModule; Executor: TGocciaBytecodeExecutor; Engine: TGocciaEngine; GC: TGarbageCollector; FileResult: TBenchmarkFileResult; ScriptResult: TGocciaObjectValue; - LexStart, LexEnd, ParseEnd, CompileEnd, ExecEnd, BenchStart: Int64; + LexStart, CompileStart, CompileEnd, ExecEnd, BenchStart: Int64; + LexTimeNanoseconds, ParseTimeNanoseconds: Int64; begin - SourceText := StringListToLFText(ASource); - if ppJSX in TGocciaEngine.DefaultPreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - JSXResult.SourceMap.Free; - end; - + PipelineResult := nil; try Executor := TGocciaBytecodeExecutor.Create; try Engine := CreateEngine(AFileName, ASource, Executor); try LexStart := GetNanoseconds; - Lexer := TGocciaLexer.Create(SourceText, AFileName); + PipelineOptions.Preprocessors := Engine.Preprocessors; + PipelineOptions.Compatibility := Engine.Compatibility; + PipelineOptions.SourceType := Engine.SourceType; + PipelineResult := TGocciaSourcePipeline.Parse(ASource, AFileName, + PipelineOptions); + LexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + ParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; + + CompileStart := GetNanoseconds; try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - - Parser := TGocciaParser.Create(Tokens, AFileName, Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := Engine.ASIEnabled; - Parser.VarDeclarationsEnabled := Engine.VarEnabled; - Parser.FunctionDeclarationsEnabled := Engine.FunctionEnabled; - Parser.TraditionalForLoopsEnabled := Engine.TraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := Engine.WhileLoopsEnabled; - Parser.LooseEqualityEnabled := Engine.LooseEqualityEnabled; - Parser.NonStrictModeEnabled := Engine.NonStrictModeEnabled or - (Engine.SourceType = stModule); - try - ProgramNode := Parser.Parse; - ParseEnd := GetNanoseconds; - - try - Module := Engine.CompileModule(ProgramNode); - CompileEnd := GetNanoseconds; - finally - ProgramNode.Free; - end; - finally - Parser.Free; - end; + Module := Engine.CompileModule(PipelineResult.ProgramNode); + CompileEnd := GetNanoseconds; finally - Lexer.Free; + PipelineResult.Free; + PipelineResult := nil; end; ConfigureBenchmarkRuntime(Engine, AShowProgress, True); @@ -718,9 +667,9 @@ begin FileResult.FileName := AFileName; FileResult.DeterministicProfile := FProfileDeterministic.Present; - FileResult.LexTimeNanoseconds := LexEnd - LexStart; - FileResult.ParseTimeNanoseconds := ParseEnd - LexEnd; - FileResult.CompileTimeNanoseconds := CompileEnd - ParseEnd; + FileResult.LexTimeNanoseconds := LexTimeNanoseconds; + FileResult.ParseTimeNanoseconds := ParseTimeNanoseconds; + FileResult.CompileTimeNanoseconds := CompileEnd - CompileStart; BenchStart := GetNanoseconds; ScriptResult := RunRegisteredBenchmarks(Engine, FProfileDeterministic.Present); @@ -1082,19 +1031,19 @@ begin EngineOptions.Mode.Apply('bytecode'); if ProfilerOptions.OutputPath.Present and not ProfilerOptions.Mode.Present then - raise TGocciaParseError.Create( + raise TParseError.Create( '--profile-output requires --profile=opcodes|functions|all.'); if ProfilerOptions.Format.Matches(pfFlamegraph) and not ProfilerOptions.OutputPath.Present then - raise TGocciaParseError.Create( + raise TParseError.Create( '--profile-format=flamegraph requires --profile-output=.'); end; procedure TBenchmarkRunnerApp.AfterExecute; var ProfileOpcodes, ProfileFunctions: Boolean; - ProfileMode: CLI.Options.TGocciaProfileMode; + ProfileMode: Goccia.CLI.Options.TGocciaProfileMode; begin ProfileOpcodes := False; ProfileFunctions := False; @@ -1102,10 +1051,10 @@ begin if ProfilerOptions.Mode.Present then begin ProfileMode := ProfilerOptions.Mode.Value; - ProfileOpcodes := (ProfileMode = CLI.Options.pmOpcodes) or - (ProfileMode = CLI.Options.pmAll); - ProfileFunctions := (ProfileMode = CLI.Options.pmFunctions) or - (ProfileMode = CLI.Options.pmAll); + ProfileOpcodes := (ProfileMode = Goccia.CLI.Options.pmOpcodes) or + (ProfileMode = Goccia.CLI.Options.pmAll); + ProfileFunctions := (ProfileMode = Goccia.CLI.Options.pmFunctions) or + (ProfileMode = Goccia.CLI.Options.pmAll); end; if (ProfileOpcodes or ProfileFunctions) and diff --git a/source/app/GocciaBundler.dpr b/source/app/GocciaBundler.dpr index 0f25c780..f534259f 100644 --- a/source/app/GocciaBundler.dpr +++ b/source/app/GocciaBundler.dpr @@ -5,11 +5,9 @@ program GocciaBundler; uses {$IFDEF UNIX}cthreads,{$ENDIF} Classes, - Generics.Collections, SysUtils, TimingUtils, - TextSemantics, Goccia.Application, Goccia.AST.Node, @@ -17,33 +15,29 @@ uses Goccia.Bytecode.Module, CLI.ConfigFile, Goccia.CLI.Application, + Goccia.CLI.Options, CLI.Options, Goccia.Compiler, Goccia.Engine, Goccia.FileExtensions, Goccia.GarbageCollector, - Goccia.JSX.Transformer, - Goccia.Lexer, - Goccia.Parser, Goccia.ScriptLoader.Input, + Goccia.SourcePipeline, Goccia.SourceMap, Goccia.TextFiles, Goccia.Threading, Goccia.Threading.Init, - Goccia.Token, FileUtils in 'units/FileUtils.pas'; type TBundlerApp = class(TGocciaCLIApplication) private - FOutputPath: TGocciaStringOption; - FSourceMap: TGocciaStringOption; + FOutputPath: TStringOption; + FSourceMap: TStringOption; function ParseSource(const ASource: TStringList; const AFileName: string; - const AASIEnabled, AVarEnabled, AFunctionEnabled, - ATraditionalForLoopsEnabled, AWhileLoopsEnabled, ALooseEqualityEnabled, - ANonStrictModeEnabled: Boolean; + const AOptions: TGocciaSourcePipelineOptions; out ALexTimeNanoseconds, AParseTimeNanoseconds: Int64; out ASourceMap: TGocciaSourceMap): TGocciaProgram; function CompileSource(const ASource: TStringList; @@ -93,78 +87,36 @@ end; { TBundlerApp - Core logic } function TBundlerApp.ParseSource(const ASource: TStringList; - const AFileName: string; const AASIEnabled, AVarEnabled, - AFunctionEnabled, ATraditionalForLoopsEnabled, - AWhileLoopsEnabled, ALooseEqualityEnabled, ANonStrictModeEnabled: Boolean; + const AFileName: string; const AOptions: TGocciaSourcePipelineOptions; out ALexTimeNanoseconds, AParseTimeNanoseconds: Int64; out ASourceMap: TGocciaSourceMap): TGocciaProgram; var - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; - Warning: TGocciaParserWarning; - StartTime, LexEnd, ParseEnd: Int64; - OrigLine, OrigCol, I: Integer; + PipelineResult: TGocciaSourcePipelineResult; + Warning: TGocciaSourcePipelineWarning; + I: Integer; begin - StartTime := GetNanoseconds; - SourceText := StringListToLFText(ASource); - ASourceMap := nil; - if ppJSX in TGocciaEngine.DefaultPreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - ASourceMap := JSXResult.SourceMap; - if Assigned(ASourceMap) then - ASourceMap.SetSourceContent(0, StringListToLFText(ASource)); - end; + PipelineResult := TGocciaSourcePipeline.Parse(ASource, AFileName, AOptions); try - Lexer := TGocciaLexer.Create(SourceText, AFileName); - try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - ALexTimeNanoseconds := LexEnd - StartTime; - - Parser := TGocciaParser.Create(Tokens, AFileName, Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := AASIEnabled; - Parser.VarDeclarationsEnabled := AVarEnabled; - Parser.FunctionDeclarationsEnabled := AFunctionEnabled; - Parser.TraditionalForLoopsEnabled := ATraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := AWhileLoopsEnabled; - Parser.LooseEqualityEnabled := ALooseEqualityEnabled; - Parser.NonStrictModeEnabled := ANonStrictModeEnabled; - try - Result := Parser.Parse; - ParseEnd := GetNanoseconds; - AParseTimeNanoseconds := ParseEnd - LexEnd; - - if not GIsWorkerThread then - for I := 0 to Parser.WarningCount - 1 do - begin - Warning := Parser.GetWarning(I); - WriteLn(SysUtils.Format('Warning: %s', [Warning.Message])); - if Warning.Suggestion <> '' then - WriteLn(SysUtils.Format(' Suggestion: %s', [Warning.Suggestion])); - if Assigned(ASourceMap) and - ASourceMap.Translate(Warning.Line, Warning.Column, OrigLine, OrigCol) then - WriteLn(SysUtils.Format(' --> %s:%d:%d', [AFileName, OrigLine, OrigCol])) - else - WriteLn(SysUtils.Format(' --> %s:%d:%d', - [AFileName, Warning.Line, Warning.Column])); - end; - finally - Parser.Free; + ALexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + AParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; + + if not GIsWorkerThread then + for I := 0 to PipelineResult.WarningCount - 1 do + begin + Warning := PipelineResult.Warnings[I]; + WriteLn(SysUtils.Format('Warning: %s', [Warning.Message])); + if Warning.Suggestion <> '' then + WriteLn(SysUtils.Format(' Suggestion: %s', [Warning.Suggestion])); + WriteLn(SysUtils.Format(' --> %s:%d:%d', + [AFileName, Warning.Line, Warning.Column])); end; - finally - Lexer.Free; - end; - except - ASourceMap.Free; - ASourceMap := nil; - raise; + + Result := PipelineResult.TakeProgramNode; + ASourceMap := PipelineResult.TakeSourceMap; + finally + PipelineResult.Free; end; end; @@ -204,43 +156,32 @@ var LexTimeNanoseconds, ParseTimeNanoseconds: Int64; SourceMap: TGocciaSourceMap; FileConfig: TConfigEntryArray; - EffectiveASI, EffectiveVar, EffectiveFunction, EffectiveStrictTypes, - EffectiveTraditionalFor, EffectiveWhileLoops, EffectiveLooseEquality, - EffectiveNonStrictMode: Boolean; + EffectiveStrictTypes: Boolean; EffectiveSourceType: TGocciaSourceType; + EffectiveCompatibility: TGocciaCompatibilityFlags; + PipelineOptions: TGocciaSourcePipelineOptions; begin - { Resolve ASI and compatibility flags: CLI flag > per-file config > - root config > default (false). } + { Resolve source pipeline flags: CLI flag > per-file config > + root config > default. } FileConfig := DiscoverFileConfig(AFileName); - EffectiveASI := ResolveFlagOption(EngineOptions.ASI, FileConfig); - EffectiveVar := ResolveFlagOption( - EngineOptions.CompatVar, FileConfig); - EffectiveFunction := ResolveFlagOption( - EngineOptions.CompatFunction, FileConfig); - EffectiveTraditionalFor := ResolveFlagOption( - EngineOptions.CompatTraditionalFor, FileConfig); - EffectiveWhileLoops := ResolveFlagOption( - EngineOptions.CompatWhileLoops, FileConfig); - EffectiveLooseEquality := ResolveFlagOption( - EngineOptions.CompatLooseEquality, FileConfig); - EffectiveNonStrictMode := ResolveFlagOption( - EngineOptions.CompatNonStrictMode, FileConfig); + EffectiveCompatibility := ResolveCompatibilityFlags( + EngineOptions, FileConfig); EffectiveSourceType := ResolveSourceTypeOption(EngineOptions.SourceType, - FileConfig); + FileConfig, AFileName); EffectiveStrictTypes := ResolveFlagOption( EngineOptions.StrictTypes, FileConfig); CompiledModule := nil; - ProgramNode := ParseSource(ASource, AFileName, EffectiveASI, EffectiveVar, - EffectiveFunction, EffectiveTraditionalFor, EffectiveWhileLoops, - EffectiveLooseEquality, EffectiveNonStrictMode or - (EffectiveSourceType = stModule), + PipelineOptions.Preprocessors := TGocciaEngine.DefaultPreprocessors; + PipelineOptions.Compatibility := EffectiveCompatibility; + PipelineOptions.SourceType := EffectiveSourceType; + ProgramNode := ParseSource(ASource, AFileName, PipelineOptions, LexTimeNanoseconds, ParseTimeNanoseconds, SourceMap); try Compiler := TGocciaCompiler.Create(AFileName); try Compiler.StrictTypes := EffectiveStrictTypes; - Compiler.NonStrictMode := EffectiveNonStrictMode and + Compiler.NonStrictMode := (cfNonStrictMode in EffectiveCompatibility) and (EffectiveSourceType = stScript); CompiledModule := Compiler.Compile(ProgramNode); WriteSourceMapIfEnabled(SourceMap, AFileName); @@ -341,7 +282,7 @@ var I: Integer; begin if not FOutputPath.Present then - raise TGocciaParseError.Create( + raise TParseError.Create( '--output= is required when compiling from stdin.'); Source := ReadSourceFromText(Input); @@ -349,7 +290,7 @@ begin if MultifileEnabled then begin if not DirectoryExists(FOutputPath.Value) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--output must be a directory when --multifile is set with stdin.'); // Ownership of Source transfers to SplitStdinMultifile. @@ -377,7 +318,7 @@ begin end; if DirectoryExists(FOutputPath.Value) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--output must be a file when compiling from stdin.'); try @@ -502,12 +443,12 @@ begin not DirectoryExists(FOutputPath.Value) and ((APaths.Count > 1) or ((APaths.Count = 1) and DirectoryExists(APaths[0]))) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--output must be a directory when compiling multiple files.'); if MultifileEnabled and FOutputPath.Present and (FOutputPath.Value <> '') and not DirectoryExists(FOutputPath.Value) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--output= cannot be combined with --multifile (an input ' + 'may expand to multiple sections); pass a directory or omit ' + '--output.'); @@ -515,13 +456,13 @@ begin if (FSourceMap.ValueOr('') <> '') and ((APaths.Count > 1) or ((APaths.Count = 1) and DirectoryExists(APaths[0]))) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--source-map= supports a single input file or stdin.'); // Use Present rather than the value to catch the bare --source-map // form too — see ScriptLoader for the rationale. if FSourceMap.Present and MultifileEnabled then - raise TGocciaParseError.Create( + raise TParseError.Create( '--source-map cannot be combined with --multifile (an input ' + 'may expand to multiple sections).'); diff --git a/source/app/GocciaREPL.dpr b/source/app/GocciaREPL.dpr index 5b291b1d..8d14be43 100644 --- a/source/app/GocciaREPL.dpr +++ b/source/app/GocciaREPL.dpr @@ -5,16 +5,15 @@ program GocciaREPL; uses {$IFDEF UNIX}cthreads,{$ENDIF} Classes, - Generics.Collections, SysUtils, TimingUtils, - TextSemantics, Goccia.Application, Goccia.AST.Node, Goccia.Bytecode.Module, Goccia.CLI.Application, + Goccia.CLI.Options, CLI.ConfigFile, CLI.Options, Goccia.Engine, @@ -24,19 +23,16 @@ uses Goccia.Error, Goccia.Error.Detail, Goccia.GarbageCollector, - Goccia.JSX.Transformer, - Goccia.Lexer, Goccia.MicrotaskQueue, - Goccia.Parser, Goccia.REPL.Formatter, Goccia.REPL.LineEditor, Goccia.Runtime, Goccia.RuntimeExtensions.Console, Goccia.RuntimeExtensions.FFI, Goccia.RuntimeProfiles.Loader, + Goccia.SourcePipeline, Goccia.Terminal.Colors, Goccia.TextFiles, - Goccia.Token, Goccia.Values.Error, Goccia.Values.Primitives, Goccia.Version; @@ -47,7 +43,7 @@ const type TREPLApp = class(TGocciaCLIApplication) private - FTiming: TGocciaFlagOption; + FTiming: TFlagOption; procedure InitializeRuntime(const AEngine: TGocciaEngine); protected procedure Configure; override; @@ -112,14 +108,11 @@ var { Bytecode mode } BcExecutor: TGocciaBytecodeExecutor; ResultValue: TGocciaValue; - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; - ProgramNode: TGocciaProgram; + PipelineOptions: TGocciaSourcePipelineOptions; + PipelineResult: TGocciaSourcePipelineResult; Module: TGocciaCompiledModule; - StartTime, LexEnd, ParseEnd, CompileEnd, ExecEnd: Int64; + StartTime, CompileStart, CompileEnd, ExecStart, ExecEnd: Int64; + LexTimeNanoseconds, ParseTimeNanoseconds: Int64; begin if APaths.Count > 0 then begin @@ -161,58 +154,38 @@ begin Source.Add(Line); StartTime := GetNanoseconds; - LexEnd := StartTime; - ParseEnd := StartTime; + CompileStart := StartTime; CompileEnd := StartTime; + ExecStart := StartTime; ExecEnd := StartTime; + LexTimeNanoseconds := 0; + ParseTimeNanoseconds := 0; + PipelineResult := nil; try - SourceText := StringListToLFText(Source); + PipelineOptions.Preprocessors := Eng.Preprocessors; + PipelineOptions.Compatibility := Eng.Compatibility; + PipelineOptions.SourceType := Eng.SourceType; + PipelineResult := TGocciaSourcePipeline.Parse(Source, + REPL_FILE_NAME, PipelineOptions); + LexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + ParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; - if ppJSX in TGocciaEngine.DefaultPreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - JSXResult.SourceMap.Free; - end; - - Lexer := TGocciaLexer.Create(SourceText, REPL_FILE_NAME); + CompileStart := GetNanoseconds; try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - - Parser := TGocciaParser.Create(Tokens, REPL_FILE_NAME, - Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := Eng.ASIEnabled; - Parser.VarDeclarationsEnabled := Eng.VarEnabled; - Parser.FunctionDeclarationsEnabled := Eng.FunctionEnabled; - Parser.TraditionalForLoopsEnabled := Eng.TraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := Eng.WhileLoopsEnabled; - Parser.LooseEqualityEnabled := Eng.LooseEqualityEnabled; - Parser.NonStrictModeEnabled := Eng.NonStrictModeEnabled or - (Eng.SourceType = stModule); - try - ProgramNode := Parser.Parse; - ParseEnd := GetNanoseconds; - - try - Module := Eng.CompileModule(ProgramNode); - CompileEnd := GetNanoseconds; - - ResultValue := Eng.RunModuleForSourceType(Module, - REPL_FILE_NAME); - ExecEnd := GetNanoseconds; - - if ResultValue <> nil then - WriteLn(FormatREPLValue(ResultValue, IsColorTerminal)); - finally - ProgramNode.Free; - end; - finally - Parser.Free; - end; + Module := Eng.CompileModule(PipelineResult.ProgramNode); + CompileEnd := GetNanoseconds; finally - Lexer.Free; + PipelineResult.Free; + PipelineResult := nil; end; + + ExecStart := GetNanoseconds; + ResultValue := Eng.RunModuleForSourceType(Module, + REPL_FILE_NAME); + ExecEnd := GetNanoseconds; + + if ResultValue <> nil then + WriteLn(FormatREPLValue(ResultValue, IsColorTerminal)); except on E: Exception do begin @@ -230,10 +203,10 @@ begin if FTiming.Present then WriteLn(SysUtils.Format( ' Lex: %s | Parse: %s | Compile: %s | Execute: %s | Total: %s', - [FormatDuration(LexEnd - StartTime), - FormatDuration(ParseEnd - LexEnd), - FormatDuration(CompileEnd - ParseEnd), - FormatDuration(ExecEnd - CompileEnd), + [FormatDuration(LexTimeNanoseconds), + FormatDuration(ParseTimeNanoseconds), + FormatDuration(CompileEnd - CompileStart), + FormatDuration(ExecEnd - ExecStart), FormatDuration(ExecEnd - StartTime)])); end; finally diff --git a/source/app/GocciaScriptLoader.dpr b/source/app/GocciaScriptLoader.dpr index 7190f89b..77513769 100644 --- a/source/app/GocciaScriptLoader.dpr +++ b/source/app/GocciaScriptLoader.dpr @@ -17,6 +17,7 @@ uses Goccia.Bytecode.Binary, Goccia.Bytecode.Module, Goccia.CLI.Application, + Goccia.CLI.Options, CLI.ConfigFile, CLI.Options, Goccia.Constants.PropertyNames, @@ -31,9 +32,6 @@ uses Goccia.FileExtensions, Goccia.GarbageCollector, Goccia.InstructionLimit, - Goccia.JSX.Transformer, - Goccia.Lexer, - Goccia.Parser, Goccia.Profiler, Goccia.Profiler.Report, Goccia.Runtime, @@ -44,13 +42,13 @@ uses Goccia.ScriptLoader.Globals, Goccia.ScriptLoader.Input, Goccia.CLI.JSON.Reporter, + Goccia.SourcePipeline, Goccia.SourceMap, Goccia.Terminal.Colors, Goccia.TextFiles, Goccia.Threading, Goccia.Threading.Init, Goccia.Timeout, - Goccia.Token, Goccia.Values.Error, Goccia.Values.ObjectValue, Goccia.Values.Primitives, @@ -98,12 +96,12 @@ type TScriptLoaderApp = class(TGocciaCLIApplication) private - FOutputPath: TGocciaStringOption; - FSilent: TGocciaFlagOption; - FPrint: TGocciaFlagOption; - FSourceMap: TGocciaStringOption; - FGlobalFiles: TGocciaRepeatableOption; - FInlineGlobals: TGocciaRepeatableOption; + FOutputPath: TStringOption; + FSilent: TFlagOption; + FPrint: TFlagOption; + FSourceMap: TStringOption; + FGlobalFiles: TRepeatableOption; + FInlineGlobals: TRepeatableOption; FLastPaths: TStringList; procedure InitializeRuntime(const AEngine: TGocciaEngine); @@ -111,10 +109,8 @@ type function IsJsonOutput: Boolean; function IsCompactJsonOutput: Boolean; function ParseSource(const ASource: TStringList; const AFileName: string; - const APreprocessors: TGocciaPreprocessors; const ASuppressWarnings: Boolean; - const AASIEnabled, AVarEnabled, AFunctionEnabled, - ATraditionalForLoopsEnabled, AWhileLoopsEnabled, ALooseEqualityEnabled, - ANonStrictModeEnabled: Boolean; + const AOptions: TGocciaSourcePipelineOptions; + const ASuppressWarnings: Boolean; out ALexTimeNanoseconds, AParseTimeNanoseconds: Int64; out ASourceMap: TGocciaSourceMap): TGocciaProgram; procedure WriteSourceMapIfEnabled(const ASourceMap: TGocciaSourceMap; @@ -333,7 +329,7 @@ begin inherited Validate; if EngineOptions.Timeout.Present and (EngineOptions.Timeout.Value < 0) then - raise TGocciaParseError.Create('--timeout must be 0 or greater.'); + raise TParseError.Create('--timeout must be 0 or greater.'); // --profile-format implies --profile=functions when no explicit --profile given if ProfilerOptions.Format.Present and not ProfilerOptions.Mode.Present then @@ -344,90 +340,49 @@ begin EngineOptions.Mode.Apply('bytecode'); if ProfilerOptions.OutputPath.Present and not ProfilerOptions.Mode.Present then - raise TGocciaParseError.Create( + raise TParseError.Create( '--profile-output requires --profile=opcodes|functions|all.'); if ProfilerOptions.Format.Matches(pfFlamegraph) and not ProfilerOptions.OutputPath.Present then - raise TGocciaParseError.Create( + raise TParseError.Create( '--profile-format=flamegraph requires --profile-output=.'); end; { TScriptLoaderApp - Core logic } function TScriptLoaderApp.ParseSource(const ASource: TStringList; - const AFileName: string; const APreprocessors: TGocciaPreprocessors; - const ASuppressWarnings: Boolean; const AASIEnabled, AVarEnabled, - AFunctionEnabled, ATraditionalForLoopsEnabled, - AWhileLoopsEnabled, ALooseEqualityEnabled, ANonStrictModeEnabled: Boolean; + const AFileName: string; const AOptions: TGocciaSourcePipelineOptions; + const ASuppressWarnings: Boolean; out ALexTimeNanoseconds, AParseTimeNanoseconds: Int64; out ASourceMap: TGocciaSourceMap): TGocciaProgram; var - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; - Warning: TGocciaParserWarning; - StartTime, LexEnd, ParseEnd: Int64; - OrigLine, OrigCol, I: Integer; + PipelineResult: TGocciaSourcePipelineResult; + Warning: TGocciaSourcePipelineWarning; + I: Integer; begin - StartTime := GetNanoseconds; - SourceText := StringListToLFText(ASource); - ASourceMap := nil; - if ppJSX in APreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - ASourceMap := JSXResult.SourceMap; - if Assigned(ASourceMap) then - ASourceMap.SetSourceContent(0, StringListToLFText(ASource)); - end; + PipelineResult := TGocciaSourcePipeline.Parse(ASource, AFileName, AOptions); try - Lexer := TGocciaLexer.Create(SourceText, AFileName); - try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - ALexTimeNanoseconds := LexEnd - StartTime; - - Parser := TGocciaParser.Create(Tokens, AFileName, Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := AASIEnabled; - Parser.VarDeclarationsEnabled := AVarEnabled; - Parser.FunctionDeclarationsEnabled := AFunctionEnabled; - Parser.TraditionalForLoopsEnabled := ATraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := AWhileLoopsEnabled; - Parser.LooseEqualityEnabled := ALooseEqualityEnabled; - Parser.NonStrictModeEnabled := ANonStrictModeEnabled; - try - Result := Parser.Parse; - ParseEnd := GetNanoseconds; - AParseTimeNanoseconds := ParseEnd - LexEnd; + ALexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + AParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; - if (not ASuppressWarnings) and (not GIsWorkerThread) then - for I := 0 to Parser.WarningCount - 1 do - begin - Warning := Parser.GetWarning(I); - WriteLn(SysUtils.Format('Warning: %s', [Warning.Message])); - if Warning.Suggestion <> '' then - WriteLn(SysUtils.Format(' Suggestion: %s', [Warning.Suggestion])); - if Assigned(ASourceMap) and - ASourceMap.Translate(Warning.Line, Warning.Column, OrigLine, OrigCol) then - WriteLn(SysUtils.Format(' --> %s:%d:%d', [AFileName, OrigLine, OrigCol])) - else - WriteLn(SysUtils.Format(' --> %s:%d:%d', [AFileName, Warning.Line, Warning.Column])); - end; - finally - Parser.Free; + if (not ASuppressWarnings) and (not GIsWorkerThread) then + for I := 0 to PipelineResult.WarningCount - 1 do + begin + Warning := PipelineResult.Warnings[I]; + WriteLn(SysUtils.Format('Warning: %s', [Warning.Message])); + if Warning.Suggestion <> '' then + WriteLn(SysUtils.Format(' Suggestion: %s', [Warning.Suggestion])); + WriteLn(SysUtils.Format(' --> %s:%d:%d', + [AFileName, Warning.Line, Warning.Column])); end; - finally - Lexer.Free; - end; - except - ASourceMap.Free; - ASourceMap := nil; - raise; + + Result := PipelineResult.TakeProgramNode; + ASourceMap := PipelineResult.TakeSourceMap; + finally + PipelineResult.Free; end; end; @@ -660,6 +615,7 @@ var Module: TGocciaCompiledModule; Executor: TGocciaBytecodeExecutor; Engine: TGocciaEngine; + PipelineOptions: TGocciaSourcePipelineOptions; SourceMap: TGocciaSourceMap; StartTime, CompileStart, CompileEnd, ExecEnd: Int64; begin @@ -671,11 +627,11 @@ begin ConfigureConsole(RuntimeConsole(Engine), ACapture); ApplyDataGlobalsToEngine(Engine); - ProgramNode := ParseSource(ASource, AFileName, TGocciaEngine.DefaultPreprocessors, - IsJsonOutput, Engine.ASIEnabled, Engine.VarEnabled, Engine.FunctionEnabled, - Engine.TraditionalForLoopsEnabled, Engine.WhileLoopsEnabled, - Engine.LooseEqualityEnabled, Engine.NonStrictModeEnabled or - (Engine.SourceType = stModule), + PipelineOptions.Preprocessors := Engine.Preprocessors; + PipelineOptions.Compatibility := Engine.Compatibility; + PipelineOptions.SourceType := Engine.SourceType; + ProgramNode := ParseSource(ASource, AFileName, PipelineOptions, + IsJsonOutput, Result.Timing.LexTimeNanoseconds, Result.Timing.ParseTimeNanoseconds, SourceMap); try @@ -1298,13 +1254,13 @@ begin if FSourceMap.Present and (FSourceMap.ValueOr('') = '') and ((APaths.Count = 0) or ((APaths.Count = 1) and IsStdinPath(APaths[0]))) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--source-map= is required when reading source from stdin.'); if (FSourceMap.ValueOr('') <> '') and ((APaths.Count > 1) or ((APaths.Count = 1) and DirectoryExists(APaths[0]))) then - raise TGocciaParseError.Create( + raise TParseError.Create( '--source-map= supports a single input file or stdin.'); // Use Present rather than the value to catch the bare --source-map @@ -1312,7 +1268,7 @@ begin // user passing --source-map alongside --multifile is almost certainly // signalling intent that does not match the multi-output reality. if FSourceMap.Present and MultifileEnabled then - raise TGocciaParseError.Create( + raise TParseError.Create( '--source-map cannot be combined with --multifile (an input ' + 'may expand to multiple sections).'); @@ -1370,7 +1326,7 @@ begin for I := 0 to APaths.Count - 1 do begin if IsStdinPath(APaths[I]) then - raise TGocciaParseError.Create( + raise TParseError.Create( 'stdin is supported only as the sole input.'); if DirectoryExists(APaths[I]) then RawFiles.AddStrings(FindAllFiles(APaths[I], ScriptExtensions)) @@ -1402,7 +1358,7 @@ begin --output=json mode and by GocciaTestRunner / GocciaBenchmarkRunner. } for I := 0 to APaths.Count - 1 do if IsStdinPath(APaths[I]) then - raise TGocciaParseError.Create( + raise TParseError.Create( 'stdin is supported only as the sole input.'); for I := 0 to APaths.Count - 1 do @@ -1431,7 +1387,7 @@ end; procedure TScriptLoaderApp.AfterExecute; var ProfileOpcodes, ProfileFunctions: Boolean; - ProfileMode: CLI.Options.TGocciaProfileMode; + ProfileMode: Goccia.CLI.Options.TGocciaProfileMode; begin if (CoverageOptions.Enabled.Present or CoverageOptions.Format.Present or CoverageOptions.OutputPath.Present) and @@ -1459,10 +1415,10 @@ begin if ProfilerOptions.Mode.Present then begin ProfileMode := ProfilerOptions.Mode.Value; - ProfileOpcodes := (ProfileMode = CLI.Options.pmOpcodes) or - (ProfileMode = CLI.Options.pmAll); - ProfileFunctions := (ProfileMode = CLI.Options.pmFunctions) or - (ProfileMode = CLI.Options.pmAll); + ProfileOpcodes := (ProfileMode = Goccia.CLI.Options.pmOpcodes) or + (ProfileMode = Goccia.CLI.Options.pmAll); + ProfileFunctions := (ProfileMode = Goccia.CLI.Options.pmFunctions) or + (ProfileMode = Goccia.CLI.Options.pmAll); end; if (ProfileOpcodes or ProfileFunctions) and diff --git a/source/app/GocciaScriptLoaderBare.dpr b/source/app/GocciaScriptLoaderBare.dpr index d42a080c..fe1ee139 100644 --- a/source/app/GocciaScriptLoaderBare.dpr +++ b/source/app/GocciaScriptLoaderBare.dpr @@ -9,12 +9,14 @@ uses TextSemantics, Goccia.Arguments.Collection, + Goccia.CLI.Options, Goccia.Engine, Goccia.Error, Goccia.Error.Detail, Goccia.Executor, Goccia.Executor.Bytecode, Goccia.Executor.Interpreter, + Goccia.FileExtensions, Goccia.GarbageCollector, Goccia.InstructionLimit, Goccia.ScriptLoader.Input, @@ -35,18 +37,13 @@ type TBareExecutionMode = (bemInterpreted, bemBytecode); TBareOptions = record - ASI: Boolean; - CompatVar: Boolean; - CompatFunction: Boolean; - CompatTraditionalFor: Boolean; - CompatWhileLoops: Boolean; - CompatLooseEquality: Boolean; - CompatNonStrictMode: Boolean; + Compatibility: TGocciaCompatibilityFlags; StrictTypes: Boolean; UnsafeFunctionConstructor: Boolean; Print: Boolean; Mode: TBareExecutionMode; SourceType: TGocciaSourceType; + SourceTypeExplicit: Boolean; FileName: string; TimeoutMs: Integer; MaxMemoryBytes: Int64; @@ -75,20 +72,22 @@ begin end; procedure PrintUsage; +var + Flag: TGocciaCompatibility; + Descriptor: TGocciaCompatibilityFlagDescriptor; begin WriteLn('Usage: GocciaScriptLoaderBare [file|-] [options]'); WriteLn(''); WriteLn('Options:'); - WriteLn(' --asi Enable automatic semicolon insertion'); - WriteLn(' --compat-var Enable var declarations'); - WriteLn(' --compat-function Enable function declarations/expressions'); - WriteLn(' --compat-traditional-for-loop Enable traditional C-style for(;;) loops'); - WriteLn(' --compat-while-loops Enable while and do...while loops'); - WriteLn(' --compat-loose-equality Enable loose equality (== and !=)'); - WriteLn(' --compat-non-strict-mode Enable non-strict-mode compatibility'); + for Flag := Low(TGocciaCompatibility) to High(TGocciaCompatibility) do + begin + Descriptor := CompatibilityFlagDescriptor(Flag); + WriteLn(Format(' --%-28s %s', [Descriptor.OptionName, + Descriptor.HelpText])); + end; WriteLn(' --strict-types Enforce type annotations at runtime'); WriteLn(' --mode=interpreted|bytecode Execution mode (default: interpreted)'); - WriteLn(' --source-type=script|module Load entry as script source or module source'); + WriteLn(' --source-type=script|module Load entry as script source or module source (.mjs infers module)'); WriteLn(' --unsafe-function-constructor Enable dynamic Function constructor'); WriteLn(' --print Print the script''s last value (incl. undefined)'); WriteLn(' --timeout=MS Per-file cooperative timeout in milliseconds'); @@ -115,6 +114,7 @@ begin AOptions.SourceType := stModule else raise Exception.Create('Invalid --source-type value: ' + AValue); + AOptions.SourceTypeExplicit := True; end; procedure ParseTimeout(const AValue: string; var AOptions: TBareOptions); @@ -156,18 +156,13 @@ var I: Integer; Arg: string; begin - Result.ASI := False; - Result.CompatVar := False; - Result.CompatFunction := False; - Result.CompatTraditionalFor := False; - Result.CompatWhileLoops := False; - Result.CompatLooseEquality := False; - Result.CompatNonStrictMode := False; + Result.Compatibility := []; Result.StrictTypes := False; Result.UnsafeFunctionConstructor := False; Result.Print := False; Result.Mode := bemInterpreted; Result.SourceType := stScript; + Result.SourceTypeExplicit := False; Result.FileName := STDIN_PATH_MARKER; Result.TimeoutMs := 0; Result.MaxMemoryBytes := 0; @@ -181,20 +176,10 @@ begin PrintUsage; Halt(0); end - else if Arg = '--asi' then - Result.ASI := True - else if Arg = '--compat-var' then - Result.CompatVar := True - else if Arg = '--compat-function' then - Result.CompatFunction := True - else if Arg = '--compat-traditional-for-loop' then - Result.CompatTraditionalFor := True - else if Arg = '--compat-while-loops' then - Result.CompatWhileLoops := True - else if Arg = '--compat-loose-equality' then - Result.CompatLooseEquality := True - else if Arg = '--compat-non-strict-mode' then - Result.CompatNonStrictMode := True + else if TryApplyCompatibilityFlagArg(Arg, Result.Compatibility) then + begin + { handled by source compatibility flag registry } + end else if Arg = '--strict-types' then Result.StrictTypes := True else if Arg = '--unsafe-function-constructor' then @@ -219,6 +204,10 @@ begin else raise Exception.Create('Unexpected argument: ' + Arg); end; + + if (not Result.SourceTypeExplicit) and + IsModuleSourceFileName(Result.FileName) then + Result.SourceType := stModule; end; function ReadBareSource(const AFileName: string): TStringList; @@ -232,13 +221,7 @@ end; procedure ConfigureEngine(const AEngine: TGocciaEngine; const AOptions: TBareOptions); begin - AEngine.ASIEnabled := AOptions.ASI; - AEngine.VarEnabled := AOptions.CompatVar; - AEngine.FunctionEnabled := AOptions.CompatFunction; - AEngine.TraditionalForLoopsEnabled := AOptions.CompatTraditionalFor; - AEngine.WhileLoopsEnabled := AOptions.CompatWhileLoops; - AEngine.LooseEqualityEnabled := AOptions.CompatLooseEquality; - AEngine.NonStrictModeEnabled := AOptions.CompatNonStrictMode; + AEngine.Compatibility := AOptions.Compatibility; AEngine.StrictTypes := AOptions.StrictTypes; AEngine.SourceType := AOptions.SourceType; AEngine.FunctionConstructor.Enabled := AOptions.UnsafeFunctionConstructor; diff --git a/source/app/GocciaTestRunner.dpr b/source/app/GocciaTestRunner.dpr index 8540cdd8..9cd46cca 100644 --- a/source/app/GocciaTestRunner.dpr +++ b/source/app/GocciaTestRunner.dpr @@ -5,17 +5,16 @@ program GocciaTestRunner; uses {$IFDEF UNIX}cthreads,{$ENDIF} Classes, - Generics.Collections, StrUtils, SysUtils, TimingUtils, - TextSemantics, Goccia.Application, Goccia.AST.Node, Goccia.Bytecode.Module, Goccia.CLI.Application, + Goccia.CLI.Options, CLI.ConfigFile, CLI.Options, Goccia.Coverage, @@ -30,22 +29,18 @@ uses Goccia.GarbageCollector, Goccia.InstructionLimit, Goccia.JSON.Utils, - Goccia.JSX.Transformer, - Goccia.Lexer, - Goccia.Parser, Goccia.Runtime, Goccia.RuntimeExtensions.Console, Goccia.RuntimeExtensions.FFI, Goccia.RuntimeProfiles.TestRunner, Goccia.Scope, Goccia.ScriptLoader.Input, - Goccia.SourceMap, + Goccia.SourcePipeline, Goccia.Builtins.TestingLibrary, Goccia.CLI.JSON.Reporter, Goccia.Terminal.Colors, Goccia.TextFiles, Goccia.Timeout, - Goccia.Token, Goccia.Values.ArrayValue, Goccia.Values.Error, Goccia.Values.ObjectValue, @@ -124,13 +119,13 @@ type TTestRunnerApp = class(TGocciaCLIApplication) private - FNoProgress: TGocciaFlagOption; - FNoResults: TGocciaFlagOption; - FExitOnFirst: TGocciaFlagOption; - FSilent: TGocciaFlagOption; - FOutputFile: TGocciaStringOption; - FTestTimeout: TGocciaIntegerOption; - FDescribeTimeout: TGocciaIntegerOption; + FNoProgress: TFlagOption; + FNoResults: TFlagOption; + FExitOnFirst: TFlagOption; + FSilent: TFlagOption; + FOutputFile: TStringOption; + FTestTimeout: TIntegerOption; + FDescribeTimeout: TIntegerOption; procedure InitializeRuntime(const AEngine: TGocciaEngine); procedure InitializeRuntimeWithUnsafeFFI(const AEngine: TGocciaEngine); protected @@ -601,14 +596,9 @@ function TTestRunnerApp.RunGocciaScriptBytecode(const AFileName: string; APreloadedSource: TStringList): TTestFileResult; var Source: TStringList; - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - SourceMap: TGocciaSourceMap; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; - Warning: TGocciaParserWarning; - ProgramNode: TGocciaProgram; + PipelineOptions: TGocciaSourcePipelineOptions; + PipelineResult: TGocciaSourcePipelineResult; + Warning: TGocciaSourcePipelineWarning; Module: TGocciaCompiledModule; Executor: TGocciaBytecodeExecutor; Engine: TGocciaEngine; @@ -616,13 +606,15 @@ var ResultValue: TGocciaValue; GC: TGarbageCollector; ResultValueRooted: Boolean; - OrigLine, OrigCol, I: Integer; - LexStart, LexEnd, ParseEnd, CompileEnd, ExecEnd: Int64; + I: Integer; + LexStart, CompileStart, CompileEnd, ExecEnd: Int64; + LexTimeNanoseconds, ParseTimeNanoseconds: Int64; begin ScriptResult := CreateDefaultScriptResult; ResultValue := nil; GC := TGarbageCollector.Instance; ResultValueRooted := False; + PipelineResult := nil; if Assigned(GC) then GC.AddTempRoot(ScriptResult); @@ -649,16 +641,7 @@ begin Source.Add(Format('runTests({ exitOnFirstFailure: %s, showTestResults: false });', [BoolToStr(FExitOnFirst.Present, 'true', 'false')])); - SourceText := StringListToLFText(Source); - SourceMap := nil; - if ppJSX in TGocciaEngine.DefaultPreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - SourceMap := JSXResult.SourceMap; - end; - - try try + try Executor := TGocciaBytecodeExecutor.Create; try Engine := CreateEngine(AFileName, Source, Executor); @@ -670,59 +653,43 @@ begin end; LexStart := GetNanoseconds; - Lexer := TGocciaLexer.Create(SourceText, AFileName); - try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - - Parser := TGocciaParser.Create(Tokens, AFileName, Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := Engine.ASIEnabled; - Parser.VarDeclarationsEnabled := Engine.VarEnabled; - Parser.FunctionDeclarationsEnabled := Engine.FunctionEnabled; - Parser.TraditionalForLoopsEnabled := Engine.TraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := Engine.WhileLoopsEnabled; - Parser.LooseEqualityEnabled := Engine.LooseEqualityEnabled; - Parser.NonStrictModeEnabled := Engine.NonStrictModeEnabled or - (Engine.SourceType = stModule); - try - ProgramNode := Parser.Parse; - ParseEnd := GetNanoseconds; - - if Assigned(TGocciaCoverageTracker.Instance) and - TGocciaCoverageTracker.Instance.Enabled then - begin - TGocciaCoverageTracker.Instance.RegisterSourceFile( - AFileName, CountExecutableLines(Lexer.SourceLines)); - if Assigned(SourceMap) then - TGocciaCoverageTracker.Instance.RegisterSourceMap( - AFileName, SourceMap.Clone); - end; - - if (not FSilent.Present) and (not GIsWorkerThread) and (not IsJsonOutput) then - for I := 0 to Parser.WarningCount - 1 do - begin - Warning := Parser.GetWarning(I); - WriteLn(Format('Warning: %s', [Warning.Message])); - if Warning.Suggestion <> '' then - WriteLn(Format(' Suggestion: %s', [Warning.Suggestion])); - if Assigned(SourceMap) and SourceMap.Translate(Warning.Line, Warning.Column, OrigLine, OrigCol) then - WriteLn(Format(' --> %s:%d:%d', [AFileName, OrigLine, OrigCol])) - else - WriteLn(Format(' --> %s:%d:%d', [AFileName, Warning.Line, Warning.Column])); - end; - try - Module := Engine.CompileModule(ProgramNode); - CompileEnd := GetNanoseconds; - finally - ProgramNode.Free; - end; - finally - Parser.Free; - end; - finally - Lexer.Free; + PipelineOptions.Preprocessors := Engine.Preprocessors; + PipelineOptions.Compatibility := Engine.Compatibility; + PipelineOptions.SourceType := Engine.SourceType; + PipelineResult := TGocciaSourcePipeline.Parse(Source, AFileName, + PipelineOptions); + LexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + ParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; + + if Assigned(TGocciaCoverageTracker.Instance) and + TGocciaCoverageTracker.Instance.Enabled then + begin + TGocciaCoverageTracker.Instance.RegisterSourceFile( + AFileName, + CountExecutableLines(PipelineResult.GeneratedSourceLines)); + if Assigned(PipelineResult.SourceMap) then + TGocciaCoverageTracker.Instance.RegisterSourceMap( + AFileName, PipelineResult.SourceMap.Clone); end; + if (not FSilent.Present) and (not GIsWorkerThread) and + (not IsJsonOutput) then + for I := 0 to PipelineResult.WarningCount - 1 do + begin + Warning := PipelineResult.Warnings[I]; + WriteLn(Format('Warning: %s', [Warning.Message])); + if Warning.Suggestion <> '' then + WriteLn(Format(' Suggestion: %s', [Warning.Suggestion])); + WriteLn(Format(' --> %s:%d:%d', + [AFileName, Warning.Line, Warning.Column])); + end; + + CompileStart := GetNanoseconds; + Module := Engine.CompileModule(PipelineResult.ProgramNode); + CompileEnd := GetNanoseconds; + PipelineResult.Free; + PipelineResult := nil; + StartExecutionTimeout(EngineOptions.Timeout.ValueOr(DEFAULT_TIMEOUT_MS)); StartInstructionLimit(EngineOptions.MaxInstructions.ValueOr(0)); try @@ -743,9 +710,9 @@ begin Result.TestResult := ScriptResult; Result.Timing.Result := ResultValue; - Result.Timing.LexTimeNanoseconds := LexEnd - LexStart; - Result.Timing.ParseTimeNanoseconds := ParseEnd - LexEnd; - Result.Timing.CompileTimeNanoseconds := CompileEnd - ParseEnd; + Result.Timing.LexTimeNanoseconds := LexTimeNanoseconds; + Result.Timing.ParseTimeNanoseconds := ParseTimeNanoseconds; + Result.Timing.CompileTimeNanoseconds := CompileEnd - CompileStart; Result.Timing.ExecuteTimeNanoseconds := ExecEnd - CompileEnd; Result.Timing.TotalTimeNanoseconds := ExecEnd - LexStart; Result.Timing.FileName := AFileName; @@ -786,10 +753,8 @@ begin end; end; end; - finally - SourceMap.Free; - end; finally + PipelineResult.Free; if ResultValueRooted and Assigned(GC) then GC.RemoveTempRoot(ResultValue); if Assigned(GC) then diff --git a/source/shared/CLI.ConfigFile.Test.pas b/source/shared/CLI.ConfigFile.Test.pas index d0e180fa..ec556ee2 100644 --- a/source/shared/CLI.ConfigFile.Test.pas +++ b/source/shared/CLI.ConfigFile.Test.pas @@ -220,16 +220,16 @@ procedure TConfigFileTests.WriteRawFile(const APath: string; procedure TConfigFileTests.TestJSONStringValue; var Dir, Path: string; - Flag: TGocciaFlagOption; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; WriteTextFile(Path, '{"mode": "bytecode"}'); - Mode := TGocciaStringOption.Create('mode', 'Execution mode'); - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Mode := TStringOption.Create('mode', 'Execution mode'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 2); Options[0] := Mode; @@ -249,14 +249,14 @@ procedure TConfigFileTests.TestJSONStringValue; procedure TConfigFileTests.TestJSONIntegerValue; var Dir, Path: string; - Timeout: TGocciaIntegerOption; - Options: TGocciaOptionArray; + Timeout: TIntegerOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; WriteTextFile(Path, '{"timeout": 5000}'); - Timeout := TGocciaIntegerOption.Create('timeout', 'Timeout'); + Timeout := TIntegerOption.Create('timeout', 'Timeout'); try SetLength(Options, 1); Options[0] := Timeout; @@ -273,60 +273,60 @@ procedure TConfigFileTests.TestJSONIntegerValue; procedure TConfigFileTests.TestJSONBooleanTrueIncluded; var Dir, Path: string; - ASI: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; - WriteTextFile(Path, '{"asi": true}'); + WriteTextFile(Path, '{"feature": true}'); - ASI := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); - Options[0] := ASI; + Options[0] := Flag; ApplyConfigFile(Path, Options); - Expect(ASI.Present).ToBe(True); + Expect(Flag.Present).ToBe(True); finally - ASI.Free; + Flag.Free; end; end; procedure TConfigFileTests.TestJSONBooleanFalseOmitted; var Dir, Path: string; - ASI: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; - WriteTextFile(Path, '{"asi": false}'); + WriteTextFile(Path, '{"feature": false}'); - ASI := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); - Options[0] := ASI; + Options[0] := Flag; ApplyConfigFile(Path, Options); - Expect(ASI.Present).ToBe(False); + Expect(Flag.Present).ToBe(False); finally - ASI.Free; + Flag.Free; end; end; procedure TConfigFileTests.TestJSONArrayProducesMultipleEntries; var Dir, Path: string; - Aliases: TGocciaRepeatableOption; - Options: TGocciaOptionArray; + Aliases: TRepeatableOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; WriteTextFile(Path, '{"alias": ["@/=./src/", "config=./config.js"]}'); - Aliases := TGocciaRepeatableOption.Create('alias', 'Aliases'); + Aliases := TRepeatableOption.Create('alias', 'Aliases'); try SetLength(Options, 1); Options[0] := Aliases; @@ -345,14 +345,14 @@ procedure TConfigFileTests.TestJSONArrayProducesMultipleEntries; procedure TConfigFileTests.TestJSONNestedObjectSkipped; var Dir, Path: string; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; WriteTextFile(Path, '{"imports": {"@/": "./src/"}, "mode": "bytecode"}'); - Mode := TGocciaStringOption.Create('mode', 'Mode'); + Mode := TStringOption.Create('mode', 'Mode'); try SetLength(Options, 1); Options[0] := Mode; @@ -369,14 +369,14 @@ procedure TConfigFileTests.TestJSONNestedObjectSkipped; procedure TConfigFileTests.TestJSONNullSkipped; var Dir, Path: string; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'test.json'; WriteTextFile(Path, '{"mode": null}'); - Mode := TGocciaStringOption.Create('mode', 'Mode'); + Mode := TStringOption.Create('mode', 'Mode'); try SetLength(Options, 1); Options[0] := Mode; @@ -393,16 +393,16 @@ procedure TConfigFileTests.TestJSONNullSkipped; procedure TConfigFileTests.TestApplyFlagOption; var - Flag: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); Options[0] := Flag; SetLength(Entries, 1); - Entries[0].Key := 'asi'; + Entries[0].Key := 'feature'; Entries[0].Value := 'true'; ApplyConfigEntries(Entries, Options); @@ -415,16 +415,16 @@ procedure TConfigFileTests.TestApplyFlagOption; procedure TConfigFileTests.TestApplyFlagFalseNotSet; var - Flag: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); Options[0] := Flag; SetLength(Entries, 1); - Entries[0].Key := 'asi'; + Entries[0].Key := 'feature'; Entries[0].Value := 'false'; ApplyConfigEntries(Entries, Options); @@ -437,11 +437,11 @@ procedure TConfigFileTests.TestApplyFlagFalseNotSet; procedure TConfigFileTests.TestApplyStringOption; var - Opt: TGocciaStringOption; - Options: TGocciaOptionArray; + Opt: TStringOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Opt := TGocciaStringOption.Create('output', 'Output path'); + Opt := TStringOption.Create('output', 'Output path'); try SetLength(Options, 1); Options[0] := Opt; @@ -460,11 +460,11 @@ procedure TConfigFileTests.TestApplyStringOption; procedure TConfigFileTests.TestApplyIntegerOption; var - Opt: TGocciaIntegerOption; - Options: TGocciaOptionArray; + Opt: TIntegerOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Opt := TGocciaIntegerOption.Create('timeout', 'Timeout'); + Opt := TIntegerOption.Create('timeout', 'Timeout'); try SetLength(Options, 1); Options[0] := Opt; @@ -486,11 +486,11 @@ procedure TConfigFileTests.TestApplyIntegerOption; procedure TConfigFileTests.TestApplyEnumOption; var - Opt: TGocciaEnumOption; - Options: TGocciaOptionArray; + Opt: TEnumOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Opt := TGocciaEnumOption.Create('mode', 'Execution mode'); + Opt := TEnumOption.Create('mode', 'Execution mode'); try SetLength(Options, 1); Options[0] := Opt; @@ -509,11 +509,11 @@ procedure TConfigFileTests.TestApplyEnumOption; procedure TConfigFileTests.TestApplyRepeatableOption; var - Opt: TGocciaRepeatableOption; - Options: TGocciaOptionArray; + Opt: TRepeatableOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Opt := TGocciaRepeatableOption.Create('alias', 'Aliases'); + Opt := TRepeatableOption.Create('alias', 'Aliases'); try SetLength(Options, 1); Options[0] := Opt; @@ -536,11 +536,11 @@ procedure TConfigFileTests.TestApplyRepeatableOption; procedure TConfigFileTests.TestApplyUnknownKeySkipped; var - Flag: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); Options[0] := Flag; @@ -561,28 +561,28 @@ procedure TConfigFileTests.TestApplyUnknownKeySkipped; procedure TConfigFileTests.TestApplyConfigFileJSON; var Dir, Path: string; - ASI: TGocciaFlagOption; - Timeout: TGocciaIntegerOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Timeout: TIntegerOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'config.json'; - WriteTextFile(Path, '{"asi": true, "timeout": 2000}'); + WriteTextFile(Path, '{"feature": true, "timeout": 2000}'); - ASI := TGocciaFlagOption.Create('asi', 'ASI'); - Timeout := TGocciaIntegerOption.Create('timeout', 'Timeout'); + Flag := TFlagOption.Create('feature', 'Flag'); + Timeout := TIntegerOption.Create('timeout', 'Timeout'); try SetLength(Options, 2); - Options[0] := ASI; + Options[0] := Flag; Options[1] := Timeout; ApplyConfigFile(Path, Options); - Expect(ASI.Present).ToBe(True); + Expect(Flag.Present).ToBe(True); Expect(Timeout.Present).ToBe(True); Expect(Timeout.Value).ToBe(2000); finally - ASI.Free; + Flag.Free; Timeout.Free; end; end; @@ -592,17 +592,17 @@ procedure TConfigFileTests.TestApplyConfigFileJSONPreservesUTF8; JSON_BYTES = '{"mode":"Jos' + #$C3#$A9 + '","alias":["caf' + #$C3#$A9 + '=./d' + #$C3#$A9 + 'j' + #$C3#$A0 + '.js"]}'; var - Alias: TGocciaRepeatableOption; + Alias: TRepeatableOption; Dir, Path: string; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'config.json'; WriteRawFile(Path, JSON_BYTES); - Alias := TGocciaRepeatableOption.Create('alias', 'Alias'); - Mode := TGocciaStringOption.Create('mode', 'Mode'); + Alias := TRepeatableOption.Create('alias', 'Alias'); + Mode := TStringOption.Create('mode', 'Mode'); try SetLength(Options, 2); Options[0] := Mode; @@ -623,15 +623,15 @@ procedure TConfigFileTests.TestApplyConfigFileJSONPreservesUTF8; procedure TConfigFileTests.TestApplyConfigFileUnregisteredExtensionRaises; var Dir, Path: string; - Flag: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; Raised: Boolean; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'config.xyz'; WriteTextFile(Path, 'whatever'); - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); Options[0] := Flag; @@ -655,14 +655,14 @@ procedure TConfigFileTests.TestApplyConfigFileUnregisteredExtensionRaises; procedure TConfigFileTests.TestOptionCanBeModifiedAfterConfigApply; var Dir, Path: string; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'config.json'; WriteTextFile(Path, '{"mode": "bytecode"}'); - Mode := TGocciaStringOption.Create('mode', 'Mode'); + Mode := TStringOption.Create('mode', 'Mode'); try SetLength(Options, 1); Options[0] := Mode; @@ -682,14 +682,14 @@ procedure TConfigFileTests.TestOptionCanBeModifiedAfterConfigApply; procedure TConfigFileTests.TestApplySkipsAlreadyPresentOption; var Dir, Path: string; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'config.json'; WriteTextFile(Path, '{"mode": "bytecode"}'); - Mode := TGocciaStringOption.Create('mode', 'Mode'); + Mode := TStringOption.Create('mode', 'Mode'); try SetLength(Options, 1); Options[0] := Mode; @@ -710,30 +710,30 @@ procedure TConfigFileTests.TestApplySkipsAlreadyPresentOption; procedure TConfigFileTests.TestExtendsLoadsBaseConfig; var Dir, BasePath, ChildPath: string; - ASI: TGocciaFlagOption; - Timeout: TGocciaIntegerOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Timeout: TIntegerOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; BasePath := IncludeTrailingPathDelimiter(Dir) + 'base.json'; ChildPath := IncludeTrailingPathDelimiter(Dir) + 'goccia.json'; - WriteTextFile(BasePath, '{"asi": true, "timeout": 3000}'); + WriteTextFile(BasePath, '{"feature": true, "timeout": 3000}'); WriteTextFile(ChildPath, '{"extends": "base.json"}'); - ASI := TGocciaFlagOption.Create('asi', 'ASI'); - Timeout := TGocciaIntegerOption.Create('timeout', 'Timeout'); + Flag := TFlagOption.Create('feature', 'Flag'); + Timeout := TIntegerOption.Create('timeout', 'Timeout'); try SetLength(Options, 2); - Options[0] := ASI; + Options[0] := Flag; Options[1] := Timeout; ApplyConfigFile(ChildPath, Options); - Expect(ASI.Present).ToBe(True); + Expect(Flag.Present).ToBe(True); Expect(Timeout.Present).ToBe(True); Expect(Timeout.Value).ToBe(3000); finally - ASI.Free; + Flag.Free; Timeout.Free; end; end; @@ -741,40 +741,40 @@ procedure TConfigFileTests.TestExtendsLoadsBaseConfig; procedure TConfigFileTests.TestExtendsChildOverridesParent; var Dir, BasePath, ChildPath: string; - Mode: TGocciaStringOption; - ASI: TGocciaFlagOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Flag: TFlagOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; BasePath := IncludeTrailingPathDelimiter(Dir) + 'base.json'; ChildPath := IncludeTrailingPathDelimiter(Dir) + 'goccia.json'; - WriteTextFile(BasePath, '{"mode": "interpreted", "asi": true}'); + WriteTextFile(BasePath, '{"mode": "interpreted", "feature": true}'); WriteTextFile(ChildPath, '{"extends": "base.json", "mode": "bytecode"}'); - Mode := TGocciaStringOption.Create('mode', 'Mode'); - ASI := TGocciaFlagOption.Create('asi', 'ASI'); + Mode := TStringOption.Create('mode', 'Mode'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 2); Options[0] := Mode; - Options[1] := ASI; + Options[1] := Flag; ApplyConfigFile(ChildPath, Options); { Child's mode overrides parent's } Expect(Mode.Value).ToBe('bytecode'); - { Parent's asi is inherited } - Expect(ASI.Present).ToBe(True); + { Parent's feature is inherited } + Expect(Flag.Present).ToBe(True); finally Mode.Free; - ASI.Free; + Flag.Free; end; end; procedure TConfigFileTests.TestExtendsCircularRaises; var Dir, PathA, PathB: string; - Flag: TGocciaFlagOption; - Options: TGocciaOptionArray; + Flag: TFlagOption; + Options: TOptionArray; Raised: Boolean; begin Dir := CreateTempDirectory; @@ -783,7 +783,7 @@ procedure TConfigFileTests.TestExtendsCircularRaises; WriteTextFile(PathA, '{"extends": "b.json"}'); WriteTextFile(PathB, '{"extends": "a.json"}'); - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try SetLength(Options, 1); Options[0] := Flag; @@ -814,8 +814,8 @@ function DummyTOMLParser(const AContent: string): TConfigEntryArray; procedure TConfigFileTests.TestRegisterAndUseCustomParser; var Dir, Path: string; - Mode: TGocciaStringOption; - Options: TGocciaOptionArray; + Mode: TStringOption; + Options: TOptionArray; begin Dir := CreateTempDirectory; Path := IncludeTrailingPathDelimiter(Dir) + 'config.toml'; @@ -823,7 +823,7 @@ procedure TConfigFileTests.TestRegisterAndUseCustomParser; RegisterConfigParser('.toml', @DummyTOMLParser); - Mode := TGocciaStringOption.Create('mode', 'Mode'); + Mode := TStringOption.Create('mode', 'Mode'); try SetLength(Options, 1); Options[0] := Mode; @@ -905,10 +905,10 @@ procedure TConfigFileTests.TestFindConfigEntryReturnsMatch; SetLength(Entries, 2); Entries[0].Key := 'mode'; Entries[0].Value := 'bytecode'; - Entries[1].Key := 'asi'; + Entries[1].Key := 'feature'; Entries[1].Value := 'true'; - Expect(FindConfigEntry(Entries, 'asi', Value)).ToBe(True); + Expect(FindConfigEntry(Entries, 'feature', Value)).ToBe(True); Expect(Value).ToBe('true'); end; @@ -943,17 +943,17 @@ procedure TConfigFileTests.TestFindConfigEntryFirstMatchWins; procedure TConfigFileTests.TestResolveFlagOptionCLIWins; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try Flag.Apply(''); Flag.MarkFromCommandLine; { Per-file config says false, but CLI should win } SetLength(FileConfig, 1); - FileConfig[0].Key := 'asi'; + FileConfig[0].Key := 'feature'; FileConfig[0].Value := 'false'; Expect(ResolveFlagOption(Flag, FileConfig)).ToBe(True); @@ -964,25 +964,25 @@ procedure TConfigFileTests.TestResolveFlagOptionCLIWins; procedure TConfigFileTests.TestResolveFlagOptionPerFileOverridesRoot; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; - Options: TGocciaOptionArray; + Options: TOptionArray; RootEntries: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try - { Root config sets asi='false' — ApplyConfigEntries skips Apply for + { Root config sets feature='false' — ApplyConfigEntries skips Apply for flag value 'false', so Present remains False. } SetLength(Options, 1); Options[0] := Flag; SetLength(RootEntries, 1); - RootEntries[0].Key := 'asi'; + RootEntries[0].Key := 'feature'; RootEntries[0].Value := 'false'; ApplyConfigEntries(RootEntries, Options); { Per-file config says true — should override root } SetLength(FileConfig, 1); - FileConfig[0].Key := 'asi'; + FileConfig[0].Key := 'feature'; FileConfig[0].Value := 'true'; Expect(ResolveFlagOption(Flag, FileConfig)).ToBe(True); @@ -993,25 +993,25 @@ procedure TConfigFileTests.TestResolveFlagOptionPerFileOverridesRoot; procedure TConfigFileTests.TestResolveFlagOptionPerFileFalseOverridesRoot; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; - Options: TGocciaOptionArray; + Options: TOptionArray; RootEntries: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try - { Simulate root config setting asi=true (Present but not FromCommandLine) } + { Simulate root config setting feature=true (Present but not FromCommandLine) } SetLength(Options, 1); Options[0] := Flag; SetLength(RootEntries, 1); - RootEntries[0].Key := 'asi'; + RootEntries[0].Key := 'feature'; RootEntries[0].Value := 'true'; ApplyConfigEntries(RootEntries, Options); Expect(Flag.Present).ToBe(True); { Per-file config says false — should override root } SetLength(FileConfig, 1); - FileConfig[0].Key := 'asi'; + FileConfig[0].Key := 'feature'; FileConfig[0].Value := 'false'; Expect(ResolveFlagOption(Flag, FileConfig)).ToBe(False); @@ -1022,18 +1022,18 @@ procedure TConfigFileTests.TestResolveFlagOptionPerFileFalseOverridesRoot; procedure TConfigFileTests.TestResolveFlagOptionFallsBackToRoot; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; - Options: TGocciaOptionArray; + Options: TOptionArray; RootEntries: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try - { Simulate root config setting asi=true } + { Simulate root config setting feature=true } SetLength(Options, 1); Options[0] := Flag; SetLength(RootEntries, 1); - RootEntries[0].Key := 'asi'; + RootEntries[0].Key := 'feature'; RootEntries[0].Value := 'true'; ApplyConfigEntries(RootEntries, Options); @@ -1048,14 +1048,14 @@ procedure TConfigFileTests.TestResolveFlagOptionFallsBackToRoot; procedure TConfigFileTests.TestResolveFlagOptionEmptyStringEnablesFlag; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try { Per-file config with empty string — matches ApplyConfigEntries behavior } SetLength(FileConfig, 1); - FileConfig[0].Key := 'asi'; + FileConfig[0].Key := 'feature'; FileConfig[0].Value := ''; Expect(ResolveFlagOption(Flag, FileConfig)).ToBe(True); @@ -1066,10 +1066,10 @@ procedure TConfigFileTests.TestResolveFlagOptionEmptyStringEnablesFlag; procedure TConfigFileTests.TestResolveFlagOptionUsesConfigName; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('enable-ffi', 'FFI'); + Flag := TFlagOption.Create('enable-ffi', 'FFI'); try Flag.ConfigName := 'unsafe-ffi'; SetLength(FileConfig, 1); @@ -1085,7 +1085,7 @@ procedure TConfigFileTests.TestResolveFlagOptionUsesConfigName; procedure TConfigFileTests.TestResolveFlagOptionMixedAliasExtendsPrecedence; var Dir, BasePath, ChildPath: string; - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; begin Dir := CreateTempDirectory; @@ -1094,7 +1094,7 @@ procedure TConfigFileTests.TestResolveFlagOptionMixedAliasExtendsPrecedence; WriteTextFile(BasePath, '{"unsafe-ffi": true}'); WriteTextFile(ChildPath, '{"extends": "base.json", "enable-ffi": false}'); - Flag := TGocciaFlagOption.Create('enable-ffi', 'FFI'); + Flag := TFlagOption.Create('enable-ffi', 'FFI'); try Flag.ConfigName := 'unsafe-ffi'; FileConfig := ParseConfigFile(ChildPath); @@ -1107,10 +1107,10 @@ procedure TConfigFileTests.TestResolveFlagOptionMixedAliasExtendsPrecedence; procedure TConfigFileTests.TestResolveFlagOptionDefaultsFalse; var - Flag: TGocciaFlagOption; + Flag: TFlagOption; FileConfig: TConfigEntryArray; begin - Flag := TGocciaFlagOption.Create('asi', 'ASI'); + Flag := TFlagOption.Create('feature', 'Flag'); try { No CLI, no root config, no per-file config — should default to False } SetLength(FileConfig, 0); diff --git a/source/shared/CLI.ConfigFile.pas b/source/shared/CLI.ConfigFile.pas index 2b656700..c499ea0d 100644 --- a/source/shared/CLI.ConfigFile.pas +++ b/source/shared/CLI.ConfigFile.pas @@ -37,7 +37,7 @@ procedure RegisterConfigParser(const AExtension: string; Flag options are only set when the value is 'true' or empty. For repeatable options, values are accumulated even when Present. } procedure ApplyConfigEntries(const AEntries: TConfigEntryArray; - const AOptions: TGocciaOptionArray); + const AOptions: TOptionArray); { Parse a configuration file and return its entries without applying them. Handles the "extends" key: if present, the @@ -55,7 +55,7 @@ function ParseConfigFile(const APath: string): TConfigEntryArray; by a built-in parser; other formats require prior registration via RegisterConfigParser. } procedure ApplyConfigFile(const APath: string; - const AOptions: TGocciaOptionArray); + const AOptions: TOptionArray); { Walk up from AStartDirectory looking for a configuration file. At each directory level, tries every combination of @@ -78,7 +78,7 @@ function FindConfigEntry(const AEntries: TConfigEntryArray; default (False). AFlag is the parsed option and AFileConfig the per-file config entries. The config key is resolved from the option metadata, checking ConfigName before LongName. } -function ResolveFlagOption(const AFlag: TGocciaFlagOption; +function ResolveFlagOption(const AFlag: TFlagOption; const AFileConfig: TConfigEntryArray): Boolean; implementation @@ -292,8 +292,8 @@ function ParseJSONConfig(const AContent: string): TConfigEntryArray; { ── Apply entries to options ───────────────────────────────── } -function FindOptionByName(const AOptions: TGocciaOptionArray; - const AName: string): TGocciaOptionBase; +function FindOptionByName(const AOptions: TOptionArray; + const AName: string): TOptionBase; var I: Integer; begin @@ -306,7 +306,7 @@ function FindOptionByName(const AOptions: TGocciaOptionArray; end; function FindOptionConfigEntry(const AEntries: TConfigEntryArray; - const AOption: TGocciaOptionBase; out AValue: string): Boolean; + const AOption: TOptionBase; out AValue: string): Boolean; var I: Integer; begin @@ -322,10 +322,10 @@ function FindOptionConfigEntry(const AEntries: TConfigEntryArray; end; procedure ApplyConfigEntries(const AEntries: TConfigEntryArray; - const AOptions: TGocciaOptionArray); + const AOptions: TOptionArray); var I: Integer; - Option: TGocciaOptionBase; + Option: TOptionBase; begin for I := 0 to High(AEntries) do begin @@ -339,21 +339,21 @@ procedure ApplyConfigEntries(const AEntries: TConfigEntryArray; them or when the child config explicitly set an empty array (Present with zero values). } if Option.Present and - (not (Option is TGocciaRepeatableOption) or + (not (Option is TRepeatableOption) or Option.FromCommandLine or - (TGocciaRepeatableOption(Option).Values.Count = 0)) then + (TRepeatableOption(Option).Values.Count = 0)) then Continue; { Empty-array sentinel: mark the option as present so the explicit empty override is visible, but do not add a value. } - if (Option is TGocciaRepeatableOption) and + if (Option is TRepeatableOption) and (AEntries[I].Value = '') then begin Option.MarkPresent; Continue; end; - if Option is TGocciaFlagOption then + if Option is TFlagOption then begin if (AEntries[I].Value = 'true') or (AEntries[I].Value = '') then Option.Apply(''); @@ -464,7 +464,7 @@ function ParseConfigFile(const APath: string): TConfigEntryArray; end; procedure ApplyConfigFile(const APath: string; - const AOptions: TGocciaOptionArray); + const AOptions: TOptionArray); var Entries: TConfigEntryArray; begin @@ -532,7 +532,7 @@ function FindConfigEntry(const AEntries: TConfigEntryArray; { ── Flag resolution ────────────────────────────────────────── } -function ResolveFlagOption(const AFlag: TGocciaFlagOption; +function ResolveFlagOption(const AFlag: TFlagOption; const AFileConfig: TConfigEntryArray): Boolean; var ValueStr: string; diff --git a/source/shared/CLI.Options.pas b/source/shared/CLI.Options.pas index ba77204e..a4e913ce 100644 --- a/source/shared/CLI.Options.pas +++ b/source/shared/CLI.Options.pas @@ -11,9 +11,9 @@ interface TypInfo; type - TGocciaParseError = class(Exception); + TParseError = class(Exception); - TGocciaOptionBase = class + TOptionBase = class private FLongName: string; FShortName: string; @@ -51,15 +51,15 @@ TGocciaOptionBase = class property FromCommandLine: Boolean read FFromCommandLine; end; - TGocciaOptionArray = array of TGocciaOptionBase; + TOptionArray = array of TOptionBase; - TGocciaFlagOption = class(TGocciaOptionBase) + TFlagOption = class(TOptionBase) public procedure Apply(const AValue: string); override; function FormatForHelp: string; override; end; - TGocciaStringOption = class(TGocciaOptionBase) + TStringOption = class(TOptionBase) private FValue: string; public @@ -71,7 +71,7 @@ TGocciaStringOption = class(TGocciaOptionBase) property Value: string read FValue; end; - TGocciaIntegerOption = class(TGocciaOptionBase) + TIntegerOption = class(TOptionBase) private FValue: Integer; public @@ -83,7 +83,7 @@ TGocciaIntegerOption = class(TGocciaOptionBase) property Value: Integer read FValue; end; - TGocciaInt64Option = class(TGocciaOptionBase) + TInt64Option = class(TOptionBase) private FValue: Int64; public @@ -95,7 +95,7 @@ TGocciaInt64Option = class(TGocciaOptionBase) property Value: Int64 read FValue; end; - TGocciaRepeatableOption = class(TGocciaOptionBase) + TRepeatableOption = class(TOptionBase) private FValues: TStringList; public @@ -108,7 +108,7 @@ TGocciaRepeatableOption = class(TGocciaOptionBase) property Values: TStringList read FValues; end; - TGocciaEnumOption = class(TGocciaOptionBase) + TEnumOption = class(TOptionBase) private FOrdinal: Integer; FPrefixLength: Integer; @@ -126,125 +126,35 @@ TGocciaEnumOption = class(TGocciaOptionBase) function Matches(const AValue: T): Boolean; end; - TGocciaOptionBaseList = TObjectList; + TOptionBaseList = TObjectList; - TGocciaOptionList = class + TOptionList = class private - FItems: TGocciaOptionBaseList; + FItems: TOptionBaseList; public constructor Create; destructor Destroy; override; function AddFlag(const ALongName, AHelpText: string; - const AGroup: string = ''): TGocciaFlagOption; + const AGroup: string = ''): TFlagOption; function AddString(const ALongName, AHelpText: string; - const AGroup: string = ''): TGocciaStringOption; + const AGroup: string = ''): TStringOption; function AddInteger(const ALongName, AHelpText: string; - const AGroup: string = ''): TGocciaIntegerOption; + const AGroup: string = ''): TIntegerOption; function AddRepeatable(const ALongName, AHelpText: string; - const AGroup: string = ''): TGocciaRepeatableOption; - function Add(const AOption: TGocciaOptionBase): TGocciaOptionBase; + const AGroup: string = ''): TRepeatableOption; + function Add(const AOption: TOptionBase): TOptionBase; - function Options: TGocciaOptionArray; + function Options: TOptionArray; end; - TGocciaExecutionMode = (emInterpreted, emBytecode); - TGocciaSourceType = (stScript, stModule); - - TGocciaEngineOptions = class - private - FMode: TGocciaEnumOption; - FSourceType: TGocciaEnumOption; - FASI: TGocciaFlagOption; - FImportMap: TGocciaStringOption; - FAliases: TGocciaRepeatableOption; - FTimeout: TGocciaIntegerOption; - FMaxMemory: TGocciaInt64Option; - FMaxInstructions: TGocciaInt64Option; - FUnsafeFFI: TGocciaFlagOption; - FUnsafeFunctionConstructor: TGocciaFlagOption; - FStackSize: TGocciaIntegerOption; - FCompatVar: TGocciaFlagOption; - FCompatFunction: TGocciaFlagOption; - FCompatTraditionalFor: TGocciaFlagOption; - FCompatWhileLoops: TGocciaFlagOption; - FCompatLooseEquality: TGocciaFlagOption; - FCompatNonStrictMode: TGocciaFlagOption; - FStrictTypes: TGocciaFlagOption; - FAllowedHosts: TGocciaRepeatableOption; - FInspectDepth: TGocciaIntegerOption; - public - constructor Create; - destructor Destroy; override; - - function Options: TGocciaOptionArray; - - property Mode: TGocciaEnumOption read FMode; - property SourceType: TGocciaEnumOption read FSourceType; - property ASI: TGocciaFlagOption read FASI; - property ImportMap: TGocciaStringOption read FImportMap; - property Aliases: TGocciaRepeatableOption read FAliases; - property Timeout: TGocciaIntegerOption read FTimeout; - property MaxMemory: TGocciaInt64Option read FMaxMemory; - property MaxInstructions: TGocciaInt64Option read FMaxInstructions; - property UnsafeFFI: TGocciaFlagOption read FUnsafeFFI; - property UnsafeFunctionConstructor: TGocciaFlagOption read FUnsafeFunctionConstructor; - property StackSize: TGocciaIntegerOption read FStackSize; - property CompatVar: TGocciaFlagOption read FCompatVar; - property CompatFunction: TGocciaFlagOption read FCompatFunction; - property CompatTraditionalFor: TGocciaFlagOption read FCompatTraditionalFor; - property CompatWhileLoops: TGocciaFlagOption read FCompatWhileLoops; - property CompatLooseEquality: TGocciaFlagOption read FCompatLooseEquality; - property CompatNonStrictMode: TGocciaFlagOption read FCompatNonStrictMode; - property StrictTypes: TGocciaFlagOption read FStrictTypes; - property AllowedHosts: TGocciaRepeatableOption read FAllowedHosts; - property InspectDepth: TGocciaIntegerOption read FInspectDepth; - end; - - TGocciaCoverageFormat = (cfLcov, cfJson); - - TGocciaCoverageOptions = class - private - FEnabled: TGocciaFlagOption; - FFormat: TGocciaEnumOption; - FOutputPath: TGocciaStringOption; - public - constructor Create; - destructor Destroy; override; - - function Options: TGocciaOptionArray; - - property Enabled: TGocciaFlagOption read FEnabled; - property Format: TGocciaEnumOption read FFormat; - property OutputPath: TGocciaStringOption read FOutputPath; - end; - - TGocciaProfileMode = (pmOpcodes, pmFunctions, pmAll); - TGocciaProfileFormat = (pfFlamegraph); - - TGocciaProfilerOptions = class - private - FMode: TGocciaEnumOption; - FOutputPath: TGocciaStringOption; - FFormat: TGocciaEnumOption; - public - constructor Create; - destructor Destroy; override; - - function Options: TGocciaOptionArray; - - property Mode: TGocciaEnumOption read FMode; - property OutputPath: TGocciaStringOption read FOutputPath; - property Format: TGocciaEnumOption read FFormat; - end; - -function ConcatOptions(const AArrays: array of TGocciaOptionArray): TGocciaOptionArray; +function ConcatOptions(const AArrays: array of TOptionArray): TOptionArray; implementation { ConcatOptions } -function ConcatOptions(const AArrays: array of TGocciaOptionArray): TGocciaOptionArray; +function ConcatOptions(const AArrays: array of TOptionArray): TOptionArray; var TotalLength: Integer; I, J, Offset: Integer; @@ -263,9 +173,9 @@ function ConcatOptions(const AArrays: array of TGocciaOptionArray): TGocciaOptio end; end; -{ TGocciaOptionBase } +{ TOptionBase } -constructor TGocciaOptionBase.Create(const ALongName, AHelpText: string; +constructor TOptionBase.Create(const ALongName, AHelpText: string; const AGroup: string); begin inherited Create; @@ -278,47 +188,47 @@ constructor TGocciaOptionBase.Create(const ALongName, AHelpText: string; FFromCommandLine := False; end; -procedure TGocciaOptionBase.MarkFromCommandLine; +procedure TOptionBase.MarkFromCommandLine; begin FFromCommandLine := True; end; -procedure TGocciaOptionBase.MarkPresent; +procedure TOptionBase.MarkPresent; begin FPresent := True; end; -function TGocciaOptionBase.ValidValues: string; +function TOptionBase.ValidValues: string; begin Result := ''; end; -{ TGocciaFlagOption } +{ TFlagOption } -procedure TGocciaFlagOption.Apply(const AValue: string); +procedure TFlagOption.Apply(const AValue: string); begin FPresent := True; end; -function TGocciaFlagOption.FormatForHelp: string; +function TFlagOption.FormatForHelp: string; begin Result := '--' + LongName; end; -{ TGocciaStringOption } +{ TStringOption } -procedure TGocciaStringOption.Apply(const AValue: string); +procedure TStringOption.Apply(const AValue: string); begin FValue := AValue; FPresent := True; end; -function TGocciaStringOption.FormatForHelp: string; +function TStringOption.FormatForHelp: string; begin Result := '--' + LongName + '='; end; -function TGocciaStringOption.ValueOr(const ADefault: string): string; +function TStringOption.ValueOr(const ADefault: string): string; begin if FPresent then Result := FValue @@ -326,25 +236,25 @@ function TGocciaStringOption.ValueOr(const ADefault: string): string; Result := ADefault; end; -{ TGocciaIntegerOption } +{ TIntegerOption } -procedure TGocciaIntegerOption.Apply(const AValue: string); +procedure TIntegerOption.Apply(const AValue: string); var Parsed: Integer; begin if not TryStrToInt(AValue, Parsed) then - raise TGocciaParseError.CreateFmt('Invalid integer value for --%s: %s', + raise TParseError.CreateFmt('Invalid integer value for --%s: %s', [LongName, AValue]); FValue := Parsed; FPresent := True; end; -function TGocciaIntegerOption.FormatForHelp: string; +function TIntegerOption.FormatForHelp: string; begin Result := '--' + LongName + '='; end; -function TGocciaIntegerOption.ValueOr(const ADefault: Integer): Integer; +function TIntegerOption.ValueOr(const ADefault: Integer): Integer; begin if FPresent then Result := FValue @@ -352,25 +262,25 @@ function TGocciaIntegerOption.ValueOr(const ADefault: Integer): Integer; Result := ADefault; end; -{ TGocciaInt64Option } +{ TInt64Option } -procedure TGocciaInt64Option.Apply(const AValue: string); +procedure TInt64Option.Apply(const AValue: string); var Parsed: Int64; begin if not TryStrToInt64(AValue, Parsed) then - raise TGocciaParseError.CreateFmt('Invalid integer value for --%s: %s', + raise TParseError.CreateFmt('Invalid integer value for --%s: %s', [LongName, AValue]); FValue := Parsed; FPresent := True; end; -function TGocciaInt64Option.FormatForHelp: string; +function TInt64Option.FormatForHelp: string; begin Result := '--' + LongName + '='; end; -function TGocciaInt64Option.ValueOr(const ADefault: Int64): Int64; +function TInt64Option.ValueOr(const ADefault: Int64): Int64; begin if FPresent then Result := FValue @@ -378,35 +288,35 @@ function TGocciaInt64Option.ValueOr(const ADefault: Int64): Int64; Result := ADefault; end; -{ TGocciaRepeatableOption } +{ TRepeatableOption } -constructor TGocciaRepeatableOption.Create(const ALongName, AHelpText: string; +constructor TRepeatableOption.Create(const ALongName, AHelpText: string; const AGroup: string); begin inherited Create(ALongName, AHelpText, AGroup); FValues := TStringList.Create; end; -destructor TGocciaRepeatableOption.Destroy; +destructor TRepeatableOption.Destroy; begin FValues.Free; inherited Destroy; end; -procedure TGocciaRepeatableOption.Apply(const AValue: string); +procedure TRepeatableOption.Apply(const AValue: string); begin FValues.Add(AValue); FPresent := True; end; -function TGocciaRepeatableOption.FormatForHelp: string; +function TRepeatableOption.FormatForHelp: string; begin Result := '--' + LongName + ' '; end; -{ TGocciaEnumOption } +{ TEnumOption } -constructor TGocciaEnumOption.Create(const ALongName, AHelpText: string; +constructor TEnumOption.Create(const ALongName, AHelpText: string; const AGroup: string; const APrefixLength: Integer); begin inherited Create(ALongName, AHelpText, AGroup); @@ -414,7 +324,7 @@ constructor TGocciaEnumOption.Create(const ALongName, AHelpText: string; FPrefixLength := APrefixLength; end; -function TGocciaEnumOption.JoinStrippedNames( +function TEnumOption.JoinStrippedNames( const ASeparator: string): string; var TypeData: PTypeData; @@ -435,7 +345,7 @@ function TGocciaEnumOption.JoinStrippedNames( end; end; -procedure TGocciaEnumOption.Apply(const AValue: string); +procedure TEnumOption.Apply(const AValue: string); var TypeData: PTypeData; I: Integer; @@ -457,16 +367,16 @@ procedure TGocciaEnumOption.Apply(const AValue: string); end; end; - raise TGocciaParseError.CreateFmt('Invalid value for --%s: %s (valid: %s)', + raise TParseError.CreateFmt('Invalid value for --%s: %s (valid: %s)', [LongName, AValue, JoinStrippedNames(', ')]); end; -function TGocciaEnumOption.Value: T; +function TEnumOption.Value: T; begin Move(FOrdinal, Result, SizeOf(T)); end; -function TGocciaEnumOption.ValueOr(const ADefault: T): T; +function TEnumOption.ValueOr(const ADefault: T): T; begin if FPresent then Result := Value @@ -474,7 +384,7 @@ function TGocciaEnumOption.ValueOr(const ADefault: T): T; Result := ADefault; end; -function TGocciaEnumOption.Matches(const AValue: T): Boolean; +function TEnumOption.Matches(const AValue: T): Boolean; var OrdinalValue: Integer; begin @@ -483,65 +393,65 @@ function TGocciaEnumOption.Matches(const AValue: T): Boolean; Result := FPresent and (FOrdinal = OrdinalValue); end; -function TGocciaEnumOption.ValidValues: string; +function TEnumOption.ValidValues: string; begin Result := JoinStrippedNames(', '); end; -function TGocciaEnumOption.FormatForHelp: string; +function TEnumOption.FormatForHelp: string; begin Result := '--' + LongName + '=' + JoinStrippedNames('|'); end; -{ TGocciaOptionList } +{ TOptionList } -constructor TGocciaOptionList.Create; +constructor TOptionList.Create; begin inherited Create; - FItems := TGocciaOptionBaseList.Create(True); + FItems := TOptionBaseList.Create(True); end; -destructor TGocciaOptionList.Destroy; +destructor TOptionList.Destroy; begin FItems.Free; inherited Destroy; end; -function TGocciaOptionList.AddFlag(const ALongName, AHelpText: string; - const AGroup: string): TGocciaFlagOption; +function TOptionList.AddFlag(const ALongName, AHelpText: string; + const AGroup: string): TFlagOption; begin - Result := TGocciaFlagOption.Create(ALongName, AHelpText, AGroup); + Result := TFlagOption.Create(ALongName, AHelpText, AGroup); FItems.Add(Result); end; -function TGocciaOptionList.AddString(const ALongName, AHelpText: string; - const AGroup: string): TGocciaStringOption; +function TOptionList.AddString(const ALongName, AHelpText: string; + const AGroup: string): TStringOption; begin - Result := TGocciaStringOption.Create(ALongName, AHelpText, AGroup); + Result := TStringOption.Create(ALongName, AHelpText, AGroup); FItems.Add(Result); end; -function TGocciaOptionList.AddInteger(const ALongName, AHelpText: string; - const AGroup: string): TGocciaIntegerOption; +function TOptionList.AddInteger(const ALongName, AHelpText: string; + const AGroup: string): TIntegerOption; begin - Result := TGocciaIntegerOption.Create(ALongName, AHelpText, AGroup); + Result := TIntegerOption.Create(ALongName, AHelpText, AGroup); FItems.Add(Result); end; -function TGocciaOptionList.AddRepeatable(const ALongName, AHelpText: string; - const AGroup: string): TGocciaRepeatableOption; +function TOptionList.AddRepeatable(const ALongName, AHelpText: string; + const AGroup: string): TRepeatableOption; begin - Result := TGocciaRepeatableOption.Create(ALongName, AHelpText, AGroup); + Result := TRepeatableOption.Create(ALongName, AHelpText, AGroup); FItems.Add(Result); end; -function TGocciaOptionList.Add(const AOption: TGocciaOptionBase): TGocciaOptionBase; +function TOptionList.Add(const AOption: TOptionBase): TOptionBase; begin FItems.Add(AOption); Result := AOption; end; -function TGocciaOptionList.Options: TGocciaOptionArray; +function TOptionList.Options: TOptionArray; var I: Integer; begin @@ -550,160 +460,4 @@ function TGocciaOptionList.Options: TGocciaOptionArray; Result[I] := FItems[I]; end; -{ TGocciaEngineOptions } - -constructor TGocciaEngineOptions.Create; -begin - inherited Create; - FMode := TGocciaEnumOption.Create('mode', - 'Execution mode', 'Engine'); - FSourceType := TGocciaEnumOption.Create('source-type', - 'Source loading kind (default: script)', 'Engine'); - FASI := TGocciaFlagOption.Create('asi', - 'Enable automatic semicolon insertion', 'Engine'); - FImportMap := TGocciaStringOption.Create('import-map', - 'Path to import map JSON file', 'Engine'); - FAliases := TGocciaRepeatableOption.Create('alias', - 'Import alias (e.g. @/=./src/)', 'Engine'); - FTimeout := TGocciaIntegerOption.Create('timeout', - 'Per-file timeout in milliseconds', 'Engine'); - FMaxMemory := TGocciaInt64Option.Create('max-memory', - 'GC heap byte limit (RangeError on exceed)', 'Engine'); - FMaxInstructions := TGocciaInt64Option.Create('max-instructions', - 'Maximum execution steps before aborting', 'Engine'); - FUnsafeFFI := TGocciaFlagOption.Create('unsafe-ffi', - 'Enable the FFI global (foreign function interface)', 'Runtime'); - FUnsafeFunctionConstructor := TGocciaFlagOption.Create('unsafe-function-constructor', - 'Enable the Function constructor (dynamic code generation)', 'Engine'); - FStackSize := TGocciaIntegerOption.Create('stack-size', - 'Maximum call stack depth (0 = no limit)', 'Engine'); - FCompatVar := TGocciaFlagOption.Create('compat-var', - 'Enable var declarations (compatibility)', 'Engine'); - FCompatFunction := TGocciaFlagOption.Create('compat-function', - 'Enable function declarations and expressions (compatibility)', 'Engine'); - FCompatTraditionalFor := TGocciaFlagOption.Create('compat-traditional-for-loop', - 'Enable traditional C-style for(init; test; update) loops (compatibility)', 'Engine'); - FCompatWhileLoops := TGocciaFlagOption.Create('compat-while-loops', - 'Enable while and do...while loops (compatibility)', 'Engine'); - FCompatLooseEquality := TGocciaFlagOption.Create('compat-loose-equality', - 'Enable loose equality and inequality (== and !=) (compatibility)', 'Engine'); - FCompatNonStrictMode := TGocciaFlagOption.Create('compat-non-strict-mode', - 'Enable non-strict-mode compatibility semantics', 'Engine'); - FStrictTypes := TGocciaFlagOption.Create('strict-types', - 'Enforce type annotations at runtime (interpreter and bytecode)', 'Engine'); - FAllowedHosts := TGocciaRepeatableOption.Create('allowed-host', - 'Hostname allowed for fetch requests (repeatable)', 'Engine'); - FAllowedHosts.ConfigName := 'allowed-hosts'; - FInspectDepth := TGocciaIntegerOption.Create('inspect-depth', - 'Maximum object inspection depth for console output (default: 5)', 'Engine'); -end; - -destructor TGocciaEngineOptions.Destroy; -begin - FMode.Free; - FSourceType.Free; - FASI.Free; - FImportMap.Free; - FAliases.Free; - FTimeout.Free; - FMaxMemory.Free; - FMaxInstructions.Free; - FUnsafeFFI.Free; - FUnsafeFunctionConstructor.Free; - FStackSize.Free; - FCompatVar.Free; - FCompatFunction.Free; - FCompatTraditionalFor.Free; - FCompatWhileLoops.Free; - FCompatLooseEquality.Free; - FCompatNonStrictMode.Free; - FStrictTypes.Free; - FAllowedHosts.Free; - FInspectDepth.Free; - inherited Destroy; -end; - -function TGocciaEngineOptions.Options: TGocciaOptionArray; -begin - SetLength(Result, 20); - Result[0] := FMode; - Result[1] := FSourceType; - Result[2] := FASI; - Result[3] := FImportMap; - Result[4] := FAliases; - Result[5] := FTimeout; - Result[6] := FMaxMemory; - Result[7] := FMaxInstructions; - Result[8] := FUnsafeFFI; - Result[9] := FUnsafeFunctionConstructor; - Result[10] := FStackSize; - Result[11] := FCompatVar; - Result[12] := FCompatFunction; - Result[13] := FCompatTraditionalFor; - Result[14] := FCompatWhileLoops; - Result[15] := FCompatLooseEquality; - Result[16] := FCompatNonStrictMode; - Result[17] := FStrictTypes; - Result[18] := FAllowedHosts; - Result[19] := FInspectDepth; -end; - -{ TGocciaCoverageOptions } - -constructor TGocciaCoverageOptions.Create; -begin - inherited Create; - FEnabled := TGocciaFlagOption.Create('coverage', - 'Enable line and branch coverage', 'Coverage'); - FFormat := TGocciaEnumOption.Create('coverage-format', - 'Coverage output format', 'Coverage'); - FOutputPath := TGocciaStringOption.Create('coverage-output', - 'Coverage output file path', 'Coverage'); -end; - -destructor TGocciaCoverageOptions.Destroy; -begin - FEnabled.Free; - FFormat.Free; - FOutputPath.Free; - inherited Destroy; -end; - -function TGocciaCoverageOptions.Options: TGocciaOptionArray; -begin - SetLength(Result, 3); - Result[0] := FEnabled; - Result[1] := FFormat; - Result[2] := FOutputPath; -end; - -{ TGocciaProfilerOptions } - -constructor TGocciaProfilerOptions.Create; -begin - inherited Create; - FMode := TGocciaEnumOption.Create('profile', - 'Profiling mode', 'Profiler'); - FOutputPath := TGocciaStringOption.Create('profile-output', - 'Profile output file path', 'Profiler'); - FFormat := TGocciaEnumOption.Create('profile-format', - 'Profile output format', 'Profiler'); -end; - -destructor TGocciaProfilerOptions.Destroy; -begin - FMode.Free; - FOutputPath.Free; - FFormat.Free; - inherited Destroy; -end; - -function TGocciaProfilerOptions.Options: TGocciaOptionArray; -begin - SetLength(Result, 3); - Result[0] := FMode; - Result[1] := FOutputPath; - Result[2] := FFormat; -end; - end. diff --git a/source/shared/CLI.Parser.Test.pas b/source/shared/CLI.Parser.Test.pas index a2da18a8..0fc00a7b 100644 --- a/source/shared/CLI.Parser.Test.pas +++ b/source/shared/CLI.Parser.Test.pas @@ -54,11 +54,11 @@ procedure TCLIOptionsTests.SetupTests; Test('IntegerOption.Apply parses integer value', TestIntegerOptionApply); Test('IntegerOption.ValueOr returns value when present', TestIntegerOptionValueOrWhenPresent); Test('IntegerOption.ValueOr returns default when absent', TestIntegerOptionValueOrWhenAbsent); - Test('IntegerOption.Apply raises TGocciaParseError for non-integer', TestIntegerOptionInvalidValue); + Test('IntegerOption.Apply raises TParseError for non-integer', TestIntegerOptionInvalidValue); Test('RepeatableOption accumulates multiple values', TestRepeatableOptionMultipleValues); Test('EnumOption applies first value', TestEnumOptionFirstValue); Test('EnumOption applies second value', TestEnumOptionSecondValue); - Test('EnumOption raises TGocciaParseError for invalid value', TestEnumOptionInvalidValue); + Test('EnumOption raises TParseError for invalid value', TestEnumOptionInvalidValue); Test('EnumOption.ValidValues returns comma-separated list', TestEnumOptionValidValues); Test('EnumOption.FormatForHelp returns pipe-separated values', TestEnumOptionFormatForHelp); Test('OptionList tracks added options', TestOptionListAddFlagAndString); @@ -69,13 +69,13 @@ procedure TCLIOptionsTests.SetupTests; Test('Config-applied option has Present but not FromCommandLine', TestConfigAppliedOptionNotFromCommandLine); end; -{ TGocciaFlagOption tests } +{ TFlagOption tests } procedure TCLIOptionsTests.TestFlagOptionNotPresentInitially; var - Opt: TGocciaFlagOption; + Opt: TFlagOption; begin - Opt := TGocciaFlagOption.Create('verbose', 'Enable verbose output'); + Opt := TFlagOption.Create('verbose', 'Enable verbose output'); try Expect(Opt.Present).ToBe(False); finally @@ -85,9 +85,9 @@ procedure TCLIOptionsTests.TestFlagOptionNotPresentInitially; procedure TCLIOptionsTests.TestFlagOptionApply; var - Opt: TGocciaFlagOption; + Opt: TFlagOption; begin - Opt := TGocciaFlagOption.Create('verbose', 'Enable verbose output'); + Opt := TFlagOption.Create('verbose', 'Enable verbose output'); try Opt.Apply(''); Expect(Opt.Present).ToBe(True); @@ -96,13 +96,13 @@ procedure TCLIOptionsTests.TestFlagOptionApply; end; end; -{ TGocciaStringOption tests } +{ TStringOption tests } procedure TCLIOptionsTests.TestStringOptionApply; var - Opt: TGocciaStringOption; + Opt: TStringOption; begin - Opt := TGocciaStringOption.Create('output', 'Output path'); + Opt := TStringOption.Create('output', 'Output path'); try Opt.Apply('hello'); Expect(Opt.Present).ToBe(True); @@ -114,9 +114,9 @@ procedure TCLIOptionsTests.TestStringOptionApply; procedure TCLIOptionsTests.TestStringOptionValueOrWhenPresent; var - Opt: TGocciaStringOption; + Opt: TStringOption; begin - Opt := TGocciaStringOption.Create('output', 'Output path'); + Opt := TStringOption.Create('output', 'Output path'); try Opt.Apply('hello'); Expect(Opt.ValueOr('fallback')).ToBe('hello'); @@ -127,9 +127,9 @@ procedure TCLIOptionsTests.TestStringOptionValueOrWhenPresent; procedure TCLIOptionsTests.TestStringOptionValueOrWhenAbsent; var - Opt: TGocciaStringOption; + Opt: TStringOption; begin - Opt := TGocciaStringOption.Create('output', 'Output path'); + Opt := TStringOption.Create('output', 'Output path'); try Expect(Opt.ValueOr('fallback')).ToBe('fallback'); finally @@ -137,13 +137,13 @@ procedure TCLIOptionsTests.TestStringOptionValueOrWhenAbsent; end; end; -{ TGocciaIntegerOption tests } +{ TIntegerOption tests } procedure TCLIOptionsTests.TestIntegerOptionApply; var - Opt: TGocciaIntegerOption; + Opt: TIntegerOption; begin - Opt := TGocciaIntegerOption.Create('timeout', 'Timeout in ms'); + Opt := TIntegerOption.Create('timeout', 'Timeout in ms'); try Opt.Apply('42'); Expect(Opt.Present).ToBe(True); @@ -155,9 +155,9 @@ procedure TCLIOptionsTests.TestIntegerOptionApply; procedure TCLIOptionsTests.TestIntegerOptionValueOrWhenPresent; var - Opt: TGocciaIntegerOption; + Opt: TIntegerOption; begin - Opt := TGocciaIntegerOption.Create('timeout', 'Timeout in ms'); + Opt := TIntegerOption.Create('timeout', 'Timeout in ms'); try Opt.Apply('42'); Expect(Opt.ValueOr(100)).ToBe(42); @@ -168,9 +168,9 @@ procedure TCLIOptionsTests.TestIntegerOptionValueOrWhenPresent; procedure TCLIOptionsTests.TestIntegerOptionValueOrWhenAbsent; var - Opt: TGocciaIntegerOption; + Opt: TIntegerOption; begin - Opt := TGocciaIntegerOption.Create('timeout', 'Timeout in ms'); + Opt := TIntegerOption.Create('timeout', 'Timeout in ms'); try Expect(Opt.ValueOr(100)).ToBe(100); finally @@ -180,16 +180,16 @@ procedure TCLIOptionsTests.TestIntegerOptionValueOrWhenAbsent; procedure TCLIOptionsTests.TestIntegerOptionInvalidValue; var - Opt: TGocciaIntegerOption; + Opt: TIntegerOption; Raised: Boolean; begin - Opt := TGocciaIntegerOption.Create('timeout', 'Timeout in ms'); + Opt := TIntegerOption.Create('timeout', 'Timeout in ms'); try Raised := False; try Opt.Apply('notanumber'); except - on E: TGocciaParseError do + on E: TParseError do Raised := True; end; Expect(Raised).ToBe(True); @@ -198,13 +198,13 @@ procedure TCLIOptionsTests.TestIntegerOptionInvalidValue; end; end; -{ TGocciaRepeatableOption tests } +{ TRepeatableOption tests } procedure TCLIOptionsTests.TestRepeatableOptionMultipleValues; var - Opt: TGocciaRepeatableOption; + Opt: TRepeatableOption; begin - Opt := TGocciaRepeatableOption.Create('alias', 'Import alias'); + Opt := TRepeatableOption.Create('alias', 'Import alias'); try Opt.Apply('@/=./src/'); Opt.Apply('config=./config/default.js'); @@ -219,13 +219,13 @@ procedure TCLIOptionsTests.TestRepeatableOptionMultipleValues; end; end; -{ TGocciaEnumOption tests — uses local TTestColor enum } +{ TEnumOption tests — uses local TTestColor enum } procedure TCLIOptionsTests.TestEnumOptionFirstValue; var - Opt: TGocciaEnumOption; + Opt: TEnumOption; begin - Opt := TGocciaEnumOption.Create('color', 'Pick a color'); + Opt := TEnumOption.Create('color', 'Pick a color'); try Opt.Apply('red'); Expect(Opt.Present).ToBe(True); @@ -237,9 +237,9 @@ procedure TCLIOptionsTests.TestEnumOptionFirstValue; procedure TCLIOptionsTests.TestEnumOptionSecondValue; var - Opt: TGocciaEnumOption; + Opt: TEnumOption; begin - Opt := TGocciaEnumOption.Create('color', 'Pick a color'); + Opt := TEnumOption.Create('color', 'Pick a color'); try Opt.Apply('blue'); Expect(Opt.Present).ToBe(True); @@ -251,16 +251,16 @@ procedure TCLIOptionsTests.TestEnumOptionSecondValue; procedure TCLIOptionsTests.TestEnumOptionInvalidValue; var - Opt: TGocciaEnumOption; + Opt: TEnumOption; Raised: Boolean; begin - Opt := TGocciaEnumOption.Create('color', 'Pick a color'); + Opt := TEnumOption.Create('color', 'Pick a color'); try Raised := False; try Opt.Apply('invalid'); except - on E: TGocciaParseError do + on E: TParseError do Raised := True; end; Expect(Raised).ToBe(True); @@ -271,9 +271,9 @@ procedure TCLIOptionsTests.TestEnumOptionInvalidValue; procedure TCLIOptionsTests.TestEnumOptionValidValues; var - Opt: TGocciaEnumOption; + Opt: TEnumOption; begin - Opt := TGocciaEnumOption.Create('color', 'Pick a color'); + Opt := TEnumOption.Create('color', 'Pick a color'); try Expect(Opt.ValidValues).ToBe('red, blue'); finally @@ -283,9 +283,9 @@ procedure TCLIOptionsTests.TestEnumOptionValidValues; procedure TCLIOptionsTests.TestEnumOptionFormatForHelp; var - Opt: TGocciaEnumOption; + Opt: TEnumOption; begin - Opt := TGocciaEnumOption.Create('color', 'Pick a color'); + Opt := TEnumOption.Create('color', 'Pick a color'); try Expect(Opt.FormatForHelp).ToBe('--color=red|blue'); finally @@ -293,14 +293,14 @@ procedure TCLIOptionsTests.TestEnumOptionFormatForHelp; end; end; -{ TGocciaOptionList tests } +{ TOptionList tests } procedure TCLIOptionsTests.TestOptionListAddFlagAndString; var - List: TGocciaOptionList; - Arr: TGocciaOptionArray; + List: TOptionList; + Arr: TOptionArray; begin - List := TGocciaOptionList.Create; + List := TOptionList.Create; try List.AddFlag('verbose', 'Enable verbose output'); List.AddString('output', 'Output file path'); @@ -317,11 +317,11 @@ procedure TCLIOptionsTests.TestOptionListAddFlagAndString; procedure TCLIOptionsTests.TestConcatOptionsMergesTwoArrays; var - ListA, ListB: TGocciaOptionList; - Combined: TGocciaOptionArray; + ListA, ListB: TOptionList; + Combined: TOptionArray; begin - ListA := TGocciaOptionList.Create; - ListB := TGocciaOptionList.Create; + ListA := TOptionList.Create; + ListB := TOptionList.Create; try ListA.AddFlag('alpha', 'First flag'); ListA.AddString('beta', 'First string'); @@ -341,10 +341,10 @@ procedure TCLIOptionsTests.TestConcatOptionsMergesTwoArrays; procedure TCLIOptionsTests.TestGenerateHelpText; var - List: TGocciaOptionList; + List: TOptionList; HelpText: string; begin - List := TGocciaOptionList.Create; + List := TOptionList.Create; try List.AddFlag('verbose', 'Enable verbose output'); List.AddString('output', 'Output file path'); @@ -363,9 +363,9 @@ procedure TCLIOptionsTests.TestGenerateHelpText; procedure TCLIOptionsTests.TestFromCommandLineIsFalseInitially; var - Opt: TGocciaFlagOption; + Opt: TFlagOption; begin - Opt := TGocciaFlagOption.Create('asi', 'Enable ASI'); + Opt := TFlagOption.Create('feature', 'Enable feature'); try Expect(Opt.FromCommandLine).ToBe(False); finally @@ -375,9 +375,9 @@ procedure TCLIOptionsTests.TestFromCommandLineIsFalseInitially; procedure TCLIOptionsTests.TestMarkFromCommandLineSetsTrue; var - Opt: TGocciaFlagOption; + Opt: TFlagOption; begin - Opt := TGocciaFlagOption.Create('asi', 'Enable ASI'); + Opt := TFlagOption.Create('feature', 'Enable feature'); try Opt.Apply(''); Opt.MarkFromCommandLine; @@ -390,16 +390,16 @@ procedure TCLIOptionsTests.TestMarkFromCommandLineSetsTrue; procedure TCLIOptionsTests.TestConfigAppliedOptionNotFromCommandLine; var - Opt: TGocciaFlagOption; - Options: TGocciaOptionArray; + Opt: TFlagOption; + Options: TOptionArray; Entries: TConfigEntryArray; begin - Opt := TGocciaFlagOption.Create('asi', 'Enable ASI'); + Opt := TFlagOption.Create('feature', 'Enable feature'); try SetLength(Options, 1); Options[0] := Opt; SetLength(Entries, 1); - Entries[0].Key := 'asi'; + Entries[0].Key := 'feature'; Entries[0].Value := 'true'; ApplyConfigEntries(Entries, Options); diff --git a/source/shared/CLI.Parser.pas b/source/shared/CLI.Parser.pas index 96e848e0..e00ce2d4 100644 --- a/source/shared/CLI.Parser.pas +++ b/source/shared/CLI.Parser.pas @@ -11,8 +11,8 @@ interface { Parses command-line arguments against the given option definitions. Returns a TStringList of positional (non-option) arguments; the caller - owns the returned list. Raises TGocciaParseError for unknown options. } -function ParseCommandLine(const AOptions: TGocciaOptionArray): TStringList; + owns the returned list. Raises TParseError for unknown options. } +function ParseCommandLine(const AOptions: TOptionArray): TStringList; implementation @@ -43,8 +43,8 @@ procedure SplitFlag(const AArg: string; out AName, AValue: string); end; end; -function FindOption(const AOptions: TGocciaOptionArray; - const AName: string): TGocciaOptionBase; +function FindOption(const AOptions: TOptionArray; + const AName: string): TOptionBase; var I: Integer; begin @@ -54,8 +54,8 @@ function FindOption(const AOptions: TGocciaOptionArray; Result := nil; end; -function FindOptionShort(const AOptions: TGocciaOptionArray; - const AShortName: Char): TGocciaOptionBase; +function FindOptionShort(const AOptions: TOptionArray; + const AShortName: Char): TOptionBase; var I: Integer; begin @@ -65,11 +65,11 @@ function FindOptionShort(const AOptions: TGocciaOptionArray; Result := nil; end; -function ParseCommandLine(const AOptions: TGocciaOptionArray): TStringList; +function ParseCommandLine(const AOptions: TOptionArray): TStringList; var I, Count: Integer; Arg, Name, Value: string; - Option: TGocciaOptionBase; + Option: TOptionBase; HasEquals: Boolean; begin Result := TStringList.Create; @@ -87,15 +87,15 @@ function ParseCommandLine(const AOptions: TGocciaOptionArray): TStringList; SplitFlag(Arg, Name, Value); Option := FindOption(AOptions, Name); if Option = nil then - raise TGocciaParseError.CreateFmt('Unknown option: --%s', [Name]); + raise TParseError.CreateFmt('Unknown option: --%s', [Name]); if (Value = '') and (not HasEquals) and - not (Option is TGocciaFlagOption) and - (Option is TGocciaRepeatableOption) then + not (Option is TFlagOption) and + (Option is TRepeatableOption) then begin if (I >= Count) or (Copy(ParamStr(I + 1), 1, 1) = SHORT_FLAG_CHAR) then - raise TGocciaParseError.CreateFmt( + raise TParseError.CreateFmt( '--%s requires a value', [Name]); Inc(I); Value := ParamStr(I); @@ -109,7 +109,7 @@ function ParseCommandLine(const AOptions: TGocciaOptionArray): TStringList; begin Option := FindOptionShort(AOptions, Arg[2]); if Option = nil then - raise TGocciaParseError.CreateFmt('Unknown option: %s', [Arg]); + raise TParseError.CreateFmt('Unknown option: %s', [Arg]); Option.Apply(''); end else diff --git a/source/units/Goccia.Engine.pas b/source/units/Goccia.Engine.pas index 05efed74..2f5f19af 100644 --- a/source/units/Goccia.Engine.pas +++ b/source/units/Goccia.Engine.pas @@ -43,10 +43,10 @@ interface Goccia.Modules.Resolver, Goccia.ObjectModel, Goccia.ObjectModel.Engine, - Goccia.Parser, Goccia.Realm, Goccia.Scope, Goccia.SourceMap, + Goccia.SourcePipeline, Goccia.Values.BigIntValue, Goccia.Values.ClassValue, Goccia.Values.FunctionBase, @@ -57,14 +57,29 @@ interface Goccia.Values.TypedArrayValue; type - TGocciaPreprocessor = (ppJSX); - TGocciaPreprocessors = set of TGocciaPreprocessor; + TGocciaPreprocessor = Goccia.SourcePipeline.TGocciaPreprocessor; + TGocciaPreprocessors = Goccia.SourcePipeline.TGocciaPreprocessors; - TGocciaCompatibility = (cfASI, cfVar, cfFunction, cfTraditionalFor, - cfWhileLoops, cfLooseEquality, cfNonStrictMode); - TGocciaCompatibilityFlags = set of TGocciaCompatibility; + TGocciaCompatibility = Goccia.SourcePipeline.TGocciaCompatibility; + TGocciaCompatibilityFlags = Goccia.SourcePipeline.TGocciaCompatibilityFlags; - TGocciaSourceType = (stScript, stModule); + TGocciaSourceType = Goccia.SourcePipeline.TGocciaSourceType; + +const + ppJSX = Goccia.SourcePipeline.ppJSX; + + cfASI = Goccia.SourcePipeline.cfASI; + cfVar = Goccia.SourcePipeline.cfVar; + cfFunction = Goccia.SourcePipeline.cfFunction; + cfTraditionalFor = Goccia.SourcePipeline.cfTraditionalFor; + cfWhileLoops = Goccia.SourcePipeline.cfWhileLoops; + cfLooseEquality = Goccia.SourcePipeline.cfLooseEquality; + cfNonStrictMode = Goccia.SourcePipeline.cfNonStrictMode; + + stScript = Goccia.SourcePipeline.stScript; + stModule = Goccia.SourcePipeline.stModule; + +type TGocciaScriptResult = record Result: TGocciaValue; @@ -144,20 +159,6 @@ TGocciaEngine = class FSuppressWarnings: Boolean; FLastTiming: TGocciaScriptResult; FLastSourceMap: TGocciaSourceMap; - function GetASIEnabled: Boolean; - function GetVarEnabled: Boolean; - function GetFunctionEnabled: Boolean; - function GetTraditionalForLoopsEnabled: Boolean; - function GetWhileLoopsEnabled: Boolean; - function GetLooseEqualityEnabled: Boolean; - function GetNonStrictModeEnabled: Boolean; - procedure SetASIEnabled(const AValue: Boolean); - procedure SetVarEnabled(const AValue: Boolean); - procedure SetFunctionEnabled(const AValue: Boolean); - procedure SetTraditionalForLoopsEnabled(const AValue: Boolean); - procedure SetWhileLoopsEnabled(const AValue: Boolean); - procedure SetLooseEqualityEnabled(const AValue: Boolean); - procedure SetNonStrictModeEnabled(const AValue: Boolean); procedure SetStrictTypes(const AValue: Boolean); function GetContentProvider: TGocciaModuleContentProvider; function GetModuleResolver: TGocciaModuleResolver; @@ -182,7 +183,8 @@ TGocciaEngine = class function GocciaGCBytesAllocatedGetter(const AArgs: TGocciaArgumentsCollection; const AThisValue: TGocciaValue): TGocciaValue; procedure DoRetainModule(const AModule: TObject); procedure DiscardRuntimePending; - procedure PrintParserWarnings(const AParser: TGocciaParser; const ASourceMap: TGocciaSourceMap = nil); + procedure PrintSourcePipelineWarnings( + const APipelineResult: TGocciaSourcePipelineResult); function CompileDynamicFunction(const AParamsSources: array of string; const ABodySource: string): TGocciaFunctionBase; public @@ -243,17 +245,6 @@ TGocciaEngine = class property ContentProvider: TGocciaModuleContentProvider read GetContentProvider; property ModuleResolver: TGocciaModuleResolver read GetModuleResolver; property ModuleLoader: TGocciaModuleLoader read FModuleLoader; - property ASIEnabled: Boolean read GetASIEnabled write SetASIEnabled; - property VarEnabled: Boolean read GetVarEnabled write SetVarEnabled; - property FunctionEnabled: Boolean read GetFunctionEnabled write SetFunctionEnabled; - property TraditionalForLoopsEnabled: Boolean - read GetTraditionalForLoopsEnabled write SetTraditionalForLoopsEnabled; - property WhileLoopsEnabled: Boolean - read GetWhileLoopsEnabled write SetWhileLoopsEnabled; - property LooseEqualityEnabled: Boolean - read GetLooseEqualityEnabled write SetLooseEqualityEnabled; - property NonStrictModeEnabled: Boolean - read GetNonStrictModeEnabled write SetNonStrictModeEnabled; property FunctionConstructor: TGocciaFunctionConstructorClassValue read FFunctionConstructor; property ObjectConstructor: TGocciaClassValue read FObjectConstructor; property Preprocessors: TGocciaPreprocessors read FPreprocessors write SetPreprocessors; @@ -281,7 +272,7 @@ TGocciaEngine = class property GocciaGlobal: TGocciaObjectValue read FGocciaGlobal; property SuppressWarnings: Boolean read FSuppressWarnings write FSuppressWarnings; property LastTiming: TGocciaScriptResult read FLastTiming; - // Source map from the most recent JSX transform, if any. + // Source map from the most recent source pipeline run, if any. // Ownership transfers to the caller when read (set to nil after access). function TakeLastSourceMap: TGocciaSourceMap; end; @@ -296,8 +287,6 @@ implementation TextSemantics, TimingUtils, - Goccia.AST.Expressions, - Goccia.AST.Statements, Goccia.CallStack, Goccia.Constants.ConstructorNames, Goccia.Constants.PropertyNames, @@ -305,17 +294,15 @@ implementation Goccia.Error, Goccia.Executor.Bytecode, Goccia.Executor.Interpreter, + Goccia.FileExtensions, Goccia.GarbageCollector, Goccia.ImportMeta, - Goccia.JSX.Transformer, - Goccia.Lexer, Goccia.MicrotaskQueue, Goccia.Platform, Goccia.Scope.Redeclaration, Goccia.Shims, Goccia.Spec, Goccia.Threading, - Goccia.Token, Goccia.Values.ArrayBufferValue, Goccia.Values.ArrayValue, Goccia.Values.BooleanObjectValue, @@ -368,11 +355,6 @@ function TGocciaEngineExtension.InjectGlobalsFromYAML( { TGocciaEngine } -function TGocciaEngine.GetASIEnabled: Boolean; -begin - Result := cfASI in FCompatibility; -end; - function TGocciaEngine.GetContentProvider: TGocciaModuleContentProvider; begin Result := FModuleLoader.ContentProvider; @@ -578,7 +560,10 @@ procedure TGocciaEngine.Initialize(const AFileName: string; FPreprocessors := DefaultPreprocessors; FCompatibility := DefaultCompatibility; - FSourceType := DefaultSourceType; + if IsModuleSourceFileName(AFileName) then + FSourceType := stModule + else + FSourceType := DefaultSourceType; FStrictTypes := False; FShims := TStringList.Create; FExtensions := TGocciaEngineExtensionList.Create(True); @@ -1247,134 +1232,91 @@ procedure TGocciaEngine.RegisterGlobalModule(const AName: string; const AModule: function TGocciaEngine.Execute: TGocciaScriptResult; var - Lexer: TGocciaLexer; - Parser: TGocciaParser; - ProgramNode: TGocciaProgram; - Tokens: TObjectList; - StartTime, LexEnd, ParseEnd, ExecStart, ExecEnd: Int64; - SourceText: string; - JSXResult: TGocciaJSXTransformResult; - SourceMap: TGocciaSourceMap; - OrigLine, OrigCol: Integer; + PipelineOptions: TGocciaSourcePipelineOptions; + PipelineResult: TGocciaSourcePipelineResult; + StartTime, ExecStart, ExecEnd: Int64; ModuleScope: TGocciaScope; ModuleContext: TGocciaEvaluationContext; begin FillChar(FLastTiming, SizeOf(FLastTiming), 0); FLastTiming.FileName := FSourcePath; StartTime := GetNanoseconds; - - if Assigned(FSourceLines) then - SourceText := StringListToLFText(FSourceLines) - else - SourceText := ''; - SourceMap := nil; - - if ppJSX in FPreprocessors then - begin - JSXResult := TGocciaJSXTransformer.Transform(SourceText); - SourceText := JSXResult.Source; - SourceMap := JSXResult.SourceMap; - if Assigned(SourceMap) then - WarnIfJSXExtensionMismatch(FSourcePath); - end; + PipelineResult := nil; try + PipelineOptions.Preprocessors := FPreprocessors; + PipelineOptions.Compatibility := FCompatibility; + PipelineOptions.SourceType := FSourceType; + PipelineResult := TGocciaSourcePipeline.Parse(FSourceLines, FSourcePath, + PipelineOptions); + FLastTiming.LexTimeNanoseconds := PipelineResult.LexTimeNanoseconds; + FLastTiming.ParseTimeNanoseconds := PipelineResult.ParseTimeNanoseconds; + PrintSourcePipelineWarnings(PipelineResult); + + if Assigned(TGocciaCoverageTracker.Instance) and + TGocciaCoverageTracker.Instance.Enabled then + begin + TGocciaCoverageTracker.Instance.RegisterSourceFile( + FSourcePath, CountExecutableLines(PipelineResult.GeneratedSourceLines)); + if Assigned(PipelineResult.SourceMap) then + TGocciaCoverageTracker.Instance.RegisterSourceMap( + FSourcePath, PipelineResult.SourceMap.Clone); + end; + try - Lexer := TGocciaLexer.Create(SourceText, FSourcePath); - try - Tokens := Lexer.ScanTokens; - LexEnd := GetNanoseconds; - FLastTiming.LexTimeNanoseconds := LexEnd - StartTime; - - Parser := TGocciaParser.Create(Tokens, FSourcePath, Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := cfASI in FCompatibility; - Parser.VarDeclarationsEnabled := cfVar in FCompatibility; - Parser.FunctionDeclarationsEnabled := cfFunction in FCompatibility; - Parser.TraditionalForLoopsEnabled := cfTraditionalFor in FCompatibility; - Parser.WhileLoopsEnabled := cfWhileLoops in FCompatibility; - Parser.LooseEqualityEnabled := cfLooseEquality in FCompatibility; - Parser.NonStrictModeEnabled := (cfNonStrictMode in FCompatibility) or - (FSourceType = stModule); - try - ProgramNode := Parser.Parse; - PrintParserWarnings(Parser, SourceMap); - ParseEnd := GetNanoseconds; - FLastTiming.ParseTimeNanoseconds := ParseEnd - LexEnd; - - if Assigned(TGocciaCoverageTracker.Instance) and - TGocciaCoverageTracker.Instance.Enabled then - begin - TGocciaCoverageTracker.Instance.RegisterSourceFile( - FSourcePath, CountExecutableLines(Lexer.SourceLines)); - if Assigned(SourceMap) then - TGocciaCoverageTracker.Instance.RegisterSourceMap( - FSourcePath, SourceMap.Clone); - end; - - try - if FSourceType = stModule then - begin - // ES2026 §16.2.1.6.4: a Module Environment Record's - // [[ThisValue]] is undefined. Run the entry program in a - // fresh module scope so import.meta resolves and top-level - // `this` is undefined, matching the semantics imported - // modules already receive via TGocciaModuleLoader. - ModuleScope := FInterpreter.GlobalScope.CreateChild(skModule, - 'Module:' + FSourcePath); - ModuleScope.ThisValue := - TGocciaUndefinedLiteralValue.UndefinedValue; - ModuleScope.NonStrictMode := False; - ModuleContext := FInterpreter.CreateEvaluationContext; - ModuleContext.Scope := ModuleScope; - ModuleContext.CurrentFilePath := FSourcePath; - ModuleContext.NonStrictMode := False; - ExecStart := GetNanoseconds; - FLastTiming.Result := - FExecutor.EvaluateModuleBody(ProgramNode, ModuleContext); - WaitForRuntimeIdle; - ExecEnd := GetNanoseconds; - FLastTiming.CompileTimeNanoseconds := 0; - FLastTiming.ExecuteTimeNanoseconds := ExecEnd - ExecStart; - end - else - begin - CheckTopLevelRedeclarations(ProgramNode, - FInterpreter.GlobalScope, FSourcePath); - FLastTiming.Result := FExecutor.ExecuteProgram(ProgramNode); - WaitForRuntimeIdle; - ExecEnd := GetNanoseconds; - FLastTiming.CompileTimeNanoseconds := - FExecutor.CompileTimeNanoseconds; - FLastTiming.ExecuteTimeNanoseconds := - FExecutor.ExecuteTimeNanoseconds; - end; - FLastTiming.TotalTimeNanoseconds := ExecEnd - StartTime; - finally - if Assigned(TGocciaMicrotaskQueue.Instance) then - TGocciaMicrotaskQueue.Instance.ClearQueue; - DiscardRuntimePending; - ProgramNode.Free; - end; - finally - Parser.Free; - end; - finally - Lexer.Free; - end; - except - on E: TGocciaError do + if FSourceType = stModule then + begin + // ES2026 §16.2.1.6.4: a Module Environment Record's + // [[ThisValue]] is undefined. Run the entry program in a + // fresh module scope so import.meta resolves and top-level + // `this` is undefined, matching the semantics imported + // modules already receive via TGocciaModuleLoader. + ModuleScope := FInterpreter.GlobalScope.CreateChild(skModule, + 'Module:' + FSourcePath); + ModuleScope.ThisValue := + TGocciaUndefinedLiteralValue.UndefinedValue; + ModuleScope.NonStrictMode := False; + ModuleContext := FInterpreter.CreateEvaluationContext; + ModuleContext.Scope := ModuleScope; + ModuleContext.CurrentFilePath := FSourcePath; + ModuleContext.NonStrictMode := False; + ExecStart := GetNanoseconds; + FLastTiming.Result := + FExecutor.EvaluateModuleBody(PipelineResult.ProgramNode, + ModuleContext); + WaitForRuntimeIdle; + ExecEnd := GetNanoseconds; + FLastTiming.CompileTimeNanoseconds := 0; + FLastTiming.ExecuteTimeNanoseconds := ExecEnd - ExecStart; + end + else begin - if Assigned(SourceMap) and - SourceMap.Translate(E.Line, E.Column, OrigLine, OrigCol) then - E.TranslatePosition(OrigLine, OrigCol, FSourceLines); - raise; + CheckTopLevelRedeclarations(PipelineResult.ProgramNode, + FInterpreter.GlobalScope, FSourcePath); + FLastTiming.Result := FExecutor.ExecuteProgram( + PipelineResult.ProgramNode); + WaitForRuntimeIdle; + ExecEnd := GetNanoseconds; + FLastTiming.CompileTimeNanoseconds := + FExecutor.CompileTimeNanoseconds; + FLastTiming.ExecuteTimeNanoseconds := + FExecutor.ExecuteTimeNanoseconds; end; + FLastTiming.TotalTimeNanoseconds := ExecEnd - StartTime; + finally + if Assigned(TGocciaMicrotaskQueue.Instance) then + TGocciaMicrotaskQueue.Instance.ClearQueue; + DiscardRuntimePending; end; finally if FLastTiming.TotalTimeNanoseconds = 0 then FLastTiming.TotalTimeNanoseconds := GetNanoseconds - StartTime; FLastSourceMap.Free; - FLastSourceMap := SourceMap; + if Assigned(PipelineResult) then + FLastSourceMap := PipelineResult.TakeSourceMap + else + FLastSourceMap := nil; + PipelineResult.Free; end; Result := FLastTiming; @@ -1430,23 +1372,24 @@ class function TGocciaEngine.RunScriptFromStringList( end; end; -procedure TGocciaEngine.PrintParserWarnings(const AParser: TGocciaParser; const ASourceMap: TGocciaSourceMap); +procedure TGocciaEngine.PrintSourcePipelineWarnings( + const APipelineResult: TGocciaSourcePipelineResult); var - Warning: TGocciaParserWarning; - I, OrigLine, OrigCol: Integer; + Warning: TGocciaSourcePipelineWarning; + I: Integer; begin if FSuppressWarnings then Exit; - for I := 0 to AParser.WarningCount - 1 do + if not Assigned(APipelineResult) then + Exit; + for I := 0 to APipelineResult.WarningCount - 1 do begin - Warning := AParser.GetWarning(I); + Warning := APipelineResult.Warnings[I]; WriteLn(Format('Warning: %s', [Warning.Message])); if Warning.Suggestion <> '' then WriteLn(Format(' Suggestion: %s', [Warning.Suggestion])); - if Assigned(ASourceMap) and ASourceMap.Translate(Warning.Line, Warning.Column, OrigLine, OrigCol) then - WriteLn(Format(' --> %s:%d:%d', [FSourcePath, OrigLine, OrigCol])) - else - WriteLn(Format(' --> %s:%d:%d', [FSourcePath, Warning.Line, Warning.Column])); + WriteLn(Format(' --> %s:%d:%d', [FSourcePath, Warning.Line, + Warning.Column])); end; end; @@ -1534,101 +1477,6 @@ function TGocciaEngine.GocciaGCBytesAllocatedGetter( Result := TGocciaNumberLiteralValue.ZeroValue; end; -procedure TGocciaEngine.SetASIEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfASI) - else - Exclude(FCompatibility, cfASI); - FInterpreter.ASIEnabled := AValue; -end; - -function TGocciaEngine.GetVarEnabled: Boolean; -begin - Result := cfVar in FCompatibility; -end; - -procedure TGocciaEngine.SetVarEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfVar) - else - Exclude(FCompatibility, cfVar); - FInterpreter.VarEnabled := AValue; -end; - -function TGocciaEngine.GetFunctionEnabled: Boolean; -begin - Result := cfFunction in FCompatibility; -end; - -procedure TGocciaEngine.SetFunctionEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfFunction) - else - Exclude(FCompatibility, cfFunction); - FInterpreter.FunctionEnabled := AValue; -end; - -function TGocciaEngine.GetTraditionalForLoopsEnabled: Boolean; -begin - Result := cfTraditionalFor in FCompatibility; -end; - -procedure TGocciaEngine.SetTraditionalForLoopsEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfTraditionalFor) - else - Exclude(FCompatibility, cfTraditionalFor); - FInterpreter.TraditionalForLoopsEnabled := AValue; -end; - -function TGocciaEngine.GetWhileLoopsEnabled: Boolean; -begin - Result := cfWhileLoops in FCompatibility; -end; - -procedure TGocciaEngine.SetWhileLoopsEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfWhileLoops) - else - Exclude(FCompatibility, cfWhileLoops); - FInterpreter.WhileLoopsEnabled := AValue; -end; - -function TGocciaEngine.GetLooseEqualityEnabled: Boolean; -begin - Result := cfLooseEquality in FCompatibility; -end; - -procedure TGocciaEngine.SetLooseEqualityEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfLooseEquality) - else - Exclude(FCompatibility, cfLooseEquality); - FInterpreter.LooseEqualityEnabled := AValue; -end; - -function TGocciaEngine.GetNonStrictModeEnabled: Boolean; -begin - Result := cfNonStrictMode in FCompatibility; -end; - -procedure TGocciaEngine.SetNonStrictModeEnabled(const AValue: Boolean); -begin - if AValue then - Include(FCompatibility, cfNonStrictMode) - else - Exclude(FCompatibility, cfNonStrictMode); - FInterpreter.NonStrictModeEnabled := AValue; - if FExecutor is TGocciaBytecodeExecutor then - TGocciaBytecodeExecutor(FExecutor).NonStrictMode := AValue; -end; - procedure TGocciaEngine.SetStrictTypes(const AValue: Boolean); begin FStrictTypes := AValue; @@ -1672,12 +1520,10 @@ function TGocciaEngine.CompileDynamicFunction( const AParamsSources: array of string; const ABodySource: string): TGocciaFunctionBase; var - ParamStr, Source: string; + ParamStr: string; I: Integer; - BodyHasUseStrictDirective: Boolean; - Lexer: TGocciaLexer; - Tokens: TObjectList; - Parser: TGocciaParser; + BodyParseResult: TGocciaFunctionBodyParseResult; + PipelineOptions: TGocciaSourcePipelineOptions; ProgramNode: TGocciaProgram; ResultValue: TGocciaValue; begin @@ -1690,7 +1536,6 @@ function TGocciaEngine.CompileDynamicFunction( // wrapper will fail validation because it will have unmatched braces when // parsed as a standalone function body. ParamStr := ''; - BodyHasUseStrictDirective := False; for I := 0 to High(AParamsSources) do begin if I > 0 then @@ -1700,114 +1545,38 @@ function TGocciaEngine.CompileDynamicFunction( // Validate params: must parse as a valid parameter list. // If params contain tokens that escape the signature, this will throw. - if ParamStr <> '' then - begin - Source := '(' + ParamStr + ') => {}'; - Lexer := TGocciaLexer.Create(Source, ''); - try - Tokens := Lexer.ScanTokens; - Parser := TGocciaParser.Create(Tokens, '', Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := cfASI in FCompatibility; - Parser.VarDeclarationsEnabled := cfVar in FCompatibility; - Parser.FunctionDeclarationsEnabled := cfFunction in FCompatibility; - Parser.TraditionalForLoopsEnabled := cfTraditionalFor in FCompatibility; - Parser.WhileLoopsEnabled := cfWhileLoops in FCompatibility; - Parser.LooseEqualityEnabled := cfLooseEquality in FCompatibility; - Parser.NonStrictModeEnabled := cfNonStrictMode in FCompatibility; - try - ProgramNode := Parser.Parse; - try - if (ProgramNode.Body.Count <> 1) or - not (ProgramNode.Body[0] is TGocciaExpressionStatement) or - not (TGocciaExpressionStatement(ProgramNode.Body[0]).Expression - is TGocciaArrowFunctionExpression) then - ThrowSyntaxError('Invalid parameter list for Function constructor'); - finally - ProgramNode.Free; - end; - finally - Parser.Free; - end; - finally - Lexer.Free; - end; - end; + PipelineOptions.Preprocessors := []; + PipelineOptions.Compatibility := FCompatibility; + PipelineOptions.SourceType := stScript; + if not TGocciaSourcePipeline.ParseFunctionParameters(ParamStr, + '', PipelineOptions) then + ThrowSyntaxError('Invalid parameter list for Function constructor'); // Validate body: must parse as a valid function body. // An arrow wrapper ensures the body is enclosed in matching braces. - if ABodySource <> '' then - begin - Source := '() => {' + #10 + ABodySource + #10 + '}'; - Lexer := TGocciaLexer.Create(Source, ''); - try - Tokens := Lexer.ScanTokens; - Parser := TGocciaParser.Create(Tokens, '', Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := cfASI in FCompatibility; - Parser.VarDeclarationsEnabled := cfVar in FCompatibility; - Parser.FunctionDeclarationsEnabled := cfFunction in FCompatibility; - Parser.TraditionalForLoopsEnabled := cfTraditionalFor in FCompatibility; - Parser.WhileLoopsEnabled := cfWhileLoops in FCompatibility; - Parser.LooseEqualityEnabled := cfLooseEquality in FCompatibility; - Parser.NonStrictModeEnabled := cfNonStrictMode in FCompatibility; - try - ProgramNode := Parser.Parse; - try - if (ProgramNode.Body.Count <> 1) or - not (ProgramNode.Body[0] is TGocciaExpressionStatement) or - not (TGocciaExpressionStatement(ProgramNode.Body[0]).Expression - is TGocciaArrowFunctionExpression) then - ThrowSyntaxError('Invalid body for Function constructor'); - BodyHasUseStrictDirective := HasUseStrictDirective( - TGocciaArrowFunctionExpression( - TGocciaExpressionStatement(ProgramNode.Body[0]).Expression).Body); - finally - ProgramNode.Free; - end; - finally - Parser.Free; - end; - finally - Lexer.Free; - end; - end; + BodyParseResult := TGocciaSourcePipeline.ParseFunctionBodyWrapper( + ABodySource, '', PipelineOptions); + if not BodyParseResult.IsValid then + ThrowSyntaxError('Invalid body for Function constructor'); // Both pieces validated — safe to assemble the wrapper - Source := '({ anonymous(' + ParamStr + ') {' + #10 + ABodySource + #10 + '} }).anonymous'; - - Lexer := TGocciaLexer.Create(Source, ''); + ProgramNode := TGocciaSourcePipeline.ParseDynamicFunctionWrapper(ParamStr, + ABodySource, '', PipelineOptions); try - Tokens := Lexer.ScanTokens; - Parser := TGocciaParser.Create(Tokens, '', Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := cfASI in FCompatibility; - Parser.VarDeclarationsEnabled := cfVar in FCompatibility; - Parser.FunctionDeclarationsEnabled := cfFunction in FCompatibility; - Parser.TraditionalForLoopsEnabled := cfTraditionalFor in FCompatibility; - Parser.WhileLoopsEnabled := cfWhileLoops in FCompatibility; - Parser.LooseEqualityEnabled := cfLooseEquality in FCompatibility; - Parser.NonStrictModeEnabled := cfNonStrictMode in FCompatibility; - try - ProgramNode := Parser.ParseUnchecked; - try - ResultValue := FExecutor.ExecuteDynamicFunction(ProgramNode); - Result := TGocciaFunctionBase(ResultValue); - // ES2026 §20.2.1.1.1: the function's name is 'anonymous' - if Result is TGocciaFunctionValue then - TGocciaFunctionValue(Result).Name := 'anonymous'; - // ES2026 §15.2.2.4: Function-constructor bodies are non-strict - // unless the parsed body contains a Use Strict Directive (§11.2.2). - if not BodyHasUseStrictDirective then - begin - Result.StrictThis := False; - Result.StrictCode := False; - end; - finally - ProgramNode.Free; - end; - finally - Parser.Free; + ResultValue := FExecutor.ExecuteDynamicFunction(ProgramNode); + Result := TGocciaFunctionBase(ResultValue); + // ES2026 §20.2.1.1.1: the function's name is 'anonymous' + if Result is TGocciaFunctionValue then + TGocciaFunctionValue(Result).Name := 'anonymous'; + // ES2026 §15.2.2.4: Function-constructor bodies are non-strict + // unless the parsed body contains a Use Strict Directive (§11.2.2). + if not BodyParseResult.HasUseStrictDirective then + begin + Result.StrictThis := False; + Result.StrictCode := False; end; finally - Lexer.Free; + ProgramNode.Free; end; end; diff --git a/source/units/Goccia.Evaluator.pas b/source/units/Goccia.Evaluator.pas index d35e88bc..dd520ca1 100644 --- a/source/units/Goccia.Evaluator.pas +++ b/source/units/Goccia.Evaluator.pas @@ -121,8 +121,7 @@ implementation Goccia.Generator.Continuation, Goccia.InstructionLimit, Goccia.Keywords.Reserved, - Goccia.Lexer, - Goccia.Parser, + Goccia.SourcePipeline, Goccia.StackLimit, Goccia.Timeout, Goccia.Token, @@ -6154,12 +6153,9 @@ function EvaluateTemplateExpression(const AExpressionText: string; const AContex PlusPos, MinusPos, StarPos, SlashPos, DotPos: Integer; Left, Right, PropName: string; LeftVal, RightVal, ObjVal: TGocciaValue; - Lexer: TGocciaLexer; - Parser: TGocciaParser; Expression: TGocciaExpression; - Tokens: TObjectList; - SourceLines: TStringList; DeclaredPrivateNames: TStringList; + PipelineOptions: TGocciaSourcePipelineOptions; I: Integer; IsSimpleIdentifier: Boolean; begin @@ -6364,35 +6360,22 @@ function EvaluateTemplateExpression(const AExpressionText: string; const AContex // Fall back to full parsing for complex expressions // This handles complex cases like nested expressions, function calls, string literals, etc. - Lexer := nil; - Parser := nil; - Tokens := nil; - SourceLines := nil; Expression := nil; DeclaredPrivateNames := nil; try - SourceLines := TStringList.Create; - SourceLines.Add(AExpressionText); - - Lexer := TGocciaLexer.Create(AExpressionText, 'template-expression'); - Tokens := Lexer.ScanTokens; - if Tokens = nil then - begin - Result := TGocciaUndefinedLiteralValue.UndefinedValue; - Exit; - end; - - Parser := TGocciaParser.Create(Tokens, 'template-expression', SourceLines); - Tokens := nil; // Parser owns it - + PipelineOptions.Preprocessors := []; + PipelineOptions.Compatibility := []; + PipelineOptions.SourceType := stScript; if Pos('#', Trimmed) > 0 then begin DeclaredPrivateNames := CollectDeclaredPrivateNames(AContext); - Expression := Parser.ParseExpressionWithPrivateNames(DeclaredPrivateNames); + Expression := TGocciaSourcePipeline.ParseExpression(AExpressionText, + 'template-expression', PipelineOptions, DeclaredPrivateNames); end else - Expression := Parser.Expression; + Expression := TGocciaSourcePipeline.ParseExpression(AExpressionText, + 'template-expression', PipelineOptions); if Expression = nil then begin @@ -6408,10 +6391,6 @@ function EvaluateTemplateExpression(const AExpressionText: string; const AContex // Cleanup if Assigned(Expression) then Expression.Free; - if Assigned(Parser) then Parser.Free; - if Assigned(Tokens) then Tokens.Free; - if Assigned(Lexer) then Lexer.Free; - if Assigned(SourceLines) then SourceLines.Free; if Assigned(DeclaredPrivateNames) then DeclaredPrivateNames.Free; end; diff --git a/source/units/Goccia.FileExtensions.pas b/source/units/Goccia.FileExtensions.pas index c90d7f0f..83e837f2 100644 --- a/source/units/Goccia.FileExtensions.pas +++ b/source/units/Goccia.FileExtensions.pas @@ -48,6 +48,8 @@ function IsCSVExtension(const AExtension: string): Boolean; function IsJSON5Extension(const AExtension: string): Boolean; function IsJSONLExtension(const AExtension: string): Boolean; function IsJSXNativeExtension(const AExtension: string): Boolean; +function IsModuleSourceExtension(const AExtension: string): Boolean; +function IsModuleSourceFileName(const AFileName: string): Boolean; function IsTextAssetExtension(const AExtension: string): Boolean; function IsTOMLExtension(const AExtension: string): Boolean; function IsTSVExtension(const AExtension: string): Boolean; @@ -84,6 +86,19 @@ function IsJSXNativeExtension(const AExtension: string): Boolean; Result := False; end; +function IsModuleSourceExtension(const AExtension: string): Boolean; +var + Ext: string; +begin + Ext := LowerCase(AExtension); + Result := Ext = EXT_MJS; +end; + +function IsModuleSourceFileName(const AFileName: string): Boolean; +begin + Result := IsModuleSourceExtension(ExtractFileExt(AFileName)); +end; + function IsCSVExtension(const AExtension: string): Boolean; var Ext: string; diff --git a/source/units/Goccia.Modules.Loader.pas b/source/units/Goccia.Modules.Loader.pas index ee0a6ed9..992dd5ca 100644 --- a/source/units/Goccia.Modules.Loader.pas +++ b/source/units/Goccia.Modules.Loader.pas @@ -16,6 +16,7 @@ interface Goccia.Modules.ContentProvider, Goccia.Modules.Resolver, Goccia.Scope, + Goccia.SourcePipeline, Goccia.Values.Primitives; type @@ -31,20 +32,14 @@ interface TGocciaModuleLoader = class private - FASIEnabled: Boolean; - FVarEnabled: Boolean; - FFunctionEnabled: Boolean; - FTraditionalForLoopsEnabled: Boolean; - FWhileLoopsEnabled: Boolean; - FLooseEqualityEnabled: Boolean; - FNonStrictModeEnabled: Boolean; + FPreprocessors: TGocciaPreprocessors; + FCompatibility: TGocciaCompatibilityFlags; FStrictTypesEnabled: Boolean; FContentProvider: TGocciaModuleContentProvider; FEvaluateModuleBody: TGocciaModuleBodyEvaluator; FEntryFileName: string; FGlobalModules: TOrderedStringMap; FGlobalScope: TGocciaGlobalScope; - FJSXEnabled: Boolean; FLoadingModules: TOrderedStringMap; FModules: TOrderedStringMap; FOnError: TGocciaThrowErrorCallback; @@ -56,6 +51,22 @@ TGocciaModuleLoader = class procedure CopyModuleContents(const ASourceModule, ATargetModule: TGocciaModule); function LoadJSONModule(const AResolvedPath: string): TGocciaModule; + function GetASIEnabled: Boolean; + function GetJSXEnabled: Boolean; + function GetVarEnabled: Boolean; + function GetFunctionEnabled: Boolean; + function GetTraditionalForLoopsEnabled: Boolean; + function GetWhileLoopsEnabled: Boolean; + function GetLooseEqualityEnabled: Boolean; + function GetNonStrictModeEnabled: Boolean; + procedure SetASIEnabled(const AValue: Boolean); + procedure SetJSXEnabled(const AValue: Boolean); + procedure SetVarEnabled(const AValue: Boolean); + procedure SetFunctionEnabled(const AValue: Boolean); + procedure SetTraditionalForLoopsEnabled(const AValue: Boolean); + procedure SetWhileLoopsEnabled(const AValue: Boolean); + procedure SetLooseEqualityEnabled(const AValue: Boolean); + procedure SetNonStrictModeEnabled(const AValue: Boolean); public constructor Create(const AEntryFileName: string; const AResolver: TGocciaModuleResolver = nil; @@ -77,18 +88,22 @@ TGocciaModuleLoader = class read FEvaluateModuleBody write FEvaluateModuleBody; property GlobalModules: TOrderedStringMap read FGlobalModules; - property ASIEnabled: Boolean read FASIEnabled write FASIEnabled; - property JSXEnabled: Boolean read FJSXEnabled write FJSXEnabled; - property VarEnabled: Boolean read FVarEnabled write FVarEnabled; - property FunctionEnabled: Boolean read FFunctionEnabled write FFunctionEnabled; + property Preprocessors: TGocciaPreprocessors + read FPreprocessors write FPreprocessors; + property Compatibility: TGocciaCompatibilityFlags + read FCompatibility write FCompatibility; + property ASIEnabled: Boolean read GetASIEnabled write SetASIEnabled; + property JSXEnabled: Boolean read GetJSXEnabled write SetJSXEnabled; + property VarEnabled: Boolean read GetVarEnabled write SetVarEnabled; + property FunctionEnabled: Boolean read GetFunctionEnabled write SetFunctionEnabled; property TraditionalForLoopsEnabled: Boolean - read FTraditionalForLoopsEnabled write FTraditionalForLoopsEnabled; + read GetTraditionalForLoopsEnabled write SetTraditionalForLoopsEnabled; property WhileLoopsEnabled: Boolean - read FWhileLoopsEnabled write FWhileLoopsEnabled; + read GetWhileLoopsEnabled write SetWhileLoopsEnabled; property LooseEqualityEnabled: Boolean - read FLooseEqualityEnabled write FLooseEqualityEnabled; + read GetLooseEqualityEnabled write SetLooseEqualityEnabled; property NonStrictModeEnabled: Boolean - read FNonStrictModeEnabled write FNonStrictModeEnabled; + read GetNonStrictModeEnabled write SetNonStrictModeEnabled; property StrictTypesEnabled: Boolean read FStrictTypesEnabled write FStrictTypesEnabled; property Resolver: TGocciaModuleResolver read FResolver; @@ -99,19 +114,13 @@ TGocciaModuleLoader = class implementation uses - TextSemantics, - Goccia.AST.Expressions, Goccia.AST.Statements, Goccia.Error, Goccia.FileExtensions, Goccia.GarbageCollector, Goccia.JSON, - Goccia.JSX.Transformer, Goccia.Keywords.Reserved, - Goccia.Lexer, - Goccia.Parser, - Goccia.SourceMap, Goccia.Values.ObjectValue; constructor TGocciaModuleLoader.Create(const AEntryFileName: string; @@ -160,6 +169,111 @@ destructor TGocciaModuleLoader.Destroy; inherited; end; +function TGocciaModuleLoader.GetASIEnabled: Boolean; +begin + Result := cfASI in FCompatibility; +end; + +function TGocciaModuleLoader.GetJSXEnabled: Boolean; +begin + Result := ppJSX in FPreprocessors; +end; + +function TGocciaModuleLoader.GetVarEnabled: Boolean; +begin + Result := cfVar in FCompatibility; +end; + +function TGocciaModuleLoader.GetFunctionEnabled: Boolean; +begin + Result := cfFunction in FCompatibility; +end; + +function TGocciaModuleLoader.GetTraditionalForLoopsEnabled: Boolean; +begin + Result := cfTraditionalFor in FCompatibility; +end; + +function TGocciaModuleLoader.GetWhileLoopsEnabled: Boolean; +begin + Result := cfWhileLoops in FCompatibility; +end; + +function TGocciaModuleLoader.GetLooseEqualityEnabled: Boolean; +begin + Result := cfLooseEquality in FCompatibility; +end; + +function TGocciaModuleLoader.GetNonStrictModeEnabled: Boolean; +begin + Result := cfNonStrictMode in FCompatibility; +end; + +procedure TGocciaModuleLoader.SetASIEnabled(const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfASI) + else + Exclude(FCompatibility, cfASI); +end; + +procedure TGocciaModuleLoader.SetJSXEnabled(const AValue: Boolean); +begin + if AValue then + Include(FPreprocessors, ppJSX) + else + Exclude(FPreprocessors, ppJSX); +end; + +procedure TGocciaModuleLoader.SetVarEnabled(const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfVar) + else + Exclude(FCompatibility, cfVar); +end; + +procedure TGocciaModuleLoader.SetFunctionEnabled(const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfFunction) + else + Exclude(FCompatibility, cfFunction); +end; + +procedure TGocciaModuleLoader.SetTraditionalForLoopsEnabled( + const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfTraditionalFor) + else + Exclude(FCompatibility, cfTraditionalFor); +end; + +procedure TGocciaModuleLoader.SetWhileLoopsEnabled(const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfWhileLoops) + else + Exclude(FCompatibility, cfWhileLoops); +end; + +procedure TGocciaModuleLoader.SetLooseEqualityEnabled(const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfLooseEquality) + else + Exclude(FCompatibility, cfLooseEquality); +end; + +procedure TGocciaModuleLoader.SetNonStrictModeEnabled(const AValue: Boolean); +begin + if AValue then + Include(FCompatibility, cfNonStrictMode) + else + Exclude(FCompatibility, cfNonStrictMode); +end; + procedure TGocciaModuleLoader.SetContentProvider( const AContentProvider: TGocciaModuleContentProvider; const AOwnsContentProvider: Boolean); @@ -213,19 +327,15 @@ function TGocciaModuleLoader.LoadModule(const AModulePath, ExportPair: TStringStringMap.TKeyValuePair; ExportVarDecl: TGocciaExportVariableDeclaration; I: Integer; - JSXResult: TGocciaJSXTransformResult; - JSXSourceMap: TGocciaSourceMap; - Lexer: TGocciaLexer; Module: TGocciaModule; + ModuleParseResult: TGocciaSourcePipelineModuleResult; + ModuleWarning: TGocciaSourcePipelineWarning; ModuleScope: TGocciaScope; - OrigLine: Integer; - OrigCol: Integer; - Parser: TGocciaParser; + PipelineOptions: TGocciaSourcePipelineOptions; ProgramNode: TGocciaProgram; ReExportDecl: TGocciaReExportDeclaration; ResolvedPath: string; SourceModule: TGocciaModule; - SourceText: UTF8String; Stmt: TGocciaStatement; Value: TGocciaValue; VarInfo: TGocciaVariableInfo; @@ -282,149 +392,125 @@ function TGocciaModuleLoader.LoadModule(const AModulePath, Content := FContentProvider.LoadContent(ResolvedPath); try - SourceText := NormalizeUTF8NewlinesToLF(Content.Text); - JSXSourceMap := nil; - if FJSXEnabled then - begin - JSXResult := TGocciaJSXTransformer.Transform(string(SourceText)); - SourceText := UTF8String(JSXResult.Source); - JSXSourceMap := JSXResult.SourceMap; - if Assigned(JSXSourceMap) then - WarnIfJSXExtensionMismatch(ResolvedPath); - end; - + PipelineOptions.Preprocessors := FPreprocessors; + PipelineOptions.Compatibility := FCompatibility; + PipelineOptions.SourceType := stModule; + ModuleParseResult := TGocciaSourcePipeline.ParseModuleSource(Content.Text, + ResolvedPath, PipelineOptions); try + for I := 0 to ModuleParseResult.WarningCount - 1 do + begin + ModuleWarning := ModuleParseResult.Warnings[I]; + WriteLn(Format('Warning: %s', [ModuleWarning.Message])); + if ModuleWarning.Suggestion <> '' then + WriteLn(Format(' Suggestion: %s', [ModuleWarning.Suggestion])); + WriteLn(Format(' --> %s:%d:%d', [ResolvedPath, ModuleWarning.Line, + ModuleWarning.Column])); + end; + + ProgramNode := ModuleParseResult.TakeProgramNode; try - Lexer := TGocciaLexer.Create(string(SourceText), ResolvedPath); + Module := TGocciaModule.Create(ResolvedPath); + Module.LastModified := Content.LastModified; + FModules.Add(ResolvedPath, Module); + FLoadingModules.Add(ResolvedPath, True); + LoadSucceeded := False; try - Parser := TGocciaParser.Create(Lexer.ScanTokens, ResolvedPath, - Lexer.SourceLines); - Parser.AutomaticSemicolonInsertion := FASIEnabled; - Parser.VarDeclarationsEnabled := FVarEnabled; - Parser.FunctionDeclarationsEnabled := FFunctionEnabled; - Parser.TraditionalForLoopsEnabled := FTraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := FWhileLoopsEnabled; - Parser.LooseEqualityEnabled := FLooseEqualityEnabled; - Parser.NonStrictModeEnabled := True; - try - ProgramNode := Parser.Parse; - try - Module := TGocciaModule.Create(ResolvedPath); - Module.LastModified := Content.LastModified; - FModules.Add(ResolvedPath, Module); - FLoadingModules.Add(ResolvedPath, True); - LoadSucceeded := False; - try - ModuleScope := FGlobalScope.CreateChild(skModule, - 'Module:' + ResolvedPath); - // ES2026 §16.2.1.6.4 InitializeEnvironment: a Module - // Environment Record's [[ThisValue]] is undefined. - ModuleScope.ThisValue := TGocciaUndefinedLiteralValue.UndefinedValue; - ModuleScope.StrictTypes := FStrictTypesEnabled; - ModuleScope.NonStrictMode := False; - Context.Scope := ModuleScope; - Context.OnError := FOnError; - Context.LoadModule := LoadModule; - Context.CurrentFilePath := ResolvedPath; - Context.CoverageEnabled := False; - Context.StrictTypes := FStrictTypesEnabled; - Context.NonStrictMode := False; - Context.DisposalTracker := nil; - - FEvaluateModuleBody(ProgramNode, Context); - - for I := 0 to ProgramNode.Body.Count - 1 do - begin - Stmt := ProgramNode.Body[I]; - - if Stmt is TGocciaExportDeclaration then - begin - ExportDecl := TGocciaExportDeclaration(Stmt); - for ExportPair in ExportDecl.ExportsTable do - begin - Value := ModuleScope.GetValue(ExportPair.Value); - if Assigned(Value) then - Module.ExportsTable.AddOrSetValue(ExportPair.Key, Value); - end; - end - else if Stmt is TGocciaExportDefaultDeclaration then - begin - ExportDefaultDecl := TGocciaExportDefaultDeclaration(Stmt); - Value := ModuleScope.GetValue(ExportDefaultDecl.LocalName); - if Assigned(Value) then - Module.ExportsTable.AddOrSetValue(KEYWORD_DEFAULT, Value); - end - else if Stmt is TGocciaExportVariableDeclaration then - begin - ExportVarDecl := TGocciaExportVariableDeclaration(Stmt); - for VarInfo in ExportVarDecl.Declaration.Variables do - begin - Value := ModuleScope.GetValue(VarInfo.Name); - if Assigned(Value) then - Module.ExportsTable.AddOrSetValue(VarInfo.Name, Value); - end; - end - else if Stmt is TGocciaExportFunctionDeclaration then - begin - ExportFuncDecl := TGocciaExportFunctionDeclaration(Stmt); - Value := ModuleScope.GetValue(ExportFuncDecl.Declaration.Name); - if Assigned(Value) then - Module.ExportsTable.AddOrSetValue( - ExportFuncDecl.Declaration.Name, Value); - end - else if Stmt is TGocciaExportEnumDeclaration then - begin - Value := ModuleScope.GetValue( - TGocciaExportEnumDeclaration(Stmt).Declaration.Name); - if Assigned(Value) then - Module.ExportsTable.AddOrSetValue( - TGocciaExportEnumDeclaration(Stmt).Declaration.Name, - Value); - end - else if Stmt is TGocciaReExportDeclaration then - begin - ReExportDecl := TGocciaReExportDeclaration(Stmt); - SourceModule := LoadModule(ReExportDecl.ModulePath, - ResolvedPath); - for ExportPair in ReExportDecl.ExportsTable do - begin - if SourceModule.ExportsTable.TryGetValue(ExportPair.Value, - Value) then - Module.ExportsTable.AddOrSetValue(ExportPair.Key, Value); - end; - end; - end; - - Result := Module; - LoadSucceeded := True; - finally - FLoadingModules.Remove(ResolvedPath); - if not LoadSucceeded then - begin - FModules.Remove(ResolvedPath); - Module.Free; - end; + ModuleScope := FGlobalScope.CreateChild(skModule, + 'Module:' + ResolvedPath); + // ES2026 §16.2.1.6.4 InitializeEnvironment: a Module + // Environment Record's [[ThisValue]] is undefined. + ModuleScope.ThisValue := TGocciaUndefinedLiteralValue.UndefinedValue; + ModuleScope.StrictTypes := FStrictTypesEnabled; + ModuleScope.NonStrictMode := False; + Context.Scope := ModuleScope; + Context.OnError := FOnError; + Context.LoadModule := LoadModule; + Context.CurrentFilePath := ResolvedPath; + Context.CoverageEnabled := False; + Context.StrictTypes := FStrictTypesEnabled; + Context.NonStrictMode := False; + Context.DisposalTracker := nil; + + FEvaluateModuleBody(ProgramNode, Context); + + for I := 0 to ProgramNode.Body.Count - 1 do + begin + Stmt := ProgramNode.Body[I]; + + if Stmt is TGocciaExportDeclaration then + begin + ExportDecl := TGocciaExportDeclaration(Stmt); + for ExportPair in ExportDecl.ExportsTable do + begin + Value := ModuleScope.GetValue(ExportPair.Value); + if Assigned(Value) then + Module.ExportsTable.AddOrSetValue(ExportPair.Key, Value); + end; + end + else if Stmt is TGocciaExportDefaultDeclaration then + begin + ExportDefaultDecl := TGocciaExportDefaultDeclaration(Stmt); + Value := ModuleScope.GetValue(ExportDefaultDecl.LocalName); + if Assigned(Value) then + Module.ExportsTable.AddOrSetValue(KEYWORD_DEFAULT, Value); + end + else if Stmt is TGocciaExportVariableDeclaration then + begin + ExportVarDecl := TGocciaExportVariableDeclaration(Stmt); + for VarInfo in ExportVarDecl.Declaration.Variables do + begin + Value := ModuleScope.GetValue(VarInfo.Name); + if Assigned(Value) then + Module.ExportsTable.AddOrSetValue(VarInfo.Name, Value); + end; + end + else if Stmt is TGocciaExportFunctionDeclaration then + begin + ExportFuncDecl := TGocciaExportFunctionDeclaration(Stmt); + Value := ModuleScope.GetValue(ExportFuncDecl.Declaration.Name); + if Assigned(Value) then + Module.ExportsTable.AddOrSetValue( + ExportFuncDecl.Declaration.Name, Value); + end + else if Stmt is TGocciaExportEnumDeclaration then + begin + Value := ModuleScope.GetValue( + TGocciaExportEnumDeclaration(Stmt).Declaration.Name); + if Assigned(Value) then + Module.ExportsTable.AddOrSetValue( + TGocciaExportEnumDeclaration(Stmt).Declaration.Name, + Value); + end + else if Stmt is TGocciaReExportDeclaration then + begin + ReExportDecl := TGocciaReExportDeclaration(Stmt); + SourceModule := LoadModule(ReExportDecl.ModulePath, + ResolvedPath); + for ExportPair in ReExportDecl.ExportsTable do + begin + if SourceModule.ExportsTable.TryGetValue(ExportPair.Value, + Value) then + Module.ExportsTable.AddOrSetValue(ExportPair.Key, Value); end; - finally - ProgramNode.Free; end; - finally - Parser.Free; end; + + Result := Module; + LoadSucceeded := True; finally - Lexer.Free; - end; - except - on E: TGocciaError do - begin - if Assigned(JSXSourceMap) and - JSXSourceMap.Translate(E.Line, E.Column, OrigLine, OrigCol) then - E.TranslatePosition(OrigLine, OrigCol, Content.SourceLines); - raise; + FLoadingModules.Remove(ResolvedPath); + if not LoadSucceeded then + begin + FModules.Remove(ResolvedPath); + Module.Free; + end; end; + finally + ProgramNode.Free; end; finally - JSXSourceMap.Free; + ModuleParseResult.Free; end; finally Content.Free; diff --git a/source/units/Goccia.Parser.pas b/source/units/Goccia.Parser.pas index 635c890d..cc38f1f0 100644 --- a/source/units/Goccia.Parser.pas +++ b/source/units/Goccia.Parser.pas @@ -25,6 +25,16 @@ TGocciaParserWarning = record Column: Integer; end; + TGocciaParserOptions = record + AutomaticSemicolonInsertion: Boolean; + VarDeclarationsEnabled: Boolean; + FunctionDeclarationsEnabled: Boolean; + TraditionalForLoopsEnabled: Boolean; + WhileLoopsEnabled: Boolean; + LooseEqualityEnabled: Boolean; + NonStrictModeEnabled: Boolean; + end; + TGocciaPrivateNameReference = record Name: string; Line: Integer; @@ -235,20 +245,8 @@ TGocciaParser = class function ParseExpressionUnchecked: TGocciaExpression; function Expression: TGocciaExpression; function GetWarning(const AIndex: Integer): TGocciaParserWarning; inline; - property AutomaticSemicolonInsertion: Boolean - read FAutomaticSemicolonInsertion write FAutomaticSemicolonInsertion; - property VarDeclarationsEnabled: Boolean - read FVarDeclarationsEnabled write FVarDeclarationsEnabled; - property FunctionDeclarationsEnabled: Boolean - read FFunctionDeclarationsEnabled write FFunctionDeclarationsEnabled; - property TraditionalForLoopsEnabled: Boolean - read FTraditionalForLoopsEnabled write FTraditionalForLoopsEnabled; - property WhileLoopsEnabled: Boolean - read FWhileLoopsEnabled write FWhileLoopsEnabled; - property LooseEqualityEnabled: Boolean - read FLooseEqualityEnabled write FLooseEqualityEnabled; - property NonStrictModeEnabled: Boolean - read FNonStrictModeEnabled write FNonStrictModeEnabled; + procedure ApplyOptions(const AOptions: TGocciaParserOptions); + function Options: TGocciaParserOptions; property WarningCount: Integer read FWarningCount; end; @@ -330,6 +328,28 @@ constructor TGocciaParser.Create(const ATokens: TObjectList; FPrivateClassContexts := TObjectList.Create(True); end; +procedure TGocciaParser.ApplyOptions(const AOptions: TGocciaParserOptions); +begin + FAutomaticSemicolonInsertion := AOptions.AutomaticSemicolonInsertion; + FVarDeclarationsEnabled := AOptions.VarDeclarationsEnabled; + FFunctionDeclarationsEnabled := AOptions.FunctionDeclarationsEnabled; + FTraditionalForLoopsEnabled := AOptions.TraditionalForLoopsEnabled; + FWhileLoopsEnabled := AOptions.WhileLoopsEnabled; + FLooseEqualityEnabled := AOptions.LooseEqualityEnabled; + FNonStrictModeEnabled := AOptions.NonStrictModeEnabled; +end; + +function TGocciaParser.Options: TGocciaParserOptions; +begin + Result.AutomaticSemicolonInsertion := FAutomaticSemicolonInsertion; + Result.VarDeclarationsEnabled := FVarDeclarationsEnabled; + Result.FunctionDeclarationsEnabled := FFunctionDeclarationsEnabled; + Result.TraditionalForLoopsEnabled := FTraditionalForLoopsEnabled; + Result.WhileLoopsEnabled := FWhileLoopsEnabled; + Result.LooseEqualityEnabled := FLooseEqualityEnabled; + Result.NonStrictModeEnabled := FNonStrictModeEnabled; +end; + destructor TGocciaParser.Destroy; begin FPrivateClassContexts.Free; @@ -1539,12 +1559,7 @@ function CookRawSegment(const ARawSegment: string; out ACooked: string): Boolean // Note: Tokens are owned by the Lexer (FTokens with OwnsObjects=True) and freed // when the Lexer is destroyed — they must not be freed separately. function ParseInterpolationExpression(const AExprText, AFileName: string; - const AASI: Boolean = False; const AVarEnabled: Boolean = False; - const AFunctionEnabled: Boolean = False; - const ATraditionalForLoopsEnabled: Boolean = False; - const AWhileLoopsEnabled: Boolean = False; - const ALooseEqualityEnabled: Boolean = False; - const ANonStrictModeEnabled: Boolean = False): TGocciaExpression; + const AOptions: TGocciaParserOptions): TGocciaExpression; var Lexer: TGocciaLexer; Parser: TGocciaParser; @@ -1563,13 +1578,7 @@ function ParseInterpolationExpression(const AExprText, AFileName: string; SourceLines.Text := AExprText; try Parser := TGocciaParser.Create(Tokens, AFileName, SourceLines); - Parser.AutomaticSemicolonInsertion := AASI; - Parser.VarDeclarationsEnabled := AVarEnabled; - Parser.FunctionDeclarationsEnabled := AFunctionEnabled; - Parser.TraditionalForLoopsEnabled := ATraditionalForLoopsEnabled; - Parser.WhileLoopsEnabled := AWhileLoopsEnabled; - Parser.LooseEqualityEnabled := ALooseEqualityEnabled; - Parser.NonStrictModeEnabled := ANonStrictModeEnabled; + Parser.ApplyOptions(AOptions); try ProgramNode := Parser.ParseUnchecked; try @@ -1632,10 +1641,7 @@ function TGocciaParser.ParseTaggedTemplate(const ATag: TGocciaExpression; Expressions := TObjectList.Create(True); for I := 0 to Length(ExprTexts) - 1 do begin - ParsedExpr := ParseInterpolationExpression(ExprTexts[I], FFileName, - FAutomaticSemicolonInsertion, FVarDeclarationsEnabled, - FFunctionDeclarationsEnabled, FTraditionalForLoopsEnabled, - FWhileLoopsEnabled, FLooseEqualityEnabled, FNonStrictModeEnabled); + ParsedExpr := ParseInterpolationExpression(ExprTexts[I], FFileName, Options); if Assigned(ParsedExpr) then Expressions.Add(ParsedExpr); end; @@ -1695,10 +1701,7 @@ function TGocciaParser.ParseTemplateLiteral(const AToken: TGocciaToken): TGoccia AToken.Line, AToken.Column)); // Parse and add the interpolation expression - ParsedExpr := ParseInterpolationExpression(ExprTexts[I], FFileName, - FAutomaticSemicolonInsertion, FVarDeclarationsEnabled, - FFunctionDeclarationsEnabled, FTraditionalForLoopsEnabled, - FWhileLoopsEnabled, FLooseEqualityEnabled, FNonStrictModeEnabled); + ParsedExpr := ParseInterpolationExpression(ExprTexts[I], FFileName, Options); if Assigned(ParsedExpr) then Parts.Add(ParsedExpr); end; diff --git a/source/units/Goccia.Shims.pas b/source/units/Goccia.Shims.pas index 3d0e6109..ee58aad4 100644 --- a/source/units/Goccia.Shims.pas +++ b/source/units/Goccia.Shims.pas @@ -43,15 +43,11 @@ function LoadShimValue(const AInterpreter: TGocciaInterpreter; implementation uses - Generics.Collections, - Goccia.AST.Node, Goccia.Evaluator, Goccia.Evaluator.Context, - Goccia.Lexer, - Goccia.Parser, Goccia.Scope, - Goccia.Token; + Goccia.SourcePipeline; const DEFAULT_SHIMS: array[0..7] of TGocciaShimDefinition = ( @@ -285,38 +281,36 @@ procedure RegisterDefaultShimNames(const AShims: TStringList); function LoadShimValue(const AInterpreter: TGocciaInterpreter; const AShim: TGocciaShimDefinition): TGocciaValue; var - Lexer: TGocciaLexer; - Parser: TGocciaParser; + ModuleParseResult: TGocciaSourcePipelineModuleResult; + PipelineOptions: TGocciaSourcePipelineOptions; ProgramNode: TGocciaProgram; ModuleScope: TGocciaScope; Context: TGocciaEvaluationContext; I: Integer; begin - Lexer := TGocciaLexer.Create(AShim.Source, AShim.FileName); + PipelineOptions.Preprocessors := []; + PipelineOptions.Compatibility := []; + PipelineOptions.SourceType := stModule; + ModuleParseResult := TGocciaSourcePipeline.ParseModuleSource( + UTF8String(AShim.Source), AShim.FileName, PipelineOptions); try - Parser := TGocciaParser.Create(Lexer.ScanTokens, AShim.FileName, - Lexer.SourceLines); + ProgramNode := ModuleParseResult.TakeProgramNode; try - ProgramNode := Parser.Parse; - try - ModuleScope := AInterpreter.GlobalScope.CreateChild(skModule, - 'Shim:' + AShim.Name); - // ES2026 §16.2.1.6.4 InitializeEnvironment: a Module - // Environment Record's [[ThisValue]] is undefined. - ModuleScope.ThisValue := TGocciaUndefinedLiteralValue.UndefinedValue; - Context := AInterpreter.CreateEvaluationContext; - Context.Scope := ModuleScope; - for I := 0 to ProgramNode.Body.Count - 1 do - EvaluateStatement(ProgramNode.Body[I], Context); - Result := ModuleScope.GetValue(AShim.Name); - finally - ProgramNode.Free; - end; + ModuleScope := AInterpreter.GlobalScope.CreateChild(skModule, + 'Shim:' + AShim.Name); + // ES2026 §16.2.1.6.4 InitializeEnvironment: a Module + // Environment Record's [[ThisValue]] is undefined. + ModuleScope.ThisValue := TGocciaUndefinedLiteralValue.UndefinedValue; + Context := AInterpreter.CreateEvaluationContext; + Context.Scope := ModuleScope; + for I := 0 to ProgramNode.Body.Count - 1 do + EvaluateStatement(ProgramNode.Body[I], Context); + Result := ModuleScope.GetValue(AShim.Name); finally - Parser.Free; + ProgramNode.Free; end; finally - Lexer.Free; + ModuleParseResult.Free; end; end; diff --git a/source/units/Goccia.SourcePipeline.pas b/source/units/Goccia.SourcePipeline.pas new file mode 100644 index 00000000..7ec52bba --- /dev/null +++ b/source/units/Goccia.SourcePipeline.pas @@ -0,0 +1,488 @@ +unit Goccia.SourcePipeline; + +{$I Goccia.inc} + +interface + +uses + Classes, + Generics.Collections, + + Goccia.AST.Expressions, + Goccia.AST.Node, + Goccia.SourceMap; + +type + TGocciaPreprocessor = (ppJSX); + TGocciaPreprocessors = set of TGocciaPreprocessor; + + TGocciaCompatibility = (cfASI, cfVar, cfFunction, cfTraditionalFor, + cfWhileLoops, cfLooseEquality, cfNonStrictMode); + TGocciaCompatibilityFlags = set of TGocciaCompatibility; + + TGocciaSourceType = (stScript, stModule); + + TGocciaSourcePipelineOptions = record + Preprocessors: TGocciaPreprocessors; + Compatibility: TGocciaCompatibilityFlags; + SourceType: TGocciaSourceType; + end; + + TGocciaFunctionBodyParseResult = record + IsValid: Boolean; + HasUseStrictDirective: Boolean; + end; + + TGocciaSourcePipelineWarning = record + Message: string; + Suggestion: string; + Line: Integer; + Column: Integer; + GeneratedLine: Integer; + GeneratedColumn: Integer; + end; + + TGocciaSourcePipelineResult = class + private + FProgramNode: TGocciaProgram; + FSourceMap: TGocciaSourceMap; + FGeneratedSourceLines: TStringList; + FLexTimeNanoseconds: Int64; + FParseTimeNanoseconds: Int64; + FWarnings: array of TGocciaSourcePipelineWarning; + FWarningCount: Integer; + + procedure AddWarning(const AMessage, ASuggestion: string; + const ALine, AColumn, AGeneratedLine, AGeneratedColumn: Integer); + function GetWarning(const AIndex: Integer): TGocciaSourcePipelineWarning; + public + destructor Destroy; override; + + function TakeProgramNode: TGocciaProgram; + function TakeSourceMap: TGocciaSourceMap; + + property ProgramNode: TGocciaProgram read FProgramNode; + property SourceMap: TGocciaSourceMap read FSourceMap; + property GeneratedSourceLines: TStringList read FGeneratedSourceLines; + property LexTimeNanoseconds: Int64 read FLexTimeNanoseconds; + property ParseTimeNanoseconds: Int64 read FParseTimeNanoseconds; + property WarningCount: Integer read FWarningCount; + property Warnings[const AIndex: Integer]: TGocciaSourcePipelineWarning + read GetWarning; + end; + + TGocciaSourcePipelineModuleResult = class + private + FProgramNode: TGocciaProgram; + FWarnings: array of TGocciaSourcePipelineWarning; + FWarningCount: Integer; + + procedure AddWarning(const AWarning: TGocciaSourcePipelineWarning); + function GetWarning(const AIndex: Integer): TGocciaSourcePipelineWarning; + public + destructor Destroy; override; + + function TakeProgramNode: TGocciaProgram; + + property ProgramNode: TGocciaProgram read FProgramNode; + property WarningCount: Integer read FWarningCount; + property Warnings[const AIndex: Integer]: TGocciaSourcePipelineWarning + read GetWarning; + end; + + TGocciaSourcePipeline = class + public + class function Parse(const ASource: TStringList; const AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaSourcePipelineResult; static; + class function ParseModuleSource(const ASource: UTF8String; + const AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaSourcePipelineModuleResult; static; + class function ParseExpression(const AExpressionText, + AFileName: string; const AOptions: TGocciaSourcePipelineOptions; + const ADeclaredPrivateNames: TStrings = nil): TGocciaExpression; static; + class function ParseFunctionParameters(const AParametersSource, + AFileName: string; const AOptions: TGocciaSourcePipelineOptions): Boolean; static; + class function ParseFunctionBodyWrapper(const ABodySource, + AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaFunctionBodyParseResult; static; + class function ParseDynamicFunctionWrapper(const AParametersSource, + ABodySource, AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaProgram; static; + end; + +implementation + +uses + SysUtils, + + TextSemantics, + TimingUtils, + + Goccia.AST.Statements, + Goccia.Error, + Goccia.FileExtensions, + Goccia.JSX.Transformer, + Goccia.Lexer, + Goccia.Parser, + Goccia.Token; + +function SourceTextToLines(const ASource: UTF8String): TStringList; +begin + Result := CreateUTF8FileTextLines(NormalizeUTF8NewlinesToLF(ASource)); +end; + +function CloneStringList(const ASource: TStrings): TStringList; +begin + Result := TStringList.Create; + if Assigned(ASource) then + Result.Assign(ASource); +end; + +function ParserOptionsForSourcePipeline( + const AOptions: TGocciaSourcePipelineOptions): TGocciaParserOptions; +begin + Result.AutomaticSemicolonInsertion := cfASI in AOptions.Compatibility; + Result.VarDeclarationsEnabled := cfVar in AOptions.Compatibility; + Result.FunctionDeclarationsEnabled := cfFunction in AOptions.Compatibility; + Result.TraditionalForLoopsEnabled := cfTraditionalFor in AOptions.Compatibility; + Result.WhileLoopsEnabled := cfWhileLoops in AOptions.Compatibility; + Result.LooseEqualityEnabled := cfLooseEquality in AOptions.Compatibility; + Result.NonStrictModeEnabled := (cfNonStrictMode in AOptions.Compatibility) or + (AOptions.SourceType = stModule); +end; + +procedure ConfigureParser(const AParser: TGocciaParser; + const AOptions: TGocciaSourcePipelineOptions); +begin + AParser.ApplyOptions(ParserOptionsForSourcePipeline(AOptions)); +end; + +function HasSingleArrowFunctionProgram(const AProgramNode: TGocciaProgram; + out AArrowFunction: TGocciaArrowFunctionExpression): Boolean; +var + ExpressionStatement: TGocciaExpressionStatement; +begin + AArrowFunction := nil; + Result := Assigned(AProgramNode) and (AProgramNode.Body.Count = 1) and + (AProgramNode.Body[0] is TGocciaExpressionStatement); + if not Result then + Exit; + + ExpressionStatement := TGocciaExpressionStatement(AProgramNode.Body[0]); + Result := ExpressionStatement.Expression is TGocciaArrowFunctionExpression; + if Result then + AArrowFunction := TGocciaArrowFunctionExpression( + ExpressionStatement.Expression); +end; + +{ TGocciaSourcePipelineResult } + +destructor TGocciaSourcePipelineResult.Destroy; +begin + FProgramNode.Free; + FSourceMap.Free; + FGeneratedSourceLines.Free; + inherited; +end; + +procedure TGocciaSourcePipelineResult.AddWarning(const AMessage, + ASuggestion: string; const ALine, AColumn, AGeneratedLine, + AGeneratedColumn: Integer); +begin + Inc(FWarningCount); + SetLength(FWarnings, FWarningCount); + FWarnings[FWarningCount - 1].Message := AMessage; + FWarnings[FWarningCount - 1].Suggestion := ASuggestion; + FWarnings[FWarningCount - 1].Line := ALine; + FWarnings[FWarningCount - 1].Column := AColumn; + FWarnings[FWarningCount - 1].GeneratedLine := AGeneratedLine; + FWarnings[FWarningCount - 1].GeneratedColumn := AGeneratedColumn; +end; + +function TGocciaSourcePipelineResult.GetWarning( + const AIndex: Integer): TGocciaSourcePipelineWarning; +begin + if (AIndex < 0) or (AIndex >= FWarningCount) then + raise ERangeError.CreateFmt('Source pipeline warning index out of range: %d', + [AIndex]); + Result := FWarnings[AIndex]; +end; + +function TGocciaSourcePipelineResult.TakeProgramNode: TGocciaProgram; +begin + Result := FProgramNode; + FProgramNode := nil; +end; + +function TGocciaSourcePipelineResult.TakeSourceMap: TGocciaSourceMap; +begin + Result := FSourceMap; + FSourceMap := nil; +end; + +{ TGocciaSourcePipelineModuleResult } + +destructor TGocciaSourcePipelineModuleResult.Destroy; +begin + FProgramNode.Free; + inherited; +end; + +procedure TGocciaSourcePipelineModuleResult.AddWarning( + const AWarning: TGocciaSourcePipelineWarning); +begin + Inc(FWarningCount); + SetLength(FWarnings, FWarningCount); + FWarnings[FWarningCount - 1] := AWarning; +end; + +function TGocciaSourcePipelineModuleResult.GetWarning( + const AIndex: Integer): TGocciaSourcePipelineWarning; +begin + if (AIndex < 0) or (AIndex >= FWarningCount) then + raise ERangeError.CreateFmt('Source pipeline module warning index out of range: %d', + [AIndex]); + Result := FWarnings[AIndex]; +end; + +function TGocciaSourcePipelineModuleResult.TakeProgramNode: TGocciaProgram; +begin + Result := FProgramNode; + FProgramNode := nil; +end; + +{ TGocciaSourcePipeline } + +class function TGocciaSourcePipeline.Parse(const ASource: TStringList; + const AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaSourcePipelineResult; +var + SourceText, OriginalSourceText: string; + JSXResult: TGocciaJSXTransformResult; + Lexer: TGocciaLexer; + Tokens: TObjectList; + Parser: TGocciaParser; + ParserWarning: TGocciaParserWarning; + StartTime, LexEnd, ParseEnd: Int64; + OrigLine, OrigCol, I: Integer; +begin + Result := TGocciaSourcePipelineResult.Create; + try + StartTime := GetNanoseconds; + if Assigned(ASource) then + SourceText := StringListToLFText(ASource) + else + SourceText := ''; + OriginalSourceText := SourceText; + + if ppJSX in AOptions.Preprocessors then + begin + JSXResult := TGocciaJSXTransformer.Transform(SourceText); + SourceText := JSXResult.Source; + Result.FSourceMap := JSXResult.SourceMap; + if Assigned(Result.FSourceMap) then + begin + Result.FSourceMap.SetSourceContent(0, OriginalSourceText); + if not IsJSXNativeExtension(ExtractFileExt(AFileName)) then + Result.AddWarning( + 'JSX syntax found in source with a non-JSX extension', + 'Use a .jsx or .tsx extension for JSX source', + 1, 1, 1, 1); + end; + end; + + try + Lexer := TGocciaLexer.Create(SourceText, AFileName); + try + Tokens := Lexer.ScanTokens; + LexEnd := GetNanoseconds; + Result.FLexTimeNanoseconds := LexEnd - StartTime; + Result.FGeneratedSourceLines := CloneStringList(Lexer.SourceLines); + + Parser := TGocciaParser.Create(Tokens, AFileName, Lexer.SourceLines); + ConfigureParser(Parser, AOptions); + try + Result.FProgramNode := Parser.Parse; + ParseEnd := GetNanoseconds; + Result.FParseTimeNanoseconds := ParseEnd - LexEnd; + + for I := 0 to Parser.WarningCount - 1 do + begin + ParserWarning := Parser.GetWarning(I); + OrigLine := ParserWarning.Line; + OrigCol := ParserWarning.Column; + if Assigned(Result.FSourceMap) then + Result.FSourceMap.Translate(ParserWarning.Line, + ParserWarning.Column, OrigLine, OrigCol); + Result.AddWarning(ParserWarning.Message, ParserWarning.Suggestion, + OrigLine, OrigCol, ParserWarning.Line, ParserWarning.Column); + end; + finally + Parser.Free; + end; + finally + Lexer.Free; + end; + except + on E: TGocciaError do + begin + if Assigned(Result.FSourceMap) and + Result.FSourceMap.Translate(E.Line, E.Column, OrigLine, OrigCol) then + E.TranslatePosition(OrigLine, OrigCol, ASource); + raise; + end; + end; + except + Result.Free; + raise; + end; +end; + +class function TGocciaSourcePipeline.ParseModuleSource(const ASource: UTF8String; + const AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaSourcePipelineModuleResult; +var + ModuleOptions: TGocciaSourcePipelineOptions; + PipelineResult: TGocciaSourcePipelineResult; + SourceLines: TStringList; + I: Integer; +begin + ModuleOptions := AOptions; + ModuleOptions.SourceType := stModule; + SourceLines := SourceTextToLines(ASource); + try + PipelineResult := Parse(SourceLines, AFileName, ModuleOptions); + try + Result := TGocciaSourcePipelineModuleResult.Create; + try + Result.FProgramNode := PipelineResult.TakeProgramNode; + for I := 0 to PipelineResult.WarningCount - 1 do + Result.AddWarning(PipelineResult.Warnings[I]); + except + Result.Free; + raise; + end; + finally + PipelineResult.Free; + end; + finally + SourceLines.Free; + end; +end; + +class function TGocciaSourcePipeline.ParseExpression(const AExpressionText, + AFileName: string; const AOptions: TGocciaSourcePipelineOptions; + const ADeclaredPrivateNames: TStrings): TGocciaExpression; +var + Lexer: TGocciaLexer; + Parser: TGocciaParser; + SourceLines: TStringList; + Tokens: TObjectList; +begin + Result := nil; + if AExpressionText = '' then + Exit; + + SourceLines := CreateECMAScriptSourceLines(AExpressionText); + try + Lexer := TGocciaLexer.Create(AExpressionText, AFileName); + try + Tokens := Lexer.ScanTokens; + if not Assigned(Tokens) then + Exit; + Parser := TGocciaParser.Create(Tokens, AFileName, SourceLines); + ConfigureParser(Parser, AOptions); + try + if Assigned(ADeclaredPrivateNames) then + Result := Parser.ParseExpressionWithPrivateNames(ADeclaredPrivateNames) + else + Result := Parser.Expression; + finally + Parser.Free; + end; + finally + Lexer.Free; + end; + finally + SourceLines.Free; + end; +end; + +class function TGocciaSourcePipeline.ParseFunctionParameters( + const AParametersSource, AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): Boolean; +var + ArrowFunction: TGocciaArrowFunctionExpression; + PipelineResult: TGocciaSourcePipelineResult; + Source: TStringList; +begin + Source := TStringList.Create; + try + Source.Text := '(' + AParametersSource + ') => {}'; + PipelineResult := Parse(Source, AFileName, AOptions); + try + Result := HasSingleArrowFunctionProgram(PipelineResult.ProgramNode, + ArrowFunction); + finally + PipelineResult.Free; + end; + finally + Source.Free; + end; +end; + +class function TGocciaSourcePipeline.ParseFunctionBodyWrapper( + const ABodySource, AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaFunctionBodyParseResult; +var + ArrowFunction: TGocciaArrowFunctionExpression; + PipelineResult: TGocciaSourcePipelineResult; + Source: TStringList; +begin + Result.IsValid := False; + Result.HasUseStrictDirective := False; + Source := TStringList.Create; + try + Source.Text := '() => {' + #10 + ABodySource + #10 + '}'; + PipelineResult := Parse(Source, AFileName, AOptions); + try + Result.IsValid := HasSingleArrowFunctionProgram(PipelineResult.ProgramNode, + ArrowFunction); + if Result.IsValid then + Result.HasUseStrictDirective := HasUseStrictDirective( + ArrowFunction.Body); + finally + PipelineResult.Free; + end; + finally + Source.Free; + end; +end; + +class function TGocciaSourcePipeline.ParseDynamicFunctionWrapper( + const AParametersSource, ABodySource, AFileName: string; + const AOptions: TGocciaSourcePipelineOptions): TGocciaProgram; +var + Lexer: TGocciaLexer; + Parser: TGocciaParser; + Source: string; +begin + Source := '({ anonymous(' + AParametersSource + ') {' + #10 + ABodySource + + #10 + '} }).anonymous'; + + Lexer := TGocciaLexer.Create(Source, AFileName); + try + Parser := TGocciaParser.Create(Lexer.ScanTokens, AFileName, + Lexer.SourceLines); + ConfigureParser(Parser, AOptions); + try + Result := Parser.ParseUnchecked; + finally + Parser.Free; + end; + finally + Lexer.Free; + end; +end; + +end. diff --git a/tests/language/asi/goccia.json b/tests/language/asi/goccia.json index 3757b734..314cbf3d 100644 --- a/tests/language/asi/goccia.json +++ b/tests/language/asi/goccia.json @@ -1,3 +1,3 @@ { - "asi": true + "compat-asi": true } diff --git a/tests/language/modules/mjs-entry-source-type.mjs b/tests/language/modules/mjs-entry-source-type.mjs new file mode 100644 index 00000000..2cc40559 --- /dev/null +++ b/tests/language/modules/mjs-entry-source-type.mjs @@ -0,0 +1,13 @@ +const topLevelThis = this; +const metaUrl = import.meta.url; + +describe(".mjs entry source type", () => { + test(".mjs entries default to module source", () => { + expect(topLevelThis).toBeUndefined(); + }); + + test("import.meta resolves for .mjs entries without source-type config", () => { + expect(typeof metaUrl).toBe("string"); + expect(metaUrl.endsWith("/mjs-entry-source-type.mjs")).toBe(true); + }); +}); diff --git a/tests/language/with/asi/goccia.json b/tests/language/with/asi/goccia.json index ce83bbff..8b07681c 100644 --- a/tests/language/with/asi/goccia.json +++ b/tests/language/with/asi/goccia.json @@ -1,4 +1,4 @@ { "extends": "../goccia.json", - "asi": true + "compat-asi": true } From 0f79ea22c9dd4de9e9fd372785fd911140ea96e8 Mon Sep 17 00:00:00 2001 From: Johannes Stein Date: Sun, 24 May 2026 18:35:52 +0100 Subject: [PATCH 02/12] Add architecture agent skills --- .agents/skills/grill-with-docs/ADR-FORMAT.md | 47 +++++++ .../skills/grill-with-docs/CONTEXT-FORMAT.md | 63 +++++++++ .agents/skills/grill-with-docs/SKILL.md | 88 +++++++++++++ .agents/skills/handoff/SKILL.md | 15 +++ .../DEEPENING.md | 37 ++++++ .../HTML-REPORT.md | 123 ++++++++++++++++++ .../INTERFACE-DESIGN.md | 44 +++++++ .../improve-codebase-architecture/LANGUAGE.md | 53 ++++++++ .../improve-codebase-architecture/SKILL.md | 81 ++++++++++++ skills-lock.json | 18 +++ 10 files changed, 569 insertions(+) create mode 100644 .agents/skills/grill-with-docs/ADR-FORMAT.md create mode 100644 .agents/skills/grill-with-docs/CONTEXT-FORMAT.md create mode 100644 .agents/skills/grill-with-docs/SKILL.md create mode 100644 .agents/skills/handoff/SKILL.md create mode 100644 .agents/skills/improve-codebase-architecture/DEEPENING.md create mode 100644 .agents/skills/improve-codebase-architecture/HTML-REPORT.md create mode 100644 .agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md create mode 100644 .agents/skills/improve-codebase-architecture/LANGUAGE.md create mode 100644 .agents/skills/improve-codebase-architecture/SKILL.md diff --git a/.agents/skills/grill-with-docs/ADR-FORMAT.md b/.agents/skills/grill-with-docs/ADR-FORMAT.md new file mode 100644 index 00000000..da7e78ec --- /dev/null +++ b/.agents/skills/grill-with-docs/ADR-FORMAT.md @@ -0,0 +1,47 @@ +# ADR Format + +ADRs live in `docs/adr/` and use sequential numbering: `0001-slug.md`, `0002-slug.md`, etc. + +Create the `docs/adr/` directory lazily — only when the first ADR is needed. + +## Template + +```md +# {Short title of the decision} + +{1-3 sentences: what's the context, what did we decide, and why.} +``` + +That's it. An ADR can be a single paragraph. The value is in recording *that* a decision was made and *why* — not in filling out sections. + +## Optional sections + +Only include these when they add genuine value. Most ADRs won't need them. + +- **Status** frontmatter (`proposed | accepted | deprecated | superseded by ADR-NNNN`) — useful when decisions are revisited +- **Considered Options** — only when the rejected alternatives are worth remembering +- **Consequences** — only when non-obvious downstream effects need to be called out + +## Numbering + +Scan `docs/adr/` for the highest existing number and increment by one. + +## When to offer an ADR + +All three of these must be true: + +1. **Hard to reverse** — the cost of changing your mind later is meaningful +2. **Surprising without context** — a future reader will look at the code and wonder "why on earth did they do it this way?" +3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons + +If a decision is easy to reverse, skip it — you'll just reverse it. If it's not surprising, nobody will wonder why. If there was no real alternative, there's nothing to record beyond "we did the obvious thing." + +### What qualifies + +- **Architectural shape.** "We're using a monorepo." "The write model is event-sourced, the read model is projected into Postgres." +- **Integration patterns between contexts.** "Ordering and Billing communicate via domain events, not synchronous HTTP." +- **Technology choices that carry lock-in.** Database, message bus, auth provider, deployment target. Not every library — just the ones that would take a quarter to swap out. +- **Boundary and scope decisions.** "Customer data is owned by the Customer context; other contexts reference it by ID only." The explicit no-s are as valuable as the yes-s. +- **Deliberate deviations from the obvious path.** "We're using manual SQL instead of an ORM because X." Anything where a reasonable reader would assume the opposite. These stop the next engineer from "fixing" something that was deliberate. +- **Constraints not visible in the code.** "We can't use AWS because of compliance requirements." "Response times must be under 200ms because of the partner API contract." +- **Rejected alternatives when the rejection is non-obvious.** If you considered GraphQL and picked REST for subtle reasons, record it — otherwise someone will suggest GraphQL again in six months. diff --git a/.agents/skills/grill-with-docs/CONTEXT-FORMAT.md b/.agents/skills/grill-with-docs/CONTEXT-FORMAT.md new file mode 100644 index 00000000..08302557 --- /dev/null +++ b/.agents/skills/grill-with-docs/CONTEXT-FORMAT.md @@ -0,0 +1,63 @@ +# CONTEXT.md Format + +## Structure + +```md +# {Context Name} + +{One or two sentence description of what this context is and why it exists.} + +## Language + +**Order**: +{A one or two sentence description of the term} +_Avoid_: Purchase, transaction + +**Invoice**: +A request for payment sent to a customer after delivery. +_Avoid_: Bill, payment request + +**Customer**: +A person or organization that places orders. +_Avoid_: Client, buyer, account +``` + +## Rules + +- **Be opinionated.** When multiple words exist for the same concept, pick the best one and list the others as aliases to avoid. +- **Flag conflicts explicitly.** If a term is used ambiguously, call it out in "Flagged ambiguities" with a clear resolution. +- **Keep definitions tight.** One or two sentences max. Define what it IS, not what it does. +- **Show relationships.** Use bold term names and express cardinality where obvious. +- **Only include terms specific to this project's context.** General programming concepts (timeouts, error types, utility patterns) don't belong even if the project uses them extensively. Before adding a term, ask: is this a concept unique to this context, or a general programming concept? Only the former belongs. +- **Group terms under subheadings** when natural clusters emerge. If all terms belong to a single cohesive area, a flat list is fine. +- **Write an example dialogue.** A conversation between a dev and a domain expert that demonstrates how the terms interact naturally and clarifies boundaries between related concepts. + +## Single vs multi-context repos + +**Single context (most repos):** One `CONTEXT.md` at the repo root. + +**Multiple contexts:** A `CONTEXT-MAP.md` at the repo root lists the contexts, where they live, and how they relate to each other: + +```md +# Context Map + +## Contexts + +- [Ordering](./src/ordering/CONTEXT.md) — receives and tracks customer orders +- [Billing](./src/billing/CONTEXT.md) — generates invoices and processes payments +- [Fulfillment](./src/fulfillment/CONTEXT.md) — manages warehouse picking and shipping + +## Relationships + +- **Ordering → Fulfillment**: Ordering emits `OrderPlaced` events; Fulfillment consumes them to start picking +- **Fulfillment → Billing**: Fulfillment emits `ShipmentDispatched` events; Billing consumes them to generate invoices +- **Ordering ↔ Billing**: Shared types for `CustomerId` and `Money` +``` + +The skill infers which structure applies: + +- If `CONTEXT-MAP.md` exists, read it to find contexts +- If only a root `CONTEXT.md` exists, single context +- If neither exists, create a root `CONTEXT.md` lazily when the first term is resolved + +When multiple contexts exist, infer which one the current topic relates to. If unclear, ask. diff --git a/.agents/skills/grill-with-docs/SKILL.md b/.agents/skills/grill-with-docs/SKILL.md new file mode 100644 index 00000000..5ea0aa91 --- /dev/null +++ b/.agents/skills/grill-with-docs/SKILL.md @@ -0,0 +1,88 @@ +--- +name: grill-with-docs +description: Grilling session that challenges your plan against the existing domain model, sharpens terminology, and updates documentation (CONTEXT.md, ADRs) inline as decisions crystallise. Use when user wants to stress-test a plan against their project's language and documented decisions. +--- + + + +Interview me relentlessly about every aspect of this plan until we reach a shared understanding. Walk down each branch of the design tree, resolving dependencies between decisions one-by-one. For each question, provide your recommended answer. + +Ask the questions one at a time, waiting for feedback on each question before continuing. + +If a question can be answered by exploring the codebase, explore the codebase instead. + + + + + +## Domain awareness + +During codebase exploration, also look for existing documentation: + +### File structure + +Most repos have a single context: + +``` +/ +├── CONTEXT.md +├── docs/ +│ └── adr/ +│ ├── 0001-event-sourced-orders.md +│ └── 0002-postgres-for-write-model.md +└── src/ +``` + +If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives: + +``` +/ +├── CONTEXT-MAP.md +├── docs/ +│ └── adr/ ← system-wide decisions +├── src/ +│ ├── ordering/ +│ │ ├── CONTEXT.md +│ │ └── docs/adr/ ← context-specific decisions +│ └── billing/ +│ ├── CONTEXT.md +│ └── docs/adr/ +``` + +Create files lazily — only when you have something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed. + +## During the session + +### Challenge against the glossary + +When the user uses a term that conflicts with the existing language in `CONTEXT.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?" + +### Sharpen fuzzy language + +When the user uses vague or overloaded terms, propose a precise canonical term. "You're saying 'account' — do you mean the Customer or the User? Those are different things." + +### Discuss concrete scenarios + +When domain relationships are being discussed, stress-test them with specific scenarios. Invent scenarios that probe edge cases and force the user to be precise about the boundaries between concepts. + +### Cross-reference with code + +When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?" + +### Update CONTEXT.md inline + +When a term is resolved, update `CONTEXT.md` right there. Don't batch these up — capture them as they happen. Use the format in [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md). + +`CONTEXT.md` should be totally devoid of implementation details. Do not treat `CONTEXT.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else. + +### Offer ADRs sparingly + +Only offer to create an ADR when all three are true: + +1. **Hard to reverse** — the cost of changing your mind later is meaningful +2. **Surprising without context** — a future reader will wonder "why did they do it this way?" +3. **The result of a real trade-off** — there were genuine alternatives and you picked one for specific reasons + +If any of the three is missing, skip the ADR. Use the format in [ADR-FORMAT.md](./ADR-FORMAT.md). + + diff --git a/.agents/skills/handoff/SKILL.md b/.agents/skills/handoff/SKILL.md new file mode 100644 index 00000000..0aa5b993 --- /dev/null +++ b/.agents/skills/handoff/SKILL.md @@ -0,0 +1,15 @@ +--- +name: handoff +description: Compact the current conversation into a handoff document for another agent to pick up. +argument-hint: "What will the next session be used for?" +--- + +Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS - not the current workspace. + +Include a "suggested skills" section in the document, which suggests skills that the agent should invoke. + +Do not duplicate content already captured in other artifacts (PRDs, plans, ADRs, issues, commits, diffs). Reference them by path or URL instead. + +Redact any sensitive information, such as API keys, passwords, or personally identifiable information. + +If the user passed arguments, treat them as a description of what the next session will focus on and tailor the doc accordingly. diff --git a/.agents/skills/improve-codebase-architecture/DEEPENING.md b/.agents/skills/improve-codebase-architecture/DEEPENING.md new file mode 100644 index 00000000..ecaf5d7d --- /dev/null +++ b/.agents/skills/improve-codebase-architecture/DEEPENING.md @@ -0,0 +1,37 @@ +# Deepening + +How to deepen a cluster of shallow modules safely, given its dependencies. Assumes the vocabulary in [LANGUAGE.md](LANGUAGE.md) — **module**, **interface**, **seam**, **adapter**. + +## Dependency categories + +When assessing a candidate for deepening, classify its dependencies. The category determines how the deepened module is tested across its seam. + +### 1. In-process + +Pure computation, in-memory state, no I/O. Always deepenable — merge the modules and test through the new interface directly. No adapter needed. + +### 2. Local-substitutable + +Dependencies that have local test stand-ins (PGLite for Postgres, in-memory filesystem). Deepenable if the stand-in exists. The deepened module is tested with the stand-in running in the test suite. The seam is internal; no port at the module's external interface. + +### 3. Remote but owned (Ports & Adapters) + +Your own services across a network boundary (microservices, internal APIs). Define a **port** (interface) at the seam. The deep module owns the logic; the transport is injected as an **adapter**. Tests use an in-memory adapter. Production uses an HTTP/gRPC/queue adapter. + +Recommendation shape: *"Define a port at the seam, implement an HTTP adapter for production and an in-memory adapter for testing, so the logic sits in one deep module even though it's deployed across a network."* + +### 4. True external (Mock) + +Third-party services (Stripe, Twilio, etc.) you don't control. The deepened module takes the external dependency as an injected port; tests provide a mock adapter. + +## Seam discipline + +- **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a port unless at least two adapters are justified (typically production + test). A single-adapter seam is just indirection. +- **Internal seams vs external seams.** A deep module can have internal seams (private to its implementation, used by its own tests) as well as the external seam at its interface. Don't expose internal seams through the interface just because tests use them. + +## Testing strategy: replace, don't layer + +- Old unit tests on shallow modules become waste once tests at the deepened module's interface exist — delete them. +- Write new tests at the deepened module's interface. The **interface is the test surface**. +- Tests assert on observable outcomes through the interface, not internal state. +- Tests should survive internal refactors — they describe behaviour, not implementation. If a test has to change when the implementation changes, it's testing past the interface. diff --git a/.agents/skills/improve-codebase-architecture/HTML-REPORT.md b/.agents/skills/improve-codebase-architecture/HTML-REPORT.md new file mode 100644 index 00000000..8adc368f --- /dev/null +++ b/.agents/skills/improve-codebase-architecture/HTML-REPORT.md @@ -0,0 +1,123 @@ +# HTML Report Format + +The architectural review is rendered as a single self-contained HTML file in the OS temp directory. Tailwind and Mermaid both come from CDNs. Mermaid handles graph-shaped diagrams reliably; hand-built divs and inline SVG handle the more editorial visuals (mass diagrams, cross-sections). Mix the two — don't lean on Mermaid for everything, it'll start to look generic. + +## Scaffold + +```html + + + + + Architecture review — {{repo name}} + + + + + +
+
...
+
...
+
...
+
+ + +``` + +## Header + +Repo name, date, and a compact legend: solid box = module, dashed line = seam, red arrow = leakage, thick dark box = deep module. No introduction paragraph — straight into the candidates. + +## Candidate card + +The diagrams carry the weight. Prose is sparse, plain, and uses the glossary terms ([LANGUAGE.md](LANGUAGE.md)) without ceremony. + +Each candidate is one `
`: + +- **Title** — short, names the deepening (e.g. "Collapse the Order intake pipeline"). +- **Badge row** — recommendation strength (`Strong` = emerald, `Worth exploring` = amber, `Speculative` = slate), plus a tag for the dependency category (`in-process`, `local-substitutable`, `ports & adapters`, `mock`). +- **Files** — monospaced list, `font-mono text-sm`. +- **Before / After diagram** — the centrepiece. Two columns, side by side. See patterns below. +- **Problem** — one sentence. What hurts. +- **Solution** — one sentence. What changes. +- **Wins** — bullets, ≤6 words each. e.g. "Tests hit one interface", "Pricing logic stops leaking", "Delete 4 shallow wrappers". +- **ADR callout** (if applicable) — one line in an amber-tinted box. + +No paragraphs of explanation. If the diagram needs a paragraph to be understood, redraw the diagram. + +## Diagram patterns + +Pick the pattern that fits the candidate. Mix them. Don't make every diagram look the same — variety is part of the point. + +### Mermaid graph (the workhorse for dependencies / call flow) + +Use a Mermaid `flowchart` or `graph` when the point is "X calls Y calls Z, and look at the mess." Wrap it in a Tailwind-styled card so it doesn't feel parachuted in. Style with classDef to colour leakage edges red and the deep module dark. Sequence diagrams work well for "before: 6 round-trips; after: 1." + +```html +
+
+    flowchart LR
+      A[OrderHandler] --> B[OrderValidator]
+      B --> C[OrderRepo]
+      C -.leak.-> D[PricingClient]
+      classDef leak stroke:#dc2626,stroke-width:2px;
+      class C,D leak
+  
+
+``` + +### Hand-built boxes-and-arrows (when Mermaid's layout fights you) + +Modules as `
`s with borders and labels. Arrows as inline SVG `` or `` elements positioned absolutely over a relative container. Reach for this when you want the "after" diagram to feel like one thick-bordered deep module with greyed-out internals — Mermaid won't render that with the right weight. + +### Cross-section (good for layered shallowness) + +Stack horizontal bands (`h-12 border-l-4`) to show layers a call passes through. Before: 6 thin layers each doing nothing. After: 1 thick band labelled with the consolidated responsibility. + +### Mass diagram (good for "interface as wide as implementation") + +Two rectangles per module — one for interface surface area, one for implementation. Before: interface rectangle is nearly as tall as the implementation rectangle (shallow). After: interface rectangle is short, implementation rectangle is tall (deep). + +### Call-graph collapse + +Before: a tree of function calls rendered as nested boxes. After: the same tree collapsed into one box, with the now-internal calls shown faded inside it. + +## Style guidance + +- Lean editorial, not corporate-dashboard. Generous whitespace. Serif optional for headings (`font-serif` works well with stone/slate). +- Colour sparingly: one accent (emerald or indigo) plus red for leakage and amber for warnings. +- Keep diagrams ~320px tall so before/after sits comfortably side by side without scrolling. +- Use `text-xs uppercase tracking-wider` for module labels inside diagrams — they should read as schematic, not as UI. +- The only scripts are the Tailwind CDN and the Mermaid ESM import. The report is otherwise static — no app code, no interactivity beyond Mermaid's own rendering. + +## Top recommendation section + +One larger card. Candidate name, one sentence on why, anchor link to its card. That's it. + +## Tone + +Plain English, concise — but the architectural nouns and verbs come straight from [LANGUAGE.md](LANGUAGE.md). Concision is not an excuse to drift. + +**Use exactly:** module, interface, implementation, depth, deep, shallow, seam, adapter, leverage, locality. + +**Never substitute:** component, service, unit (for module) · API, signature (for interface) · boundary (for seam) · layer, wrapper (for module, when you mean module). + +**Phrasings that fit the style:** + +- "Order intake module is shallow — interface nearly matches the implementation." +- "Pricing leaks across the seam." +- "Deepen: one interface, one place to test." +- "Two adapters justify the seam: HTTP in prod, in-memory in tests." + +**Wins bullets** name the gain in glossary terms: *"locality: bugs concentrate in one module"*, *"leverage: one interface, N call sites"*, *"interface shrinks; implementation absorbs the wrappers"*. Don't write *"easier to maintain"* or *"cleaner code"* — those terms aren't in the glossary and don't earn their place. + +No hedging, no throat-clearing, no "it's worth noting that…". If a sentence could be a bullet, make it a bullet. If a bullet could be cut, cut it. If a term isn't in [LANGUAGE.md](LANGUAGE.md), reach for one that is before inventing a new one. diff --git a/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md b/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md new file mode 100644 index 00000000..3197723a --- /dev/null +++ b/.agents/skills/improve-codebase-architecture/INTERFACE-DESIGN.md @@ -0,0 +1,44 @@ +# Interface Design + +When the user wants to explore alternative interfaces for a chosen deepening candidate, use this parallel sub-agent pattern. Based on "Design It Twice" (Ousterhout) — your first idea is unlikely to be the best. + +Uses the vocabulary in [LANGUAGE.md](LANGUAGE.md) — **module**, **interface**, **seam**, **adapter**, **leverage**. + +## Process + +### 1. Frame the problem space + +Before spawning sub-agents, write a user-facing explanation of the problem space for the chosen candidate: + +- The constraints any new interface would need to satisfy +- The dependencies it would rely on, and which category they fall into (see [DEEPENING.md](DEEPENING.md)) +- A rough illustrative code sketch to ground the constraints — not a proposal, just a way to make the constraints concrete + +Show this to the user, then immediately proceed to Step 2. The user reads and thinks while the sub-agents work in parallel. + +### 2. Spawn sub-agents + +Spawn 3+ sub-agents in parallel using the Agent tool. Each must produce a **radically different** interface for the deepened module. + +Prompt each sub-agent with a separate technical brief (file paths, coupling details, dependency category from [DEEPENING.md](DEEPENING.md), what sits behind the seam). The brief is independent of the user-facing problem-space explanation in Step 1. Give each agent a different design constraint: + +- Agent 1: "Minimize the interface — aim for 1–3 entry points max. Maximise leverage per entry point." +- Agent 2: "Maximise flexibility — support many use cases and extension." +- Agent 3: "Optimise for the most common caller — make the default case trivial." +- Agent 4 (if applicable): "Design around ports & adapters for cross-seam dependencies." + +Include both [LANGUAGE.md](LANGUAGE.md) vocabulary and CONTEXT.md vocabulary in the brief so each sub-agent names things consistently with the architecture language and the project's domain language. + +Each sub-agent outputs: + +1. Interface (types, methods, params — plus invariants, ordering, error modes) +2. Usage example showing how callers use it +3. What the implementation hides behind the seam +4. Dependency strategy and adapters (see [DEEPENING.md](DEEPENING.md)) +5. Trade-offs — where leverage is high, where it's thin + +### 3. Present and compare + +Present designs sequentially so the user can absorb each one, then compare them in prose. Contrast by **depth** (leverage at the interface), **locality** (where change concentrates), and **seam placement**. + +After comparing, give your own recommendation: which design you think is strongest and why. If elements from different designs would combine well, propose a hybrid. Be opinionated — the user wants a strong read, not a menu. diff --git a/.agents/skills/improve-codebase-architecture/LANGUAGE.md b/.agents/skills/improve-codebase-architecture/LANGUAGE.md new file mode 100644 index 00000000..530c2763 --- /dev/null +++ b/.agents/skills/improve-codebase-architecture/LANGUAGE.md @@ -0,0 +1,53 @@ +# Language + +Shared vocabulary for every suggestion this skill makes. Use these terms exactly — don't substitute "component," "service," "API," or "boundary." Consistent language is the whole point. + +## Terms + +**Module** +Anything with an interface and an implementation. Deliberately scale-agnostic — applies equally to a function, class, package, or tier-spanning slice. +_Avoid_: unit, component, service. + +**Interface** +Everything a caller must know to use the module correctly. Includes the type signature, but also invariants, ordering constraints, error modes, required configuration, and performance characteristics. +_Avoid_: API, signature (too narrow — those refer only to the type-level surface). + +**Implementation** +What's inside a module — its body of code. Distinct from **Adapter**: a thing can be a small adapter with a large implementation (a Postgres repo) or a large adapter with a small implementation (an in-memory fake). Reach for "adapter" when the seam is the topic; "implementation" otherwise. + +**Depth** +Leverage at the interface — the amount of behaviour a caller (or test) can exercise per unit of interface they have to learn. A module is **deep** when a large amount of behaviour sits behind a small interface. A module is **shallow** when the interface is nearly as complex as the implementation. + +**Seam** _(from Michael Feathers)_ +A place where you can alter behaviour without editing in that place. The *location* at which a module's interface lives. Choosing where to put the seam is its own design decision, distinct from what goes behind it. +_Avoid_: boundary (overloaded with DDD's bounded context). + +**Adapter** +A concrete thing that satisfies an interface at a seam. Describes *role* (what slot it fills), not substance (what's inside). + +**Leverage** +What callers get from depth. More capability per unit of interface they have to learn. One implementation pays back across N call sites and M tests. + +**Locality** +What maintainers get from depth. Change, bugs, knowledge, and verification concentrate at one place rather than spreading across callers. Fix once, fixed everywhere. + +## Principles + +- **Depth is a property of the interface, not the implementation.** A deep module can be internally composed of small, mockable, swappable parts — they just aren't part of the interface. A module can have **internal seams** (private to its implementation, used by its own tests) as well as the **external seam** at its interface. +- **The deletion test.** Imagine deleting the module. If complexity vanishes, the module wasn't hiding anything (it was a pass-through). If complexity reappears across N callers, the module was earning its keep. +- **The interface is the test surface.** Callers and tests cross the same seam. If you want to test *past* the interface, the module is probably the wrong shape. +- **One adapter means a hypothetical seam. Two adapters means a real one.** Don't introduce a seam unless something actually varies across it. + +## Relationships + +- A **Module** has exactly one **Interface** (the surface it presents to callers and tests). +- **Depth** is a property of a **Module**, measured against its **Interface**. +- A **Seam** is where a **Module**'s **Interface** lives. +- An **Adapter** sits at a **Seam** and satisfies the **Interface**. +- **Depth** produces **Leverage** for callers and **Locality** for maintainers. + +## Rejected framings + +- **Depth as ratio of implementation-lines to interface-lines** (Ousterhout): rewards padding the implementation. We use depth-as-leverage instead. +- **"Interface" as the TypeScript `interface` keyword or a class's public methods**: too narrow — interface here includes every fact a caller must know. +- **"Boundary"**: overloaded with DDD's bounded context. Say **seam** or **interface**. diff --git a/.agents/skills/improve-codebase-architecture/SKILL.md b/.agents/skills/improve-codebase-architecture/SKILL.md new file mode 100644 index 00000000..c12b263b --- /dev/null +++ b/.agents/skills/improve-codebase-architecture/SKILL.md @@ -0,0 +1,81 @@ +--- +name: improve-codebase-architecture +description: Find deepening opportunities in a codebase, informed by the domain language in CONTEXT.md and the decisions in docs/adr/. Use when the user wants to improve architecture, find refactoring opportunities, consolidate tightly-coupled modules, or make a codebase more testable and AI-navigable. +--- + +# Improve Codebase Architecture + +Surface architectural friction and propose **deepening opportunities** — refactors that turn shallow modules into deep ones. The aim is testability and AI-navigability. + +## Glossary + +Use these terms exactly in every suggestion. Consistent language is the point — don't drift into "component," "service," "API," or "boundary." Full definitions in [LANGUAGE.md](LANGUAGE.md). + +- **Module** — anything with an interface and an implementation (function, class, package, slice). +- **Interface** — everything a caller must know to use the module: types, invariants, error modes, ordering, config. Not just the type signature. +- **Implementation** — the code inside. +- **Depth** — leverage at the interface: a lot of behaviour behind a small interface. **Deep** = high leverage. **Shallow** = interface nearly as complex as the implementation. +- **Seam** — where an interface lives; a place behaviour can be altered without editing in place. (Use this, not "boundary.") +- **Adapter** — a concrete thing satisfying an interface at a seam. +- **Leverage** — what callers get from depth. +- **Locality** — what maintainers get from depth: change, bugs, knowledge concentrated in one place. + +Key principles (see [LANGUAGE.md](LANGUAGE.md) for the full list): + +- **Deletion test**: imagine deleting the module. If complexity vanishes, it was a pass-through. If complexity reappears across N callers, it was earning its keep. +- **The interface is the test surface.** +- **One adapter = hypothetical seam. Two adapters = real seam.** + +This skill is _informed_ by the project's domain model. The domain language gives names to good seams; ADRs record decisions the skill should not re-litigate. + +## Process + +### 1. Explore + +Read the project's domain glossary and any ADRs in the area you're touching first. + +Then use the Agent tool with `subagent_type=Explore` to walk the codebase. Don't follow rigid heuristics — explore organically and note where you experience friction: + +- Where does understanding one concept require bouncing between many small modules? +- Where are modules **shallow** — interface nearly as complex as the implementation? +- Where have pure functions been extracted just for testability, but the real bugs hide in how they're called (no **locality**)? +- Where do tightly-coupled modules leak across their seams? +- Which parts of the codebase are untested, or hard to test through their current interface? + +Apply the **deletion test** to anything you suspect is shallow: would deleting it concentrate complexity, or just move it? A "yes, concentrates" is the signal you want. + +### 2. Present candidates as an HTML report + +Write a self-contained HTML file to the OS temp directory so nothing lands in the repo. Resolve the temp dir from `$TMPDIR`, falling back to `/tmp` (or `%TEMP%` on Windows), and write to `/architecture-review-.html` so each run gets a fresh file. Open it for the user — `xdg-open ` on Linux, `open ` on macOS, `start ` on Windows — and tell them the absolute path. + +The report uses **Tailwind via CDN** for layout and styling, and **Mermaid via CDN** for diagrams where a graph/flow/sequence reliably communicates the structure. Mix Mermaid with hand-crafted CSS/SVG visuals — use Mermaid when relationships are graph-shaped (call graphs, dependencies, sequences), and hand-built divs/SVG when you want something more editorial (mass diagrams, cross-sections, collapse animations). Each candidate gets a **before/after visualisation**. Be visual. + +For each candidate, the same template as before, but rendered as a card: + +- **Files** — which files/modules are involved +- **Problem** — why the current architecture is causing friction +- **Solution** — plain English description of what would change +- **Benefits** — explained in terms of locality and leverage, and how tests would improve +- **Before / After diagram** — side-by-side, custom-drawn, illustrating the shallowness and the deepening +- **Recommendation strength** — one of `Strong`, `Worth exploring`, `Speculative`, rendered as a badge + +End the report with a **Top recommendation** section: which candidate you'd tackle first and why. + +**Use CONTEXT.md vocabulary for the domain, and [LANGUAGE.md](LANGUAGE.md) vocabulary for the architecture.** If `CONTEXT.md` defines "Order," talk about "the Order intake module" — not "the FooBarHandler," and not "the Order service." + +**ADR conflicts**: if a candidate contradicts an existing ADR, only surface it when the friction is real enough to warrant revisiting the ADR. Mark it clearly in the card (e.g. a warning callout: _"contradicts ADR-0007 — but worth reopening because…"_). Don't list every theoretical refactor an ADR forbids. + +See [HTML-REPORT.md](HTML-REPORT.md) for the full HTML scaffold, diagram patterns, and styling guidance. + +Do NOT propose interfaces yet. After the file is written, ask the user: "Which of these would you like to explore?" + +### 3. Grilling loop + +Once the user picks a candidate, drop into a grilling conversation. Walk the design tree with them — constraints, dependencies, the shape of the deepened module, what sits behind the seam, what tests survive. + +Side effects happen inline as decisions crystallize: + +- **Naming a deepened module after a concept not in `CONTEXT.md`?** Add the term to `CONTEXT.md` — same discipline as `/grill-with-docs` (see [CONTEXT-FORMAT.md](../grill-with-docs/CONTEXT-FORMAT.md)). Create the file lazily if it doesn't exist. +- **Sharpening a fuzzy term during the conversation?** Update `CONTEXT.md` right there. +- **User rejects the candidate with a load-bearing reason?** Offer an ADR, framed as: _"Want me to record this as an ADR so future architecture reviews don't re-suggest it?"_ Only offer when the reason would actually be needed by a future explorer to avoid re-suggesting the same thing — skip ephemeral reasons ("not worth it right now") and self-evident ones. See [ADR-FORMAT.md](../grill-with-docs/ADR-FORMAT.md). +- **Want to explore alternative interfaces for the deepened module?** See [INTERFACE-DESIGN.md](INTERFACE-DESIGN.md). diff --git a/skills-lock.json b/skills-lock.json index a4225547..8bb0bed8 100644 --- a/skills-lock.json +++ b/skills-lock.json @@ -11,6 +11,24 @@ "sourceType": "github", "computedHash": "9e1c8b3103f92fa8092568a44fe64858de7c5c9dc65ce4bea8f168080e889cfd" }, + "grill-with-docs": { + "source": "mattpocock/skills", + "sourceType": "github", + "skillPath": "skills/engineering/grill-with-docs/SKILL.md", + "computedHash": "a5c65e76275008b469962f7bee8b34866f1c9b0709f4886e71c8e731735640e4" + }, + "handoff": { + "source": "mattpocock/skills", + "sourceType": "github", + "skillPath": "skills/productivity/handoff/SKILL.md", + "computedHash": "1a78d774f8a59db5daa6e65e20a6596872fa8cde769f9a6e3a09b678dd5ae8cc" + }, + "improve-codebase-architecture": { + "source": "mattpocock/skills", + "sourceType": "github", + "skillPath": "skills/engineering/improve-codebase-architecture/SKILL.md", + "computedHash": "ef32aea0a8fab9b365ff9e08a95f8d353e20ca21ea46ec2e73587c86dd341351" + }, "resolve-reviews": { "source": "pbakaus/agent-reviews", "sourceType": "github", From 62e6860329ff4e8e3236c7fdd2b39272ff508500 Mon Sep 17 00:00:00 2001 From: Johannes Stein Date: Sun, 24 May 2026 19:11:43 +0100 Subject: [PATCH 03/12] Update logo asset and build script --- logo.png | Bin 51972 -> 1471194 bytes scripts/build-logo.ts | 71 ++++++++++++++++++++++++++++++++++++++++ website/public/logo.png | Bin 51972 -> 1471194 bytes 3 files changed, 71 insertions(+) create mode 100644 scripts/build-logo.ts diff --git a/logo.png b/logo.png index 587a273cf1c361becf0d360173de37d430207916..bbe42c73f9f86718cc0caadf8e06039922818627 100644 GIT binary patch literal 1471194 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 =UNWP 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

}H+)kW6lx=UV(wDm@@2N+ulJdUJza*-G=%ZGD-@ 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