Skip to content

Release 0.5.0#32

Merged
siy merged 46 commits into
mainfrom
release-0.5.0
May 8, 2026
Merged

Release 0.5.0#32
siy merged 46 commits into
mainfrom
release-0.5.0

Conversation

@siy

@siy siy commented May 8, 2026

Copy link
Copy Markdown
Owner

Summary

Release 0.5.0 of peglib — incremental engine architectural rework + throughput engine Tier 1 perf arc + Move B post-mortem + post-rollback wins. 46 commits past main.

Headline numbers

Incremental engine (1900-LOC Java fixture, Regime B cursor-moved-to-edit):

Metric 0.4.3 0.5.0 Δ
Median 10.8 ms 5.0 ms -54%
p95 22.4 ms 11.2 ms -50%
% under 16ms 91.5% 96.5% +5pp

Throughput engine (variant phase1_allStructural_mutableResult_autoSkipPackrat):

Fixture Original (pre-Tier-1) 0.5.0 Δ vs original vs javac
Reference (1900 LOC) 76.2 ms / 150 MB 19.12 ms / 68.02 MB -75% wallclock, -55% bytes ≈2.1× of javac (9 ms) with strictly more output
Self-host (37k LOC) OOM 832 ms / 1.85 GB from impossible to <1 sec n/a

What shipped

  • Incremental engine 0.5.0CstNode records gain long id first record component (BREAKING). Path D stable-id ancestor preservation + LongLongMap NodeIndex. 96-604× speedup on flat-tree mid-buffer edits. Lever D Cursor split.
  • Throughput engine Tier 1 perf arc — 7 moves (A/D/F/G/G2+H/selective packrat/DFA fast-path) cumulative -67% wallclock, -75% gc.count. New selfhost JMH fixture catches regressions the small bench misses.
  • Move B attempted, abandoned — 5-commit arc + 5 reset attempts. Singleton mutator regressed wallclock monotonically while alloc dropped. Definitive post-mortem with quantitative data: alloc rate is no longer a productive optimization target — JIT scalar replacement already handles short-lived per-call records.
  • Post-rollback profile-driven optimization arc — 2 ships from new methodology (CPU + alloc evidence aligned, structural call elimination, JIT-resistant patterns):
    • Trivia snapshot via int size (4763251): -12.1% reference / -8.2% selfhost wallclock
    • ASCII char interning in matchCharClassCst (38b6a8e): -3.95% reference / -4.59% selfhost wallclock

Test counts

  • peglib-core: 705 (incl. 6 smoke tests from the 2 shipped commits + parity gates)
  • peglib-incremental, peglib-formatter (66), peglib-maven-plugin (5), peglib-playground (27): all green
  • Phase1ParityTest 22/22, RoundTripTest 22/22, LeftRecursionTest 13/13

Breaking changes

  • CstNode records gain long id first record component on all 4 variants (Terminal, NonTerminal, Token, Error). equals/hashCode exclude id per spec §7 R1 — structural equality preserved. Downstream pattern-matchers on case CstNode.Terminal(String text, ...) need to add the leading long id component.
  • Generated parsers should be regenerated to pick up the throughput engine emission updates (FIRST-set choice dispatch, JBCT-style method splits, DFA fast-path, ASCII char pool).

Test plan

  • Full reactor mvn install green — local m2 reflects 0.5.0 artifacts
  • Phase1ParityTest 22/22 (the regression net) — confirmed at every commit
  • Bench A/B both fixtures showing wallclock improvements within stated CIs
  • Move B post-mortem documented with quantitative data
  • Lesson taxonomy banked for future sessions (HANDOVER §11)

Docs

  • docs/HANDOVER.md §11 — current branch state + post-rollback wins + reoriented next moves
  • docs/incremental/THROUGHPUT-ENGINE-MOVE-B.md §11 — Move B post-mortem
  • CHANGELOG.md [0.5.0] section — full release notes
  • docs/archive/ — historical specs (V2.5 spike NO-GO, original SPEC.md, etc.)

🤖 Generated with Claude Code

Summary by CodeRabbit

  • New Features

    • Incremental parsing Phase 1 improvements delivering O(δ) scaling for editing workflows
    • Cursor/Session API split for better interactive editing control
    • Throughput engine Tier 1 optimization suite with configurable performance flags
  • Performance

    • Enhanced generator performance via inlineLocations, selectivePackrat, tokenFastPath, and mutableParseResult optimizations
    • Improved incremental reparse performance with stable node IDs and optimized ancestry tracking
  • Breaking Changes

    • CstNode now includes stable long id field
    • Session API refactored; cursor state separated from Session
    • ParserConfig expanded with new performance flags

