on master help sign in
Switch to reporting errors with [Doc] for prettier layout.
ce357b3Evan Czaplicki
compiler/Initialize.hs+20−19
@@ -2,41 +2,42 @@ module Initialize (buildFromSource, getSortedModuleNames) where
2
2
3import Control.Applicative ((<$>))
3import Control.Applicative ((<$>))
4import Control.Monad.Error
4import Control.Monad.Error
5−import Data.List (lookup,nub)
5+import Data.List (nub)
6import qualified Data.Map as Map
6import qualified Data.Map as Map
7import Data.Data
7import Data.Data
8−import SourceSyntax.Everything
9import Data.List (intercalate,partition)
8import Data.List (intercalate,partition)
9+import System.Exit
10+import System.FilePath
11+import Text.PrettyPrint (Doc)
12+
10import Parse.Parser (parseProgram, parseDependencies)
13import Parse.Parser (parseProgram, parseDependencies)
14+import SourceSyntax.Everything
11import qualified Metadata.Libraries as Libs
15import qualified Metadata.Libraries as Libs
12import qualified Transform.Optimize as Optimize
16import qualified Transform.Optimize as Optimize
13import qualified Transform.Check as Check
17import qualified Transform.Check as Check
14−import System.Exit
18+import qualified Type.Inference as TI
15−import System.FilePath
19+import qualified Type.Type as T
16
20
17
21
18−unify = undefined
19−hints = undefined
20
22
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)
23checkMistakes modul@(Module name ex im decls) =
24checkMistakes modul@(Module name ex im decls) =
24 case Check.mistakes decls of
25 case Check.mistakes decls of
25 [] -> return modul
26 [] -> return modul
26− ms -> Left (unlines ms)
27+ ms -> Left ms
28+
29+-- subs `seq` return (Optimize.optimize (renameModule modul))
27
30
28−checkTypes :: (Data t, Data v) => Module t v -> Either String (Module t v)
31+buildFromSource :: (Data t, Data v) => Bool -> String -> Either [Doc] (Module t v, Map.Map String T.Variable)
29−checkTypes modul =
32+buildFromSource noPrelude src = do
30− do subs <- unify hints modul
33+ modul <- parseProgram src
31− subs `seq` return (Optimize.optimize (renameModule modul))
32
34
33−check :: (Data t, Data v) => Module t v -> Either String (Module t v)
35+ -- check for structural errors and give all variables unique names
34−check = checkMistakes >=> checkTypes
36+ modul' <- renameModule <$> checkMistakes modul
37+ -- reorder AST into strongly connected components
35
38
36−buildFromSource :: (Data t, Data v) => Bool -> String -> Either String (Module t v)
39+ types <- TI.infer modul'
37−buildFromSource noPrelude src =
40+ return (modul', types)
38− let add = if noPrelude then id else Libs.addPrelude in
39− (check . add) =<< parseProgram src
40
41
41getSortedModuleNames :: FilePath -> IO [String]
42getSortedModuleNames :: FilePath -> IO [String]
42getSortedModuleNames root =
43getSortedModuleNames root =
compiler/Transform/Check.hs+6−2
@@ -8,11 +8,15 @@ import qualified Data.Map as Map
8import qualified Data.Set as Set
8import qualified Data.Set as Set
9import Data.Data
9import Data.Data
10import Data.Generics.Uniplate.Data
10import Data.Generics.Uniplate.Data
11+import Text.PrettyPrint as P
11
12
12
13
13−mistakes :: (Data t, Data v) => [Declaration t v] -> [String]
14+mistakes :: (Data t, Data v) => [Declaration t v] -> [Doc]
14mistakes decls =
15mistakes decls =
16+ map prettify $ concatMap findErrors (getLets decls)
17+ where
18+ prettify = P.sep . map P.text . words
15− concatMap (\defs -> duplicates defs ++ badOrder defs) (getLets decls)
19+ findErrors defs = duplicates defs ++ badOrder defs
16
20
17
21
18getLets :: (Data t, Data v) => [Declaration t v] -> [[Def t v]]
22getLets :: (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
14import Control.Monad.State
14import Control.Monad.State
15import Transform.SortDefinitions as Sort
15import Transform.SortDefinitions as Sort
16
16
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.
17
19
18−infer :: Module t v -> IO (Either [Doc] (Map.Map String T.Variable))
20+infer :: Module t v -> Either [Doc] (Map.Map String T.Variable)
19−infer (Module _ _ _ decls) = do
21+infer (Module _ _ _ decls) = unsafePerformIO $ do
20 env <- Env.initialEnvironment
22 env <- Env.initialEnvironment
21 var <- T.flexibleVar
23 var <- T.flexibleVar
22 let expr = sortDefs (TcDecl.toExpr decls)
24 let expr = sortDefs (TcDecl.toExpr decls)