on 4f04eb5 help sign in
elk/src/Elm/Compiler.hs
178 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 qualified Data.Text.Lazy as LazyText
15import System.IO (Handle)
17import qualified AST.Module as Module
18import qualified AST.Module.Name as ModuleName
19import qualified Compile
20import qualified Docs.Check as Docs
21import qualified Elm.Compiler.Version
22import qualified Elm.Compiler.Module as PublicModule
23import qualified Elm.Docs as Docs
24import qualified Elm.Package as Package
25import qualified Generate.JavaScript as JS
26import qualified Parse.Module as Parse
27import qualified Parse.Parse as Parse
28import qualified Reporting.Annotation as A
29import qualified Reporting.Bag as Bag
30import qualified Reporting.Error as Error
31import qualified Reporting.Render.Type as RenderType
32import qualified Reporting.Report as Report
33import qualified Reporting.Result as Result
34import qualified Reporting.Warning as Warning
38-- VERSION
41version :: Package.Version
42version =
43 Elm.Compiler.Version.version
47-- DEPENDENCIES
50parseDependencies :: String -> Either [Error] (PublicModule.Raw, [PublicModule.Raw])
51parseDependencies sourceCode =
52 let
53 (Result.Result _ _ answer) =
54 Parse.parse sourceCode Parse.header
56 getDeps (Module.Header _ name _ _ _ imports) =
57 ( name, map (fst . A.drop) imports )
58 in
59 Result.answerToEither (Error . A.map Error.Syntax) getDeps answer
63-- COMPILATION
66{-| Compiles Elm source code to JavaScript. -}
67compile
68 :: Context
69 -> String
70 -> PublicModule.Interfaces
71 -> (Localizer, [Warning], Either [Error] Result)
73compile context source interfaces =
74 let
75 (Context packageName isExposed dependencies) =
76 context
78 (Result.Result oneLocalizer warnings answer) =
79 do modul <- Compile.compile packageName dependencies interfaces source
80 docs <- Result.format Error.Docs (docsGen isExposed modul)
82 let interface = Module.toInterface packageName modul
83 let javascript = JS.generate modul
85 return (Result docs interface javascript)
86 in
87 ( Result.oneToValue dummyLocalizer Localizer oneLocalizer
88 , Bag.toList Warning warnings
89 , Result.answerToEither Error id answer
90 )
93data Context = Context
94 { _packageName :: Package.Name
95 , _isExposed :: Bool
96 , _dependencies :: [PublicModule.Canonical]
97 }
100data Result = Result
101 { _docs :: Maybe Docs.Documentation
102 , _interface :: PublicModule.Interface
103 , _js :: LazyText.Text
104 }
107docsGen :: Bool -> Module.Optimized -> Docs.Result w (Maybe Docs.Documentation)
108docsGen isExposed (Module.Module name _ info) =
109 if not isExposed then
110 Result.ok Nothing
112 else
113 let
114 toDocs checked =
115 Just (Docs.fromCheckedDocs (ModuleName._module name) checked)
116 in
117 toDocs <$> Docs.check (Module.exports info) (Module.docs info)
121-- DEALIASER
124newtype Localizer =
125 Localizer RenderType.Localizer
128dummyLocalizer :: Localizer
129dummyLocalizer =
130 Localizer Map.empty
134-- ERRORS
137newtype Error =
138 Error (A.Located Error.Error)
141errorToString :: Localizer -> String -> String -> Error -> String
142errorToString (Localizer localizer) location source (Error (A.A region err)) =
143 Report.toString location region (Error.toReport localizer err) source
146printError :: Handle -> Localizer -> String -> String -> Error -> IO ()
147printError handle (Localizer localizer) location source (Error (A.A region err)) =
148 Report.toHandle handle location region (Error.toReport localizer err) source
151errorToJson :: Localizer -> String -> Error -> Json.Value
152errorToJson (Localizer localizer) location (Error err) =
153 Error.toJson localizer location err
157-- WARNINGS
160newtype Warning =
161 Warning (A.Located Warning.Warning)
164warningToString :: Localizer -> String -> String -> Warning -> String
165warningToString (Localizer localizer) location source (Warning (A.A region wrn)) =
166 Report.toString location region (Warning.toReport localizer wrn) source
169printWarning :: Handle -> Localizer -> String -> String -> Warning -> IO ()
170printWarning handle (Localizer localizer) location source (Warning (A.A region wrn)) =
171 Report.toHandle handle location region (Warning.toReport localizer wrn) source
174warningToJson :: Localizer -> String -> Warning -> Json.Value
175warningToJson (Localizer localizer) location (Warning wrn) =
176 Warning.toJson localizer location wrn