on master help sign in
make regions for exposed types more precise
5387ae6Evan Czaplicki
compiler/src/AST/Source.hs+5−5
@@ -195,15 +195,15 @@ newtype Comment =
195
195
196data Exposing
196data Exposing
197 = Open
197 = Open
198− | Explicit [A.Located Exposed]
198+ | Explicit [Exposed]
199
199
200
200
201data Exposed
201data Exposed
202− = Lower Name
202+ = Lower (A.Located Name)
203− | Upper Name Privacy
203+ | Upper (A.Located Name) Privacy
204− | Operator Name
204+ | Operator A.Region Name
205
205
206
206
207data Privacy
207data Privacy
208− = Public
208+ = Public A.Region
209 | Private
209 | Private
compiler/src/Canonicalize/Environment/Foreign.hs+7−7
@@ -207,11 +207,11 @@ addExposedValue
207 -> Map.Map Name.Name (Env.Type, Env.Exposed Env.Ctor)
207 -> Map.Map Name.Name (Env.Type, Env.Exposed Env.Ctor)
208 -> Map.Map Name.Name I.Binop
208 -> Map.Map Name.Name I.Binop
209 -> State
209 -> State
210− -> A.Located Src.Exposed
210+ -> Src.Exposed
211 -> Result i w State
211 -> Result i w State
212−addExposedValue home vars types binops (State vs ts cs bs qvs qts qcs) (A.At region exposed) =
212+addExposedValue home vars types binops (State vs ts cs bs qvs qts qcs) exposed =
213 case exposed of
213 case exposed of
214− Src.Lower name ->
214+ Src.Lower (A.At region name) ->
215 case Map.lookup name vars of
215 case Map.lookup name vars of
216 Just info ->
216 Just info ->
217 Result.ok (State (Map.insertWith Map.union name info vs) ts cs bs qvs qts qcs)
217 Result.ok (State (Map.insertWith Map.union name info vs) ts cs bs qvs qts qcs)
@@ -219,7 +219,7 @@ addExposedValue home vars types binops (State vs ts cs bs qvs qts qcs) (A.At reg
219 Nothing ->
219 Nothing ->
220 Result.throw (Error.ImportExposingNotFound region home name (Map.keys vars))
220 Result.throw (Error.ImportExposingNotFound region home name (Map.keys vars))
221
221
222− Src.Upper name privacy ->
222+ Src.Upper (A.At region name) privacy ->
223 case privacy of
223 case privacy of
224 Src.Private ->
224 Src.Private ->
225 case Map.lookup name types of
225 case Map.lookup name types of
@@ -246,7 +246,7 @@ addExposedValue home vars types binops (State vs ts cs bs qvs qts qcs) (A.At reg
246 Nothing ->
246 Nothing ->
247 Result.throw $ Error.ImportExposingNotFound region home name (Map.keys types)
247 Result.throw $ Error.ImportExposingNotFound region home name (Map.keys types)
248
248
249− Src.Public ->
249+ Src.Public dotDotRegion ->
250 case Map.lookup name types of
250 case Map.lookup name types of
251 Just (tipe, ctors) ->
251 Just (tipe, ctors) ->
252 case tipe of
252 case tipe of
@@ -258,12 +258,12 @@ addExposedValue home vars types binops (State vs ts cs bs qvs qts qcs) (A.At reg
258 Result.ok (State vs ts2 cs2 bs qvs qts qcs)
258 Result.ok (State vs ts2 cs2 bs qvs qts qcs)
259
259
260 Env.Alias _ _ _ _ ->
260 Env.Alias _ _ _ _ ->
261− Result.throw (Error.ImportOpenAlias region name)
261+ Result.throw (Error.ImportOpenAlias dotDotRegion name)
262
262
263 Nothing ->
263 Nothing ->
264 Result.throw (Error.ImportExposingNotFound region home name (Map.keys types))
264 Result.throw (Error.ImportExposingNotFound region home name (Map.keys types))
265
265
266− Src.Operator op ->
266+ Src.Operator region op ->
267 case Map.lookup op binops of
267 case Map.lookup op binops of
268 Just binop ->
268 Just binop ->
269 let
269 let
compiler/src/Canonicalize/Module.hs+7−7
@@ -236,11 +236,11 @@ checkExposed
236 -> Map.Map Name.Name alias
236 -> Map.Map Name.Name alias
237 -> Map.Map Name.Name binop
237 -> Map.Map Name.Name binop
238 -> Can.Effects
238 -> Can.Effects
239− -> A.Located Src.Exposed
239+ -> Src.Exposed
240 -> Result i w (Dups.Dict (A.Located Can.Export))
240 -> Result i w (Dups.Dict (A.Located Can.Export))
241−checkExposed values unions aliases binops effects (A.At region exposed) =
241+checkExposed values unions aliases binops effects exposed =
242 case exposed of
242 case exposed of
243− Src.Lower name ->
243+ Src.Lower (A.At region name) ->
244 if Map.member name values then
244 if Map.member name values then
245 ok name region Can.ExportValue
245 ok name region Can.ExportValue
246 else
246 else
@@ -252,23 +252,23 @@ checkExposed values unions aliases binops effects (A.At region exposed) =
252 Result.throw $ Error.ExportNotFound region Error.BadVar name $
252 Result.throw $ Error.ExportNotFound region Error.BadVar name $
253 ports ++ Map.keys values
253 ports ++ Map.keys values
254
254
255− Src.Operator name ->
255+ Src.Operator region name ->
256 if Map.member name binops then
256 if Map.member name binops then
257 ok name region Can.ExportBinop
257 ok name region Can.ExportBinop
258 else
258 else
259 Result.throw $ Error.ExportNotFound region Error.BadOp name $
259 Result.throw $ Error.ExportNotFound region Error.BadOp name $
260 Map.keys binops
260 Map.keys binops
261
261
262− Src.Upper name Src.Public ->
262+ Src.Upper (A.At region name) (Src.Public dotDotRegion) ->
263 if Map.member name unions then
263 if Map.member name unions then
264 ok name region Can.ExportUnionOpen
264 ok name region Can.ExportUnionOpen
265 else if Map.member name aliases then
265 else if Map.member name aliases then
266− Result.throw $ Error.ExportOpenAlias region name
266+ Result.throw $ Error.ExportOpenAlias dotDotRegion name
267 else
267 else
268 Result.throw $ Error.ExportNotFound region Error.BadType name $
268 Result.throw $ Error.ExportNotFound region Error.BadType name $
269 Map.keys unions ++ Map.keys aliases
269 Map.keys unions ++ Map.keys aliases
270
270
271− Src.Upper name Src.Private ->
271+ Src.Upper (A.At region name) Src.Private ->
272 if Map.member name unions then
272 if Map.member name unions then
273 ok name region Can.ExportUnionClosed
273 ok name region Can.ExportUnionClosed
274 else if Map.member name aliases then
274 else if Map.member name aliases then
compiler/src/Elm/Compiler/Imports.hs+3−3
@@ -49,14 +49,14 @@ closed =
49
49
50typeOpen :: Name.Name -> Src.Exposing
50typeOpen :: Name.Name -> Src.Exposing
51typeOpen name =
51typeOpen name =
52− Src.Explicit [ A.At A.zero (Src.Upper name Src.Public) ]
52+ Src.Explicit [ Src.Upper (A.At A.zero name) (Src.Public A.zero) ]
53
53
54
54
55typeClosed :: Name.Name -> Src.Exposing
55typeClosed :: Name.Name -> Src.Exposing
56typeClosed name =
56typeClosed name =
57− Src.Explicit [ A.At A.zero (Src.Upper name Src.Private) ]
57+ Src.Explicit [ Src.Upper (A.At A.zero name) Src.Private ]
58
58
59
59
60operator :: Name.Name -> Src.Exposing
60operator :: Name.Name -> Src.Exposing
61operator op =
61operator op =
62− Src.Explicit [ A.At A.zero (Src.Operator op) ]
62+ Src.Explicit [ Src.Operator A.zero op ]
compiler/src/Elm/Kernel.hs+6−6
@@ -319,19 +319,19 @@ toNames exposing =
319 map toName exposedList
319 map toName exposedList
320
320
321
321
322−toName :: A.Located Src.Exposed -> Name.Name
322+toName :: Src.Exposed -> Name.Name
323−toName (A.At _ exposed) =
323+toName exposed =
324 case exposed of
324 case exposed of
325− Src.Lower name ->
325+ Src.Lower (A.At _ name) ->
326 name
326 name
327
327
328− Src.Upper name Src.Private ->
328+ Src.Upper (A.At _ name) Src.Private ->
329 name
329 name
330
330
331− Src.Upper _ Src.Public ->
331+ Src.Upper _ (Src.Public _) ->
332 error "cannot have Maybe(..) syntax in kernel code header"
332 error "cannot have Maybe(..) syntax in kernel code header"
333
333
334− Src.Operator _ ->
334+ Src.Operator _ _ ->
335 error "cannot use binops in kernel code"
335 error "cannot use binops in kernel code"
336
336
337
337
compiler/src/Parse/Module.hs+21−14
@@ -434,18 +434,18 @@ exposing =
434 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
434 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
435 word1 0x29 {-)-} E.ExposingEnd
435 word1 0x29 {-)-} E.ExposingEnd
436 return Src.Open
436 return Src.Open
437− , do exposed <- addLocation chompExposed
437+ , do exposed <- chompExposed
438 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
438 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
439 exposingHelp [exposed]
439 exposingHelp [exposed]
440 ]
440 ]
441
441
442
442
443−exposingHelp :: [A.Located Src.Exposed] -> Parser E.Exposing Src.Exposing
443+exposingHelp :: [Src.Exposed] -> Parser E.Exposing Src.Exposing
444exposingHelp revExposed =
444exposingHelp revExposed =
445 oneOf E.ExposingEnd
445 oneOf E.ExposingEnd
446 [ do word1 0x2C {-,-} E.ExposingEnd
446 [ do word1 0x2C {-,-} E.ExposingEnd
447 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentValue
447 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentValue
448− exposed <- addLocation chompExposed
448+ exposed <- chompExposed
449 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
449 Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
450 exposingHelp (exposed:revExposed)
450 exposingHelp (exposed:revExposed)
451 , do word1 0x29 {-)-} E.ExposingEnd
451 , do word1 0x29 {-)-} E.ExposingEnd
@@ -455,16 +455,21 @@ exposingHelp revExposed =
455
455
456chompExposed :: Parser E.Exposing Src.Exposed
456chompExposed :: Parser E.Exposing Src.Exposed
457chompExposed =
457chompExposed =
458+ do start <- getPosition
458− oneOf E.ExposingValue
459+ oneOf E.ExposingValue
459− [ Src.Lower <$> Var.lower E.ExposingValue
460+ [ do name <- Var.lower E.ExposingValue
461+ end <- getPosition
462+ return $ Src.Lower $ A.at start end name
460− , do word1 0x28 {-(-} E.ExposingValue
463+ , do word1 0x28 {-(-} E.ExposingValue
461− op <- Symbol.operator E.ExposingOperator E.ExposingOperatorReserved
464+ op <- Symbol.operator E.ExposingOperator E.ExposingOperatorReserved
462− word1 0x29 {-)-} E.ExposingOperatorRightParen
465+ word1 0x29 {-)-} E.ExposingOperatorRightParen
466+ end <- getPosition
463− return (Src.Operator op)
467+ return $ Src.Operator (A.Region start end) op
464− , do name <- Var.upper E.ExposingValue
468+ , do name <- Var.upper E.ExposingValue
469+ end <- getPosition
465− Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
470+ Space.chompAndCheckIndent E.ExposingSpace E.ExposingIndentEnd
466− Src.Upper name <$> privacy
471+ Src.Upper (A.at start end name) <$> privacy
467− ]
472+ ]
468
473
469
474
470privacy :: Parser E.Exposing Src.Privacy
475privacy :: Parser E.Exposing Src.Privacy
@@ -472,9 +477,11 @@ privacy =
472 oneOfWithFallback
477 oneOfWithFallback
473 [ do word1 0x28 {-(-} E.ExposingTypePrivacy
478 [ do word1 0x28 {-(-} E.ExposingTypePrivacy
474 Space.chompAndCheckIndent E.ExposingSpace E.ExposingTypePrivacy
479 Space.chompAndCheckIndent E.ExposingSpace E.ExposingTypePrivacy
480+ start <- getPosition
475 word2 0x2E 0x2E {-..-} E.ExposingTypePrivacy
481 word2 0x2E 0x2E {-..-} E.ExposingTypePrivacy
482+ end <- getPosition
476 Space.chompAndCheckIndent E.ExposingSpace E.ExposingTypePrivacy
483 Space.chompAndCheckIndent E.ExposingSpace E.ExposingTypePrivacy
477 word1 0x29 {-)-} E.ExposingTypePrivacy
484 word1 0x29 {-)-} E.ExposingTypePrivacy
478− return Src.Public
485+ return $ Src.Public (A.Region start end)
479 ]
486 ]
480 Src.Private
487 Src.Private
compiler/src/Reporting/Render/Type/Localizer.hs+5−5
@@ -112,9 +112,9 @@ toExposing exposing =
112 Only (foldr addType Set.empty exposedList)
112 Only (foldr addType Set.empty exposedList)
113
113
114
114
115−addType :: A.Located Src.Exposed -> Set.Set Name.Name -> Set.Set Name.Name
115+addType :: Src.Exposed -> Set.Set Name.Name -> Set.Set Name.Name
116−addType (A.At _ exposed) types =
116+addType exposed types =
117 case exposed of
117 case exposed of
118− Src.Lower _ -> types
118+ Src.Lower _ -> types
119− Src.Upper name _ -> Set.insert name types
119+ Src.Upper (A.At _ name) _ -> Set.insert name types
120− Src.Operator _ -> types
120+ Src.Operator _ _ -> types