on master help sign in
Give name hints in certain docs errors

Improvement to https://github.com/evancz/error-message-catalog/issues/20

commit86acf58bb7c56cfcccbdba6779aa0eab35473310 authorEvan Czaplicki <info@elm-lang.org> dateMon 20 Jul 2015, 15:08 (11 years ago) parentc0c53db
8 files changed+70−52
elm-compiler.cabal+1 src/Canonicalize.hs+2−1 src/Canonicalize/Setup.hs+1 src/Canonicalize/Variable.hs+1 src/Docs/Check.hs+14−7 src/Reporting/Error/Canonicalize.hs+8−41 src/Reporting/Error/Docs.hs+4−3 src/Reporting/Error/Helpers.hs+39
elm-compiler.cabal+1
@@ -93,6 +93,7 @@ Library
9393 Reporting.Error,
9494 Reporting.Error.Canonicalize,
9595 Reporting.Error.Docs,
96+ Reporting.Error.Helpers,
9697 Reporting.Error.Syntax,
9798 Reporting.Error.Type,
9899 Reporting.PrettyPrint,
src/Canonicalize.hs+2−1
@@ -23,6 +23,7 @@ import qualified Docs.Centralize as Docs
2323import qualified Reporting.Annotation as A
2424import qualified Reporting.Error as Error
2525import qualified Reporting.Error.Canonicalize as CError
26+import qualified Reporting.Error.Helpers as ErrorHelp
2627import qualified Reporting.Result as R
2728import qualified Reporting.Warning as Warning
2829import qualified Canonicalize.Declaration as Decls
@@ -197,7 +198,7 @@ resolveExports fullList (Var.Listing partialList open) =
197198
198199 notFound region possibilities name =
199200 A.A region $ CError.Export name $
200− CError.nearbyNames id name possibilities
201+ ErrorHelp.nearbyNames id name possibilities
201202
202203
203204-- GROUPING VALUES
src/Canonicalize/Setup.hs+1
@@ -17,6 +17,7 @@ import qualified AST.Variable as Var
1717import Elm.Utils ((|>))
1818import qualified Reporting.Annotation as A
1919import qualified Reporting.Error.Canonicalize as Error
20+import qualified Reporting.Error.Helpers as Error
2021import qualified Reporting.Region as R
2122import qualified Canonicalize.Environment as Env
2223import qualified Canonicalize.Result as Result
src/Canonicalize/Variable.hs+1
@@ -11,6 +11,7 @@ import qualified AST.Type as Type
1111import qualified AST.Variable as Var
1212import qualified Reporting.Annotation as A
1313import qualified Reporting.Error.Canonicalize as Error
14+import qualified Reporting.Error.Helpers as Error
1415import qualified Reporting.Region as R
1516import qualified Canonicalize.Environment as Env
1617import qualified Canonicalize.Result as Result
src/Docs/Check.hs+14−7
@@ -18,6 +18,7 @@ import Parse.Helpers
1818 )
1919import qualified Reporting.Annotation as A
2020import qualified Reporting.Error.Docs as Error
21+import qualified Reporting.Error.Helpers as Error (nearbyNames)
2122import qualified Reporting.Region as R
2223import qualified Reporting.Result as R
2324
@@ -115,18 +116,24 @@ checkModuleComment :: R.Region -> [Var.Value] -> [A.Located String] -> Result w
115116checkModuleComment docRegion exports locatedDocNames =
116117 let
117118 exportNames =
118− Map.fromList (map (\v -> (valueName v, ())) exports)
119+ map valueName exports
119120
120− docNames =
121+ exportDict =
122+ Map.fromList (map (\name -> (name, ())) exportNames)
123+
124+ docDict =
121125 Map.fromList (map (\(A.A region name) -> (name, region)) locatedDocNames)
122126
127+ extraNameError (name, region) =
128+ R.throw region (Error.OnlyInDocs name (Error.nearbyNames id name exportNames))
129+
123130 docErrors =
124− Map.difference docNames exportNames
131+ Map.difference docDict exportDict
125132 |> Map.toList
126− |> T.traverse (\(name, region) -> R.throw region (Error.OnlyInDocs name))
133+ |> T.traverse extraNameError
127134
128135 namesOnlyInExports =
129− Map.difference exportNames docNames
136+ Map.difference exportDict docDict
130137 |> Map.toList
131138 |> map fst
132139
@@ -137,8 +144,8 @@ checkModuleComment docRegion exports locatedDocNames =
137144 R.throw docRegion (Error.OnlyInExports namesOnlyInExports)
138145 in
139146 (\_ _ -> ())
140− <$> docErrors
141− <*> exportErrors
147+ <$> exportErrors
148+ <*> docErrors
142149
143150
144151commentedNames :: R.Region -> String -> [A.Located String]
src/Reporting/Error/Canonicalize.hs+8−41
@@ -1,15 +1,12 @@
11{-# OPTIONS_GHC -Wall #-}
22module Reporting.Error.Canonicalize where
33
4−import Data.Function (on)
5−import qualified Data.List as List
6−import qualified Text.EditDistance as Dist
74import qualified Text.PrettyPrint as P
85
96import qualified AST.Module as Module
107import qualified AST.Type as Type
118import qualified AST.Variable as Var
12−import Elm.Utils ((|>))
9+import qualified Reporting.Error.Helpers as Help
1310import qualified Reporting.PrettyPrint as P
1411import qualified Reporting.Region as Region
1512import qualified Reporting.Report as Report
@@ -109,25 +106,6 @@ port name isInbound rootType localType maybeMessage =
109106 Port (PortError name isInbound rootType localType maybeMessage)
110107
111108
112−-- NEARBY NAMES
113−
114−nearbyNames :: (a -> String) -> a -> [a] -> [a]
115−nearbyNames format name names =
116− let editDistance =
117− if length (format name) < 3 then 1 else 2
118− in
119− names
120− |> map (\x -> (distance (format name) (format x), x))
121− |> List.sortBy (compare `on` fst)
122− |> filter ( (<= editDistance) . abs . fst )
123− |> map snd
124−
125−
126−distance :: String -> String -> Int
127−distance x y =
128− Dist.restrictedDamerauLevenshteinDistance Dist.defaultEditCosts x y
129−
130−
131109-- TO REPORT
132110
133111namingError :: String -> String -> Report.Report
@@ -145,26 +123,26 @@ toReport dealiaser err =
145123 Ambiguous ->
146124 namingError
147125 ("This usage of " ++ var ++ " is ambiguous.")
148− (maybeYouWant suggestions)
126+ (Help.maybeYouWant suggestions)
149127
150128 UnknownQualifier qualifier localName ->
151129 namingError
152130 ("Cannot find " ++ var ++ ".")
153131 ( "The qualifier `" ++ qualifier ++ "` is not in scope. "
154− ++ maybeYouWant (map (\modul -> modul ++ "." ++ localName) suggestions)
132+ ++ Help.maybeYouWant (map (\modul -> modul ++ "." ++ localName) suggestions)
155133 )
156134
157135 QualifiedUnknown qualifier localName ->
158136 namingError
159137 ("Cannot find " ++ var ++ ".")
160138 ( "`" ++ qualifier ++ "` does not expose `" ++ localName ++ "`. "
161− ++ maybeYouWant (map (\v -> qualifier ++ "." ++ v) suggestions)
139+ ++ Help.maybeYouWant (map (\v -> qualifier ++ "." ++ v) suggestions)
162140 )
163141
164142 ExposedUnknown ->
165143 namingError
166144 ("Cannot find " ++ var)
167− (maybeYouWant suggestions)
145+ (Help.maybeYouWant suggestions)
168146
169147 Pattern patternError ->
170148 case patternError of
@@ -205,17 +183,17 @@ toReport dealiaser err =
205183 ModuleNotFound suggestions ->
206184 namingError
207185 ("Could not find a module named `" ++ moduleName ++ "`")
208− (maybeYouWant (map Module.nameToString suggestions))
186+ (Help.maybeYouWant (map Module.nameToString suggestions))
209187
210188 ValueNotFound value suggestions ->
211189 namingError
212190 ("Module `" ++ moduleName ++ "` does not expose `" ++ value ++ "`")
213− (maybeYouWant suggestions)
191+ (Help.maybeYouWant suggestions)
214192
215193 Export name suggestions ->
216194 namingError
217195 ("Could not export `" ++ name ++ "` which is not defined in this module.")
218− (maybeYouWant suggestions)
196+ (Help.maybeYouWant suggestions)
219197
220198 Port (PortError name isInbound _rootType localType maybeMessage) ->
221199 let
@@ -250,17 +228,6 @@ argMismatchReport kind var expected actual =
250228 Report.simple "ARGUMENT" preHint postHint
251229
252230
253−maybeYouWant :: [String] -> String
254−maybeYouWant suggestions =
255− case suggestions of
256− [] ->
257− ""
258−
259− _:_ ->
260− "Maybe you want one of the following?\n"
261− ++ concatMap ("\n "++) (take 4 suggestions)
262−
263−
264231extractSuggestions :: Error -> Maybe [String]
265232extractSuggestions err =
266233 case err of
src/Reporting/Error/Docs.hs+4−3
@@ -1,12 +1,13 @@
11{-# OPTIONS_GHC -Wall #-}
22module Reporting.Error.Docs where
33
4+import qualified Reporting.Error.Helpers as Help
45import qualified Reporting.Report as Report
56
67
78data Error
89 = NoDocs
9− | OnlyInDocs String
10+ | OnlyInDocs String [String]
1011 | OnlyInExports [String]
1112 | NoComment String
1213 | NoType String
@@ -24,10 +25,10 @@ toReport err =
2425 )
2526 "Learn how at <http://package.elm-lang.org/help/documentation-format>"
2627
27− OnlyInDocs name ->
28+ OnlyInDocs name suggestions ->
2829 Report.simple "DOCUMENTATION ERROR"
2930 ("Your module documentation includes `" ++ name ++ "` which is not exported.")
30− "Is it misspelled? Should it be exported?"
31+ ("Is it misspelled? Should it be exported? " ++ Help.maybeYouWant suggestions)
3132
3233 OnlyInExports names ->
3334 Report.simple
src/Reporting/Error/Helpers.hsnew file+39
@@ -0,0 +1,39 @@
1+{-# OPTIONS_GHC -Wall #-}
2+module Reporting.Error.Helpers where
3+
4+import Data.Function (on)
5+import qualified Data.List as List
6+import qualified Text.EditDistance as Dist
7+
8+import Elm.Utils ((|>))
9+
10+
11+-- NEARBY NAMES
12+
13+nearbyNames :: (a -> String) -> a -> [a] -> [a]
14+nearbyNames format name names =
15+ let editDistance =
16+ if length (format name) < 3 then 1 else 2
17+ in
18+ names
19+ |> map (\x -> (distance (format name) (format x), x))
20+ |> List.sortBy (compare `on` fst)
21+ |> filter ( (<= editDistance) . abs . fst )
22+ |> map snd
23+
24+
25+distance :: String -> String -> Int
26+distance x y =
27+ Dist.restrictedDamerauLevenshteinDistance Dist.defaultEditCosts x y
28+
29+
30+maybeYouWant :: [String] -> String
31+maybeYouWant suggestions =
32+ case suggestions of
33+ [] ->
34+ ""
35+
36+ _:_ ->
37+ "Maybe you want one of the following?\n"
38+ ++ concatMap ("\n "++) (take 4 suggestions)
39+