| Safe Haskell | None |
|---|---|
| Language | Haskell2010 |
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
- data Severity
- data Diagnostic = Diagnostic {}
- data HoleData = HoleData {
- holeDataName :: Maybe String
- holeDataGoal :: String
- holeDataShape :: Maybe (String, String)
- holeDataTermVars :: [(String, String)]
- holeDataCubeVars :: [(String, String)]
- holeDataTopes :: [String]
- locationToJSON :: LocationInfo -> Value
- typeErrorTag :: TypeError var -> String
- typeErrorTagInScopedContext :: TypeErrorInScopedContext var -> String
- locationOfTypeError :: TypeErrorInScopedContext var -> Maybe LocationInfo
- diagnoseTypeError :: OutputDirection -> TypeErrorInScopedContext VarIdent -> Diagnostic
- diagnoseHole :: HoleInfo -> Diagnostic
- holeData :: HoleInfo -> HoleData
- ppHoleInfo :: HoleInfo -> String
- ppLocationInfo :: LocationInfo -> String
Documentation
Diagnostic severity, mirroring the usual LSP levels.
Constructors
| SeverityError | |
| SeverityWarning | |
| SeverityInformation | |
| SeverityHint |
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
| ToJSON Diagnostic Source # | |
Defined in Rzk.Diagnostic Methods toJSON :: Diagnostic -> Value # toEncoding :: Diagnostic -> Encoding # toJSONList :: [Diagnostic] -> Value # toEncodingList :: [Diagnostic] -> Encoding # omitField :: Diagnostic -> Bool # | |
| Show Diagnostic Source # | |
Defined in Rzk.Diagnostic Methods showsPrec :: Int -> Diagnostic -> ShowS # show :: Diagnostic -> String # showList :: [Diagnostic] -> ShowS # | |
| Eq Diagnostic Source # | |
Defined in Rzk.Diagnostic | |
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:
shapeis 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 ofgoal(a restricted typeA [ … ↦ … ]), andshapeisnull— read the boundary out ofgoal.cubeVarsnames can be patterns like"(t, s)"(pair-pattern binders); they are display strings, not single identifiers.
Constructors
| HoleData | |
Fields
| |
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.
ppLocationInfo :: LocationInfo -> String Source #