on master help sign in
Switch to reporting errors with [Doc] for prettier layout.
commitce357b3d0dcaca94ed85f4721b7a39893440a498 authorEvan Czaplicki <evan@Evans-MacBook-Air.local> dateTue 16 Jul 2013, 14:52 (13 years ago) parent1c9da4b
3 files changed+30−23
compiler/Initialize.hs+20−19 compiler/Transform/Check.hs+6−2 compiler/Type/Inference.hs+4−2
compiler/Initialize.hs+20−19
@@ -2,41 +2,42 @@ module Initialize (buildFromSource, getSortedModuleNames) where
22
33import Control.Applicative ((<$>))
44import Control.Monad.Error
5−import Data.List (lookup,nub)
5+import Data.List (nub)
66import qualified Data.Map as Map
77import Data.Data
8−import SourceSyntax.Everything
98import Data.List (intercalate,partition)
9+import System.Exit
10+import System.FilePath
11+import Text.PrettyPrint (Doc)
12+
1013import Parse.Parser (parseProgram, parseDependencies)
14+import SourceSyntax.Everything
1115import qualified Metadata.Libraries as Libs
1216import qualified Transform.Optimize as Optimize
1317import qualified Transform.Check as Check
14−import System.Exit
15−import System.FilePath
18+import qualified Type.Inference as TI
19+import qualified Type.Type as T
1620
1721
18−unify = undefined
19−hints = undefined
2022
21−
22−checkMistakes :: (Data t, Data v) => Module t v -> Either String (Module t v)
23+checkMistakes :: (Data t, Data v) => Module t v -> Either [Doc] (Module t v)
2324checkMistakes modul@(Module name ex im decls) =
2425 case Check.mistakes decls of
2526 [] -> return modul
26− ms -> Left (unlines ms)
27+ ms -> Left ms
28+
29+-- subs `seq` return (Optimize.optimize (renameModule modul))
2730
28−checkTypes :: (Data t, Data v) => Module t v -> Either String (Module t v)
29−checkTypes modul =
30− do subs <- unify hints modul
31− subs `seq` return (Optimize.optimize (renameModule modul))
31+buildFromSource :: (Data t, Data v) => Bool -> String -> Either [Doc] (Module t v, Map.Map String T.Variable)
32+buildFromSource noPrelude src = do
33+ modul <- parseProgram src
3234
33−check :: (Data t, Data v) => Module t v -> Either String (Module t v)
34−check = checkMistakes >=> checkTypes
35+ -- check for structural errors and give all variables unique names
36+ modul' <- renameModule <$> checkMistakes modul
37+ -- reorder AST into strongly connected components
3538
36−buildFromSource :: (Data t, Data v) => Bool -> String -> Either String (Module t v)
37−buildFromSource noPrelude src =
38− let add = if noPrelude then id else Libs.addPrelude in
39− (check . add) =<< parseProgram src
39+ types <- TI.infer modul'
40+ return (modul', types)
4041
4142getSortedModuleNames :: FilePath -> IO [String]
4243getSortedModuleNames root =
compiler/Transform/Check.hs+6−2
@@ -8,11 +8,15 @@ import qualified Data.Map as Map
88import qualified Data.Set as Set
99import Data.Data
1010import Data.Generics.Uniplate.Data
11+import Text.PrettyPrint as P
1112
1213
13−mistakes :: (Data t, Data v) => [Declaration t v] -> [String]
14+mistakes :: (Data t, Data v) => [Declaration t v] -> [Doc]
1415mistakes decls =
15− concatMap (\defs -> duplicates defs ++ badOrder defs) (getLets decls)
16+ map prettify $ concatMap findErrors (getLets decls)
17+ where
18+ prettify = P.sep . map P.text . words
19+ findErrors defs = duplicates defs ++ badOrder defs
1620
1721
1822getLets :: (Data t, Data v) => [Declaration t v] -> [[Def t v]]
compiler/Type/Inference.hs+4−2
@@ -14,9 +14,11 @@ import qualified Type.State as TS
1414import Control.Monad.State
1515import Transform.SortDefinitions as Sort
1616
17+import System.IO.Unsafe -- Possible to switch over to the ST monad instead of
18+ -- the IO monad. Not sure if that'd be worthwhile.
1719
18−infer :: Module t v -> IO (Either [Doc] (Map.Map String T.Variable))
19−infer (Module _ _ _ decls) = do
20+infer :: Module t v -> Either [Doc] (Map.Map String T.Variable)
21+infer (Module _ _ _ decls) = unsafePerformIO $ do
2022 env <- Env.initialEnvironment
2123 var <- T.flexibleVar
2224 let expr = sortDefs (TcDecl.toExpr decls)