siy added 30 commits May 6, 2026 23:00
…ceSpan via primitives in emitted CST construction
siy added 16 commits May 8, 2026 00:10
…hot (-12% reference, -8% selfhost wallclock; -6% / -7% alloc)
@siy siy merged commit abfd00c into main May 8, 2026
1 of 2 checks passed
@coderabbitai

coderabbitai Bot commented May 8, 2026

Copy link
Copy Markdown

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 8d82ea25-fff5-4094-8984-8f1645ef18e1

📥 Commits

Reviewing files that changed from the base of the PR and between 4c431c6 and d6f8ac8.

📒 Files selected for processing (111)
  • CHANGELOG.md
  • CLAUDE.md
  • README.md
  • docs/AUDIT-REPORTS/docs-backreference.md
  • docs/BENCHMARKING.md
  • docs/GRAMMAR-DSL.md
  • docs/HANDOVER.md
  • docs/PARTIAL-PARSE.md
  • docs/PERF-FLAGS.md
  • docs/RELEASE-PLAN-0.3.5-0.4.0.md
  • docs/archive/PERF-REWORK-SPEC.md
  • docs/archive/PHASE-0-RESULTS.md
  • docs/archive/PHASE-1-PROVE-OUT.md
  • docs/archive/SPEC-incremental-original.md
  • docs/archive/UNSAFE-GENERATOR-SPIKE.md
  • docs/archive/V2.5-SPIKE.md
  • docs/bench-results/generator-profile-baseline.md
  • docs/bench-results/path-d-results.md
  • docs/bench-results/phase0-spike-results.md
  • docs/bench-results/phase1-spanindex-results.md
  • docs/bench-results/throughput-tier1-results.md
  • docs/incremental/ARCHITECTURE-0.5.0.md
  • docs/incremental/PHASE-1-RESULTS.md
  • docs/incremental/THROUGHPUT-ENGINE-MOVE-B.md
  • docs/incremental/THROUGHPUT-ENGINE-TIER1.md
  • peglib-core/pom.xml
  • peglib-core/src/jmh/java/org/pragmatica/peg/bench/Java25ParseBenchmark.java
  • peglib-core/src/jmh/java/org/pragmatica/peg/bench/PackratStatsProbe.java
  • peglib-core/src/main/java/org/pragmatica/peg/error/Diagnostic.java
  • peglib-core/src/main/java/org/pragmatica/peg/generator/ChoiceDispatchAnalyzer.java
  • peglib-core/src/main/java/org/pragmatica/peg/generator/PackratAnalyzer.java
  • peglib-core/src/main/java/org/pragmatica/peg/generator/ParserGenerator.java
  • peglib-core/src/main/java/org/pragmatica/peg/parser/ParserConfig.java
  • peglib-core/src/main/java/org/pragmatica/peg/parser/ParsingContext.java
  • peglib-core/src/main/java/org/pragmatica/peg/parser/PegEngine.java
  • peglib-core/src/main/java/org/pragmatica/peg/tree/CstNode.java
  • peglib-core/src/main/java/org/pragmatica/peg/tree/IdGenerator.java
  • peglib-core/src/test/java/org/pragmatica/peg/examples/SourceGenerationExample.java
  • peglib-core/src/test/java/org/pragmatica/peg/generator/ParserGeneratorTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/grammar/LeftRecursionTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/parser/ParseResultTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/parser/ParseRuleAtTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/parser/ParsingContextTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/CandidateFourSmokeTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/CandidateTwoSmokeTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase1ParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2AllStructuralParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2ChoiceDispatchAndMarkResetParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2ChoiceDispatchParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2InlineLocationsParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2MarkResetChildrenParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2SelectivePackratEmptySetParityTest.java
  • peglib-core/src/test/java/org/pragmatica/peg/perf/Phase2SelectivePackratParityTest.java
  • peglib-formatter/pom.xml
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/Doc.java
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/Docs.java
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/FormatContext.java
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/Formatter.java
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/FormatterConfig.java
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/TriviaPolicy.java
  • peglib-formatter/src/main/java/org/pragmatica/peg/formatter/internal/Renderer.java
  • peglib-incremental/README.md
  • peglib-incremental/pom.xml
  • peglib-incremental/src/jmh/java/org/pragmatica/peg/incremental/bench/IncrementalBenchmark.java
  • peglib-incremental/src/jmh/java/org/pragmatica/peg/incremental/bench/IncrementalSessionBench.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/Cursor.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/Edit.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/EditOutcome.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/IncrementalParser.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/InitialSession.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/ReparseOutcome.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/Session.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/SessionError.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/Stats.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/BackReferenceScan.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/CstHash.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/IncrementalSession.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/LinearProbingLongLongMap.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/LongLongMap.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/NodeIndex.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/RuleIdRegistry.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/SafePivotAnalyzer.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/SessionFactory.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/TreeSplicer.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/TriviaRedistribution.java
  • peglib-incremental/src/main/java/org/pragmatica/peg/incremental/package-info.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/BackReferenceFallbackTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/IdempotencyTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/IncrementalParityTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/IncrementalTriviaParityTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/ReparseBoundaryTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/SessionApiTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/TriviaRedistributionTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/examples/BasicEditorLoopExample.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/internal/LongLongMapTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/internal/NodeIndexTest.java
  • peglib-incremental/src/test/java/org/pragmatica/peg/incremental/internal/SafePivotAnalyzerTest.java
  • peglib-maven-plugin/pom.xml
  • peglib-maven-plugin/src/main/java/org/pragmatica/peg/maven/CheckMojo.java
  • peglib-maven-plugin/src/main/java/org/pragmatica/peg/maven/GenerateMojo.java
  • peglib-maven-plugin/src/main/java/org/pragmatica/peg/maven/LintMojo.java
  • peglib-playground/pom.xml
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/ParseTracer.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/PlaygroundEngine.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/PlaygroundRepl.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/PlaygroundServer.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/Stats.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/TraceRecord.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/internal/JsonDecoder.java
  • peglib-playground/src/main/java/org/pragmatica/peg/playground/internal/JsonEncoder.java
  • pom.xml

