From 40f87463823d40e5fe9236f5cb6b5371dbdf9ff3 Mon Sep 17 00:00:00 2001 From: Phil Freeman Date: Mon, 4 Apr 2016 20:45:30 -0700 Subject: [PATCH 1/2] Remove qualified keyword --- examples/failing/OverlappingReExport.purs | 2 +- examples/passing/AutoPrelude2.purs | 2 +- examples/passing/ModuleExportQualified.purs | 2 +- examples/passing/OptionalQualified.purs | 3 +-- .../passing/QualifiedQualifiedImports.purs | 2 +- examples/passing/ReExportQualified.purs | 2 +- psci/PSCi/Completion.hs | 6 ++--- psci/PSCi/Module.hs | 2 +- psci/PSCi/Parser.hs | 2 +- src/Language/PureScript/AST/Declarations.hs | 7 +++--- src/Language/PureScript/CoreFn/Desugar.hs | 2 +- src/Language/PureScript/Errors.hs | 15 ++---------- src/Language/PureScript/Externs.hs | 2 +- src/Language/PureScript/Ide/SourceFile.hs | 6 ++--- src/Language/PureScript/Linter/Imports.hs | 4 ++-- src/Language/PureScript/ModuleDependencies.hs | 2 +- .../PureScript/Parser/Declarations.hs | 23 ++++++------------- .../PureScript/Sugar/Names/Imports.hs | 9 ++++---- tests/TestPsci.hs | 4 +--- 19 files changed, 35 insertions(+), 62 deletions(-) diff --git a/examples/failing/OverlappingReExport.purs b/examples/failing/OverlappingReExport.purs index af85a5a534..8c38c4561d 100644 --- a/examples/failing/OverlappingReExport.purs +++ b/examples/failing/OverlappingReExport.purs @@ -7,4 +7,4 @@ module B where module C (module A, module M2) where import A - import qualified B as M2 + import B as M2 diff --git a/examples/passing/AutoPrelude2.purs b/examples/passing/AutoPrelude2.purs index 373c38079b..4db3aaf14a 100644 --- a/examples/passing/AutoPrelude2.purs +++ b/examples/passing/AutoPrelude2.purs @@ -1,7 +1,7 @@ module Main where import Prelude -import qualified Prelude as P +import Prelude as P import Control.Monad.Eff.Console f :: forall a. a -> a diff --git a/examples/passing/ModuleExportQualified.purs b/examples/passing/ModuleExportQualified.purs index 88fa20edf5..0c1892361c 100644 --- a/examples/passing/ModuleExportQualified.purs +++ b/examples/passing/ModuleExportQualified.purs @@ -3,7 +3,7 @@ module A (module Prelude) where module Main where import Control.Monad.Eff.Console - import qualified A as B + import A as B main = do print (B.show 1.0) diff --git a/examples/passing/OptionalQualified.purs b/examples/passing/OptionalQualified.purs index fccfd7ae4b..de5b8749cf 100644 --- a/examples/passing/OptionalQualified.purs +++ b/examples/passing/OptionalQualified.purs @@ -1,7 +1,6 @@ module Main where --- qualified import with the "qualified" keyword -import qualified Prelude as P +import Prelude as P -- qualified import without the "qualified" keyword import Control.Monad.Eff.Console as Console diff --git a/examples/passing/QualifiedQualifiedImports.purs b/examples/passing/QualifiedQualifiedImports.purs index 91c188c275..77401b205c 100644 --- a/examples/passing/QualifiedQualifiedImports.purs +++ b/examples/passing/QualifiedQualifiedImports.purs @@ -1,6 +1,6 @@ module Main where -- qualified import with qualified imported names -import qualified Control.Monad.Eff.Console (log) as Console +import Control.Monad.Eff.Console (log) as Console main = Console.log "Success!" diff --git a/examples/passing/ReExportQualified.purs b/examples/passing/ReExportQualified.purs index cf1c037cf8..e85ecee236 100644 --- a/examples/passing/ReExportQualified.purs +++ b/examples/passing/ReExportQualified.purs @@ -6,7 +6,7 @@ module B where module C (module A, module M2) where import A - import qualified B as M2 + import B as M2 module Main where diff --git a/psci/PSCi/Completion.hs b/psci/PSCi/Completion.hs index 26965e7c71..711f0615c0 100644 --- a/psci/PSCi/Completion.hs +++ b/psci/PSCi/Completion.hs @@ -87,10 +87,8 @@ directiveArg _ Kind = [CtxType] completeImport :: [String] -> String -> [CompletionContext] completeImport ws w' = case (ws, w') of - (["import"], w) | headSatisfies isUpper w -> [CtxModule] - (["import"], _) -> [CtxModule, CtxFixed "qualified"] - (["import", "qualified"], _) -> [CtxModule] - _ -> [] + (["import"], _) -> [CtxModule] + _ -> [] headSatisfies :: (a -> Bool) -> [a] -> Bool headSatisfies p str = diff --git a/psci/PSCi/Module.hs b/psci/PSCi/Module.hs index ead2c0057a..cd25bc2ff4 100644 --- a/psci/PSCi/Module.hs +++ b/psci/PSCi/Module.hs @@ -97,7 +97,7 @@ createTemporaryModuleForImports PSCiState{psciImportedModules = imports} = P.Module (P.internalModuleSourceSpan "") [] moduleName (importDecl `map` imports) Nothing importDecl :: ImportedModule -> P.Declaration -importDecl (mn, declType, asQ) = P.ImportDeclaration mn declType asQ False +importDecl (mn, declType, asQ) = P.ImportDeclaration mn declType asQ indexFile :: FilePath indexFile = ".psci_modules" ++ pathSeparator : "index.js" diff --git a/psci/PSCi/Parser.hs b/psci/PSCi/Parser.hs index 526f3d6eac..ec7a4e9eab 100644 --- a/psci/PSCi/Parser.hs +++ b/psci/PSCi/Parser.hs @@ -107,7 +107,7 @@ psciLet = Decls <$> (P.reserved "let" *> P.indented *> manyDecls) -- :show import works, for example. psciImport :: P.TokenParser Command psciImport = do - (mn, declType, asQ, _) <- P.parseImportDeclaration' + (mn, declType, asQ) <- P.parseImportDeclaration' return $ Import (mn, declType, asQ) -- | Any other declaration that we don't need a 'special case' parser for diff --git a/src/Language/PureScript/AST/Declarations.hs b/src/Language/PureScript/AST/Declarations.hs index f4e999c1b8..5e851371e1 100644 --- a/src/Language/PureScript/AST/Declarations.hs +++ b/src/Language/PureScript/AST/Declarations.hs @@ -47,9 +47,9 @@ getModuleName (Module _ _ name _ _) = name addDefaultImport :: ModuleName -> Module -> Module addDefaultImport toImport m@(Module ss coms mn decls exps) = if isExistingImport `any` decls || mn == toImport then m - else Module ss coms mn (ImportDeclaration toImport Implicit Nothing False : decls) exps + else Module ss coms mn (ImportDeclaration toImport Implicit Nothing : decls) exps where - isExistingImport (ImportDeclaration mn' _ _ _) | mn' == toImport = True + isExistingImport (ImportDeclaration mn' _ _) | mn' == toImport = True isExistingImport (PositionedDeclaration _ _ d) = isExistingImport d isExistingImport _ = False @@ -193,9 +193,8 @@ data Declaration | FixityDeclaration Fixity String (Maybe (Either (Qualified Ident) (Qualified (ProperName 'ConstructorName)))) -- | -- A module import (module name, qualified/unqualified/hiding, optional "qualified as" name) - -- TODO: also a boolean specifying whether the old `qualified` syntax was used, so a warning can be raised in desugaring (remove for 0.9) -- - | ImportDeclaration ModuleName ImportDeclarationType (Maybe ModuleName) Bool + | ImportDeclaration ModuleName ImportDeclarationType (Maybe ModuleName) -- | -- A type class declaration (name, argument, implies, member declarations) -- diff --git a/src/Language/PureScript/CoreFn/Desugar.hs b/src/Language/PureScript/CoreFn/Desugar.hs index 0c86329de2..23304267c7 100644 --- a/src/Language/PureScript/CoreFn/Desugar.hs +++ b/src/Language/PureScript/CoreFn/Desugar.hs @@ -228,7 +228,7 @@ findQualModules decls = -- Desugars import declarations from AST to CoreFn representation. -- importToCoreFn :: A.Declaration -> Maybe (Ann, ModuleName) -importToCoreFn (A.ImportDeclaration name _ _ _) = Just (nullAnn, name) +importToCoreFn (A.ImportDeclaration name _ _) = Just (nullAnn, name) importToCoreFn (A.PositionedDeclaration ss _ d) = ((,) (Just ss, [], Nothing, Nothing) . snd) <$> importToCoreFn d importToCoreFn _ = Nothing diff --git a/src/Language/PureScript/Errors.hs b/src/Language/PureScript/Errors.hs index c6bdb149fd..1dacfca299 100644 --- a/src/Language/PureScript/Errors.hs +++ b/src/Language/PureScript/Errors.hs @@ -132,7 +132,6 @@ data SimpleErrorMessage | UnusedDctorExplicitImport (ProperName 'TypeName) [ProperName 'ConstructorName] | DeprecatedOperatorDecl String | DeprecatedOperatorSection Expr (Either Expr Expr) - | DeprecatedQualifiedSyntax ModuleName ModuleName | DeprecatedClassImport ModuleName (ProperName 'ClassName) | DeprecatedClassExport (ProperName 'ClassName) | RedundantUnqualifiedImport ModuleName ImportDeclarationType @@ -313,7 +312,6 @@ errorCode em = case unwrapErrorMessage em of UnusedDctorExplicitImport{} -> "UnusedDctorExplicitImport" DeprecatedOperatorDecl{} -> "DeprecatedOperatorDecl" DeprecatedOperatorSection{} -> "DeprecatedOperatorSection" - DeprecatedQualifiedSyntax{} -> "DeprecatedQualifiedSyntax" DeprecatedClassImport{} -> "DeprecatedClassImport" DeprecatedClassExport{} -> "DeprecatedClassExport" RedundantUnqualifiedImport{} -> "RedundantUnqualifiedImport" @@ -444,8 +442,6 @@ errorSuggestion err = case err of RedundantEmptyHidingImport{} -> emptySuggestion DuplicateImport{} -> emptySuggestion RedundantUnqualifiedImport{} -> emptySuggestion - DeprecatedQualifiedSyntax name qualName -> suggest $ - "import " ++ runModuleName name ++ " as " ++ runModuleName qualName UnusedExplicitImport mn _ qual refs -> suggest $ importSuggestion mn refs qual ImplicitImport mn refs -> suggest $ importSuggestion mn refs Nothing ImplicitQualifiedImport mn asModule refs -> suggest $ importSuggestion mn refs (Just asModule) @@ -902,14 +898,7 @@ prettyPrintSingleError full level showWiki e = flip evalState defaultUnknownMap renderOperator (PositionedValue _ _ ex) = renderOperator ex renderOperator (Var (Qualified _ (Op ident))) = line ident renderOperator other = Box.hcat Box.top [ line "`", prettyPrintValue valueDepth other, line "`" ] - renderSimpleErrorMessage (DeprecatedQualifiedSyntax name qualName) = - paras [ line "Import uses the deprecated 'qualified' syntax:" - , indent $ line $ "import qualified " ++ runModuleName name ++ " as " ++ runModuleName qualName - , line "Should instead use the form:" - , indent $ line $ "import " ++ runModuleName name ++ " as " ++ runModuleName qualName - , line "The deprecated syntax will be removed in PureScript 0.9." - ] - + renderSimpleErrorMessage (DeprecatedClassImport mn name) = paras [ line $ "Class import from " ++ runModuleName mn ++ " uses deprecated syntax that omits the 'class' keyword:" , indent $ line $ runProperName name @@ -1202,7 +1191,7 @@ prettyPrintMultipleWarningsBox = prettyPrintMultipleErrorsWith Warning "Warning -- | Pretty print errors as a Box prettyPrintMultipleErrorsBox :: Bool -> MultipleErrors -> [Box.Box] -prettyPrintMultipleErrorsBox = prettyPrintMultipleErrorsWith Error "Error found:" "Error" +prettyPrintMultipleErrorsBox = prettyPrintMultipleErrorsWith Error "Error found:" "Error" prettyPrintMultipleErrorsWith :: Level -> String -> String -> Bool -> MultipleErrors -> [Box.Box] prettyPrintMultipleErrorsWith level intro _ full (MultipleErrors [e]) = diff --git a/src/Language/PureScript/Externs.hs b/src/Language/PureScript/Externs.hs index b334a8bf5d..6e9e7c9633 100644 --- a/src/Language/PureScript/Externs.hs +++ b/src/Language/PureScript/Externs.hs @@ -164,7 +164,7 @@ moduleToExternsFile (Module _ _ mn ds (Just exps)) env = ExternsFile{..} fixityDecl _ = Nothing importDecl :: Declaration -> Maybe ExternsImport - importDecl (ImportDeclaration m mt qmn _) = Just (ExternsImport m mt qmn) + importDecl (ImportDeclaration m mt qmn) = Just (ExternsImport m mt qmn) importDecl (PositionedDeclaration _ _ d) = importDecl d importDecl _ = Nothing diff --git a/src/Language/PureScript/Ide/SourceFile.hs b/src/Language/PureScript/Ide/SourceFile.hs index 846a8faee7..844e837b43 100644 --- a/src/Language/PureScript/Ide/SourceFile.hs +++ b/src/Language/PureScript/Ide/SourceFile.hs @@ -52,14 +52,14 @@ getImportsForFile fp = do let imports = getImports module' pure (mkModuleImport . unwrapPositionedImport <$> imports) where - mkModuleImport (D.ImportDeclaration mn importType' qualifier _) = + mkModuleImport (D.ImportDeclaration mn importType' qualifier) = ModuleImport (T.pack (N.runModuleName mn)) importType' (T.pack . N.runModuleName <$> qualifier) mkModuleImport _ = error "Shouldn't have gotten anything but Imports here" - unwrapPositionedImport (D.ImportDeclaration mn importType' qualifier b) = - D.ImportDeclaration mn (unwrapImportType importType') qualifier b + unwrapPositionedImport (D.ImportDeclaration mn importType' qualifier) = + D.ImportDeclaration mn (unwrapImportType importType') qualifier unwrapPositionedImport x = x unwrapImportType (D.Explicit decls) = D.Explicit (map unwrapPositionedRef decls) unwrapImportType (D.Hiding decls) = D.Hiding (map unwrapPositionedRef decls) diff --git a/src/Language/PureScript/Linter/Imports.hs b/src/Language/PureScript/Linter/Imports.hs index 446ede2f30..118c9fea3f 100644 --- a/src/Language/PureScript/Linter/Imports.hs +++ b/src/Language/PureScript/Linter/Imports.hs @@ -107,8 +107,8 @@ lintImports (Module _ _ mn mdecls mexports) env usedImps = do where countOpenImports :: Declaration -> Int - countOpenImports (ImportDeclaration mn' Implicit Nothing _) | not (isPrim mn') = 1 - countOpenImports (ImportDeclaration mn' (Hiding _) Nothing _) | not (isPrim mn') = 1 + countOpenImports (ImportDeclaration mn' Implicit Nothing) | not (isPrim mn') = 1 + countOpenImports (ImportDeclaration mn' (Hiding _) Nothing) | not (isPrim mn') = 1 countOpenImports (PositionedDeclaration _ _ d) = countOpenImports d countOpenImports _ = 0 diff --git a/src/Language/PureScript/ModuleDependencies.hs b/src/Language/PureScript/ModuleDependencies.hs index 93b85e8329..6d0d806407 100644 --- a/src/Language/PureScript/ModuleDependencies.hs +++ b/src/Language/PureScript/ModuleDependencies.hs @@ -60,7 +60,7 @@ usedModules d = in nub (f d ++ g d) where forDecls :: Declaration -> [ModuleName] - forDecls (ImportDeclaration mn _ _ _) = [mn] + forDecls (ImportDeclaration mn _ _) = [mn] forDecls (FixityDeclaration _ _ (Just (Left (Qualified (Just mn) _)))) = [mn] forDecls (FixityDeclaration _ _ (Just (Right (Qualified (Just mn) _)))) = [mn] forDecls (TypeInstanceDeclaration _ _ (Qualified (Just mn) _) _ _) = [mn] diff --git a/src/Language/PureScript/Parser/Declarations.hs b/src/Language/PureScript/Parser/Declarations.hs index 42d225354f..8d659adb1f 100644 --- a/src/Language/PureScript/Parser/Declarations.hs +++ b/src/Language/PureScript/Parser/Declarations.hs @@ -131,28 +131,19 @@ parseFixityDeclaration = do parseImportDeclaration :: TokenParser Declaration parseImportDeclaration = do - (mn, declType, asQ, isOldSyntax) <- parseImportDeclaration' - return $ ImportDeclaration mn declType asQ isOldSyntax + (mn, declType, asQ) <- parseImportDeclaration' + return $ ImportDeclaration mn declType asQ -parseImportDeclaration' :: TokenParser (ModuleName, ImportDeclarationType, Maybe ModuleName, Bool) +parseImportDeclaration' :: TokenParser (ModuleName, ImportDeclarationType, Maybe ModuleName) parseImportDeclaration' = do reserved "import" indented - qualImport <|> stdImport + moduleName' <- moduleName + declType <- reserved "hiding" *> qualifyingList Hiding <|> qualifyingList Explicit + qName <- P.optionMaybe qualifiedName + return (moduleName', declType, qName) where - stdImport = do - moduleName' <- moduleName - declType <- reserved "hiding" *> qualifyingList Hiding <|> qualifyingList Explicit - qName <- P.optionMaybe qualifiedName - return (moduleName', declType, qName, False) qualifiedName = reserved "as" *> moduleName - qualImport = do - reserved "qualified" - indented - moduleName' <- moduleName - declType <- qualifyingList Explicit - qName <- qualifiedName - return (moduleName', declType, Just qName, True) qualifyingList expectedType = do declType <- P.optionMaybe (expectedType <$> (indented *> parens (commaSep parseDeclarationRef))) return $ fromMaybe Implicit declType diff --git a/src/Language/PureScript/Sugar/Names/Imports.hs b/src/Language/PureScript/Sugar/Names/Imports.hs index c03517809e..6a84746e44 100644 --- a/src/Language/PureScript/Sugar/Names/Imports.hs +++ b/src/Language/PureScript/Sugar/Names/Imports.hs @@ -13,7 +13,7 @@ import Prelude () import Prelude.Compat import Data.List (find, delete, (\\)) -import Data.Maybe (fromMaybe, isJust, isNothing, fromJust) +import Data.Maybe (fromMaybe, isJust, isNothing) import Data.Foldable (traverse_, for_) import Data.Traversable (for) @@ -42,8 +42,7 @@ findImports -> m (M.Map ModuleName [(Maybe SourceSpan, ImportDeclarationType, Maybe ModuleName)]) findImports = foldM (go Nothing) M.empty where - go pos result (ImportDeclaration mn typ qual isOldSyntax) = do - when isOldSyntax . tell . errorMessage $ DeprecatedQualifiedSyntax mn (fromJust qual) + go pos result (ImportDeclaration mn typ qual) = do let imp = (pos, typ, qual) return $ M.insert mn (maybe [imp] (imp :) (mn `M.lookup` result)) result go _ result (PositionedDeclaration pos _ d) = warnAndRethrowWithPosition pos $ go (Just pos) result d @@ -137,13 +136,13 @@ resolveImports env (Module ss coms currentModule decls exps) = updateImportRef :: Declaration -> m Declaration updateImportRef (PositionedDeclaration pos com d) = warnAndRethrowWithPosition pos $ PositionedDeclaration pos com <$> updateImportRef d - updateImportRef (ImportDeclaration mn typ qual isOldSyntax) = do + updateImportRef (ImportDeclaration mn typ qual) = do modExports <- getExports env mn typ' <- case typ of Implicit -> return Implicit Explicit refs -> Explicit <$> updateProperRef mn modExports `traverse` refs Hiding refs -> Hiding <$> updateProperRef mn modExports `traverse` refs - return $ ImportDeclaration mn typ' qual isOldSyntax + return $ ImportDeclaration mn typ' qual updateImportRef other = return other updateProperRef :: ModuleName -> Exports -> DeclarationRef -> m DeclarationRef diff --git a/tests/TestPsci.hs b/tests/TestPsci.hs index 3d058df020..f999d87024 100644 --- a/tests/TestPsci.hs +++ b/tests/TestPsci.hs @@ -59,7 +59,6 @@ completionTestData = -- import should complete module names , ("import Control.Monad.E", map ("import Control.Monad.Eff" ++) ["", ".Unsafe", ".Class", ".Console"]) , ("import Control.Monad.Eff.", map ("import Control.Monad.Eff" ++) [".Unsafe", ".Class", ".Console"]) - , ("import qualified Control.Monad.Eff.", map ("import qualified Control.Monad.Eff" ++) [".Unsafe", ".Class", ".Console"]) -- :load, :module should complete file paths , (":l tests/support/psci/", [":l tests/support/psci/Sample.purs"]) @@ -90,8 +89,7 @@ completionTestData = -- a few other import tests , ("impor", ["import"]) - , ("import q", ["import qualified"]) - , ("import ", map ("import " ++) supportModules ++ ["import qualified"]) + , ("import ", map ("import " ++) supportModules) , ("import Prelude ", []) -- String and number literals should not be completed From 45451a8accdeec8aedd7a182361a768f0e608ada Mon Sep 17 00:00:00 2001 From: Phil Freeman Date: Thu, 14 Apr 2016 20:43:56 -0700 Subject: [PATCH 2/2] Fix warnings --- psci/PSCi/Completion.hs | 1 - 1 file changed, 1 deletion(-) diff --git a/psci/PSCi/Completion.hs b/psci/PSCi/Completion.hs index 711f0615c0..4e7f2f1bc1 100644 --- a/psci/PSCi/Completion.hs +++ b/psci/PSCi/Completion.hs @@ -7,7 +7,6 @@ import Prelude.Compat import Data.Maybe (mapMaybe) import Data.List (nub, nubBy, sortBy, isPrefixOf, stripPrefix) -import Data.Char (isUpper) import Data.Function (on) import Control.Arrow (second)