on master help sign in
Add default imports during header parsing
4cdb58dEvan Czaplicki
src/Elm/Compiler/Imports.hs+58−31
@@ -1,51 +1,78 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2{-# LANGUAGE OverloadedStrings #-}
2{-# LANGUAGE OverloadedStrings #-}
3module Elm.Compiler.Imports
3module Elm.Compiler.Imports
4− ( Import(..)
4+ ( addDefaults
5− , Exposing(..)
6− , defaults
7 )
5 )
8 where
6 where
9
7
10
8
9+import qualified AST.Source as Src
11import qualified Elm.Name as N
10import qualified Elm.Name as N
11+import qualified Elm.Package as Pkg
12+import qualified Reporting.Annotation as A
13+import qualified Reporting.Region as R
12
14
13
15
14
16
15−-- IMPORTS
17+-- ADD DEFAULTS
16
18
17
19
18−data Import =
20+addDefaults :: Pkg.Name -> [Src.Import] -> [Src.Import]
19− Import
21+addDefaults pkgName imports =
20− { _name :: N.Name
22+ if pkgName == Pkg.core
21− , _alias :: Maybe N.Name
23+ then imports
22− , _exposing :: Exposing
24+ else defaults ++ imports
23− }
24−
25−
26−data Exposing
27− = Open
28− | Closed
29− | TypeOpen N.Name
30− | TypeClosed N.Name
31− | Operator N.Name
32
25
33
26
34
27
35-- DEFAULTS
28-- DEFAULTS
36
29
37
30
38−defaults :: [Import]
31+defaults :: [Src.Import]
39defaults =
32defaults =
40− [ Import "Basics" Nothing Open
33+ [ import_ "Basics" Nothing Src.Open
41− , Import "Debug" Nothing Closed
34+ , import_ "Debug" Nothing closed
42− , Import "List" Nothing (Operator "::")
35+ , import_ "List" Nothing (operator "::")
43− , Import "Maybe" Nothing (TypeOpen "Maybe")
36+ , import_ "Maybe" Nothing (typeOpen "Maybe")
44− , Import "Result" Nothing (TypeOpen "Result")
37+ , import_ "Result" Nothing (typeOpen "Result")
45− , Import "String" Nothing (TypeClosed "String")
38+ , import_ "String" Nothing (typeClosed "String")
46− , Import "Char" Nothing (TypeClosed "Char")
39+ , import_ "Char" Nothing (typeClosed "Char")
47− , Import "Tuple" Nothing Closed
40+ , import_ "Tuple" Nothing closed
48− , Import "Platform" Nothing (TypeClosed "Program")
41+ , import_ "Platform" Nothing (typeClosed "Program")
49− , Import "Platform.Cmd" (Just "Cmd") (TypeClosed "Cmd")
42+ , import_ "Platform.Cmd" (Just "Cmd") (typeClosed "Cmd")
50− , Import "Platform.Sub" (Just "Sub") (TypeClosed "Sub")
43+ , import_ "Platform.Sub" (Just "Sub") (typeClosed "Sub")
51− ]
44+ ]
45+
46+
47+import_ :: N.Name -> Maybe N.Name -> Src.Exposing -> Src.Import
48+import_ name maybeAlias exposing =
49+ Src.Import (A.At zero name) maybeAlias exposing
50+
51+
52+zero :: R.Region
53+zero =
54+ R.Region (R.Position 0 0) (R.Position 0 0)
55+
56+
57+
58+-- EXPOSING
59+
60+
61+closed :: Src.Exposing
62+closed =
63+ Src.Explicit []
64+
65+
66+typeOpen :: N.Name -> Src.Exposing
67+typeOpen name =
68+ Src.Explicit [ A.At zero (Src.Upper name Src.Public) ]
69+
70+
71+typeClosed :: N.Name -> Src.Exposing
72+typeClosed name =
73+ Src.Explicit [ A.At zero (Src.Upper name Src.Private) ]
74+
75+
76+operator :: N.Name -> Src.Exposing
77+operator op =
78+ Src.Explicit [ A.At zero (Src.Operator op) ]
src/Parse/Module.hs+5−3
@@ -12,7 +12,9 @@ import qualified Data.ByteString as B
12import Data.Text (Text)
12import Data.Text (Text)
13
13
14import qualified AST.Source as Src
14import qualified AST.Source as Src
15+import qualified Elm.Compiler.Imports as Imports
15import qualified Elm.Name as N
16import qualified Elm.Name as N
17+import qualified Elm.Package as Pkg
16import Parse.Primitives (Parser, oneOf)
18import Parse.Primitives (Parser, oneOf)
17import qualified Parse.Primitives as P
19import qualified Parse.Primitives as P
18import qualified Parse.Primitives.Keyword as Keyword
20import qualified Parse.Primitives.Keyword as Keyword
@@ -28,11 +30,11 @@ import qualified Reporting.Region as R
28-- MODULE
30-- MODULE
29
31
30
32
31−module_ :: Parser decls -> Parser (Src.Module decls)
33+module_ :: Pkg.Name -> Parser decls -> Parser (Src.Module decls)
32−module_ chompDecls =
34+module_ pkgName chompDecls =
33 do freshLine
35 do freshLine
34 header <- oneOf [ Just <$> chompHeader, return Nothing ]
36 header <- oneOf [ Just <$> chompHeader, return Nothing ]
35− imports <- chompImports []
37+ imports <- Imports.addDefaults pkgName <$> chompImports []
36 decls <- chompDecls
38 decls <- chompDecls
37 return (Src.Module header imports decls)
39 return (Src.Module header imports decls)
38
40
src/Parse/Parse.hs+7−19
@@ -25,8 +25,14 @@ import qualified Validate
25program :: Pkg.Name -> B.ByteString -> Result.Result i w Error.Error Valid.Module
25program :: Pkg.Name -> B.ByteString -> Result.Result i w Error.Error Valid.Module
26program pkg src =
26program pkg src =
27 let
27 let
28+ bodyParser =
29+ if Pkg.isKernel pkg then
30+ chompDeclarations =<< chompInfixes []
31+ else
32+ chompDeclarations []
33+
28 parser =
34 parser =
29− if Pkg.isKernel pkg then fancyParser else normalParser
35+ Module.module_ pkg bodyParser <* P.endOfFile
30 in
36 in
31 case P.run parser src of
37 case P.run parser src of
32 Right modul ->
38 Right modul ->
@@ -37,24 +43,6 @@ program pkg src =
37
43
38
44
39
45
40−-- CHOMP PROGRAMS
41−
42−
43−normalParser :: P.Parser (Src.Module [Src.Decl])
44−normalParser =
45− do srcModule <- Module.module_ (chompDeclarations [])
46− P.endOfFile
47− return srcModule
48−
49−
50−fancyParser :: P.Parser (Src.Module [Src.Decl])
51−fancyParser =
52− do srcModule <- Module.module_ (chompDeclarations =<< chompInfixes [])
53− P.endOfFile
54− return srcModule
55−
56−
57−
58-- CHOMP DECLARATIONS
46-- CHOMP DECLARATIONS
59
47
60
48