-- UUAGC 0.9.50.2 (build/103/lib-ehc/UHC/Light/Compiler/Error.ag)
module UHC.Light.Compiler.Error(Err (..), ErrL
, ThingAndRange
, ErrSq
, mkThingAnd1Range
, module UHC.Light.Compiler.Base.Target
, errLIsFatal
, errIsFatal
, mkNestErr, mkNestErr'
, mkErr_NamesNotIntrod, mkErr_NamesNotIntrod') where

import UHC.Light.Compiler.Base.Common
import UHC.Light.Compiler.Ty
import UHC.Util.Pretty
import qualified UHC.Util.FastSeq as Seq
import Control.Monad.Error.Class
import UHC.Light.Compiler.Base.Target (FFIWay)
import UHC.Util.FPath















type ThingAndRange x = (x,Maybe [(Range,Maybe PP_Doc)])



type ErrSq = Seq.FastSeq Err



instance Error Err where
  strMsg m = rngLift emptyRange Err_Str m



errIsFatal :: Err -> Bool
errIsFatal (Err_MissingDataFields   	_ 	_ _			) = False
errIsFatal (Err_TyCoreMatchClash   		_ 	_ _ _ _		) = False
errIsFatal _                             				  = True



errLIsFatal :: [Err] -> Bool
errLIsFatal es = not (null es) && any errIsFatal es



mkNestErr' :: Range -> PP_Doc -> [ErrSq] -> ErrSq
mkNestErr' r wher errs = Seq.fromList $ mkNestErr r wher $ Seq.toList $ Seq.unions errs

mkNestErr :: Range -> PP_Doc -> ErrL -> ErrL
mkNestErr r wher errL | null ({- forceEval -} errL) = []
                      | otherwise             = [Err_NestedIn r wher errL]



mkThingAnd1Range :: Range -> x -> ThingAndRange x
mkThingAnd1Range r x = (x,Just [(r,Nothing)])



mkErr_NamesNotIntrod' :: PP n => Range -> String -> [ThingAndRange n] -> Err
mkErr_NamesNotIntrod' r m ns = Err_NamesNotIntrod r m (assocLMapKey pp ns)

mkErr_NamesNotIntrod :: Range -> String -> [HsName] -> Err
mkErr_NamesNotIntrod r m ns = mkErr_NamesNotIntrod' r m (zip (map pp ns) (repeat Nothing))

-- Err ---------------------------------------------------------
data Err = Err_PP {range_Err_PP :: !(Range),pp_Err_PP :: !(PP_Doc)}
         | Err_Str {range_Err_Str :: !(Range),str_Err_Str :: !(String)}
         | Err_UnifyClash {range_Err_UnifyClash :: !(Range),ty1_Err_UnifyClash :: !(Ty),ty2_Err_UnifyClash :: !(Ty),fiMode_Err_UnifyClash :: !(FIMode),ty1detail_Err_UnifyClash :: !(Ty),ty2detail_Err_UnifyClash :: !(Ty),fiModeD_Err_UnifyClash :: !(FIMode)}
         | Err_NamesNotIntrod {range_Err_NamesNotIntrod :: !(Range),kind_Err_NamesNotIntrod :: !(String),nmL_Err_NamesNotIntrod :: !(([ThingAndRange PP_Doc]))}
         | Err_PatArity {range_Err_PatArity :: !(Range),ty_Err_PatArity :: !(Ty),arity_Err_PatArity :: !(Int)}
         | Err_PatArity2 {range_Err_PatArity2 :: !(Range),kind_Err_PatArity2 :: !(String),what_Err_PatArity2 :: !(PP_Doc),arity_Err_PatArity2 :: !(Int)}
         | Err_NamesDupIntrod {range_Err_NamesDupIntrod :: !(Range),kind_Err_NamesDupIntrod :: !(String),nmL_Err_NamesDupIntrod :: !(([ThingAndRange HsName]))}
         | Err_NestedIn {range_Err_NestedIn :: !(Range),wher_Err_NestedIn :: !(PP_Doc),errL_Err_NestedIn :: !(ErrL)}
         | Err_Fixity {range_Err_Fixity :: !(Range),op1_Err_Fixity :: !(PP_Doc),op2_Err_Fixity :: !(PP_Doc)}
         | Err_UnifyOccurs {range_Err_UnifyOccurs :: !(Range),ty1_Err_UnifyOccurs :: !(Ty),ty2_Err_UnifyOccurs :: !(Ty),fiMode_Err_UnifyOccurs :: !(FIMode),tvar_Err_UnifyOccurs :: !(TyVarId),ty2detail_Err_UnifyOccurs :: !(Ty),fiModeD_Err_UnifyOccurs :: !(FIMode)}
         | Err_OccurCycle {range_Err_OccurCycle :: !(Range),tvar_Err_OccurCycle :: !(TyVarId),ty_Err_OccurCycle :: !(Ty)}
         | Err_Newtype {range_Err_Newtype :: !(Range),tyNm_Err_Newtype :: !(HsName)}
         | Err_FunPatternLengths {range_Err_FunPatternLengths :: !(Range),funNm_Err_FunPatternLengths :: !(HsName)}
         | Err_MissingRowLabels {range_Err_MissingRowLabels :: !(Range),nmL_Err_MissingRowLabels :: !(([HsName])),ty_Err_MissingRowLabels :: !(Ty)}
         | Err_TooManyRowLabels {range_Err_TooManyRowLabels :: !(Range),nmL_Err_TooManyRowLabels :: !(([HsName])),ty_Err_TooManyRowLabels :: !(Ty)}
         | Err_InconsistentIntros {range_Err_InconsistentIntros :: !(Range),kind_Err_InconsistentIntros :: !(String),nmL_Err_InconsistentIntros :: !(([HsName]))}
         | Err_MissingDataFields {range_Err_MissingDataFields :: !(Range),nmL_Err_MissingDataFields :: !(([HsName])),con_Err_MissingDataFields :: !(HsName)}
         | Err_MissingAnyDataField {range_Err_MissingAnyDataField :: !(Range),nmL_Err_MissingAnyDataField :: !(([HsName])),tyNm_Err_MissingAnyDataField :: !(HsName)}
         | Err_DuplicateDataFields {range_Err_DuplicateDataFields :: !(Range),nmL_Err_DuplicateDataFields :: !(([HsName]))}
         | Err_FileNotFound {range_Err_FileNotFound :: !(Range),fileName_Err_FileNotFound :: !(String),locations_Err_FileNotFound :: !(([String])),suffixes_Err_FileNotFound :: !(([FileSuffix]))}
         | Err_AmbiguousExport {range_Err_AmbiguousExport :: !(Range),name_Err_AmbiguousExport :: !(HsName),entities_Err_AmbiguousExport :: !(([ThingAndRange HsName]))}
         | Err_IllegalFFIWay {range_Err_IllegalFFIWay :: !(Range),ffiWay_Err_IllegalFFIWay :: !(FFIWay)}
         | Err_TyCoreMatchClash {range_Err_TyCoreMatchClash :: !(Range),ty1_Err_TyCoreMatchClash :: !(PP_Doc),ty2_Err_TyCoreMatchClash :: !(PP_Doc),ty1detail_Err_TyCoreMatchClash :: !((Maybe PP_Doc)),ty2detail_Err_TyCoreMatchClash :: !((Maybe PP_Doc))}
         | Err_TyCoreSeqLevels {range_Err_TyCoreSeqLevels :: !(Range),hereLev_Err_TyCoreSeqLevels :: !(Int),mustLev_Err_TyCoreSeqLevels :: !(Int),ty_Err_TyCoreSeqLevels :: !(PP_Doc)}
         | Err_NoCoerceDerivation {range_Err_NoCoerceDerivation :: !(Range),ty1_Err_NoCoerceDerivation :: !(Ty),ty2_Err_NoCoerceDerivation :: !(Ty),fiMode_Err_NoCoerceDerivation :: !(FIMode),func_Err_NoCoerceDerivation :: !(Ty),arg_Err_NoCoerceDerivation :: !(Ty)}
         | Err_PrfCutOffReached {range_Err_PrfCutOffReached :: !(Range),pred_Err_PrfCutOffReached :: !(PredOcc),depth_Err_PrfCutOffReached :: !(Int)}
         | Err_NotProvenPreds {range_Err_NotProvenPreds :: !(Range),preds_Err_NotProvenPreds :: !(([((Pred,[Range]),PP_Doc)]))}
         | Err_AmbigPreds {range_Err_AmbigPreds :: !(Range),preds_Err_AmbigPreds :: !(([(Pred,[Range])])),inQBinds_Err_AmbigPreds :: !((AssocL HsName PP_Doc)),inBinds_Err_AmbigPreds :: !((AssocL HsName PP_Doc))}
         | Err_OverlapPreds {range_Err_OverlapPreds :: !(Range),overl_Err_OverlapPreds :: !((AssocL Pred [PP_Doc]))}
         | Err_TyHasFreeTVars {range_Err_TyHasFreeTVars :: !(Range),ty_Err_TyHasFreeTVars :: !(Ty)}
         | Err_DeclsNotAllowed {range_Err_DeclsNotAllowed :: !(Range),inside_Err_DeclsNotAllowed :: !(String),decls_Err_DeclsNotAllowed :: !((AssocL IdOccKind [HsName]))}
         | Err_ValWithoutSig {range_Err_ValWithoutSig :: !(Range),nmL_Err_ValWithoutSig :: !(([HsName]))}
         | Err_NoMostSpecificPred {range_Err_NoMostSpecificPred :: !(Range),pred1_Err_NoMostSpecificPred :: !(Pred),pred2_Err_NoMostSpecificPred :: !(Pred)}
         | Err_EvidenceAltsLeft {range_Err_EvidenceAltsLeft :: !(Range)}
         | Err_MalformedPred {range_Err_MalformedPred :: !(Range),pp_Err_MalformedPred :: !(PP_Doc)}
         | Err_TyBetaRedLimit {range_Err_TyBetaRedLimit :: !(Range),ty_Err_TyBetaRedLimit :: !(Ty),tyTo_Err_TyBetaRedLimit :: !(Ty),limit_Err_TyBetaRedLimit :: !(Int)}
         | Err_MayOnlyHaveNrMain {range_Err_MayOnlyHaveNrMain :: !(Range),nrAllowed_Err_MayOnlyHaveNrMain :: !(Int),prevModNmL_Err_MayOnlyHaveNrMain :: !(([HsName])),modNm_Err_MayOnlyHaveNrMain :: !(HsName)}
         | Err_MayNotHaveMain {range_Err_MayNotHaveMain :: !(Range),modNm_Err_MayNotHaveMain :: !(HsName)}
         | Err_MustHaveMain {range_Err_MustHaveMain :: !(Range)}
         | Err_ModNameMismatch {range_Err_ModNameMismatch :: !(Range),nmOfFile_Err_ModNameMismatch :: !(HsName),nmFromSrc_Err_ModNameMismatch :: !(HsName)}
         | Err_AmbiguousNameRef {range_Err_AmbiguousNameRef :: !(Range),kindName_Err_AmbiguousNameRef :: !(String),kind_Err_AmbiguousNameRef :: !(String),nm_Err_AmbiguousNameRef :: !(HsName),nmAlts_Err_AmbiguousNameRef :: !(([HsName]))}
         | Err_MutRecModules {range_Err_MutRecModules :: !(Range),mutRecL_Err_MutRecModules :: !(([[HsName]]))}
         | Err_MalformedTy {range_Err_MalformedTy :: !(Range),kind_Err_MalformedTy :: !(String),purpose_Err_MalformedTy :: !(String),ty_Err_MalformedTy :: !(Ty)}
         | Err_NoDerivFor {range_Err_NoDerivFor :: !(Range),pred_Err_NoDerivFor :: !(PP_Doc)}
         | Err_NoDerivForData {range_Err_NoDerivForData :: !(Range),ty_Err_NoDerivForData :: !(Ty),clNm_Err_NoDerivForData :: !(HsName),reason_Err_NoDerivForData :: !(String)}
         | Err_FusionBuildInverse {range_Err_FusionBuildInverse :: !(Range),ty1_Err_FusionBuildInverse :: !(Ty),ty2_Err_FusionBuildInverse :: !(Ty)}
         | Err_InconsistentHI {range_Err_InconsistentHI :: !(Range),modNm_Err_InconsistentHI :: !(String),file_Err_InconsistentHI :: !(String),expected_Err_InconsistentHI :: !(([String])),inHI_Err_InconsistentHI :: !(([String]))}
         | Err_WrongMagic {range_Err_WrongMagic :: !(Range),modNm_Err_WrongMagic :: !(String),file_Err_WrongMagic :: !(String)}
         deriving ( Show)
-- ErrL --------------------------------------------------------
type ErrL = [Err]