Add flag to control number of missing patterns in warnings
authorDavid Luposchainsky <dluposchainsky@gmail.com>
Sun, 17 Apr 2016 12:41:33 +0000 (14:41 +0200)
committerBen Gamari <ben@smart-cactus.org>
Sun, 17 Apr 2016 12:42:15 +0000 (14:42 +0200)
Non-exhaustive pattern warnings had their number of patterns to
show hardcoded in the past. This patch implements the TODO remark
that this should be made a command line flag.

    -fmax-uncovered-patterns=<n>

can now be used to influence the number of patterns to be shown.

Reviewers: hvr, austin, bgamari

Reviewed By: bgamari

Subscribers: thomie

Differential Revision: https://phabricator.haskell.org/D2076

compiler/deSugar/Check.hs
compiler/main/DynFlags.hs
docs/users_guide/using-optimisation.rst
utils/mkUserGuidePart/Options/Optimizations.hs

index fe1b4bc..02074e5 100644 (file)
@@ -1256,6 +1256,8 @@ dsPmWarn dflags ctx@(DsMatchContext kind loc) pm_result
     flag_u = exhaustive dflags kind
     flag_u_reason = maybe NoReason Reason (exhaustiveWarningFlag kind)
 
+    maxPatterns = maxUncoveredPatterns dflags
+
     -- Print a single clause (for redundant/with-inaccessible-rhs)
     pprEqn q txt = pp_context True ctx (text txt) $ \f -> ppr_eqn f kind q
 
@@ -1266,7 +1268,8 @@ dsPmWarn dflags ctx@(DsMatchContext kind loc) pm_result
                     -> text "Guards do not cover entire pattern space"
            _missing -> let us = map ppr qs
                        in  hang (text "Patterns not matched:") 4
-                                (vcat (take maximum_output us) $$ dots us)
+                                (vcat (take maxPatterns us)
+                                 $$ dots maxPatterns us)
 
 -- | Issue a warning when the predefined number of iterations is exceeded
 -- for the pattern match checker
@@ -1285,9 +1288,10 @@ warnPmIters dflags (DsMatchContext kind loc)
     flag_i = wopt Opt_WarnOverlappingPatterns dflags
     flag_u = exhaustive dflags kind
 
-dots :: [a] -> SDoc
-dots qs | qs `lengthExceeds` maximum_output = text "..."
-        | otherwise                         = empty
+dots :: Int -> [a] -> SDoc
+dots maxPatterns qs
+    | qs `lengthExceeds` maxPatterns = text "..."
+    | otherwise                      = empty
 
 -- | Check whether the exhaustiveness checker should run (exhaustiveness only)
 exhaustive :: DynFlags -> HsMatchContext id -> Bool
@@ -1347,12 +1351,6 @@ ppr_uncovered (expr_vec, complex)
     sdoc_vec = mapM pprPmExprWithParens expr_vec
     (vec,cs) = runPmPprM sdoc_vec (filterComplex complex)
 
--- | This variable shows the maximum number of lines of output generated for
--- warnings. It will limit the number of patterns/equations displayed to
--- maximum_output. (TODO: add command-line option?)
-maximum_output :: Int
-maximum_output = 4
-
 {- Note [Representation of Term Equalities]
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 In the paper, term constraints always take the form (x ~ e). Of course, a more
index a79bb3a..e43869e 100644 (file)
@@ -664,6 +664,8 @@ data DynFlags = DynFlags {
 
   maxRelevantBinds      :: Maybe Int,   -- ^ Maximum number of bindings from the type envt
                                         --   to show in type error messages
+  maxUncoveredPatterns  :: Int,         -- ^ Maximum number of unmatched patterns to show
+                                        --   in non-exhaustiveness warnings
   simplTickFactor       :: Int,         -- ^ Multiplier for simplifier ticks
   specConstrThreshold   :: Maybe Int,   -- ^ Threshold for SpecConstr
   specConstrCount       :: Maybe Int,   -- ^ Max number of specialisations for any one function
@@ -1448,6 +1450,7 @@ defaultDynFlags mySettings =
         maxPmCheckIterations    = 2000000,
         ruleCheck               = Nothing,
         maxRelevantBinds        = Just 6,
+        maxUncoveredPatterns    = 4,
         simplTickFactor         = 100,
         specConstrThreshold     = Just 2000,
         specConstrCount         = Just 3,
@@ -2837,6 +2840,8 @@ dynamic_flags_deps = [
       (intSuffix (\n d -> d { maxRelevantBinds = Just n }))
   , make_ord_flag defFlag "fno-max-relevant-binds"
       (noArg (\d -> d { maxRelevantBinds = Nothing }))
+  , make_ord_flag defFlag "fmax-uncovered-patterns"
+      (intSuffix (\n d -> d { maxUncoveredPatterns = n }))
   , make_ord_flag defFlag "fsimplifier-phases"
       (intSuffix (\n d -> d { simplPhases = n }))
   , make_ord_flag defFlag "fmax-simplifier-iterations"
index 5e4995d..9436510 100644 (file)
@@ -120,7 +120,7 @@ list.
 
           case x of
              Red -> e1
-             _   -> case x of 
+             _   -> case x of
                       Blue -> e2
                       Green -> e3
 
@@ -353,6 +353,13 @@ list.
     they may be numerous), but ``-fno-max-relevant-bindings`` includes
     them too.
 
+.. ghc-flag:: -fmax-uncovered-patterns=<n>
+
+    :default: 4
+
+    Maximum number of unmatched patterns to be shown in warnings generated by
+    :ghc-flag:`-Wincomplete-patterns` and :ghc-flag:`-Wincomplete-uni-patterns`.
+
 .. ghc-flag:: -fmax-simplifier-iterations=<n>
 
     :default: 4
index dd9ffd9..5f46a06 100644 (file)
@@ -178,6 +178,12 @@ optimizationsOptions =
          , flagType = DynamicFlag
          , flagReverse = "-fno-max-relevant-bindings"
          }
+  , flag { flagName = "-fmax-uncovered-patterns=⟨n⟩"
+         , flagDescription =
+           "*default: 4.* Set the maximum number of patterns to display in "++
+           "warnings about non-exhaustive ones."
+         , flagType = DynamicFlag
+         }
   , flag { flagName = "-fmax-simplifier-iterations=⟨n⟩"
          , flagDescription =
            "*default: 4.* Set the max iterations for the simplifier."