on master help sign in
Start localizing the types printed out by the REPL
commitacb86628c9b52a5311e7036e0341b7431d6f7d35 authorEvan Czaplicki <evancz@users.noreply.github.com> dateWed 18 Apr 2018, 18:36 (9 years ago) parent0551bff
6 files changed+87−25
builder/src/Elm/Project.hs+4−3 builder/src/Generate/Output.hs+10−3 compiler/src/Parse/Module.hs+1 compiler/src/Parse/Repl.hs+29−2 compiler/src/Reporting/Render/Type/Localizer.hs+20 ui/terminal/src/Repl.hs+23−17
builder/src/Elm/Project.hs+4−3
@@ -26,6 +26,7 @@ import qualified File.Compile as Compile
2626import qualified File.Crawl as Crawl
2727import qualified File.Plan as Plan
2828import qualified Generate.Output as Output
29+import qualified Reporting.Render.Type.Localizer as L
2930import qualified Reporting.Task as Task
3031import qualified Stuff.Paths as Path
3132
@@ -70,15 +71,15 @@ compile mode target maybeOutput docs summary@(Summary.Summary root project _ _ _
7071-- COMPILE FOR REPL
7172
7273
73−compileForRepl :: BS.ByteString -> Maybe N.Name -> Task.Task (Maybe FilePath)
74−compileForRepl source maybeName =
74+compileForRepl :: L.Localizer -> BS.ByteString -> Maybe N.Name -> Task.Task (Maybe FilePath)
75+compileForRepl localizer source maybeName =
7576 do summary@(Summary.Summary root project _ _ _) <- getRoot
7677 graph <- Crawl.crawlFromSource summary source
7778 (dirty, ifaces) <- Plan.plan Nothing summary graph
7879 answers <- Compile.compile project Nothing ifaces dirty
7980 results <- Artifacts.write root answers
8081 let (Compiler.Artifacts elmi _ _) = results ! "Elm_Repl"
81− traverse (Output.generateReplFile summary graph elmi) maybeName
82+ traverse (Output.generateReplFile localizer summary graph elmi) maybeName
8283
8384
8485
builder/src/Generate/Output.hs+10−3
@@ -40,6 +40,7 @@ import qualified Generate.Nitpick as Nitpick
4040import qualified Generate.JavaScript.Mode as Mode
4141import qualified Reporting.Exit as Exit
4242import qualified Reporting.Exit.Make as E
43+import qualified Reporting.Render.Type.Localizer as L
4344import qualified Reporting.Task as Task
4445import qualified Stuff.Paths as Paths
4546import Terminal.Args (Parser(..))
@@ -143,13 +144,19 @@ generateMonolith mode maybeOutput (Summary.Summary _ project _ _ _) graph rootNa
143144-- GENERATE REPL MONOLITH
144145
145146
146−generateReplFile :: Summary.Summary -> Crawl.Result -> I.Interface -> N.Name -> Task.Task FilePath
147−generateReplFile summary@(Summary.Summary _ project _ _ _) graph iface name =
147+generateReplFile
148+ :: L.Localizer
149+ -> Summary.Summary
150+ -> Crawl.Result
151+ -> I.Interface
152+ -> N.Name
153+ -> Task.Task FilePath
154+generateReplFile localizer summary@(Summary.Summary _ project _ _ _) graph iface name =
148155 do
149156 objectGraph <- organize summary graph
150157
151158 let home = Module.Canonical (Project.getName project) "Elm_Repl"
152− let builder = Obj.generateForRepl True objectGraph iface home name
159+ let builder = Obj.generateForRepl True localizer objectGraph iface home name
153160
154161 liftIO $ IO.writeBuilder (Paths.temp "js") $
155162 replRecovery <> "(function(){\n'use strict';" <> Functions.functions <> builder <> "}());"
compiler/src/Parse/Module.hs+1
@@ -4,6 +4,7 @@ module Parse.Module
44 ( module_
55 , chompImports
66 , freshLine
7+ , exposing
78 )
89 where
910
compiler/src/Parse/Repl.hs+29−2
@@ -13,6 +13,7 @@ import Data.Text (Text)
1313
1414import qualified AST.Source as Src
1515import qualified Elm.Name as N
16+import qualified Parse.Module as Module
1617import Parse.Primitives
1718import qualified Parse.Primitives.Keyword as Keyword
1819import qualified Parse.Primitives.Symbol as Symbol
@@ -26,7 +27,7 @@ import qualified Reporting.Annotation as A
2627
2728
2829data Entry
29− = Import N.Name Text
30+ = Import N.Name (Maybe N.Name) Src.Exposing Text
3031 | Type N.Name Text
3132 | Def (Maybe N.Name) Text
3233 | Other Text
@@ -58,7 +59,9 @@ entryParser source =
5859 [ do Keyword.import_
5960 spaces
6061 name <- Var.moduleName
61− return (Import name source)
62+ alias <- tryAlias
63+ exposing <- tryExposing
64+ return (Import name alias exposing source)
6265
6366 , do Keyword.port_
6467 return Port
@@ -99,3 +102,27 @@ chompArgs =
99102 , do Symbol.equals
100103 return ()
101104 ]
105+
106+
107+tryAlias :: Parser (Maybe N.Name)
108+tryAlias =
109+ oneOf
110+ [ try $
111+ do spaces
112+ Keyword.as_
113+ spaces
114+ Just <$> Var.upper
115+ , return Nothing
116+ ]
117+
118+
119+tryExposing :: Parser Src.Exposing
120+tryExposing =
121+ oneOf
122+ [ try $
123+ do spaces
124+ Keyword.exposing_
125+ spaces
126+ Module.exposing
127+ , return (Src.Explicit [])
128+ ]
compiler/src/Reporting/Render/Type/Localizer.hs+20
@@ -6,6 +6,8 @@ module Reporting.Render.Type.Localizer
66 , empty
77 , fromNames
88 , fromModule
9+ , replEmpty
10+ , replAdd
911 )
1012 where
1113
@@ -15,7 +17,9 @@ import qualified Data.Set as Set
1517
1618import qualified AST.Source as Src
1719import qualified AST.Valid as Valid
20+import qualified Elm.Compiler.Imports as Imports
1821import qualified Elm.Name as N
22+import qualified Elm.Package as Pkg
1923import Reporting.Doc ((<>))
2024import qualified Reporting.Doc as D
2125import qualified Reporting.Annotation as A
@@ -110,3 +114,19 @@ addType (A.At _ exposed) types =
110114 Src.Lower _ -> types
111115 Src.Upper name _ -> Set.insert name types
112116 Src.Operator _ -> types
117+
118+
119+
120+-- REPL STUFF
121+
122+
123+replEmpty :: Localizer
124+replEmpty =
125+ Localizer $ Map.fromList $ map toPair $
126+ Imports.addDefaults Pkg.dummyName []
127+
128+
129+replAdd :: N.Name -> Maybe N.Name -> Src.Exposing -> Localizer -> Localizer
130+replAdd name alias exposing (Localizer localizer) =
131+ Localizer $ Map.insert name (Import alias (toExposing exposing)) localizer
132+
ui/terminal/src/Repl.hs+23−17
@@ -34,6 +34,7 @@ import Reporting.Doc ((<+>))
3434import qualified Reporting.Doc as D
3535import qualified Reporting.Task as Task
3636import qualified Reporting.Progress.Repl as Repl
37+import qualified Reporting.Render.Type.Localizer as L
3738
3839
3940
@@ -53,7 +54,7 @@ run () (Flags maybeAlternateInterpreter) =
5354 printWelcomeMessage
5455 settings <- initSettings
5556 let manager = Repl.runInputT settings (Repl.withInterrupt loop)
56− (exitCode,_,_) <- RWS.runRWST manager interpreter initalState
57+ (exitCode,_,_) <- RWS.runRWST manager interpreter initialState
5758 Exit.exitWith exitCode
5859
5960
@@ -107,7 +108,7 @@ eval input =
107108 return (Just Exit.ExitSuccess)
108109
109110 Reset ->
110− do RWS.put initalState
111+ do RWS.put initialState
111112 report "<reset>"
112113
113114 Help info ->
@@ -115,10 +116,14 @@ eval input =
115116
116117 Code entry ->
117118 Repl.handleInterrupt (report "<cancelled>") $
118− do state@(State _ imports types defs tricks) <- RWS.get
119+ do state@(State _ imports types defs tricks localizer) <- RWS.get
119120 case entry of
120− Elm.Import name src ->
121− interpret None $ state { _imports = Map.insert name src imports }
121+ Elm.Import name alias exposing src ->
122+ interpret None $
123+ state
124+ { _imports = Map.insert name src imports
125+ , _localizer = L.replAdd name alias exposing localizer
126+ }
122127
123128 Elm.Type name src ->
124129 interpret None $ state { _types = Map.insert name src types }
@@ -217,16 +222,17 @@ data State =
217222 , _types :: Map.Map N.Name Text.Text
218223 , _defs :: Map.Map N.Name Text.Text
219224 , _tricks :: [Text.Text]
225+ , _localizer :: L.Localizer
220226 }
221227
222228
223−initalState :: State
224−initalState =
225− State 0 Map.empty Map.empty Map.empty []
229+initialState :: State
230+initialState =
231+ State 0 Map.empty Map.empty Map.empty [] L.replEmpty
226232
227233
228234compile :: Output -> State -> Task.Task (Maybe FilePath)
229−compile output (State count imports types defs tricks) =
235+compile output (State count imports types defs tricks localizer) =
230236 let
231237 elmSourceCode =
232238 (<>) "module Elm_Repl exposing (..)\n\n" $
@@ -236,12 +242,12 @@ compile output (State count imports types defs tricks) =
236242 case output of
237243 None ->
238244 if Map.null types && Map.null defs && null tricks then
239− evaluate (elmSourceCode <> "unit = ()") Nothing
245+ evaluate localizer (elmSourceCode <> "unit = ()") Nothing
240246 else
241− evaluate elmSourceCode Nothing
247+ evaluate localizer elmSourceCode Nothing
242248
243249 Def name ->
244− evaluate elmSourceCode (Just name)
250+ evaluate localizer elmSourceCode (Just name)
245251
246252 Expr expr ->
247253 let
@@ -249,7 +255,7 @@ compile output (State count imports types defs tricks) =
249255 text = Text.replace "\n" "\n " expr
250256 def = N.toBuilder name <> " =\n " <> Text.encodeUtf8Builder text <> "\n"
251257 in
252− evaluate (elmSourceCode <> def) (Just name)
258+ evaluate localizer (elmSourceCode <> def) (Just name)
253259
254260
255261addLines :: Map.Map N.Name Text.Text -> B.Builder -> B.Builder
@@ -257,9 +263,9 @@ addLines dict builder =
257263 Map.foldr (\text b -> Text.encodeUtf8Builder text <> "\n" <> b) builder dict
258264
259265
260−evaluate :: B.Builder -> Maybe N.Name -> Task.Task (Maybe FilePath)
261−evaluate builder maybeName =
262− Project.compileForRepl (LBS.toStrict (B.toLazyByteString builder)) maybeName
266+evaluate :: L.Localizer -> B.Builder -> Maybe N.Name -> Task.Task (Maybe FilePath)
267+evaluate localizer builder maybeName =
268+ Project.compileForRepl localizer (LBS.toStrict (B.toLazyByteString builder)) maybeName
263269
264270
265271
@@ -279,7 +285,7 @@ initSettings =
279285
280286lookupCompletions :: String -> Runner [Repl.Completion]
281287lookupCompletions string =
282− do (State _ imports types defs _) <- RWS.get
288+ do (State _ imports types defs _ _) <- RWS.get
283289 return $
284290 addMatches string False defs $
285291 addMatches string False types $