git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Extract errors module
commite8e150c4e7d4c71facfa07d618ead03c636b2e5b authorGary Burgess <gary.burgess@gmail.com> dateSat 29 Mar 2014, 15:42 (13 years ago) parente4f4281
6 files changed+103−73
purescript.cabal+1 src/Language/PureScript/Errors.hs+98 src/Language/PureScript/TypeChecker.hs+1 src/Language/PureScript/TypeChecker/Kinds.hs+1 src/Language/PureScript/TypeChecker/Monad.hs+1−73 src/Language/PureScript/TypeChecker/Types.hs+1
purescript.cabal+1
@@ -30,6 +30,7 @@ library
3030 Language.PureScript.Options
3131 Language.PureScript.Declarations
3232 Language.PureScript.Environment
33+ Language.PureScript.Errors
3334 Language.PureScript.Kinds
3435 Language.PureScript.Names
3536 Language.PureScript.Types
src/Language/PureScript/Errors.hsnew file+98
@@ -0,0 +1,98 @@
1+-----------------------------------------------------------------------------
2+--
3+-- Module : Language.PureScript.Error
4+-- Copyright : (c) 2013-14 Phil Freeman, (c) 2014 Gary Burgess, and other contributors
5+-- License : MIT
6+--
7+-- Maintainer : Phil Freeman <paf31@cantab.net>
8+-- Stability : experimental
9+-- Portability :
10+--
11+-- |
12+--
13+-----------------------------------------------------------------------------
14+
15+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
16+
17+module Language.PureScript.Errors where
18+
19+import Data.List (intercalate)
20+import Data.Monoid
21+
22+import Control.Monad.Error
23+
24+import Language.PureScript.Declarations
25+import Language.PureScript.Options
26+import Language.PureScript.Pretty
27+import Language.PureScript.Types
28+
29+-- |
30+-- Type for sources of type checking errors
31+--
32+data UnifyErrorSource
33+ -- |
34+ -- An error which originated at a Value
35+ --
36+ = ValueError Value
37+ -- |
38+ -- An error which originated at a Type
39+ --
40+ | TypeError Type deriving (Show)
41+
42+-- |
43+-- Unification errors
44+--
45+data UnifyError = UnifyError {
46+ -- |
47+ -- Error message
48+ --
49+ unifyErrorMessage :: String
50+ -- |
51+ -- The value where the error occurred
52+ --
53+ , unifyErrorValue :: Maybe UnifyErrorSource
54+ -- |
55+ -- Optional source position information
56+ --
57+ , unifyErrorPosition :: Maybe SourcePos
58+ } deriving (Show)
59+
60+-- |
61+-- A stack trace for an error
62+--
63+newtype UnifyErrorStack = UnifyErrorStack { runUnifyErrorStack :: [UnifyError] } deriving (Show, Monoid)
64+
65+instance Error UnifyErrorStack where
66+ strMsg s = UnifyErrorStack [UnifyError s Nothing Nothing]
67+ noMsg = UnifyErrorStack []
68+
69+prettyPrintUnifyErrorStack :: Options -> UnifyErrorStack -> String
70+prettyPrintUnifyErrorStack opts (UnifyErrorStack es) =
71+ case mconcat $ map (Last . unifyErrorPosition) es of
72+ Last (Just sourcePos) -> "Error at " ++ show sourcePos ++ ": \n" ++ prettyPrintUnifyErrorStack'
73+ _ -> prettyPrintUnifyErrorStack'
74+ where
75+ prettyPrintUnifyErrorStack' :: String
76+ prettyPrintUnifyErrorStack'
77+ | optionsVerboseErrors opts =
78+ intercalate "\n" (map showError (filter isErrorNonEmpty es))
79+ | otherwise =
80+ let
81+ es' = filter isErrorNonEmpty es
82+ in case length es' of
83+ 1 -> showError (head es')
84+ _ -> showError (head es') ++ "\n" ++ showError (last es')
85+
86+isErrorNonEmpty :: UnifyError -> Bool
87+isErrorNonEmpty = not . null . unifyErrorMessage
88+
89+showError :: UnifyError -> String
90+showError (UnifyError msg Nothing _) = msg
91+showError (UnifyError msg (Just (ValueError val)) _) = "Error in value " ++ prettyPrintValue val ++ "\n" ++ msg
92+showError (UnifyError msg (Just (TypeError ty)) _) = "Error in type " ++ prettyPrintType ty ++ "\n" ++ msg
93+
94+mkUnifyErrorStack :: String -> Maybe UnifyErrorSource -> UnifyErrorStack
95+mkUnifyErrorStack msg t = UnifyErrorStack [UnifyError msg t Nothing]
96+
97+positionError :: SourcePos -> UnifyErrorStack
98+positionError pos = UnifyErrorStack [UnifyError "" Nothing (Just pos)]
src/Language/PureScript/TypeChecker.hs+1
@@ -37,6 +37,7 @@ import Language.PureScript.Kinds
3737import Language.PureScript.Declarations
3838import Language.PureScript.TypeClassDictionaries
3939import Language.PureScript.Environment
40+import Language.PureScript.Errors
4041
4142addDataType :: ModuleName -> ProperName -> [String] -> [(ProperName, [Type])] -> Kind -> Check ()
4243addDataType moduleName name args dctors ctorKind = do
src/Language/PureScript/TypeChecker/Kinds.hs+1
@@ -28,6 +28,7 @@ import Language.PureScript.Names
2828import Language.PureScript.TypeChecker.Monad
2929import Language.PureScript.Pretty
3030import Language.PureScript.Environment
31+import Language.PureScript.Errors
3132
3233import Control.Monad.State
3334import Control.Monad.Error
src/Language/PureScript/TypeChecker/Monad.hs+1−73
@@ -24,8 +24,8 @@ import Language.PureScript.Names
2424import Language.PureScript.Declarations
2525import Language.PureScript.Environment
2626import Language.PureScript.TypeClassDictionaries
27−import Language.PureScript.Pretty
2827import Language.PureScript.Options
28+import Language.PureScript.Errors
2929
3030import Data.Maybe
3131import Data.Monoid
@@ -36,78 +36,6 @@ import Control.Monad.Error
3636import Control.Monad.Unify
3737
3838import qualified Data.Map as M
39−import Data.List (intercalate)
40−
41−-- |
42−-- Type for sources of type checking errors
43−--
44−data UnifyErrorSource
45− -- |
46− -- An error which originated at a Value
47− --
48− = ValueError Value
49− -- |
50− -- An error which originated at a Type
51− --
52− | TypeError Type deriving (Show)
53−
54−-- |
55−-- Unification errors
56−--
57−data UnifyError = UnifyError {
58− -- |
59− -- Error message
60− --
61− unifyErrorMessage :: String
62− -- |
63− -- The value where the error occurred
64− --
65− , unifyErrorValue :: Maybe UnifyErrorSource
66− -- |
67− -- Optional source position information
68− --
69− , unifyErrorPosition :: Maybe SourcePos
70− } deriving (Show)
71−
72−-- |
73−-- A stack trace for an error
74−--
75−newtype UnifyErrorStack = UnifyErrorStack { runUnifyErrorStack :: [UnifyError] } deriving (Show, Monoid)
76−
77−instance Error UnifyErrorStack where
78− strMsg s = UnifyErrorStack [UnifyError s Nothing Nothing]
79− noMsg = UnifyErrorStack []
80−
81−prettyPrintUnifyErrorStack :: Options -> UnifyErrorStack -> String
82−prettyPrintUnifyErrorStack opts (UnifyErrorStack es) =
83− case mconcat $ map (Last . unifyErrorPosition) es of
84− Last (Just sourcePos) -> "Error at " ++ show sourcePos ++ ": \n" ++ prettyPrintUnifyErrorStack'
85− _ -> prettyPrintUnifyErrorStack'
86− where
87− prettyPrintUnifyErrorStack' :: String
88− prettyPrintUnifyErrorStack'
89− | optionsVerboseErrors opts =
90− intercalate "\n" (map showError (filter isErrorNonEmpty es))
91− | otherwise =
92− let
93− es' = filter isErrorNonEmpty es
94− in case length es' of
95− 1 -> showError (head es')
96− _ -> showError (head es') ++ "\n" ++ showError (last es')
97−
98−isErrorNonEmpty :: UnifyError -> Bool
99−isErrorNonEmpty = not . null . unifyErrorMessage
100−
101−showError :: UnifyError -> String
102−showError (UnifyError msg Nothing _) = msg
103−showError (UnifyError msg (Just (ValueError val)) _) = "Error in value " ++ prettyPrintValue val ++ "\n" ++ msg
104−showError (UnifyError msg (Just (TypeError ty)) _) = "Error in type " ++ prettyPrintType ty ++ "\n" ++ msg
105−
106−mkUnifyErrorStack :: String -> Maybe UnifyErrorSource -> UnifyErrorStack
107−mkUnifyErrorStack msg t = UnifyErrorStack [UnifyError msg t Nothing]
108−
109−positionError :: SourcePos -> UnifyErrorStack
110−positionError pos = UnifyErrorStack [UnifyError "" Nothing (Just pos)]
11139
11240-- |
11341-- Temporarily bind a collection of names to values
src/Language/PureScript/TypeChecker/Types.hs+1
@@ -59,6 +59,7 @@ import Language.PureScript.TypeChecker.Kinds
5959import Language.PureScript.TypeChecker.Synonyms
6060import Language.PureScript.Pretty
6161import Language.PureScript.Environment
62+import Language.PureScript.Errors
6263import qualified Language.PureScript.Constants as C
6364
6465import Control.Monad.State