on master help sign in
Improve presentation of incomplete patterns in error messages
db98abeEvan Czaplicki
src/Nitpick/Pattern.hs+33−5
@@ -44,17 +44,28 @@ fromCanonicalPattern (A.A _ pattern) =
44
44
45-- TO STRING
45-- TO STRING
46
46
47−toString :: Pattern -> String
47+toString :: Bool -> Pattern -> String
48−toString pattern =
48+toString needsParens pattern =
49 case pattern of
49 case pattern of
50+ Data tag [first,rest] | Var.toString tag == "::" ->
51+ toString (isCons first) first
52+ ++ " :: "
53+ ++ toString False rest
54+
50 Data tag args ->
55 Data tag args ->
56+ if Var.isTuple tag then
57+ "(" ++ List.intercalate ", " (map (toString False) args) ++ ")"
58+
59+ else
60+ addParensIf (needsParens && not (null args)) $
51− List.intercalate " " (Var.toString tag : map toString args)
61+ List.intercalate " " (Var.toString tag : map (toString True) args)
52
62
53 Record fields ->
63 Record fields ->
54 "{ " ++ List.intercalate ", " fields ++ " }"
64 "{ " ++ List.intercalate ", " fields ++ " }"
55
65
56 Alias alias realPattern ->
66 Alias alias realPattern ->
67+ addParensIf needsParens $
57− toString realPattern ++ " as " ++ alias
68+ toString False realPattern ++ " as " ++ alias
58
69
59 Var name ->
70 Var name ->
60 name
71 name
@@ -66,6 +77,23 @@ toString pattern =
66 L.toString literal
77 L.toString literal
67
78
68 AnythingBut literalSet ->
79 AnythingBut literalSet ->
69− List.intercalate " " ("<values besides:" : map L.toString (Set.toList literalSet))
80+ List.intercalate " " ("<values besides:" : map L.toString (Set.toList literalSet) ++ [">"])
81+
82+
83+addParensIf :: Bool -> String -> String
84+addParensIf needsParens str =
85+ if needsParens then
86+ "(" ++ str ++ ")"
70
87
88+ else
89+ str
90+
91+
92+isCons :: Pattern -> Bool
93+isCons pattern =
94+ case pattern of
95+ Data tag [_,_] ->
96+ Var.toString tag == "::"
71
97
98+ _ ->
99+ False
src/Reporting/Error/Pattern.hs+1−1
@@ -48,7 +48,7 @@ viewPatternList unhandledPatterns =
48 splitAt 4 unhandledPatterns
48 splitAt 4 unhandledPatterns
49 in
49 in
50 concatMap ((++) "\n ") $
50 concatMap ((++) "\n ") $
51− map Pattern.toString showPatterns
51+ map (Pattern.toString False) showPatterns
52 ++ if null rest then [] else ["..."]
52 ++ if null rest then [] else ["..."]
53
53
54
54