Fix ambiguous flag resolution (#7138)
authorPaolo Capriotti <p.capriotti@gmail.com>
Mon, 13 Aug 2012 11:48:29 +0000 (12:48 +0100)
committerPaolo Capriotti <p.capriotti@gmail.com>
Mon, 13 Aug 2012 11:48:29 +0000 (12:48 +0100)
Pick longest flag when more than one matches in findArg.

This fixes an issue where -ignore-dot-ghci wasn't honored, because the
flag was parsed as "-i gnore-dot-ghci".

compiler/main/CmdLineParser.hs

index c6d07ce..f87039a 100644 (file)
@@ -27,6 +27,7 @@ import Panic
 import Bag
 import SrcLoc
 
+import Data.Function
 import Data.List
 
 
@@ -194,11 +195,12 @@ processOneArg opt_kind rest arg args
 
 findArg :: [Flag m] -> String -> Maybe (String, OptKind m)
 findArg spec arg =
-    case [ (removeSpaces rest, optKind)
-         | flag <- spec,
-           let optKind  = flagOptKind flag,
-           Just rest <- [stripPrefix (flagName flag) arg],
-           arg_ok optKind rest arg ]
+    case sortBy (compare `on` (length . fst)) -- prefer longest matching flag
+           [ (removeSpaces rest, optKind)
+           | flag <- spec,
+             let optKind  = flagOptKind flag,
+             Just rest <- [stripPrefix (flagName flag) arg],
+             arg_ok optKind rest arg ]
     of
         []      -> Nothing
         (one:_) -> Just one