📝 Walkthrough

Walkthrough

This PR delivers version 0.5.0, a major incremental-parsing architecture overhaul accompanied by throughput-engine performance optimizations. Core changes include: splitting session cursor state into a separate Cursor record, introducing stable session-scoped node IDs via IdGenerator, refactoring NodeIndex to use primitive-key maps for id-based lookups, introducing outcome-based APIs (EditOutcome, ReparseOutcome), defaulting performance flags (inlineLocations, selectivePackrat, tokenFastPath) to true, and documenting Phase 1 production migration results and Phase 2 abandonment.

Changes

Incremental Architecture & Session Refactoring (Phase 1.x Execution)

Layer / File(s) Summary
Data Shape & Public API
peglib-incremental/src/main/java/org/pragmatica/peg/incremental/{Cursor.java, Edit.java, EditOutcome.java, InitialSession.java, ReparseOutcome.java, SessionError.java}
New immutable records Cursor (offset + enclosing node id), EditOutcome/ReparseOutcome (paired post-edit/reparse session+cursor), InitialSession (paired initialization result), SessionError sealed interface for incremental parse failures, and Edit for splice operations. These replace cursor state embedded in Session with explicit paired outcomes.
ID Generation & CST Node Stability
peglib-core/src/main/java/org/pragmatica/peg/tree/{IdGenerator.java, CstNode.java}, peglib-core/src/main/java/org/pragmatica/peg/parser/{ParsingContext.java, PegEngine.java}
IdGenerator sealed interface with PerSessionCounter implementation supplies stable long id per session. CstNode record variants (Terminal, NonTerminal, Token, Error) updated to include long id component; equals/hashCode exclude id from structural equality. ParsingContext and PegEngine thread IdGenerator through parsing.
Index Refactoring to ID-Based Lookup
peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/{LongLongMap.java, LinearProbingLongLongMap.java, NodeIndex.java, SafePivotAnalyzer.java}
LongLongMap sealed interface and LinearProbingLongLongMap implementation replace identity-based Map<CstNode, CstNode> with primitive-key long → long parent mapping. NodeIndex refactored to use id-keyed parent lookups and Map<Long, CstNode> for reverse resolution. SafePivotAnalyzer added for incremental reparse boundary selection. New applyIncremental(...) and smallestEnclosing(...) APIs.
Incremental Reparse & Session Mutations
peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/{IncrementalSession.java, TreeSplicer.java, TriviaRedistribution.java}
IncrementalSession refactored: removes cursor/enclosing fields, adds IdGenerator and Option<SessionError> lastError. edit(Cursor, Edit) now returns EditOutcome; reparseAll(Cursor) returns ReparseOutcome; parse failures synthesize degraded CstNode.Error roots. TreeSplicer.spliceAndShift(...) returns SpliceResult (root + root-to-pivot path) with stable id preservation during spine rebuild. TriviaRedistribution refactored to remove SourceLocation dependency.
Session Factory & Initialization
peglib-incremental/src/main/java/org/pragmatica/peg/incremental/{IncrementalParser.java, Session.java}, peglib-incremental/src/main/java/org/pragmatica/peg/incremental/internal/SessionFactory.java
IncrementalParser.initialize(...) now returns InitialSession (paired session+cursor). Session interface reshaped: edit(Cursor, Edit)EditOutcome; reparseAll(Cursor)ReparseOutcome; removed cursor-owning methods. SessionFactory computes safe-pivot rules, threads IdGenerator through initialization and parsing.
Parser Generator Support for IDs
peglib-core/src/main/java/org/pragmatica/peg/generator/{ChoiceDispatchAnalyzer.java, PackratAnalyzer.java}
ChoiceDispatchAnalyzer promoted to public with expanded FIRST-set analysis via FirstSets (new nested public static final class with grammar-wide fixed-point computation). PackratAnalyzer added to auto-derive skip-set for selectivePackrat (excluding left-recursive, leaf-like, and single-call-site rules).
ParserConfig Defaults & Flags
peglib-core/src/main/java/org/pragmatica/peg/parser/ParserConfig.java
Added mutableParseResult and tokenFastPath as new record components. Changed defaults: inlineLocationstrue, selectivePackrattrue (with auto-derivation when skip-set empty), tokenFastPathtrue. Updated javadoc for FIRST-set dispatch and packrat behavior.
Incremental Tests (Session/Cursor/Outcome API)
peglib-incremental/src/test/java/org/pragmatica/peg/incremental/{*.java}, peglib-incremental/src/test/java/org/pragmatica/peg/incremental/internal/{*.java}
All incremental tests refactored to use cursor-aware session.edit(cursor, edit) returning EditOutcome and reparseAll(cursor) returning ReparseOutcome. Benchmarks updated: IncrementalBenchmark tracks warm cursor; IncrementalSessionBench uses EditOutcome, post-edit validation, and rich skip classification. New tests added for LongLongMap stress, NodeIndex.smallestEnclosing, and SafePivotAnalyzer rules.

