Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Syntax.Source

Source identity for the versioned syntax artifacts: source files and half-open byte spans.

Byte offsets are the canonical position vocabulary (line and column are projections for people, never a second identity), and these are the Prism-side types the token and surface-syntax exports decode into.

Types

Span

type Span = Span { lo: Int, hi: Int } deriving (Eq, Show)

A half-open byte range [lo, hi) into one source text.

span_len(Span { lo = 3, hi = 8 })
5

SourceFile

type SourceFile = SourceFile {
  digest: String,
  text: String
} deriving (Eq, Show)

One source file as an artifact embeds it: the exact text and its digest. Every span in an artifact indexes this text, so a persisted document needs no external file.

Functions and Values

span_len

span_len : (Syntax.Source.Span) -> Int

The number of bytes a span covers.

span_valid

span_valid : (Syntax.Source.Span) -> Bool

Whether a span is well formed: non-negative start, start at or before end.

(span_valid(Span { lo = 2, hi = 2 }), span_valid(Span { lo = 5, hi = 4 }))
(true, false)

span_contains

span_contains : (Syntax.Source.Span, Int) -> Bool

Whether a byte offset falls inside the span (half-open, so the end offset is outside).

line_col

line_col : (String, Int) -> (Int, Int)

The one-based line and column of a byte offset, as a projection over the text. Offsets past the end clamp to the final position.

Both the offset and the column it reports are counted in bytes, the same vocabulary spans use, so the projection agrees with the identity it projects from. Counting the walk in characters instead would read a byte offset as a character index and land somewhere else entirely on a line holding any multi-byte character, besides re-walking the text on every step.

line_col("ab\ncd", 4)
(2, 2)