@@ -5,19 +5,20 @@ module Reporting.Error.Canonicalize
55 , BadArityContext(..)
66 , InvalidPayload(..)
77 , DuplicatePatternContext(..)
8− , variable
8+ , PossibleNames(..)
99 , VarKind(..)
10− , VarProblem(..)
1110 , toReport
1211 )
1312 where
1413
1514
1615import qualified Data.Char as Char
17−import Data.Text (Text)
16+import qualified Data.Map as Map
17+import qualified Data.Set as Set
1818
1919import qualified AST.Canonical as Can
2020import qualified AST.Source as Src
21+import qualified AST.Module.Name as ModuleName
2122import qualified Data.Index as Index
2223import qualified Elm.Name as N
2324import qualified Reporting.Annotation as A
@@ -34,8 +35,11 @@ import Reporting.Helpers ( Doc, (<>) )
3435
3536
3637data Error
37− = Var VarError
38− | AnnotationTooShort R.Region N.Name Index.ZeroBased Int
38+ = AnnotationTooShort R.Region N.Name Index.ZeroBased Int
39+ | AmbiguousVar R.Region (Maybe N.Name) N.Name [ModuleName.Canonical]
40+ | AmbiguousType R.Region (Maybe N.Name) N.Name [ModuleName.Canonical]
41+ | AmbiguousCtor R.Region (Maybe N.Name) N.Name [ModuleName.Canonical]
42+ | AmbiguousBinop R.Region N.Name [ModuleName.Canonical]
3943 | BadArity R.Region BadArityContext N.Name Int Int
4044 | Binop R.Region N.Name N.Name
4145 | DuplicateDecl N.Name R.Region R.Region
@@ -55,6 +59,13 @@ data Error
5559 | ImportNotFound R.Region N.Name [N.Name]
5660 | ImportOpenAlias R.Region N.Name
5761 | ImportExposingNotFound R.Region N.Name N.Name [N.Name]
62+ | NotFoundVar R.Region N.Name PossibleNames
63+ | NotFoundType R.Region N.Name PossibleNames
64+ | NotFoundCtor R.Region N.Name PossibleNames
65+ | NotFoundBinop R.Region N.Name (Set.Set N.Name)
66+ | NotFoundVarQual R.Region N.Name N.Name PossibleNames
67+ | NotFoundTypeQual R.Region N.Name N.Name PossibleNames
68+ | NotFoundCtorQual R.Region N.Name N.Name PossibleNames
5869 | PatternHasRecordCtor R.Region N.Name
5970 | PortPayloadInvalid R.Region N.Name Can.Type InvalidPayload
6071 | PortTypeInvalid R.Region N.Name Can.Type
@@ -87,31 +98,13 @@ data InvalidPayload
8798 | UnsupportedType N.Name
8899
89100
90−
91−-- VARIABLES
92−
93−
94−data VarError =
95− VarError
96− { _kind :: VarKind
97− , _name :: Text
98− , _problem :: VarProblem
99− , _suggestions :: [Text]
101+data PossibleNames =
102+ PossibleNames
103+ { _locals :: Set.Set N.Name
104+ , _quals :: Map.Map N.Name (Set.Set N.Name)
100105 }
101106
102107
103−data VarProblem
104− = Ambiguous
105− | UnknownQualifier Text Text
106− | QualifiedUnknown Text Text
107− | ExposedUnknown
108−
109−
110−variable :: VarKind -> Text -> VarProblem -> [Text] -> Error
111−variable kind name problem suggestions =
112− Var (VarError kind name problem suggestions)
113−
114−
115108
116109-- KIND
117110
@@ -146,9 +139,6 @@ toKindInfo kind name =
146139toReport :: Code.Source -> RenderType.Localizer -> Error -> Report.Report
147140toReport source localizer err =
148141 case err of
149− Var varError ->
150− error "TODO" varError
151−
152142 AnnotationTooShort region name index leftovers ->
153143 let
154144 numTypeArgs = Index.toHuman index
@@ -168,6 +158,18 @@ toReport source localizer err =
168158 <> " be deleted? Maybe some parentheses are missing?"
169159 )
170160
161+ AmbiguousVar region maybePrefix name possibleHomes ->
162+ error "TODO" region maybePrefix name possibleHomes
163+
164+ AmbiguousType region maybePrefix name possibleHomes ->
165+ error "TODO" region maybePrefix name possibleHomes
166+
167+ AmbiguousCtor region maybePrefix name possibleHomes ->
168+ error "TODO" region maybePrefix name possibleHomes
169+
170+ AmbiguousBinop region name possibleHomes ->
171+ error "TODO" region name possibleHomes
172+
171173 BadArity region badArityContext name expected actual ->
172174 let
173175 thing =
@@ -257,11 +259,28 @@ toReport source localizer err =
257259 DPDestruct ->
258260 "This pattern contains multiple `" <> N.toString name <> "` variables."
259261
260− EffectNotFound _ _ ->
261− error "TODO EffectNotFound"
262+ EffectNotFound region name ->
263+ Report.Report "EFFECT PROBLEM" region [] $
264+ Report.toCodeSnippet source region Nothing
265+ (
266+ H.reflow $
267+ "You have declared that `" ++ N.toString name ++ "` is an effect type:"
268+ ,
269+ H.reflow $
270+ "But I cannot find a union type named `" ++ N.toString name ++ "` in this file!"
271+ )
272+
273+ EffectFunctionNotFound region name ->
274+ Report.Report "EFFECT PROBLEM" region [] $
275+ Report.toCodeSnippet source region Nothing
276+ (
277+ H.reflow $
278+ "This kind of effect module must define a `" ++ N.toString name ++ "` function."
279+ ,
280+ H.reflow $
281+ "But I cannot find `" ++ N.toString name ++ "` in this file!"
282+ )
262283
263− EffectFunctionNotFound _ _ ->
264− error "TODO EffectFunctionNotFound"
265284
266285 ExportDuplicate name r1 r2 ->
267286 let
@@ -295,7 +314,16 @@ toReport source localizer err =
295314 ]
296315
297316 ExportOpenAlias region name ->
298− error "TODO" region name
317+ Report.Report "BAD EXPORT" region [] $
318+ Report.toCodeSnippet source region Nothing
319+ (
320+ H.reflow $
321+ "The (..) syntax is for exposing union type constructors. It cannot be used with a type alias like `"
322+ ++ N.toString name ++ "` though."
323+ ,
324+ H.reflow $
325+ "Remove the (..) and you should be fine!"
326+ )
299327
300328 ImportCtorByName region ctor tipe ->
301329 Report.Report "BAD IMPORT" region [] $
@@ -351,6 +379,27 @@ toReport source localizer err =
351379 H.maybeYouWant Nothing suggestions
352380 )
353381
382+ NotFoundVar region name possibleNames ->
383+ error "TODO" region name possibleNames
384+
385+ NotFoundType region name possibleNames ->
386+ error "TODO" region name possibleNames
387+
388+ NotFoundCtor region name possibleNames ->
389+ error "TODO" region name possibleNames
390+
391+ NotFoundBinop region name locals ->
392+ error "TODO" region name locals
393+
394+ NotFoundVarQual region prefix name possibleNames ->
395+ error "TODO" region prefix name possibleNames
396+
397+ NotFoundTypeQual region prefix name possibleNames ->
398+ error "TODO" region prefix name possibleNames
399+
400+ NotFoundCtorQual region prefix name possibleNames ->
401+ error "TODO" region prefix name possibleNames
402+
354403 PatternHasRecordCtor region name ->
355404 Report.Report "BAD PATTERN" region [] $
356405 Report.toCodeSnippet source region Nothing
@@ -453,6 +502,7 @@ toReport source localizer err =
453502 H.reflow $
454503 "The `" <> N.toString name <> "` value has a direct use of `" <> N.toString name <> "` in its definition."
455504 ,
505+ -- TODO see if shadowing rules out mutation attempts
456506 H.stack
457507 [ H.reflow $
458508 "To know what `" <> N.toString name