on master help sign in
Convert Canonicalization phase from String to Text
e53128cEvan Czaplicki
src/Canonicalize.hs+33−25
@@ -7,6 +7,8 @@ import qualified Data.Map as Map
7import qualified Data.Maybe as Maybe
7import qualified Data.Maybe as Maybe
8import qualified Data.Set as Set
8import qualified Data.Set as Set
9import qualified Data.Foldable as T
9import qualified Data.Foldable as T
10+import qualified Data.Text as Text
11+import Data.Text (Text)
10
12
11import Elm.Utils ((|>))
13import Elm.Utils ((|>))
12
14
@@ -78,7 +80,7 @@ module' allCanonicalImports interfaces modul =
78 canonicalDecls
80 canonicalDecls
79
81
80 centralizedDocs =
82 centralizedDocs =
81− A.map (fmap (Docs.centralize canonicalDecls)) docs
83+ fmap (A.map (Docs.centralize canonicalDecls)) docs
82
84
83 typeToPair (A.A _ (D.Type name args body)) =
85 typeToPair (A.A _ (D.Type name args body)) =
84 ( name, (args, body) )
86 ( name, (args, body) )
@@ -88,7 +90,7 @@ module' allCanonicalImports interfaces modul =
88 in
90 in
89 do program <- Result.mapError Error.Canonicalize getProgram
91 do program <- Result.mapError Error.Canonicalize getProgram
90 canonicalImports <- filterImports uses imports
92 canonicalImports <- filterImports uses imports
91− Result.accumulate (Result.One (Env.toDealiaser env)) $
93+ Result.accumulate (Result.One (Env.toLocalizer env)) $
92 modul {
94 modul {
93 Module.info =
95 Module.info =
94 Module.Info
96 Module.Info
@@ -164,7 +166,7 @@ resolveExports fullList (Var.Listing partialList open) =
164 <*> allUnique partialList
166 <*> allUnique partialList
165
167
166
168
167−getValueExport :: [String] -> Set.Set String -> A.Located String -> CResult Var.Value
169+getValueExport :: [Text] -> Set.Set Text -> A.Located Text -> CResult Var.Value
168getValueExport allValues allValuesSet (A.A region name) =
170getValueExport allValues allValuesSet (A.A region name) =
169 if Set.member name allValuesSet then
171 if Set.member name allValuesSet then
170 Result.ok (Var.Value name)
172 Result.ok (Var.Value name)
@@ -172,7 +174,7 @@ getValueExport allValues allValuesSet (A.A region name) =
172 manyNotFound region [name] allValues
174 manyNotFound region [name] allValues
173
175
174
176
175−getAliasExport :: [String] -> [String] -> [String] -> A.Located String -> CResult [Var.Value]
177+getAliasExport :: [Text] -> [Text] -> [Text] -> A.Located Text -> CResult [Var.Value]
176getAliasExport allValues allAliases adtTypes (A.A region alias) =
178getAliasExport allValues allAliases adtTypes (A.A region alias) =
177 if alias `elem` allAliases then
179 if alias `elem` allAliases then
178
180
@@ -189,9 +191,9 @@ getAliasExport allValues allAliases adtTypes (A.A region alias) =
189
191
190
192
191getAdtExport
193getAdtExport
192− :: [(String, Var.Listing String)]
194+ :: [(Text, Var.Listing Text)]
193− -> [String]
195+ -> [Text]
194− -> A.Located (String, Var.Listing String)
196+ -> A.Located (Text, Var.Listing Text)
195 -> CResult Var.Value
197 -> CResult Var.Value
196getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
198getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
197 case List.lookup name allAdts of
199 case List.lookup name allAdts of
@@ -209,21 +211,25 @@ getAdtExport allAdts adtTypes (A.A region (name, Var.Listing ctors open)) =
209 manyNotFound region unfoundCtors allCtors
211 manyNotFound region unfoundCtors allCtors
210
212
211
213
212−manyNotFound :: Region.Region -> [String] -> [String] -> CResult a
214+manyNotFound :: Region.Region -> [Text] -> [Text] -> CResult a
213manyNotFound region nameList possibilities =
215manyNotFound region nameList possibilities =
214 Result.throwMany (map (notFound region possibilities) nameList)
216 Result.throwMany (map (notFound region possibilities) nameList)
215
217
216
218
217−notFound :: Region.Region -> [String] -> String -> A.Located CError.Error
219+notFound :: Region.Region -> [Text] -> Text -> A.Located CError.Error
218−notFound region possibilities name =
220+notFound region possibilities badName =
221+ let
222+ badNameString =
223+ Text.unpack badName
224+ in
219− A.A region $ CError.Export name $
225+ A.A region $ CError.Export badNameString $
220− ErrorHelp.nearbyNames id name possibilities
226+ ErrorHelp.nearbyNames id badNameString (map Text.unpack possibilities)
221
227
222
228
223allUnique :: [A.Located Var.Value] -> CResult ()
229allUnique :: [A.Located Var.Value] -> CResult ()
224allUnique statedExports =
230allUnique statedExports =
225 let
231 let
226− valueToString value =
232+ valueToText value =
227 case value of
233 case value of
228 Var.Value name -> name
234 Var.Value name -> name
229 Var.Alias name -> name
235 Var.Alias name -> name
@@ -235,7 +241,7 @@ allUnique statedExports =
235 isUnique value allRegions =
241 isUnique value allRegions =
236 case allRegions of
242 case allRegions of
237 region : _ : _ ->
243 region : _ : _ ->
238− Result.throw region (CError.DuplicateExport (valueToString value))
244+ Result.throw region (CError.DuplicateExport (valueToText value))
239
245
240 _ ->
246 _ ->
241 Result.ok ()
247 Result.ok ()
@@ -284,7 +290,7 @@ maybeUnzip3 tuples =
284
290
285splitValue
291splitValue
286 :: Var.Value
292 :: Var.Value
287− -> ( Maybe String, Maybe String, Maybe (String, Var.Listing String) )
293+ -> ( Maybe Text, Maybe Text, Maybe (Text, Var.Listing Text) )
288splitValue value =
294splitValue value =
289 case value of
295 case value of
290 Var.Value name ->
296 Var.Value name ->
@@ -300,9 +306,9 @@ splitValue value =
300splitLocatedValue
306splitLocatedValue
301 :: A.Located Var.Value
307 :: A.Located Var.Value
302 ->
308 ->
303− ( Maybe (A.Located String)
309+ ( Maybe (A.Located Text)
304− , Maybe (A.Located String)
310+ , Maybe (A.Located Text)
305− , Maybe (A.Located (String, Var.Listing String))
311+ , Maybe (A.Located (Text, Var.Listing Text))
306 )
312 )
307splitLocatedValue (A.A region value) =
313splitLocatedValue (A.A region value) =
308 case value of
314 case value of
@@ -414,7 +420,9 @@ canonicalizeExpr env (A.A region validExpr) =
414 C.Var <$> Canon.variable region env x
420 C.Var <$> Canon.variable region env x
415
421
416 Src.Ctor name exprs ->
422 Src.Ctor name exprs ->
423+ C.Ctor
424+ <$> Canon.variable region env name
417− C.Ctor name <$> traverse go exprs
425+ <*> traverse go exprs
418
426
419 Src.List exprs ->
427 Src.List exprs ->
420 C.List <$> traverse go exprs
428 C.List <$> traverse go exprs
@@ -433,8 +441,8 @@ canonicalizeExpr env (A.A region validExpr) =
433
441
434canonicalizeFields
442canonicalizeFields
435 :: Env.Env
443 :: Env.Env
436− -> (A.Located String, Src.ValidExpr)
444+ -> (A.Located Text, Src.ValidExpr)
437− -> CResult (String, C.Expr)
445+ -> CResult (Text, C.Expr)
438canonicalizeFields env (A.A _ key, expr) =
446canonicalizeFields env (A.A _ key, expr) =
439 (\value -> (key, value)) <$> canonicalizeExpr env expr
447 (\value -> (key, value)) <$> canonicalizeExpr env expr
440
448
@@ -462,8 +470,8 @@ canonicalizePattern env (A.A region ptrn) =
462 P.Alias x p ->
470 P.Alias x p ->
463 P.Alias x <$> canonicalizePattern env p
471 P.Alias x <$> canonicalizePattern env p
464
472
465− P.Data (Var.Raw name) patterns ->
473+ P.Ctor (Var.Raw name) patterns ->
466− P.Data
474+ P.Ctor
467 <$> Canon.pvar region env name (length patterns)
475 <$> Canon.pvar region env name (length patterns)
468 <*> traverse (canonicalizePattern env) patterns
476 <*> traverse (canonicalizePattern env) patterns
469
477
@@ -475,7 +483,7 @@ canonicalizePattern env (A.A region ptrn) =
475canonicalizeBinop
483canonicalizeBinop
476 :: Region.Region
484 :: Region.Region
477 -> Env.Env
485 -> Env.Env
478− -> [(Src.ValidExpr, A.Located String)]
486+ -> [(Src.ValidExpr, A.Located Text)]
479 -> Src.ValidExpr
487 -> Src.ValidExpr
480 -> CResult C.Expr'
488 -> CResult C.Expr'
481canonicalizeBinop region env srcOps srcLast =
489canonicalizeBinop region env srcOps srcLast =
@@ -490,7 +498,7 @@ canonicalizeBinop region env srcOps srcLast =
490 A.drop <$> Binops.flatten region expr ops
498 A.drop <$> Binops.flatten region expr ops
491
499
492
500
493−binopHelp :: Env.Env -> (Src.ValidExpr, A.Located String) -> CResult (C.Expr, Binops.Op)
501+binopHelp :: Env.Env -> (Src.ValidExpr, A.Located Text) -> CResult (C.Expr, Binops.Op)
494binopHelp env (expr, op) =
502binopHelp env (expr, op) =
495 (,)
503 (,)
496 <$> canonicalizeExpr env expr
504 <$> canonicalizeExpr env expr
src/Canonicalize/Binops.hs+2−1
@@ -3,6 +3,7 @@ module Canonicalize.Binops ( Op(..), canonicalize, flatten ) where
3
3
4import Prelude hiding (last)
4import Prelude hiding (last)
5import qualified Data.Map as Map
5import qualified Data.Map as Map
6+import Data.Text (Text)
6
7
7import AST.Declaration (Assoc(..))
8import AST.Declaration (Assoc(..))
8import qualified AST.Expression.Canonical as C
9import qualified AST.Expression.Canonical as C
@@ -28,7 +29,7 @@ data Op =
28 }
29 }
29
30
30
31
31−canonicalize :: Env.Env -> A.Located String -> Var.Result Op
32+canonicalize :: Env.Env -> A.Located Text -> Var.Result Op
32canonicalize env (A.A region op) =
33canonicalize env (A.A region op) =
33 do name <- Var.variable region env op
34 do name <- Var.variable region env op
34 let (assoc, prec) = Map.findWithDefault (L, 9) name (Env._infixes env)
35 let (assoc, prec) = Map.findWithDefault (L, 9) name (Env._infixes env)
src/Canonicalize/Body.hs+15−9
@@ -1,7 +1,10 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module Canonicalize.Body (flatten) where
3module Canonicalize.Body (flatten) where
3
4
4import qualified Data.Maybe as Maybe
5import qualified Data.Maybe as Maybe
6+import qualified Data.Text as Text
7+import Data.Text (Text)
5
8
6import qualified AST.Declaration as Decl
9import qualified AST.Declaration as Decl
7import qualified AST.Effects as Effects
10import qualified AST.Effects as Effects
@@ -51,7 +54,7 @@ unionToDefs moduleName (A.A (region,_) (Decl.Type name tvars constructors)) =
51 tagToDef (tag, tipes) =
54 tagToDef (tag, tipes) =
52 let
55 let
53 vars =
56 vars =
54− take (length tipes) infiniteArgs
57+ generateArgs (length tipes) []
55
58
56 tbody =
59 tbody =
57 Type.App
60 Type.App
@@ -60,7 +63,7 @@ unionToDefs moduleName (A.A (region,_) (Decl.Type name tvars constructors)) =
60
63
61 body =
64 body =
62 A.A region $
65 A.A region $
63− C.Ctor tag (map (A.A region . C.localVar) vars)
66+ C.Ctor (Var.fromModule moduleName tag) (map (A.A region . C.localVar) vars)
64 in
67 in
65 definition tag (buildFunction vars body) region (foldr Type.Lambda tbody tipes)
68 definition tag (buildFunction vars body) region (foldr Type.Lambda tbody tipes)
66 in
69 in
@@ -82,7 +85,7 @@ aliasToDefs moduleName (A.A (region,_) (Decl.Type name tvars tipe)) =
82 map snd fields
85 map snd fields
83
86
84 vars =
87 vars =
85− take (length args) infiniteArgs
88+ generateArgs (length args) []
86
89
87 record =
90 record =
88 A.A region $
91 A.A region $
@@ -94,12 +97,15 @@ aliasToDefs moduleName (A.A (region,_) (Decl.Type name tvars tipe)) =
94 Nothing
97 Nothing
95
98
96
99
97−infiniteArgs :: [String]
100+generateArgs :: Int -> [Text] -> [Text]
98−infiniteArgs =
101+generateArgs n args =
99− map (:[]) ['a'..'z'] ++ map (\n -> "_" ++ show (n :: Int)) [1..]
102+ if n == 0 then
103+ args
104+ else
105+ generateArgs (n - 1) (Text.pack ('v' : show n) : args)
100
106
101
107
102−buildFunction :: [String] -> C.Expr -> C.Expr
108+buildFunction :: [Text] -> C.Expr -> C.Expr
103buildFunction vars body@(A.A ann _) =
109buildFunction vars body@(A.A ann _) =
104 foldr
110 foldr
105 (\pattern expr -> A.A ann (C.Lambda pattern expr))
111 (\pattern expr -> A.A ann (C.Lambda pattern expr))
@@ -107,7 +113,7 @@ buildFunction vars body@(A.A ann _) =
107 (map (A.A ann . P.Var) vars)
113 (map (A.A ann . P.Var) vars)
108
114
109
115
110−definition :: String -> C.Expr -> Region -> Type.Canonical -> C.Def
116+definition :: Text -> C.Expr -> Region -> Type.Canonical -> C.Def
111definition name expr@(A.A ann _) region tipe =
117definition name expr@(A.A ann _) region tipe =
112 C.Def
118 C.Def
113 region
119 region
@@ -165,7 +171,7 @@ portToDef (A.A (region, _) (Effects.PortCanonical name kind tipe)) =
165 definition name (A.A region (toPortExpr name kind)) region tipe
171 definition name (A.A region (toPortExpr name kind)) region tipe
166
172
167
173
168−toPortExpr :: String -> Effects.Kind -> C.Expr'
174+toPortExpr :: Text -> Effects.Kind -> C.Expr'
169toPortExpr name kind =
175toPortExpr name kind =
170 case kind of
176 case kind of
171 Effects.Outgoing tipe ->
177 Effects.Outgoing tipe ->
src/Canonicalize/Effects.hs+6−5
@@ -1,7 +1,8 @@
1module Canonicalize.Effects (canonicalize, toValues, checkPortType) where
1module Canonicalize.Effects (canonicalize, toValues, checkPortType) where
2
2
3import qualified Data.Foldable as F
3import qualified Data.Foldable as F
4−import qualified Data.Traversable as T
4+import qualified Data.Text as Text
5+import Data.Text (Text)
5
6
6import qualified AST.Effects as Effects
7import qualified AST.Effects as Effects
7import qualified AST.Type as T
8import qualified AST.Type as T
@@ -46,7 +47,7 @@ canonicalize env effects =
46 Result.ok (Effects.Manager (Env.getPackage env) info)
47 Result.ok (Effects.Manager (Env.getPackage env) info)
47
48
48 Effects.Port rawPorts ->
49 Effects.Port rawPorts ->
49− Effects.Port <$> T.traverse (canonicalizeRawPort env) rawPorts
50+ Effects.Port <$> traverse (canonicalizeRawPort env) rawPorts
50
51
51
52
52canonicalizeRawPort
53canonicalizeRawPort
@@ -59,7 +60,7 @@ canonicalizeRawPort env (A.A ann (Effects.PortRaw name rawType)) =
59 Result.ok (A.A ann (Effects.PortCanonical name kind tipe))
60 Result.ok (A.A ann (Effects.PortCanonical name kind tipe))
60
61
61
62
62−figureOutKind :: R.Region -> String -> T.Canonical -> Result Effects.Kind
63+figureOutKind :: R.Region -> Text -> T.Canonical -> Result Effects.Kind
63figureOutKind region name rootType =
64figureOutKind region name rootType =
64 case T.deepDealias rootType of
65 case T.deepDealias rootType of
65 T.Lambda outgoingType (T.App (T.Type effect) [T.Var _])
66 T.Lambda outgoingType (T.App (T.Type effect) [T.Var _])
@@ -76,9 +77,9 @@ figureOutKind region name rootType =
76 Result.throw region (Error.BadPort name rootType)
77 Result.throw region (Error.BadPort name rootType)
77
78
78
79
79−makeError :: R.Region -> String -> T.Canonical -> Maybe String -> A.Located Error.Error
80+makeError :: R.Region -> Text -> T.Canonical -> Maybe String -> A.Located Error.Error
80makeError region name tipe maybeMessage =
81makeError region name tipe maybeMessage =
81− A.A region (Error.port name tipe maybeMessage)
82+ A.A region (Error.port (Text.unpack name) tipe maybeMessage)
82
83
83
84
84
85
src/Canonicalize/Environment.hs+21−16
@@ -1,11 +1,12 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module Canonicalize.Environment
3module Canonicalize.Environment
3 ( Env(..)
4 ( Env(..)
4 , getPackage
5 , getPackage
5 , insert
6 , insert
6 , Patch(..), fromPatches, addPattern
7 , Patch(..), fromPatches, addPattern
7 , builtinPatches
8 , builtinPatches
8− , toDealiaser
9+ , toLocalizer
9 )
10 )
10 where
11 where
11
12
@@ -13,6 +14,8 @@ import qualified Data.List as List
13import qualified Data.Map as Map
14import qualified Data.Map as Map
14import qualified Data.Maybe as Maybe
15import qualified Data.Maybe as Maybe
15import qualified Data.Set as Set
16import qualified Data.Set as Set
17+import qualified Data.Text as Text
18+import Data.Text (Text)
16
19
17import qualified AST.Declaration as Decl
20import qualified AST.Declaration as Decl
18import qualified AST.Module.Name as ModuleName
21import qualified AST.Module.Name as ModuleName
@@ -20,6 +23,7 @@ import qualified AST.Pattern as P
20import qualified AST.Type as Type
23import qualified AST.Type as Type
21import qualified AST.Variable as Var
24import qualified AST.Variable as Var
22import qualified Elm.Package as Pkg
25import qualified Elm.Package as Pkg
26+import qualified Reporting.Render.Type as RT
23
27
24
28
25
29
@@ -30,14 +34,14 @@ data Env = Env
30 { _home :: ModuleName.Canonical
34 { _home :: ModuleName.Canonical
31 , _values :: Dict Var.Canonical
35 , _values :: Dict Var.Canonical
32 , _unions :: Dict Var.Canonical
36 , _unions :: Dict Var.Canonical
33− , _aliases :: Dict (Var.Canonical, [String], Type.Canonical)
37+ , _aliases :: Dict (Var.Canonical, [Text], Type.Canonical)
34 , _patterns :: Dict (Var.Canonical, Int)
38 , _patterns :: Dict (Var.Canonical, Int)
35 , _infixes :: Map.Map Var.Canonical (Decl.Assoc, Int)
39 , _infixes :: Map.Map Var.Canonical (Decl.Assoc, Int)
36 }
40 }
37
41
38
42
39type Dict a =
43type Dict a =
40− Map.Map String (Set.Set a)
44+ Map.Map Text (Set.Set a)
41
45
42
46
43fromPatches :: ModuleName.Canonical -> [Patch] -> Env
47fromPatches :: ModuleName.Canonical -> [Patch] -> Env
@@ -64,10 +68,10 @@ getPackage env =
64
68
65
69
66data Patch
70data Patch
67− = Value String Var.Canonical
71+ = Value Text Var.Canonical
68− | Union String Var.Canonical
72+ | Union Text Var.Canonical
69− | Alias String (Var.Canonical, [String], Type.Canonical)
73+ | Alias Text (Var.Canonical, [Text], Type.Canonical)
70− | Pattern String (Var.Canonical, Int)
74+ | Pattern Text (Var.Canonical, Int)
71 | Infix Var.Canonical Decl.Assoc Int
75 | Infix Var.Canonical Decl.Assoc Int
72
76
73
77
@@ -99,7 +103,7 @@ addPatch patch env =
99 env { _infixes = Map.insert name (assoc, prec) (_infixes env) }
103 env { _infixes = Map.insert name (assoc, prec) (_infixes env) }
100
104
101
105
102−insert :: (Ord a) => String -> a -> Dict a -> Dict a
106+insert :: (Ord a) => Text -> a -> Dict a -> Dict a
103insert key value =
107insert key value =
104 Map.insertWith Set.union key (Set.singleton value)
108 Map.insertWith Set.union key (Set.singleton value)
105
109
@@ -128,29 +132,29 @@ builtinPatches =
128 tuples =
132 tuples =
129 map toTuple [0..9]
133 map toTuple [0..9]
130
134
131− toTuple :: Int -> (String, Int)
135+ toTuple :: Int -> (Text, Int)
132 toTuple n =
136 toTuple n =
133− ("_Tuple" ++ show n, n)
137+ ( Text.pack ("_Tuple" ++ show n), n )
134
138
135
139
136
140
137-- TO TYPE DEALIASER
141-- TO TYPE DEALIASER
138
142
139
143
140−toDealiaser :: Env -> Map.Map String String
144+toLocalizer :: Env -> RT.Localizer
141−toDealiaser (Env _ _ unions aliases _ _) =
145+toLocalizer (Env _ _ unions aliases _ _) =
142 let
146 let
143 dealiasUnion (localName, canonicalSet) =
147 dealiasUnion (localName, canonicalSet) =
144 case Set.toList canonicalSet of
148 case Set.toList canonicalSet of
145 [canonicalName] ->
149 [canonicalName] ->
146− Just (Var.toString canonicalName, localName)
150+ Just (canonicalName, localName)
147 _ ->
151 _ ->
148 Nothing
152 Nothing
149
153
150 dealiasAlias (localName, canonicalSet) =
154 dealiasAlias (localName, canonicalSet) =
151 case Set.toList canonicalSet of
155 case Set.toList canonicalSet of
152 [(canonicalName,_,_)] ->
156 [(canonicalName,_,_)] ->
153− Just (Var.toString canonicalName, localName)
157+ Just (canonicalName, localName)
154 _ ->
158 _ ->
155 Nothing
159 Nothing
156
160
@@ -161,6 +165,7 @@ toDealiaser (Env _ _ unions aliases _ _) =
161 Maybe.mapMaybe dealiasAlias (Map.toList aliases)
165 Maybe.mapMaybe dealiasAlias (Map.toList aliases)
162
166
163 add (key,value) dict =
167 add (key,value) dict =
164− Map.insertWith (\v v' -> if length v < length v' then v else v') key value dict
168+ Map.insertWith (\v v' -> if Text.length v < Text.length v' then v else v') key value dict
165 in
169 in
170+ Map.map Text.unpack $
166− foldr add Map.empty (unionPairs ++ aliasPairs)
171+ foldr add Map.empty (unionPairs ++ aliasPairs)
src/Canonicalize/Setup.hs+18−14
@@ -1,4 +1,5 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module Canonicalize.Setup (environment) where
3module Canonicalize.Setup (environment) where
3
4
4import Control.Arrow (second)
5import Control.Arrow (second)
@@ -6,6 +7,9 @@ import Control.Monad (foldM)
6import qualified Data.Graph as Graph
7import qualified Data.Graph as Graph
7import qualified Data.Map as Map
8import qualified Data.Map as Map
8import qualified Data.Maybe as Maybe
9import qualified Data.Maybe as Maybe
10+import Data.Monoid ((<>))
11+import qualified Data.Text as Text
12+import Data.Text (Text)
9
13
10import qualified AST.Declaration as D
14import qualified AST.Declaration as D
11import qualified AST.Effects as Effects
15import qualified AST.Effects as Effects
@@ -96,13 +100,13 @@ importToPatches importDict allInterfaces (A.A region (rawImportName, method)) =
96 listing
100 listing
97
101
98 qualifier =
102 qualifier =
99− maybe (ModuleName.toString rawImportName) id maybeAlias
103+ maybe (Text.pack (ModuleName.toString rawImportName)) id maybeAlias
100
104
101 infixPatches =
105 infixPatches =
102 map (infixToPatch (Var.fromModule importName)) (Module.iFixities interface)
106 map (infixToPatch (Var.fromModule importName)) (Module.iFixities interface)
103
107
104 qualifiedPatches =
108 qualifiedPatches =
105− interfaceToPatches importName (qualifier ++ ".") interface
109+ interfaceToPatches importName (qualifier <> ".") interface
106
110
107 unqualifiedPatches =
111 unqualifiedPatches =
108 if open then
112 if open then
@@ -114,11 +118,11 @@ importToPatches importDict allInterfaces (A.A region (rawImportName, method)) =
114 (++) (infixPatches ++ qualifiedPatches) <$> unqualifiedPatches
118 (++) (infixPatches ++ qualifiedPatches) <$> unqualifiedPatches
115
119
116
120
117−interfaceToPatches :: ModuleName.Canonical -> String -> Module.Interface -> [Env.Patch]
121+interfaceToPatches :: ModuleName.Canonical -> Text -> Module.Interface -> [Env.Patch]
118interfaceToPatches moduleName prefix interface =
122interfaceToPatches moduleName prefix interface =
119 let
123 let
120 genericPatch mkPatch name value =
124 genericPatch mkPatch name value =
121− mkPatch (prefix ++ name) value
125+ mkPatch (prefix <> name) value
122
126
123 patch mkPatch name =
127 patch mkPatch name =
124 genericPatch mkPatch name (Var.fromModule moduleName name)
128 genericPatch mkPatch name (Var.fromModule moduleName name)
@@ -171,7 +175,7 @@ valueToPatches region moduleName interface value =
171 notFound getNames x =
175 notFound getNames x =
172 Module.iExports interface
176 Module.iExports interface
173 |> getNames
177 |> getNames
174− |> Error.nearbyNames id x
178+ |> Error.nearbyNames Text.unpack x
175 |> Error.valueNotFound (ModuleName._module moduleName) x
179 |> Error.valueNotFound (ModuleName._module moduleName) x
176 |> Result.throw region
180 |> Result.throw region
177 in
181 in
@@ -247,10 +251,10 @@ valueToPatches region moduleName interface value =
247
251
248
252
249type Node =
253type Node =
250− ( (R.Region, String, [String], Type.Raw), String, [String] )
254+ ( (R.Region, Text, [Text], Type.Raw), Text, [Text] )
251
255
252
256
253−node :: R.Region -> String -> [String] -> Type.Raw -> Node
257+node :: R.Region -> Text -> [Text] -> Type.Raw -> Node
254node region name tvars alias =
258node region name tvars alias =
255 ((region, name, tvars, alias), name, edges alias)
259 ((region, name, tvars, alias), name, edges alias)
256 where
260 where
@@ -280,7 +284,7 @@ addTypeAliases moduleName typeAliasNodes initialEnv =
280addTypeAlias
284addTypeAlias
281 :: ModuleName.Canonical
285 :: ModuleName.Canonical
282 -> Env.Env
286 -> Env.Env
283− -> Graph.SCC (R.Region, String, [String], Type.Raw)
287+ -> Graph.SCC (R.Region, Text, [Text], Type.Raw)
284 -> Result Env.Env
288 -> Result Env.Env
285addTypeAlias moduleName env scc =
289addTypeAlias moduleName env scc =
286 case scc of
290 case scc of
@@ -362,7 +366,7 @@ declsToPatches moduleName (D.Decls defs unions aliases infixes) =
362 )
366 )
363
367
364
368
365−infixToPatch :: (String -> Var.Canonical) -> D.Infix -> Env.Patch
369+infixToPatch :: (Text -> Var.Canonical) -> D.Infix -> Env.Patch
366infixToPatch toVar (D.Infix name assoc prec) =
370infixToPatch toVar (D.Infix name assoc prec) =
367 Env.Infix (toVar name) assoc prec
371 Env.Infix (toVar name) assoc prec
368
372
@@ -425,16 +429,16 @@ restrictToPublicApi interface =
425 exports =
429 exports =
426 Module.iExports interface
430 Module.iExports interface
427
431
428− unions :: [(String, Var.Listing String)]
432+ unions :: [(Text, Var.Listing Text)]
429 unions =
433 unions =
430 Var.getUnions exports
434 Var.getUnions exports
431
435
432− ctors :: [String]
436+ ctors :: [Text]
433 ctors =
437 ctors =
434 concatMap (\(_, Var.Listing ctorList _) -> ctorList) unions
438 concatMap (\(_, Var.Listing ctorList _) -> ctorList) unions
435
439
436
440
437−get :: Map.Map String a -> String -> Maybe (String, a)
441+get :: Map.Map Text a -> Text -> Maybe (Text, a)
438get dict key =
442get dict key =
439 case Map.lookup key dict of
443 case Map.lookup key dict of
440 Nothing ->
444 Nothing ->
@@ -446,8 +450,8 @@ get dict key =
446
450
447trimUnions
451trimUnions
448 :: Module.Interface
452 :: Module.Interface
449− -> (String, Var.Listing String)
453+ -> (Text, Var.Listing Text)
450− -> Maybe (String, Module.UnionInfo String)
454+ -> Maybe (Text, Module.UnionInfo Text)
451trimUnions interface (name, Var.Listing exportedCtors _) =
455trimUnions interface (name, Var.Listing exportedCtors _) =
452 case Map.lookup name (Module.iUnions interface) of
456 case Map.lookup name (Module.iUnions interface) of
453 Nothing ->
457 Nothing ->
src/Canonicalize/Sort.hs+20−19
@@ -6,6 +6,7 @@ import qualified Data.Graph as Graph
6import qualified Data.Map as Map
6import qualified Data.Map as Map
7import qualified Data.Maybe as Maybe
7import qualified Data.Maybe as Maybe
8import qualified Data.Set as Set
8import qualified Data.Set as Set
9+import Data.Text (Text)
9
10
10import qualified AST.Expression.Canonical as C
11import qualified AST.Expression.Canonical as C
11import qualified AST.Pattern as P
12import qualified AST.Pattern as P
@@ -30,9 +31,9 @@ definitions expression =
30
31
31data LocalVars =
32data LocalVars =
32 LocalVars
33 LocalVars
33− { _immediate :: Set.Set String
34+ { _immediate :: Set.Set Text
34− , _delayed :: Set.Set String
35+ , _delayed :: Set.Set Text
35− , _tags :: Set.Set String
36+ , _tags :: Set.Set Text
36 }
37 }
37
38
38
39
@@ -44,7 +45,7 @@ instance Monoid LocalVars where
44 LocalVars (Set.union i1 i2) (Set.union d1 d2) (Set.union t1 t2)
45 LocalVars (Set.union i1 i2) (Set.union d1 d2) (Set.union t1 t2)
45
46
46
47
47−addTag :: String -> a -> R.Result LocalVars w e a
48+addTag :: Text -> a -> R.Result LocalVars w e a
48addTag name value =
49addTag name value =
49 R.accumulate (LocalVars Set.empty Set.empty (Set.singleton name)) value
50 R.accumulate (LocalVars Set.empty Set.empty (Set.singleton name)) value
50
51
@@ -70,7 +71,7 @@ capture pattern result =
70 captureVars (P.boundVarSet pattern) result
71 captureVars (P.boundVarSet pattern) result
71
72
72
73
73−captureVars :: Set.Set String -> R.Result LocalVars w e a -> R.Result LocalVars w e a
74+captureVars :: Set.Set Text -> R.Result LocalVars w e a -> R.Result LocalVars w e a
74captureVars bound (R.Result (LocalVars immediate delayed tags) warnings result) =
75captureVars bound (R.Result (LocalVars immediate delayed tags) warnings result) =
75 let
76 let
76 localVars =
77 localVars =
@@ -106,8 +107,8 @@ reorder (A.A region expression) =
106 C.Case expr cases ->
107 C.Case expr cases ->
107 C.Case <$> reorder expr <*> traverse (bindingReorder (,)) cases
108 C.Case <$> reorder expr <*> traverse (bindingReorder (,)) cases
108
109
109− C.Ctor name exprs ->
110+ C.Ctor ctor@(V.Canonical _ name) exprs ->
110− addTag name =<< (C.Ctor name <$> traverse reorder exprs)
111+ addTag name =<< (C.Ctor ctor <$> traverse reorder exprs)
111
112
112 -- Just pipe the reorder though
113 -- Just pipe the reorder though
113 C.Literal _ ->
114 C.Literal _ ->
@@ -195,7 +196,7 @@ addPatternTags pattern value =
195 R.accumulate (LocalVars Set.empty Set.empty (getPatternTags pattern)) value
196 R.accumulate (LocalVars Set.empty Set.empty (getPatternTags pattern)) value
196
197
197
198
198−getPatternTags :: P.Canonical -> Set.Set String
199+getPatternTags :: P.Canonical -> Set.Set Text
199getPatternTags (A.A _ pattern) =
200getPatternTags (A.A _ pattern) =
200 case pattern of
201 case pattern of
201 P.Var _ ->
202 P.Var _ ->
@@ -213,7 +214,7 @@ getPatternTags (A.A _ pattern) =
213 P.Literal _ ->
214 P.Literal _ ->
214 Set.empty
215 Set.empty
215
216
216− P.Data (V.Canonical home name) patterns ->
217+ P.Ctor (V.Canonical home name) patterns ->
217 let
218 let
218 freeCtors =
219 freeCtors =
219 Set.unions (map getPatternTags patterns)
220 Set.unions (map getPatternTags patterns)
@@ -238,7 +239,7 @@ getPatternTags (A.A _ pattern) =
238
239
239reorderDefs
240reorderDefs
240 :: [C.Def]
241 :: [C.Def]
241− -> R.Result () w E.Error (Set.Set String, [[C.Def]], LocalVars)
242+ -> R.Result () w E.Error (Set.Set Text, [[C.Def]], LocalVars)
242reorderDefs defs =
243reorderDefs defs =
243 do rawNodes <- sequenceA $ zipWith toRawNode [0..] defs
244 do rawNodes <- sequenceA $ zipWith toRawNode [0..] defs
244 let boundVarDict = toBoundVarDict rawNodes
245 let boundVarDict = toBoundVarDict rawNodes
@@ -258,12 +259,12 @@ toRawNode index (C.Def region pattern body maybeType) =
258 toRawNodeHelp <$> R.Result () warnings answer
259 toRawNodeHelp <$> R.Result () warnings answer
259
260
260
261
261−toBoundVarDict :: [(C.Def, Int, a)] -> Map.Map String Int
262+toBoundVarDict :: [(C.Def, Int, a)] -> Map.Map Text Int
262toBoundVarDict defAndDeps =
263toBoundVarDict defAndDeps =
263 Map.fromList (concatMap toBoundVarDictHelp defAndDeps)
264 Map.fromList (concatMap toBoundVarDictHelp defAndDeps)
264
265
265
266
266−toBoundVarDictHelp :: (C.Def, Int, a) -> [(String, Int)]
267+toBoundVarDictHelp :: (C.Def, Int, a) -> [(Text, Int)]
267toBoundVarDictHelp (C.Def _ pattern _ _, key, _) =
268toBoundVarDictHelp (C.Def _ pattern _ _, key, _) =
268 map (\(A.A _ name) -> (name, key)) (P.boundVars pattern)
269 map (\(A.A _ name) -> (name, key)) (P.boundVars pattern)
269
270
@@ -273,8 +274,8 @@ toBoundVarDictHelp (C.Def _ pattern _ _, key, _) =
273
274
274
275
275toNode
276toNode
276− :: (deps -> [String])
277+ :: (deps -> [Text])
277− -> Map.Map String Int
278+ -> Map.Map Text Int
278 -> (C.Def, Int, deps)
279 -> (C.Def, Int, deps)
279 -> (C.Def, Int, [Int])
280 -> (C.Def, Int, [Int])
280toNode toVars boundVarDict (def, index, deps) =
281toNode toVars boundVarDict (def, index, deps) =
@@ -285,12 +286,12 @@ toNode toVars boundVarDict (def, index, deps) =
285 ( def, index, localDeps )
286 ( def, index, localDeps )
286
287
287
288
288−immediateOnly :: LocalVars -> [String]
289+immediateOnly :: LocalVars -> [Text]
289immediateOnly (LocalVars immediate _ _) =
290immediateOnly (LocalVars immediate _ _) =
290 Set.toList immediate
291 Set.toList immediate
291
292
292
293
293−allVars :: LocalVars -> [String]
294+allVars :: LocalVars -> [Text]
294allVars (LocalVars immediate delayed tags) =
295allVars (LocalVars immediate delayed tags) =
295 Set.toList immediate ++ Set.toList delayed ++ Set.toList tags
296 Set.toList immediate ++ Set.toList delayed ++ Set.toList tags
296
297
@@ -300,7 +301,7 @@ allVars (LocalVars immediate delayed tags) =
300
301
301
302
302detectLoops
303detectLoops
303− :: Map.Map String Int
304+ :: Map.Map Text Int
304 -> [(C.Def, Int, LocalVars)]
305 -> [(C.Def, Int, LocalVars)]
305 -> R.Result () w E.Error ()
306 -> R.Result () w E.Error ()
306detectLoops boundVarDict rawNodes =
307detectLoops boundVarDict rawNodes =
@@ -329,9 +330,9 @@ detectLoopsHelp scc =
329
330
330
331
331groupDefs
332groupDefs
332− :: Map.Map String Int
333+ :: Map.Map Text Int
333 -> [(C.Def, Int, LocalVars)]
334 -> [(C.Def, Int, LocalVars)]
334− -> ( Set.Set String, [[C.Def]], LocalVars )
335+ -> ( Set.Set Text, [[C.Def]], LocalVars )
335groupDefs boundVarDict rawNodes =
336groupDefs boundVarDict rawNodes =
336 let
337 let
337 allLocalVars =
338 allLocalVars =
src/Canonicalize/Type.hs+13−10
@@ -1,18 +1,21 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2module Canonicalize.Type (tipe) where
2module Canonicalize.Type (tipe) where
3
3
4−import qualified Data.Traversable as Trav
4+import Data.Text (Text)
5
5
6import qualified AST.Type as T
6import qualified AST.Type as T
7import qualified AST.Variable as Var
7import qualified AST.Variable as Var
8−
8+import qualified Canonicalize.Environment as Env
9+import qualified Canonicalize.Variable as Canonicalize
10+import Canonicalize.Variable (Result)
9import qualified Reporting.Annotation as A
11import qualified Reporting.Annotation as A
10import qualified Reporting.Error.Canonicalize as Error
12import qualified Reporting.Error.Canonicalize as Error
11import qualified Reporting.Region as R
13import qualified Reporting.Region as R
12import qualified Reporting.Result as Result
14import qualified Reporting.Result as Result
13−import qualified Canonicalize.Environment as Env
15+
14−import qualified Canonicalize.Variable as Canonicalize
16+
15−import Canonicalize.Variable (Result)
17+
18+-- CANONICALIZE TYPES
16
19
17
20
18tipe :: Env.Env -> T.Raw -> Result T.Canonical
21tipe :: Env.Env -> T.Raw -> Result T.Canonical
@@ -38,7 +41,7 @@ tipe env annType@(A.A _ typ) =
38 T.Lambda <$> go a <*> go b
41 T.Lambda <$> go a <*> go b
39
42
40 T.RRecord fields ext ->
43 T.RRecord fields ext ->
41− T.Record <$> Trav.traverse goField fields <*> Trav.traverse go ext
44+ T.Record <$> traverse goField fields <*> traverse go ext
42
45
43
46
44canonicalizeApp :: Env.Env -> T.Raw -> [T.Raw] -> Result T.Canonical
47canonicalizeApp :: Env.Env -> T.Raw -> [T.Raw] -> Result T.Canonical
@@ -50,7 +53,7 @@ canonicalizeApp env annFunc@(A.A region func) args =
50 _ ->
53 _ ->
51 T.App
54 T.App
52 <$> tipe env annFunc
55 <$> tipe env annFunc
53− <*> Trav.traverse (tipe env) args
56+ <*> traverse (tipe env) args
54
57
55 where
58 where
56 canonicalizeWithTvar tvar =
59 canonicalizeWithTvar tvar =
@@ -64,13 +67,13 @@ canonicalizeApp env annFunc@(A.A region func) args =
64 Result.ok (T.Type name)
67 Result.ok (T.Type name)
65
68
66 _ ->
69 _ ->
67− T.App (T.Type name) <$> Trav.traverse (tipe env) args
70+ T.App (T.Type name) <$> traverse (tipe env) args
68
71
69
72
70canonicalizeAlias
73canonicalizeAlias
71 :: R.Region
74 :: R.Region
72 -> Env.Env
75 -> Env.Env
73− -> (Var.Canonical, [String], T.Canonical)
76+ -> (Var.Canonical, [Text], T.Canonical)
74 -> [T.Raw]
77 -> [T.Raw]
75 -> Result T.Canonical
78 -> Result T.Canonical
76canonicalizeAlias region env (name, tvars, dealiasedTipe) types =
79canonicalizeAlias region env (name, tvars, dealiasedTipe) types =
@@ -88,5 +91,5 @@ canonicalizeAlias region env (name, tvars, dealiasedTipe) types =
88 Result.throw region (Error.alias name tvarsLen typesLen)
91 Result.throw region (Error.alias name tvarsLen typesLen)
89
92
90 else
93 else
91− toAlias <$> Trav.traverse (tipe env) types
94+ toAlias <$> traverse (tipe env) types
92
95
src/Canonicalize/Variable.hs+25−38
@@ -1,9 +1,12 @@
1{-# OPTIONS_GHC -Wall #-}
1{-# OPTIONS_GHC -Wall #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module Canonicalize.Variable (Result, variable, tvar, pvar) where
3module Canonicalize.Variable (Result, variable, tvar, pvar) where
3
4
4import qualified Data.Either as Either
5import qualified Data.Either as Either
5import qualified Data.Map as Map
6import qualified Data.Map as Map
6import qualified Data.Set as Set
7import qualified Data.Set as Set
8+import qualified Data.Text as Text
9+import Data.Text (Text)
7
10
8import qualified AST.Helpers as Help
11import qualified AST.Helpers as Help
9import qualified AST.Module.Name as ModuleName
12import qualified AST.Module.Name as ModuleName
@@ -45,7 +48,7 @@ logVar var =
45-- FINDERS
48-- FINDERS
46
49
47
50
48−variable :: R.Region -> Env.Env -> String -> Result Var.Canonical
51+variable :: R.Region -> Env.Env -> Text -> Result Var.Canonical
49variable region env var =
52variable region env var =
50 case toVarName var of
53 case toVarName var of
51 Right (name, varName) | ModuleName.isNative name ->
54 Right (name, varName) | ModuleName.isNative name ->
@@ -70,15 +73,7 @@ variable region env var =
70 notFound region "variable" (Map.keys (Env._values env)) var
73 notFound region "variable" (Map.keys (Env._values env)) var
71
74
72
75
73−tvar
74− :: R.Region
75− -> Env.Env
76− -> String
77− -> Result
78− (Either
79− Var.Canonical
80− (Var.Canonical, [String], Type.Canonical)
76+tvar :: R.Region -> Env.Env -> Text -> Result (Either Var.Canonical (Var.Canonical, [Text], Type.Canonical))
81− )
82tvar region env var =
77tvar region env var =
83 case unions ++ aliases of
78 case unions ++ aliases of
84 [] -> notFound region "type" (Map.keys (Env._unions env) ++ Map.keys (Env._aliases env)) var
79 [] -> notFound region "type" (Map.keys (Env._unions env) ++ Map.keys (Env._aliases env)) var
@@ -97,7 +92,7 @@ tvar region env var =
97 Right (v,_,_) -> v
92 Right (v,_,_) -> v
98
93
99
94
100−pvar :: R.Region -> Env.Env -> String -> Int -> Result Var.Canonical
95+pvar :: R.Region -> Env.Env -> Text -> Int -> Result Var.Canonical
101pvar region env var actualArgs =
96pvar region env var actualArgs =
102 case Set.toList <$> Map.lookup var (Env._patterns env) of
97 case Set.toList <$> Map.lookup var (Env._patterns env) of
103 Just [value] ->
98 Just [value] ->
@@ -121,7 +116,7 @@ pvar region env var actualArgs =
121-- FOUND
116-- FOUND
122
117
123
118
124−preferLocals :: R.Region -> Env.Env -> String -> [Var.Canonical] -> String -> Result Var.Canonical
119+preferLocals :: R.Region -> Env.Env -> Text -> [Var.Canonical] -> Text -> Result Var.Canonical
125preferLocals region env =
120preferLocals region env =
126 preferLocals' region env id
121 preferLocals' region env id
127
122
@@ -130,9 +125,9 @@ preferLocals'
130 :: R.Region
125 :: R.Region
131 -> Env.Env
126 -> Env.Env
132 -> (a -> Var.Canonical)
127 -> (a -> Var.Canonical)
133− -> String
128+ -> Text
134 -> [a]
129 -> [a]
135− -> String
130+ -> Text
136 -> Result a
131 -> Result a
137preferLocals' region env extract kind possibilities var =
132preferLocals' region env extract kind possibilities var =
138 case filter (isLocal (Env._home env) . extract) possibilities of
133 case filter (isLocal (Env._home env) . extract) possibilities of
@@ -156,7 +151,7 @@ preferLocals' region env extract kind possibilities var =
156 ambiguous possibleVars =
151 ambiguous possibleVars =
157 Result.throw region (Error.variable kind var Error.Ambiguous vars)
152 Result.throw region (Error.variable kind var Error.Ambiguous vars)
158 where
153 where
159− vars = map (Var.toString . extract) possibleVars
154+ vars = map (Text.pack . Var.toString . extract) possibleVars
160
155
161
156
162isLocal :: ModuleName.Canonical -> Var.Canonical -> Bool
157isLocal :: ModuleName.Canonical -> Var.Canonical -> Bool
@@ -190,26 +185,26 @@ isTopLevel (Var.Canonical home _) =
190
185
191
186
192type VarName =
187type VarName =
193− Either String (ModuleName.Raw, String)
188+ Either Text (ModuleName.Raw, Text)
194
189
195
190
196−toVarName :: String -> VarName
191+toVarName :: Text -> VarName
197toVarName var =
192toVarName var =
198− case Help.splitDots var of
193+ case Text.splitOn "." var of
199 [x] -> Left x
194 [x] -> Left x
200− xs -> Right (init xs, last xs)
195+ xs -> Right (Text.intercalate "." (init xs), last xs)
201
196
202
197
203noQualifier :: VarName -> String
198noQualifier :: VarName -> String
204noQualifier name =
199noQualifier name =
205 case name of
200 case name of
206− Left x -> x
207− Right (_, x) -> x
201+ Right (_, x) -> Text.unpack x
202+ Left x -> Text.unpack x
208
203
209
204
210−qualifiedToString :: (ModuleName.Raw, String) -> String
205+qualifiedToString :: (ModuleName.Raw, Text) -> Text
211qualifiedToString (modul, name) =
206qualifiedToString (modul, name) =
212− ModuleName.toString modul ++ "." ++ name
207+ Text.pack (ModuleName.toString modul ++ "." ++ Text.unpack name)
213
208
214
209
215isOp :: VarName -> Bool
210isOp :: VarName -> Bool
@@ -221,7 +216,7 @@ isOp name =
221-- NOT FOUND
216-- NOT FOUND
222
217
223
218
224−notFound :: R.Region -> String -> [String] -> String -> Result a
219+notFound :: R.Region -> Text -> [Text] -> Text -> Result a
225notFound region kind possibilities var =
220notFound region kind possibilities var =
226 let name =
221 let name =
227 toVarName var
222 toVarName var
@@ -240,7 +235,7 @@ notFound region kind possibilities var =
240 Result.throw region (Error.variable kind var problem suggestions)
235 Result.throw region (Error.variable kind var problem suggestions)
241
236
242
237
243−exposedProblem :: VarName -> [VarName] -> (Error.VarProblem, [String])
238+exposedProblem :: VarName -> [VarName] -> (Error.VarProblem, [Text])
244exposedProblem name possibleNames =
239exposedProblem name possibleNames =
245 let (exposed, qualified) =
240 let (exposed, qualified) =
246 possibleNames
241 possibleNames
@@ -253,30 +248,22 @@ exposedProblem name possibleNames =
253 )
248 )
254
249
255
250
256−qualifiedProblem
251+qualifiedProblem :: ModuleName.Raw -> Text -> [(ModuleName.Raw, Text)] -> (Error.VarProblem, [Text])
257− :: ModuleName.Raw
258− -> String
259− -> [(ModuleName.Raw, String)]
260− -> (Error.VarProblem, [String])
261qualifiedProblem moduleName name allQualified =
252qualifiedProblem moduleName name allQualified =
262 let availableModules =
253 let availableModules =
263 Set.fromList (map fst allQualified)
254 Set.fromList (map fst allQualified)
264−
265− moduleNameString =
266− ModuleName.toString moduleName
267 in
255 in
268 case Set.member moduleName availableModules of
256 case Set.member moduleName availableModules of
269 True ->
257 True ->
270− ( Error.QualifiedUnknown moduleNameString name
258+ ( Error.QualifiedUnknown moduleName name
271 , allQualified
259 , allQualified
272 |> filter ((==) moduleName . fst)
260 |> filter ((==) moduleName . fst)
273 |> map snd
261 |> map snd
274− |> Error.nearbyNames id name
262+ |> Error.nearbyNames Text.unpack name
275 )
263 )
276
264
277 False ->
265 False ->
278− ( Error.UnknownQualifier moduleNameString name
266+ ( Error.UnknownQualifier moduleName name
279 , Set.toList availableModules
267 , Set.toList availableModules
280− |> map ModuleName.toString
281− |> Error.nearbyNames id moduleNameString
268+ |> Error.nearbyNames Text.unpack moduleName
282 )
269 )