on de2dbe0 help sign in
elk/compiler/src/Elm/Compiler.hs
105 lines 2.5 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Elm.Compiler
3 ( version
4 , Context(..)
5 , Compile.Artifacts(..)
6 , compile
7 , Error.Error
8 , errorsToDoc
9 , errorsToJson
10 , Warning.Warning
11 )
12 where
15import qualified Data.ByteString as BS
16import qualified Data.Map as Map
17import qualified Data.Text as Text
18import qualified Text.PrettyPrint.ANSI.Leijen as P
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.Error as Error
26import qualified Reporting.Helpers as H
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 , _exposed :: Bool
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 exposed importDict interfaces) source =
58 let
59 docsFlag =
60 if exposed then Compile.YesDocs else Compile.NoDocs
61 in
62 Result.run $ Compile.compile docsFlag pkg importDict interfaces source
66-- ERRORS TO DOC
69errorsToDoc :: FilePath -> Text.Text -> [Error.Error] -> H.Doc
70errorsToDoc filePath source errors =
71 let
72 reports =
73 concatMap (Error.toReports (Code.toSource source) Map.empty) errors
74 in
75 H.vcat $ map (Report.toDoc filePath) reports
79-- ERRORS TO JSON
82errorsToJson :: M.Raw -> FilePath -> Text.Text -> [Error.Error] -> Encode.Value
83errorsToJson moduleName filePath source errors =
84 let
85 reports =
86 concatMap (Error.toReports (Code.toSource source) Map.empty) errors
87 in
88 Encode.object
89 [ ("path", Encode.text (Text.pack filePath))
90 , ("name", Encode.name moduleName)
91 , ("errors", Encode.array (map reportToJson reports))
92 ]
95reportToJson :: Report.Report -> Encode.Value
96reportToJson (Report.Report title region _sgstns message) =
97 let
98 messageString =
99 P.displayS (P.renderPretty 1 80 message) ""
100 in
101 Encode.object
102 [ ("title", Encode.text (Text.pack title))
103 , ("region", Region.encode region)
104 , ("message", Encode.text (Text.pack messageString))
105 ]