Performance Optimization & Throughput Engine (Tier 1)

Layer / File(s) Summary
Core Parsing & Emission Updates
peglib-core/src/main/java/org/pragmatica/peg/error/Diagnostic.java, peglib-core/src/main/java/org/pragmatica/peg/parser/PegEngine.java
Diagnostic updated to use SourceSpan.startLine()/endLine()/startColumn()/endColumn() instead of position objects. PegEngine extended with overloads accepting IdGenerator; all CST construction paths now pass generated node IDs.
Packrat & Choice Dispatch Defaults
peglib-core/src/main/java/org/pragmatica/peg/parser/ParserConfig.java
choiceDispatch defaults true with full FIRST-set transitive analysis. selectivePackrat defaults true with auto-skip-set derivation. PackratAnalyzer computes effective skip rules when not explicitly provided.
Benchmark & Parity Infrastructure
peglib-core/src/jmh/java/org/pragmatica/peg/bench/{*.java}, peglib-core/src/test/java/org/pragmatica/peg/perf/{*.java}
Java25ParseBenchmark extended with dual fixture parameter (reference/selfhost); PackratStatsProbe and all phase-2 parity tests updated to pass new tokenFastPath and mutableParseResult flags. Generator variant matrix expanded with mutableResult_autoSkipPackrat combinations.
Formatter & Playground Updates
peglib-formatter/src/main/java/org/pragmatica/peg/formatter/{*.java}, peglib-playground/src/main/java/org/pragmatica/peg/playground/{*.java}
Formatter refactored to use SourceSpan.startOffset()/endOffset() accessors. Playground enriched with Stats record, expanded ParseTracer tracking, and PlaygroundServer JSON encoding updates. All code reformatted per style guidelines.

Documentation & Release Metadata

