@@ -6,10 +6,13 @@ import Control.Exception (IOException)
66import Control.Monad.Except (MonadError , throwError )
77import Data.List.NonEmpty (NonEmpty )
88import Data.Map qualified as Map
9+ import Data.Text (Text )
10+ import Data.Typeable (Proxy )
911import Data.Void (Void )
1012import Prettyprinter (list )
1113import Vehicle.Backend.LossFunction.Core (BooleanDifferentiableLogicField , TensorDifferentiableLogicField )
1214import Vehicle.Backend.Prelude
15+ import Vehicle.Compile.Normalise.Builtin (NormalisableBuiltin )
1316import Vehicle.Compile.Prelude
1417import Vehicle.Compile.Print (PrettyFriendly )
1518import Vehicle.Compile.Print.Builtin
@@ -32,6 +35,56 @@ type MonadCompile m =
3235 MonadError CompileError m
3336 )
3437
38+ --------------------------------------------------------------------------------
39+ -- Typing errors
40+
41+ data MissingExplicitArgError builtin = MissingExplicitArgError
42+ { _ctx :: NamedBoundCtx ,
43+ explicitBinder :: Binder builtin ,
44+ nonExplicitArg :: Arg builtin
45+ }
46+ deriving (Show )
47+
48+ data RelevantUseOfIrrelevantVariableError builtin = RelevantUseOfIrrelevantVariableError
49+ { _proxy :: Proxy builtin ,
50+ _provenance :: Provenance ,
51+ irrelevantVariableName :: Name
52+ }
53+ deriving (Show )
54+
55+ data FunctionTypeMismatchError builtin = FunctionTypeMismatchError
56+ { _ctx :: NamedBoundCtx ,
57+ originalFunction :: Expr builtin ,
58+ currentExpectedType :: Expr builtin ,
59+ currentUncheckedArgs :: [Arg builtin ]
60+ }
61+ deriving (Show )
62+
63+ newtype FailedUnificationConstraintsError builtin = FailedUnificationConstraintsError
64+ { failedConstraints :: NonEmpty (WithContext (UnificationConstraint builtin ))
65+ }
66+ deriving (Show )
67+
68+ data FailedInstanceConstraintError builtin = FailedInstanceConstraintError
69+ { _freeEnv :: FreeEnv builtin ,
70+ failedConstraint :: WithContext (InstanceConstraint builtin ),
71+ exploredCandidates :: [(WithContext (InstanceCandidate builtin ), UnAnnDoc )]
72+ }
73+ deriving (Show )
74+
75+ -- | Errors thrown during type-checking
76+ data TypingError builtin
77+ = MissingExplicitArg (MissingExplicitArgError builtin )
78+ | FunctionTypeMismatch (FunctionTypeMismatchError builtin )
79+ | RelevantUseOfIrrelevantVariable (RelevantUseOfIrrelevantVariableError builtin )
80+ | FailedUnificationConstraints (FailedUnificationConstraintsError builtin )
81+ | FailedInstanceConstraint (FailedInstanceConstraintError builtin )
82+ | FailedIndexConstraintTooBig (ConstraintContext builtin ) Int Int
83+ | FailedIndexConstraintUnknown (ConstraintContext builtin ) (Value builtin ) (VType builtin )
84+ | UnsolvedConstraints (NonEmpty (WithContext (Constraint builtin )))
85+ | UnsolvedMetas (Proxy builtin ) (NonEmpty (MetaID , Provenance ))
86+ deriving (Show )
87+
3588--------------------------------------------------------------------------------
3689-- Compilation errors
3790
@@ -45,12 +98,9 @@ data CompileError
4598 | DeclarationBoundShadowing Provenance Name
4699 | MissingPrunedName Name
47100 | -- Type checking errors
48- UnresolvedHole Provenance Name
49- | forall builtin .
50- (PrintableBuiltin builtin , Show builtin ) =>
101+ forall builtin .
102+ (Eq builtin , PrintableBuiltin builtin , NormalisableBuiltin builtin , Show builtin ) =>
51103 TypingError (TypingError builtin )
52- | UnsolvedMetas (NonEmpty (MetaID , Provenance ))
53- | RelevantUseOfIrrelevantVariable Provenance Name
54104 | -- Resource loading errors
55105 ResourceNotProvided DeclProvenance ExternalResource
56106 | ResourceIOError DeclProvenance ExternalResource IOException
@@ -59,32 +109,23 @@ data CompileError
59109 | -- Unsupported networks
60110 NetworkTypeHasVariableSizeTensor DeclProvenance (GluedType Builtin ) (VType Builtin ) InputOrOutput
61111 | NetworkTypeHasImplicitSizeTensor DeclProvenance (GluedType Builtin ) Identifier InputOrOutput
62- | NetworkTypeIsNotAFunction DeclProvenance (GluedType Builtin )
63- | NetworkTypeIsNotOverTensors DeclProvenance (GluedType Builtin ) (VType Builtin ) InputOrOutput
64- | NetworkTypeHasNonExplicitArguments DeclProvenance (GluedType Builtin ) (VBinder Builtin )
65- | NetworkTypeHasUnsupportedElementType DeclProvenance (GluedType Builtin ) (VType Builtin ) InputOrOutput
66112 | -- Unsupported datasets
67- DatasetTypeUnsupportedContainer DeclProvenance (GluedType Builtin )
68- | DatasetTypeUnsupportedElement DeclProvenance (GluedType Builtin ) (VType Builtin )
69- | DatasetVariableSizeTensor DeclProvenance (GluedType Builtin ) (VType Builtin )
113+ DatasetVariableSizeTensor DeclProvenance (GluedType Builtin ) (VType Builtin )
70114 | DatasetDimensionSizeMismatch DeclProvenance FilePath Int Int TensorShape TensorShape
71115 | DatasetDimensionsMismatch DeclProvenance FilePath (GluedExpr Builtin ) TensorShape
72116 | DatasetTypeMismatch DeclProvenance FilePath (GluedType Builtin ) (VType Builtin ) (Doc Void )
73117 | DatasetInvalidIndex DeclProvenance FilePath Int Int
74118 | DatasetInvalidNat DeclProvenance FilePath Int
75119 | -- Unsupported parameters
76- ParameterTypeUnsupported DeclProvenance (GluedType Builtin )
77- | ParameterTypeVariableSizeIndex DeclProvenance (GluedType Builtin )
120+ ParameterTypeVariableSizeIndex DeclProvenance (GluedType Builtin )
78121 | ParameterTypeInferableParameterIndex DeclProvenance Identifier
79122 | ParameterValueUnparsable DeclProvenance String BuiltinType
80123 | ParameterValueInvalidIndex DeclProvenance Int Int
81124 | ParameterValueInvalidNat DeclProvenance Int
82- | InferableParameterTypeUnsupported DeclProvenance (GluedType Builtin )
83125 | InferableParameterContradictory Identifier (DeclProvenance , ExternalResource , Int ) (DeclProvenance , ExternalResource , Int )
84126 | InferableParameterUninferrable DeclProvenance
85127 | -- Unsupported properties
86- PropertyTypeUnsupported DeclProvenance (GluedType Builtin )
87- | NoPropertiesFound
128+ NoPropertiesFound
88129 | -- Verification backend errors
89130 forall builtin .
90131 (PrintableBuiltin builtin , Eq builtin , PrettyFriendly (Contextualised (VType builtin ) NamedBoundCtx )) =>
@@ -183,3 +224,37 @@ lookupInFreeCtx ::
183224lookupInFreeCtx pass ident ctx = case Map. lookup ident ctx of
184225 Nothing -> internalScopingError pass ident
185226 Just x -> return x
227+
228+ --------------------------------------------------------------------------------
229+ -- The final error type
230+
231+ -- | Errors from external code that we have no control over.
232+ -- These may be either user or developer errors but in general we
233+ -- can't distinguish between the two.
234+ newtype ExternalError = ExternalError Text
235+
236+ -- | Errors that are the user's responsibility to fix.
237+ data UserError = UserError
238+ { provenance :: Provenance ,
239+ problem :: UnAnnDoc ,
240+ fix :: Maybe UnAnnDoc
241+ }
242+
243+ data VehicleError
244+ = UError UserError
245+ | EError ExternalError
246+ | DError (Doc () )
247+
248+ instance Pretty VehicleError where
249+ pretty (UError (UserError p prob probFix)) =
250+ unAnnotate $
251+ " Error in"
252+ <+> pretty p
253+ <> " :"
254+ <+> prob
255+ <> maybe " " (\ fix -> line <> fixText fix) probFix
256+ pretty (EError (ExternalError text)) = pretty text
257+ pretty (DError text) = unAnnotate text
258+
259+ fixText :: Doc ann -> Doc ann
260+ fixText t = " Fix:" <+> t
0 commit comments