on 267f708 help sign in
elk/src/Elm/Compiler.hs
194 lines 4.9 kB history raw
1{-# OPTIONS_GHC -Wall #-}
2module Elm.Compiler
3 ( version
4 , parseDependencies, Tag(..)
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
50data Tag
51 = Normal
52 | Effect
53 | Port
56parseDependencies :: String -> Either [Error] (Tag, PublicModule.Raw, [PublicModule.Raw])
57parseDependencies sourceCode =
58 let
59 (Result.Result _ _ answer) =
60 Parse.parse sourceCode Parse.header
62 getDeps (Module.Header sourceTag name _ _ _ imports) =
63 let
64 tag =
65 case sourceTag of
66 Module.Normal -> Normal
67 Module.Port _ -> Port
68 Module.Effect _ -> Effect
69 in
70 ( tag
71 , name
72 , map (fst . A.drop) imports
73 )
74 in
75 Result.answerToEither (Error . A.map Error.Syntax) getDeps answer
79-- COMPILATION
82{-| Compiles Elm source code to JavaScript. -}
83compile
84 :: Context
85 -> String
86 -> PublicModule.Interfaces
87 -> (Localizer, [Warning], Either [Error] Result)
89compile context source interfaces =
90 let
91 (Context packageName isExposed dependencies) =
92 context
94 (Result.Result oneLocalizer warnings answer) =
95 do modul <- Compile.compile packageName dependencies interfaces source
96 docs <- Result.format Error.Docs (docsGen isExposed modul)
98 let interface = Module.toInterface packageName modul
99 let javascript = JS.generate modul
101 return (Result docs interface javascript)
102 in
103 ( Result.oneToValue dummyLocalizer Localizer oneLocalizer
104 , Bag.toList Warning warnings
105 , Result.answerToEither Error id answer
106 )
109data Context = Context
110 { _packageName :: Package.Name
111 , _isExposed :: Bool
112 , _dependencies :: [PublicModule.Canonical]
113 }
116data Result = Result
117 { _docs :: Maybe Docs.Documentation
118 , _interface :: PublicModule.Interface
119 , _js :: LazyText.Text
120 }
123docsGen :: Bool -> Module.Optimized -> Docs.Result w (Maybe Docs.Documentation)
124docsGen isExposed (Module.Module name _ info) =
125 if not isExposed then
126 Result.ok Nothing
128 else
129 let
130 toDocs checked =
131 Just (Docs.fromCheckedDocs (ModuleName._module name) checked)
132 in
133 toDocs <$> Docs.check (Module.exports info) (Module.docs info)
137-- DEALIASER
140newtype Localizer =
141 Localizer RenderType.Localizer
144dummyLocalizer :: Localizer
145dummyLocalizer =
146 Localizer Map.empty
150-- ERRORS
153newtype Error =
154 Error (A.Located Error.Error)
157errorToString :: Localizer -> String -> String -> Error -> String
158errorToString (Localizer localizer) location source (Error (A.A region err)) =
159 Report.toString location region (Error.toReport localizer err) source
162printError :: Handle -> Localizer -> String -> String -> Error -> IO ()
163printError handle (Localizer localizer) location source (Error (A.A region err)) =
164 Report.toHandle handle location region (Error.toReport localizer err) source
167errorToJson :: Localizer -> String -> Error -> Json.Value
168errorToJson (Localizer localizer) location (Error err) =
169 Error.toJson localizer location err
173-- WARNINGS
176newtype Warning =
177 Warning (A.Located Warning.Warning)
180warningToString :: Localizer -> String -> String -> Warning -> String
181warningToString (Localizer localizer) location source (Warning (A.A region wrn)) =
182 Report.toString location region (Warning.toReport localizer wrn) source
185printWarning :: Handle -> Localizer -> String -> String -> Warning -> IO ()
186printWarning handle (Localizer localizer) location source (Warning (A.A region wrn)) =
187 Report.toHandle handle location region (Warning.toReport localizer wrn) source
190warningToJson :: Localizer -> String -> Warning -> Json.Value
191warningToJson (Localizer localizer) location (Warning wrn) =
192 Warning.toJson localizer location wrn