diff options
author | Ian Lynagh <igloo@earth.li> | 2010-07-24 23:01:21 +0000 |
---|---|---|
committer | Ian Lynagh <igloo@earth.li> | 2010-07-24 23:01:21 +0000 |
commit | 0e6ff027979263c36703f26da836a784fe1606a2 (patch) | |
tree | 8282b511cd803d91e5cce7ef4e01f22f5f4a234b /compiler/main | |
parent | 1971591f865ac0806802c476f23792ae2c89411a (diff) | |
download | haskell-0e6ff027979263c36703f26da836a784fe1606a2.tar.gz |
Add support for Haskell98 and Haskell2010 "languages"
Diffstat (limited to 'compiler/main')
-rw-r--r-- | compiler/main/DynFlags.hs | 66 | ||||
-rw-r--r-- | compiler/main/HeaderInfo.hs | 4 |
2 files changed, 50 insertions, 20 deletions
diff --git a/compiler/main/DynFlags.hs b/compiler/main/DynFlags.hs index afe665260b..8b35821863 100644 --- a/compiler/main/DynFlags.hs +++ b/compiler/main/DynFlags.hs @@ -45,7 +45,7 @@ module DynFlags ( parseDynamicNoPackageFlags, allFlags, - supportedExtensions, extensionOptions, + supportedLanguagesAndExtensions, -- ** DynFlag C compiler options machdepCCOpts, picCCOpts, @@ -272,6 +272,8 @@ data DynFlag deriving (Eq, Show) +data Language = Haskell98 | Haskell2010 + data ExtensionFlag = Opt_Cpp | Opt_OverlappingInstances @@ -477,6 +479,7 @@ data DynFlags = DynFlags { -- hsc dynamic flags flags :: [DynFlag], + language :: Maybe Language, extensionFlags :: Either [OnOff ExtensionFlag] [ExtensionFlag], @@ -730,6 +733,7 @@ defaultDynFlags = -- The default -O0 options ++ standardWarnings, + language = Nothing, extensionFlags = Left [], log_action = \severity srcSpan style msg -> @@ -763,7 +767,7 @@ flattenExtensionFlags dflags = case extensionFlags dflags of Left onoffs -> dflags { - extensionFlags = Right $ flattenExtensionFlags' onoffs + extensionFlags = Right $ flattenExtensionFlags' (language dflags) onoffs } Right _ -> panic "Flattening already-flattened extension flags" @@ -773,27 +777,39 @@ ensureFlattenedExtensionFlags dflags = case extensionFlags dflags of Left onoffs -> dflags { - extensionFlags = Right $ flattenExtensionFlags' onoffs + extensionFlags = Right $ flattenExtensionFlags' (language dflags) onoffs } Right _ -> dflags -- OnOffs accumulate in reverse order, so we use foldr in order to -- process them in the right order -flattenExtensionFlags' :: [OnOff ExtensionFlag] -> [ExtensionFlag] -flattenExtensionFlags' = foldr f defaultExtensionFlags +flattenExtensionFlags' :: Maybe Language -> [OnOff ExtensionFlag] + -> [ExtensionFlag] +flattenExtensionFlags' ml = foldr f defaultExtensionFlags where f (On f) flags = f : delete f flags f (Off f) flags = delete f flags - defaultExtensionFlags = [ - Opt_MonoPatBinds, -- Experimentally, I'm making this non-standard - -- behaviour the default, to see if anyone notices - -- SLPJ July 06 - - Opt_ImplicitPrelude, - Opt_MonomorphismRestriction, - Opt_NPlusKPatterns, - Opt_DatatypeContexts - ] + defaultExtensionFlags = languageExtensions ml + +languageExtensions :: Maybe Language -> [ExtensionFlag] +languageExtensions Nothing + = Opt_MonoPatBinds -- Experimentally, I'm making this non-standard + -- behaviour the default, to see if anyone notices + -- SLPJ July 06 + : languageExtensions (Just Haskell2010) +languageExtensions (Just Haskell98) + = [Opt_ImplicitPrelude, + Opt_MonomorphismRestriction, + Opt_NPlusKPatterns, + Opt_DatatypeContexts] +languageExtensions (Just Haskell2010) + = [Opt_ImplicitPrelude, + Opt_MonomorphismRestriction, + Opt_DatatypeContexts, + Opt_EmptyDataDecls, + Opt_ForeignFunctionInterface, + Opt_PatternGuards, + Opt_RelaxedPolyRec] -- The DOpt class is a temporary workaround, to avoid having to do -- a mass-renaming dopt->lopt at the moment @@ -1530,6 +1546,7 @@ dynamic_flags = [ ++ map (mkFlag False "fno-" unSetExtensionFlag) fLangFlags ++ map (mkFlag True "X" setExtensionFlag ) xFlags ++ map (mkFlag False "XNo" unSetExtensionFlag) xFlags + ++ map (mkFlag True "X" setLanguage ) languageFlags package_flags :: [Flag DynP] package_flags = [ @@ -1687,12 +1704,21 @@ fLangFlags = [ deprecatedForExtension "IncoherentInstances" ) ] +supportedLanguages :: [String] +supportedLanguages = [ name | (name, _, _) <- languageFlags ] + supportedExtensions :: [String] supportedExtensions = [ name' | (name, _, _) <- xFlags, name' <- [name, "No" ++ name] ] --- This may contain duplicates -extensionOptions :: [ExtensionFlag] -extensionOptions = [ langFlag | (_, langFlag, _) <- xFlags ] +supportedLanguagesAndExtensions :: [String] +supportedLanguagesAndExtensions = supportedLanguages ++ supportedExtensions + +-- | These -X<blah> flags cannot be reversed with -XNo<blah> +languageFlags :: [(String, Language, Bool -> Deprecated)] +languageFlags = [ + ( "Haskell98", Haskell98, const Supported ), + ( "Haskell2010", Haskell2010, const Supported ) + ] -- | These -X<blah> flags can all be reversed with -XNo<blah> xFlags :: [(String, ExtensionFlag, Bool -> Deprecated)] @@ -1923,6 +1949,10 @@ setDynFlag f = upd (\dfs -> dopt_set dfs f) unSetDynFlag f = upd (\dfs -> dopt_unset dfs f) -------------------------- +setLanguage :: Language -> DynP () +setLanguage l = upd (\dfs -> dfs { language = Just l }) + +-------------------------- setExtensionFlag, unSetExtensionFlag :: ExtensionFlag -> DynP () setExtensionFlag f = do { upd (\dfs -> lopt_set dfs f) ; mapM_ setExtensionFlag deps } diff --git a/compiler/main/HeaderInfo.hs b/compiler/main/HeaderInfo.hs index 4c664bdc04..d21eeac860 100644 --- a/compiler/main/HeaderInfo.hs +++ b/compiler/main/HeaderInfo.hs @@ -266,7 +266,7 @@ checkExtension (L l ext) -- Checks if a given extension is valid, and if so returns -- its corresponding flag. Otherwise it throws an exception. = let ext' = unpackFS ext in - if ext' `elem` supportedExtensions + if ext' `elem` supportedLanguagesAndExtensions then L l ("-X"++ext') else unsupportedExtnError l ext' @@ -285,7 +285,7 @@ unsupportedExtnError loc unsup = mkPlainErrMsg loc $ text "Unsupported extension: " <> text unsup $$ if null suggestions then empty else text "Perhaps you meant" <+> quotedListWithOr (map text suggestions) - where suggestions = fuzzyMatch unsup supportedExtensions + where suggestions = fuzzyMatch unsup supportedLanguagesAndExtensions optionsErrorMsgs :: [String] -> [Located String] -> FilePath -> Messages |