From 0f835a5a2c1bdb1f7659a9a3d508111607cf65e0 Mon Sep 17 00:00:00 2001 From: Vidar Holen Date: Sat, 28 Jul 2018 12:30:06 -0700 Subject: [PATCH] Don't trigger SC2222 for fallthrough case branches (fixes #1044) --- CHANGELOG.md | 1 + src/ShellCheck/Analytics.hs | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 384c7de..9aabd3c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - SC1117 about unknown double-quoted escape sequences has been retired ### Fixed - SC2021 no longer triggers for equivalence classes like '[=e=]' +- SC2221/SC2222 no longer mistriggers on fall-through case branches ## v0.5.0 - 2018-05-31 ### Added diff --git a/src/ShellCheck/Analytics.hs b/src/ShellCheck/Analytics.hs index 07d5766..5b8aa36 100644 --- a/src/ShellCheck/Analytics.hs +++ b/src/ShellCheck/Analytics.hs @@ -2686,26 +2686,31 @@ prop_checkUnmatchableCases5 = verify checkUnmatchableCases "case $f in *.txt) tr prop_checkUnmatchableCases6 = verifyNot checkUnmatchableCases "case $f in ?*) true;; *) false;; esac" prop_checkUnmatchableCases7 = verifyNot checkUnmatchableCases "case $f in $(x)) true;; asdf) false;; esac" prop_checkUnmatchableCases8 = verify checkUnmatchableCases "case $f in cow) true;; bar|cow) false;; esac" +prop_checkUnmatchableCases9 = verifyNot checkUnmatchableCases "case $f in x) true;;& x) false;; esac" checkUnmatchableCases _ t = case t of T_CaseExpression _ word list -> do - let patterns = concatMap snd3 list + -- Check all patterns for whether they can ever match + let allpatterns = concatMap snd3 list + -- Check only the non-fallthrough branches for shadowing + let breakpatterns = concatMap snd3 $ filter (\x -> fst3 x == CaseBreak) list if isConstant word then warn (getId word) 2194 "This word is constant. Did you forget the $ on a variable?" else potentially $ do pg <- wordToPseudoGlob word - return $ mapM_ (check pg) patterns + return $ mapM_ (check pg) allpatterns - let exactGlobs = tupMap wordToExactPseudoGlob patterns - let fuzzyGlobs = tupMap wordToPseudoGlob patterns + let exactGlobs = tupMap wordToExactPseudoGlob breakpatterns + let fuzzyGlobs = tupMap wordToPseudoGlob breakpatterns let dominators = zip exactGlobs (tails $ drop 1 fuzzyGlobs) mapM_ checkDoms dominators _ -> return () where + fst3 (x,_,_) = x snd3 (_,x,_) = x check target candidate = potentially $ do candidateGlob <- wordToPseudoGlob candidate