Layer / File(s) Summary
Changelog & Release Notes
CHANGELOG.md, README.md, CLAUDE.md
0.5.0 release documented with Phase 0 GO verdict, Phase 1 production migration results (stable IDs, applyIncremental, LongLongMap), Phase 2 rollback, throughput-engine Tier 1 A/D moves, and cumulative performance deltas. Updated test counts (705 core tests), version references, and performance benchmarking claims.
Architecture & Phase Documentation
docs/incremental/{ARCHITECTURE-0.5.0.md, PHASE-1-RESULTS.md, THROUGHPUT-ENGINE-*.md}, docs/archive/{PHASE-*.md, V2.5-SPIKE.md, SPEC-*.md}
Archived historical spike/spec docs with status markers. Added Phase 0 results, Phase 1 prove-out, Phase 1 production results, and Throughput Engine Tier 1 spec with detailed move descriptions (A: sentinel ParseResult flow, D: span/location packing). Documented Move B singleton-state attempt and rollback.
Benchmark & Performance Results
docs/bench-results/{path-d-results.md, phase*.md, throughput-tier1-results.md, generator-profile-baseline.md}
New benchmark result documents for Phase 0 spike, Path D stable-ID prove-out (GREEN verdict), Phase 1.0 SpanIndex (RED verdict), and Throughput-Engine Tier 1 (headline figures for A/D moves). Baseline generator profiling added.
Performance Flags & Operational Docs
docs/{PERF-FLAGS.md, BENCHMARKING.md, HANDOVER.md}, docs/AUDIT-REPORTS/docs-backreference.md
Updated PERF-FLAGS with twelve flags and new 0.5.0 defaults. Benchmarking harness expanded with phase-1/phase-2 variants and fixture modes. Handover updated with Phase 1 baseline assumptions and performance delta claims. Audit backreferences corrected for archived docs.

Build & Version Management

Layer / File(s) Summary
Maven POM Files
pom.xml, peglib-*/pom.xml
All modules updated to version 0.5.0 (parent and child artifacts). No functional build config changes; dependency/plugin configuration unchanged.

Sequence Diagram

sequenceDiagram
    participant Editor as Editor / Client
    participant IP as IncrementalParser
    participant SI as Session +<br/>Cursor
    participant NI as NodeIndex
    participant IGN as IdGenerator
    participant PegEng as PegEngine

    Editor->>IP: initialize(text, offset)
    activate IP
    IP->>IGN: new PerSessionCounter()
    IP->>PegEng: parseFull(text, idGen)
    activate PegEng
    PegEng->>NI: build(root)
    PegEng-->>IP: Result<CstNode>
    deactivate PegEng
    IP-->>Editor: InitialSession(session, cursor)
    deactivate IP

    rect rgba(100, 150, 200, 0.5)
    Note over Editor,SI: Edit Loop
    Editor->>SI: edit(cursor, Edit)
    activate SI
    SI->>NI: smallestEnclosing(editStart, editEnd)
    SI->>PegEng: parseRuleAt(ruleId, newText, offset, idGen)
    activate PegEng
    PegEng-->>SI: PartialParse
    deactivate PegEng
    SI->>NI: applyIncremental(newRoot, oldPath, newPath)
    SI-->>Editor: EditOutcome(newSession, newCursor)
    deactivate SI
    end

    rect rgba(150, 200, 100, 0.5)
    Note over Editor,SI: Full Reparse Fallback
    Editor->>SI: reparseAll(cursor)
    activate SI
    SI->>PegEng: parseFull(text, idGen)
    activate PegEng
    PegEng->>NI: build(root)
    PegEng-->>SI: Result<CstNode>
    deactivate PegEng
    SI-->>Editor: ReparseOutcome(newSession, newCursor)
    deactivate SI
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

This is a sweeping architectural refactor spanning incremental-session control flow (outcome-based returns), node ID stability mechanics, index internals (id→node mapping), parser generator extensions (FIRST-set analysis, packrat auto-skip), performance-flag defaults, and comprehensive test/benchmark updates. The changes are heterogeneous: core refactoring across multiple interdependent systems, new public APIs with breaking changes, performance-flag re-tuning, and extensive parity/bench updates. Understanding the interaction between stable IDs, applyIncremental path bookkeeping, and the outcome-based cursor/session lifecycle requires careful reasoning beyond simple pattern application.

Possibly related PRs

  • siy/java-peglib#28: Continues and extends the API-consolidation and incremental-session refactoring work (e.g., ParserConfig/ParserGenerator factory renames, Session shape consolidation, SourceSpan/SourceLocation factory changes).
  • siy/java-peglib#25: Relates to NodeIndex parent-mapping and Session reparse APIs that this PR comprehensively reworks to use stable long IDs and outcome-based control flow.
  • siy/java-peglib#13: Introduces earlier perf-rework foundations (ChoiceDispatchAnalyzer, ParserConfig flags, JMH infrastructure) that this PR expands with additional defaults and Tier 1 optimization moves.

Poem

🐰 Hop! The session split from cursor's embrace,
IDs now stable through each parsing race.
Index maps primitives, outcomes pair their dance,
Performance flags default—0.5.0's advance!
With archival spikes and results in hand,
This architecture hop is truly grand! 🐇

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch release-0.5.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant