@@ -5,19 +5,20 @@ module Reporting.Error.Canonicalize
5 , BadArityContext(..)
5 , BadArityContext(..)
6 , InvalidPayload(..)
6 , InvalidPayload(..)
7 , DuplicatePatternContext(..)
7 , DuplicatePatternContext(..)
8− , variable
8+ , PossibleNames(..)
9 , VarKind(..)
9 , VarKind(..)
11 , toReport
10 , toReport
16import qualified Data.Char as Char
15import qualified Data.Char as Char
17−import Data.Text (Text)
16+import qualified Data.Map as Map
17+import qualified Data.Set as Set
19import qualified AST.Canonical as Can
19import qualified AST.Canonical as Can
20import qualified AST.Source as Src
20import qualified AST.Source as Src
21+import qualified AST.Module.Name as ModuleName
21import qualified Data.Index as Index
22import qualified Data.Index as Index
22import qualified Elm.Name as N
23import qualified Elm.Name as N
23import qualified Reporting.Annotation as A
24import qualified Reporting.Annotation as A
@@ -34,8 +35,11 @@ import Reporting.Helpers ( Doc, (<>) )
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]
39 | BadArity R.Region BadArityContext N.Name Int Int
43 | BadArity R.Region BadArityContext N.Name Int Int
40 | Binop R.Region N.Name N.Name
44 | Binop R.Region N.Name N.Name
41 | DuplicateDecl N.Name R.Region R.Region
45 | DuplicateDecl N.Name R.Region R.Region
@@ -55,6 +59,13 @@ data Error
55 | ImportNotFound R.Region N.Name [N.Name]
59 | ImportNotFound R.Region N.Name [N.Name]
56 | ImportOpenAlias R.Region N.Name
60 | ImportOpenAlias R.Region N.Name
57 | ImportExposingNotFound R.Region N.Name N.Name [N.Name]
61 | 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
58 | PatternHasRecordCtor R.Region N.Name
69 | PatternHasRecordCtor R.Region N.Name
59 | PortPayloadInvalid R.Region N.Name Can.Type InvalidPayload
70 | PortPayloadInvalid R.Region N.Name Can.Type InvalidPayload
60 | PortTypeInvalid R.Region N.Name Can.Type
71 | PortTypeInvalid R.Region N.Name Can.Type
@@ -87,31 +98,13 @@ data InvalidPayload
87 | UnsupportedType N.Name
98 | UnsupportedType N.Name
90−
101+data PossibleNames =
91−-- VARIABLES
102+ PossibleNames
92−
103+ { _locals :: Set.Set N.Name
93−
104+ , _quals :: Map.Map N.Name (Set.Set N.Name)
98− , _problem :: VarProblem
99− , _suggestions :: [Text]
105− | UnknownQualifier Text Text
106− | QualifiedUnknown Text Text
110−variable :: VarKind -> Text -> VarProblem -> [Text] -> Error
111−variable kind name problem suggestions =
112− Var (VarError kind name problem suggestions)
@@ -146,9 +139,6 @@ toKindInfo kind name =
146toReport :: Code.Source -> RenderType.Localizer -> Error -> Report.Report
139toReport :: Code.Source -> RenderType.Localizer -> Error -> Report.Report
147toReport source localizer err =
140toReport source localizer err =
148 case err of
141 case err of
150− error "TODO" varError
152 AnnotationTooShort region name index leftovers ->
142 AnnotationTooShort region name index leftovers ->
154 numTypeArgs = Index.toHuman index
144 numTypeArgs = Index.toHuman index
@@ -168,6 +158,18 @@ toReport source localizer err =
168 <> " be deleted? Maybe some parentheses are missing?"
158 <> " be deleted? Maybe some parentheses are missing?"
161+ AmbiguousVar region maybePrefix name possibleHomes ->
162+ error "TODO" region maybePrefix name possibleHomes
164+ AmbiguousType region maybePrefix name possibleHomes ->
165+ error "TODO" region maybePrefix name possibleHomes
167+ AmbiguousCtor region maybePrefix name possibleHomes ->
168+ error "TODO" region maybePrefix name possibleHomes
170+ AmbiguousBinop region name possibleHomes ->
171+ error "TODO" region name possibleHomes
171 BadArity region badArityContext name expected actual ->
173 BadArity region badArityContext name expected actual ->
@@ -257,11 +259,28 @@ toReport source localizer err =
257 DPDestruct ->
259 DPDestruct ->
258 "This pattern contains multiple `" <> N.toString name <> "` variables."
260 "This pattern contains multiple `" <> N.toString name <> "` variables."
260− EffectNotFound _ _ ->
262+ EffectNotFound region name ->
261− error "TODO EffectNotFound"
263+ Report.Report "EFFECT PROBLEM" region [] $
264+ Report.toCodeSnippet source region Nothing
267+ "You have declared that `" ++ N.toString name ++ "` is an effect type:"
270+ "But I cannot find a union type named `" ++ N.toString name ++ "` in this file!"
273+ EffectFunctionNotFound region name ->
274+ Report.Report "EFFECT PROBLEM" region [] $
275+ Report.toCodeSnippet source region Nothing
278+ "This kind of effect module must define a `" ++ N.toString name ++ "` function."
281+ "But I cannot find `" ++ N.toString name ++ "` in this file!"
263− EffectFunctionNotFound _ _ ->
264− error "TODO EffectFunctionNotFound"
266 ExportDuplicate name r1 r2 ->
285 ExportDuplicate name r1 r2 ->
@@ -295,7 +314,16 @@ toReport source localizer err =
297 ExportOpenAlias region name ->
316 ExportOpenAlias region name ->
298− error "TODO" region name
317+ Report.Report "BAD EXPORT" region [] $
318+ Report.toCodeSnippet source region Nothing
321+ "The (..) syntax is for exposing union type constructors. It cannot be used with a type alias like `"
322+ ++ N.toString name ++ "` though."
325+ "Remove the (..) and you should be fine!"
300 ImportCtorByName region ctor tipe ->
328 ImportCtorByName region ctor tipe ->
301 Report.Report "BAD IMPORT" region [] $
329 Report.Report "BAD IMPORT" region [] $
@@ -351,6 +379,27 @@ toReport source localizer err =
351 H.maybeYouWant Nothing suggestions
379 H.maybeYouWant Nothing suggestions
382+ NotFoundVar region name possibleNames ->
383+ error "TODO" region name possibleNames
385+ NotFoundType region name possibleNames ->
386+ error "TODO" region name possibleNames
388+ NotFoundCtor region name possibleNames ->
389+ error "TODO" region name possibleNames
391+ NotFoundBinop region name locals ->
392+ error "TODO" region name locals
394+ NotFoundVarQual region prefix name possibleNames ->
395+ error "TODO" region prefix name possibleNames
397+ NotFoundTypeQual region prefix name possibleNames ->
398+ error "TODO" region prefix name possibleNames
400+ NotFoundCtorQual region prefix name possibleNames ->
401+ error "TODO" region prefix name possibleNames
354 PatternHasRecordCtor region name ->
403 PatternHasRecordCtor region name ->
355 Report.Report "BAD PATTERN" region [] $
404 Report.Report "BAD PATTERN" region [] $
356 Report.toCodeSnippet source region Nothing
405 Report.toCodeSnippet source region Nothing
@@ -453,6 +502,7 @@ toReport source localizer err =
453 H.reflow $
502 H.reflow $
454 "The `" <> N.toString name <> "` value has a direct use of `" <> N.toString name <> "` in its definition."
503 "The `" <> N.toString name <> "` value has a direct use of `" <> N.toString name <> "` in its definition."
505+ -- TODO see if shadowing rules out mutation attempts
457 [ H.reflow $
507 [ H.reflow $
458 "To know what `" <> N.toString name
508 "To know what `" <> N.toString name