Persistent resident diagnostic index with lazy suffix shifts.
Diagnostics are grouped by start row. Each compact entry keeps its end-row offset plus source and projected columns. Structural row splices therefore shift an unchanged suffix in logarithmic work, while in-place edits reproject only groups whose start or end touches an edited row.
Summary
Functions
Applies immutable-base row splices and returns final start rows that need column replacement.
Types
@type compact() :: {end_offset :: non_neg_integer(), start_source_col :: non_neg_integer(), end_source_col :: non_neg_integer(), Minga.Diagnostics.Diagnostic.encoding(), Minga.Diagnostics.Diagnostic.severity(), start_col :: non_neg_integer(), end_col :: non_neg_integer()}
@type t() :: %MingaEditor.RenderModel.Window.DiagnosticIndex{root: tree_node()}
@type tree_node() :: MingaEditor.RenderModel.Window.LazyRowTree.t(tuple(), non_neg_integer())
@type work() :: %{ groups_reprojected: non_neg_integer(), suffix_shifts: non_neg_integer() }
Functions
@spec apply_splices( t(), [Minga.RenderModel.Window.RowSplice.t()], MingaEditor.RenderModel.Window.ResidentBuild.t() ) :: {t(), [non_neg_integer()], work()}
Applies immutable-base row splices and returns final start rows that need column replacement.
@spec build( [Minga.Diagnostics.Diagnostic.t()], MingaEditor.RenderModel.Window.ResidentBuild.t() ) :: t()
@spec ranges_at(t(), [non_neg_integer()]) :: [ Minga.RenderModel.Window.DiagnosticRange.t() ]
@spec to_ranges(t()) :: [Minga.RenderModel.Window.DiagnosticRange.t()]