on 856ac59 help sign in
elk/src/Elm/Compiler.hs
177 lines 4.6 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version
4 , parseDependencies
5 , compile, Context(..), Result(..)
6 , Localizer, dummyLocalizer
7 , Error, errorToString, errorToJson, printError
8 , Warning, warningToString, warningToJson, printWarning
9 )
10 where
12import qualified Data.Aeson as Json
13import qualified Data.Map as Map
14import System.IO (Handle)
16import qualified AST.Module as Module
17import qualified AST.Module.Name as ModuleName
18import qualified Compile
19import qualified Docs.Check as Docs
20import qualified Elm.Compiler.Version
21import qualified Elm.Compiler.Module as PublicModule
22import qualified Elm.Docs as Docs
23import qualified Elm.Package as Package
24import qualified Generate.JavaScript as JS
25import qualified Parse.Module as Parse
26import qualified Parse.Parse as Parse
27import qualified Reporting.Annotation as A
28import qualified Reporting.Bag as Bag
29import qualified Reporting.Error as Error
30import qualified Reporting.Render.Type as RenderType
31import qualified Reporting.Report as Report
32import qualified Reporting.Result as Result
33import qualified Reporting.Warning as Warning
37-- VERSION
40version :: Package.Version
41version =
42 Elm.Compiler.Version.version
46-- DEPENDENCIES
49parseDependencies :: String -> Either [Error] (PublicModule.Raw, [PublicModule.Raw])
50parseDependencies sourceCode =
51 let
52 (Result.Result _ _ answer) =
53 Parse.parse sourceCode Parse.header
55 getDeps (Module.Header _ name _ _ _ imports) =
56 ( name, map (fst . A.drop) imports )
57 in
58 Result.answerToEither (Error . A.map Error.Syntax) getDeps answer
62-- COMPILATION
65{-| Compiles Elm source code to JavaScript. -}
66compile
67 :: Context
68 -> String
69 -> PublicModule.Interfaces
70 -> (Localizer, [Warning], Either [Error] Result)
72compile context source interfaces =
73 let
74 (Context packageName isExposed dependencies) =
75 context
77 (Result.Result oneLocalizer warnings answer) =
78 do modul <- Compile.compile packageName dependencies interfaces source
79 docs <- Result.format Error.Docs (docsGen isExposed modul)
81 let interface = Module.toInterface packageName modul
82 let javascript = JS.generate modul
84 return (Result docs interface javascript)
85 in
86 ( Result.oneToValue dummyLocalizer Localizer oneLocalizer
87 , Bag.toList Warning warnings
88 , Result.answerToEither Error id answer
89 )
92data Context = Context
93 { _packageName :: Package.Name
94 , _isExposed :: Bool
95 , _dependencies :: [PublicModule.Canonical]
96 }
99data Result = Result
100 { _docs :: Maybe Docs.Documentation
101 , _interface :: PublicModule.Interface
102 , _js :: String
103 }
106docsGen :: Bool -> Module.Optimized -> Docs.Result w (Maybe Docs.Documentation)
107docsGen isExposed (Module.Module name _ info) =
108 if not isExposed then
109 Result.ok Nothing
111 else
112 let
113 toDocs checked =
114 Just (Docs.fromCheckedDocs (ModuleName._module name) checked)
115 in
116 toDocs <$> Docs.check (Module.exports info) (Module.docs info)
120-- DEALIASER
123newtype Localizer =
124 Localizer RenderType.Localizer
127dummyLocalizer :: Localizer
128dummyLocalizer =
129 Localizer Map.empty
133-- ERRORS
136newtype Error =
137 Error (A.Located Error.Error)
140errorToString :: Localizer -> String -> String -> Error -> String
141errorToString (Localizer localizer) location source (Error (A.A region err)) =
142 Report.toString location region (Error.toReport localizer err) source
145printError :: Handle -> Localizer -> String -> String -> Error -> IO ()
146printError handle (Localizer localizer) location source (Error (A.A region err)) =
147 Report.toHandle handle location region (Error.toReport localizer err) source
150errorToJson :: Localizer -> String -> Error -> Json.Value
151errorToJson (Localizer localizer) location (Error err) =
152 Error.toJson localizer location err
156-- WARNINGS
159newtype Warning =
160 Warning (A.Located Warning.Warning)
163warningToString :: Localizer -> String -> String -> Warning -> String
164warningToString (Localizer localizer) location source (Warning (A.A region wrn)) =
165 Report.toString location region (Warning.toReport localizer wrn) source
168printWarning :: Handle -> Localizer -> String -> String -> Warning -> IO ()
169printWarning handle (Localizer localizer) location source (Warning (A.A region wrn)) =
170 Report.toHandle handle location region (Warning.toReport localizer wrn) source
173warningToJson :: Localizer -> String -> Warning -> Json.Value
174warningToJson (Localizer localizer) location (Warning wrn) =
175 Warning.toJson localizer location wrn