on master help sign in
Add default imports during header parsing
commit4cdb58d885fe0da9cd42b746418df8617a0d7f3b authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 24 Jan 2018, 18:18 (9 years ago) parentc5c6b2d
3 files changed+70−53
src/Elm/Compiler/Imports.hs+58−31 src/Parse/Module.hs+5−3 src/Parse/Parse.hs+7−19
src/Elm/Compiler/Imports.hs+58−31
@@ -1,51 +1,78 @@
11{-# OPTIONS_GHC -Wall #-}
22{-# LANGUAGE OverloadedStrings #-}
33module Elm.Compiler.Imports
4− ( Import(..)
5− , Exposing(..)
6− , defaults
4+ ( addDefaults
75 )
86 where
97
108
9+import qualified AST.Source as Src
1110import 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
1214
1315
1416
15−-- IMPORTS
17+-- ADD DEFAULTS
1618
1719
18−data Import =
19− Import
20− { _name :: N.Name
21− , _alias :: Maybe N.Name
22− , _exposing :: Exposing
23− }
24−
25−
26−data Exposing
27− = Open
28− | Closed
29− | TypeOpen N.Name
30− | TypeClosed N.Name
31− | Operator N.Name
20+addDefaults :: Pkg.Name -> [Src.Import] -> [Src.Import]
21+addDefaults pkgName imports =
22+ if pkgName == Pkg.core
23+ then imports
24+ else defaults ++ imports
3225
3326
3427
3528-- DEFAULTS
3629
3730
38−defaults :: [Import]
31+defaults :: [Src.Import]
3932defaults =
40− [ Import "Basics" Nothing Open
41− , Import "Debug" Nothing Closed
42− , Import "List" Nothing (Operator "::")
43− , Import "Maybe" Nothing (TypeOpen "Maybe")
44− , Import "Result" Nothing (TypeOpen "Result")
45− , Import "String" Nothing (TypeClosed "String")
46− , Import "Char" Nothing (TypeClosed "Char")
47− , Import "Tuple" Nothing Closed
48− , Import "Platform" Nothing (TypeClosed "Program")
49− , Import "Platform.Cmd" (Just "Cmd") (TypeClosed "Cmd")
50− , Import "Platform.Sub" (Just "Sub") (TypeClosed "Sub")
51− ]
33+ [ import_ "Basics" Nothing Src.Open
34+ , import_ "Debug" Nothing closed
35+ , import_ "List" Nothing (operator "::")
36+ , import_ "Maybe" Nothing (typeOpen "Maybe")
37+ , import_ "Result" Nothing (typeOpen "Result")
38+ , import_ "String" Nothing (typeClosed "String")
39+ , import_ "Char" Nothing (typeClosed "Char")
40+ , import_ "Tuple" Nothing closed
41+ , import_ "Platform" Nothing (typeClosed "Program")
42+ , import_ "Platform.Cmd" (Just "Cmd") (typeClosed "Cmd")
43+ , import_ "Platform.Sub" (Just "Sub") (typeClosed "Sub")
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
1212import Data.Text (Text)
1313
1414import qualified AST.Source as Src
15+import qualified Elm.Compiler.Imports as Imports
1516import qualified Elm.Name as N
17+import qualified Elm.Package as Pkg
1618import Parse.Primitives (Parser, oneOf)
1719import qualified Parse.Primitives as P
1820import qualified Parse.Primitives.Keyword as Keyword
@@ -28,11 +30,11 @@ import qualified Reporting.Region as R
2830-- MODULE
2931
3032
31−module_ :: Parser decls -> Parser (Src.Module decls)
32−module_ chompDecls =
33+module_ :: Pkg.Name -> Parser decls -> Parser (Src.Module decls)
34+module_ pkgName chompDecls =
3335 do freshLine
3436 header <- oneOf [ Just <$> chompHeader, return Nothing ]
35− imports <- chompImports []
37+ imports <- Imports.addDefaults pkgName <$> chompImports []
3638 decls <- chompDecls
3739 return (Src.Module header imports decls)
3840
src/Parse/Parse.hs+7−19
@@ -25,8 +25,14 @@ import qualified Validate
2525program :: Pkg.Name -> B.ByteString -> Result.Result i w Error.Error Valid.Module
2626program pkg src =
2727 let
28+ bodyParser =
29+ if Pkg.isKernel pkg then
30+ chompDeclarations =<< chompInfixes []
31+ else
32+ chompDeclarations []
33+
2834 parser =
29− if Pkg.isKernel pkg then fancyParser else normalParser
35+ Module.module_ pkg bodyParser <* P.endOfFile
3036 in
3137 case P.run parser src of
3238 Right modul ->
@@ -37,24 +43,6 @@ program pkg src =
3743
3844
3945
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−
5846-- CHOMP DECLARATIONS
5947
6048