on 7feccac help sign in
elk/compiler/src/Elm/Compiler.hs
99 lines 2.5 kB history raw
1{-# LANGUAGE OverloadedStrings #-}
2module Elm.Compiler
3 ( Compile.Artifacts(..)
4 , compile
5 , Error.Error
6 , errorsToDoc
7 , errorsToJson
8 , Warning.Warning
9 )
10 where
13import qualified Data.ByteString as BS
14import qualified Data.Map as Map
15import qualified Data.Name as Name
16import qualified Data.Utf8 as Utf8
18import qualified Compile
19import qualified Elm.Interface as I
20import qualified Elm.ModuleName as ModuleName
21import qualified Elm.Package as Pkg
22import qualified Json.Encode as E
23import Json.Encode ((==>))
24import qualified Reporting.Annotation as A
25import qualified Reporting.Doc as D
26import qualified Reporting.Error as Error
27import qualified Reporting.Render.Code as Code
28import qualified Reporting.Report as Report
29import qualified Reporting.Result as Result
30import qualified Reporting.Warning as Warning
34-- COMPILE
37compile
38 :: Pkg.Name
39 -> Map.Map ModuleName.Raw ModuleName.Canonical
40 -> I.Interfaces
41 -> BS.ByteString
42 -> ( [Warning.Warning], Either [Error.Error] Compile.Artifacts )
43compile pkg importDict interfaces source =
44 Result.run $ Compile.compile pkg importDict interfaces source
48-- ERRORS TO DOC
51errorsToDoc :: FilePath -> String -> [Error.Error] -> D.Doc
52errorsToDoc filePath source errors =
53 let
54 reports =
55 concatMap (Error.toReports (Code.toSource source)) errors
56 in
57 D.vcat $ map (Report.toDoc filePath) reports
61-- ERRORS TO JSON
64errorsToJson :: ModuleName.Raw -> FilePath -> String -> [Error.Error] -> E.Value
65errorsToJson moduleName filePath source errors =
66 let
67 reports =
68 concatMap (Error.toReports (Code.toSource source)) errors
69 in
70 E.object
71 [ "path" ==> E.string (Utf8.fromChars filePath)
72 , "name" ==> E.string (Name.toUtf8 moduleName)
73 , "problems" ==> E.array (map reportToJson reports)
74 ]
77reportToJson :: Report.Report -> E.Value
78reportToJson (Report.Report title region _sgstns message) =
79 E.object
80 [ "title" ==> E.string (Utf8.fromChars title)
81 , "region" ==> encodeRegion region
82 , "message" ==> D.encode message
83 ]
86encodeRegion :: A.Region -> E.Value
87encodeRegion (A.Region (A.Position sr sc) (A.Position er ec)) =
88 E.object
89 [ "start" ==>
90 E.object
91 [ ("line", E.int (fromIntegral sr))
92 , ("column", E.int (fromIntegral sc))
93 ]
94 , "end" ==>
95 E.object
96 [ ("line", E.int (fromIntegral er))
97 , ("column", E.int (fromIntegral ec))
98 ]
99 ]