on ccbc53c help sign in
elk/compiler/src/Elm/Compiler.hs
97 lines 2.2 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Elm.Compiler
3 ( version
4 , Context(..)
5 , Compile.DocsFlag(..)
6 , Compile.Artifacts(..)
7 , compile
8 , Error.Error
9 , errorsToDoc
10 , errorsToJson
11 , Warning.Warning
12 )
13 where
16import qualified Data.ByteString as BS
17import qualified Data.Map as Map
18import qualified Data.Text as Text
20import qualified Compile
21import qualified Elm.Compiler.Module as M
22import qualified Elm.Compiler.Version
23import qualified Elm.Package as Pkg
24import qualified Json.Encode as Encode
25import qualified Reporting.Doc as D
26import qualified Reporting.Error as Error
27import qualified Reporting.Render.Code as Code
28import qualified Reporting.Region as Region
29import qualified Reporting.Report as Report
30import qualified Reporting.Result as Result
31import qualified Reporting.Warning as Warning
35-- VERSION
38version :: Pkg.Version
39version =
40 Elm.Compiler.Version.version
44-- COMPILE
47data Context =
48 Context
49 { _package :: Pkg.Name
50 , _docsFlag :: Compile.DocsFlag
51 , _imports :: Map.Map M.Raw M.Canonical
52 , _interfaces :: M.Interfaces
53 }
56compile :: Context -> BS.ByteString -> ([Warning.Warning], Either [Error.Error] Compile.Artifacts)
57compile (Context pkg docsFlag importDict interfaces) source =
58 Result.run $ Compile.compile docsFlag pkg importDict interfaces source
62-- ERRORS TO DOC
65errorsToDoc :: FilePath -> Text.Text -> [Error.Error] -> D.Doc
66errorsToDoc filePath source errors =
67 let
68 reports =
69 concatMap (Error.toReports (Code.toSource source)) errors
70 in
71 D.vcat $ map (Report.toDoc filePath) reports
75-- ERRORS TO JSON
78errorsToJson :: M.Raw -> FilePath -> Text.Text -> [Error.Error] -> Encode.Value
79errorsToJson moduleName filePath source errors =
80 let
81 reports =
82 concatMap (Error.toReports (Code.toSource source)) errors
83 in
84 Encode.object
85 [ ("path", Encode.text (Text.pack filePath))
86 , ("name", Encode.name moduleName)
87 , ("problems", Encode.array (map reportToJson reports))
88 ]
91reportToJson :: Report.Report -> Encode.Value
92reportToJson (Report.Report title region _sgstns message) =
93 Encode.object
94 [ ("title", Encode.text (Text.pack title))
95 , ("region", Region.encode region)
96 , ("message", D.encode message)
97 ]