rzk-0.9.1: An experimental proof assistant for synthetic ∞-categories
Safe HaskellNone
LanguageHaskell2010

Rzk.Diagnostic

Description

Structured diagnostics for rzk: type errors and holes as data (severity, a stable code, a source location, and a message) rather than a single pre-formatted string. The core library produces these; the LSP maps them to LSP diagnostics, and the CLI can emit them as JSON (rzk typecheck --json).

Locations are line-level: rzk currently retains only file + line at the point an error is produced (the column is discarded, and core terms keep no per-node position), so diagnostics point at the enclosing command's line.

Synopsis

Documentation

data Severity Source #

Diagnostic severity, mirroring the usual LSP levels.

Instances

Instances details
ToJSON Severity Source # 
Instance details

Defined in Rzk.Diagnostic

Show Severity Source # 
Instance details

Defined in Rzk.Diagnostic

Eq Severity Source # 
Instance details

Defined in Rzk.Diagnostic

data Diagnostic Source #

A structured diagnostic. Independent of any editor protocol: the LSP maps it to its own Diagnostic, and the CLI serialises it as JSON.

JSON wire format (rzk typecheck --json)

This is a stable format that downstream tools (e.g. richer LSP hovers) pin to. Each diagnostic is an object:

{ "severity": "error" | "warning" | "information" | "hint"
, "code":     <string>           -- "hole", or a TypeError tag (e.g. "TypeErrorUnify")
, "location": { "file": <string|null>, "line": <int|null> } | null
, "message":  <string>           -- human-facing prose (the CLI/LSP display text)
, "hole":     <HoleData> | null  -- present only for hole diagnostics (see 'HoleData')
}

The message field is kept for back-compat (the LSP and the CLI human mode use it). Structured consumers should read the hole object instead of parsing message. For non-hole diagnostics hole is null.

Constructors

Diagnostic 

Fields

Instances

Instances details
ToJSON Diagnostic Source # 
Instance details

Defined in Rzk.Diagnostic

Show Diagnostic Source # 
Instance details

Defined in Rzk.Diagnostic

Eq Diagnostic Source # 
Instance details

Defined in Rzk.Diagnostic

data HoleData Source #

The structured payload of a hole diagnostic: the goal and local context as already-rendered display strings (the same strings the LSP/CLI show, i.e. show = printTree on the underlying terms). Consumers render hole panels from these fields directly, without parsing the human-facing message.

JSON wire format

{ "name":     <string|null>                 -- the ?name, if the hole was named
, "goal":     <string>                       -- the expected type (the goal)
, "shape":    { "binder": <string>, "tope": <string> } | null
, "termVars": [ { "name": <string>, "type": <string> }, ... ]
, "cubeVars": [ { "name": <string>, "type": <string> }, ... ]
, "topes":    [ <string>, ... ]              -- local tope assumptions (excludes ⊤)
}

Notes for consumers:

  • shape is non-null only for a shape-restricted argument goal, where the goal reads (binder : goal | tope). For an extension type the boundary is already part of goal (a restricted type A [ … ↦ … ]), and shape is null — read the boundary out of goal.
  • cubeVars names can be patterns like "(t, s)" (pair-pattern binders); they are display strings, not single identifiers.

Constructors

HoleData 

Fields

Instances

Instances details
ToJSON HoleData Source # 
Instance details

Defined in Rzk.Diagnostic

Show HoleData Source # 
Instance details

Defined in Rzk.Diagnostic

Eq HoleData Source # 
Instance details

Defined in Rzk.Diagnostic

locationToJSON :: LocationInfo -> Value Source #

Encode a location as JSON. A plain helper rather than a ToJSON instance, to avoid an orphan instance (LocationInfo is defined in Rzk.TypeCheck).

typeErrorTag :: TypeError var -> String Source #

A stable tag for a type error, used as its diagnostic code. Independent of the variable type, so it survives the scoped-error unfolding.

typeErrorTagInScopedContext :: TypeErrorInScopedContext var -> String Source #

The tag of a scoped type error (peels the binder layers; the tag does not depend on the variable type).

locationOfTypeError :: TypeErrorInScopedContext var -> Maybe LocationInfo Source #

The source location of a scoped type error (the enclosing command's line).

diagnoseTypeError :: OutputDirection -> TypeErrorInScopedContext VarIdent -> Diagnostic Source #

A structured diagnostic for a type error. The message is the usual formatted error text; severity is always SeverityError.

diagnoseHole :: HoleInfo -> Diagnostic Source #

A structured diagnostic for a hole, carrying the hole's goal and local context. A hole is an unfilled obligation, so it is a SeverityWarning — mirroring Agda's yellow "unsolved" highlight, and visible in the editor's problems panel (unlike SeverityHint, which editors render almost invisibly). Finished work still rejects holes outright: the strict default of rzk typecheck reports them as errors (cf. Agda's --safe).

holeData :: HoleInfo -> HoleData Source #

The structured payload of a hole: its goal and local context rendered to display strings (the same rendering ppHoleInfo uses, but kept as separate fields rather than concatenated into prose). See HoleData.

ppHoleInfo :: HoleInfo -> String Source #

Render a hole's goal and local context (the structured query) for display, separating term variables, cube variables, and tope assumptions.