Skip to content

Commit

Permalink
Warn about unused class imports
Browse files Browse the repository at this point in the history
  • Loading branch information
garyb committed Nov 22, 2015
1 parent f36f1d5 commit 66dcb6c
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 5 deletions.
18 changes: 15 additions & 3 deletions src/Language/PureScript/Linter/Imports.hs
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,11 @@ import Language.PureScript.Sugar.Names.Imports
import qualified Language.PureScript.Constants as C

-- | Imported name used in some type or expression.
data Name = IdentName (Qualified Ident) | IsProperName (Qualified ProperName) | DctorName (Qualified ProperName)
data Name
= IdentName (Qualified Ident)
| TypeName (Qualified ProperName)
| DctorName (Qualified ProperName)
| ClassName (Qualified ProperName)

-- | Map of module name to list of imported names from that module which have been used.
type UsedImports = M.Map ModuleName [Name]
Expand All @@ -41,7 +45,9 @@ findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do
forM_ decls $ \(ss, declType, qualifierName) ->
censor (onErrorMessages $ addModuleLocError ss) $ unless (qnameUsed qualifierName) $
let names = sugarNames mni ++ M.findWithDefault [] mni usedImps
usedNames = mapMaybe (matchName (typeForDCtor mni) qualifierName) names
usedNames
= mapMaybe (matchName (typeForDCtor mni) qualifierName) names
++ mapMaybe (matchClass qualifierName) names
usedDctors = mapMaybe (matchDctor qualifierName) names
in case declType of
Implicit -> when (null usedNames) $ tell $ errorMessage $ UnusedImport mni
Expand All @@ -63,6 +69,7 @@ findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do
let ddiff = ctors \\ usedDctors
in unless (null ddiff) $ tell $ errorMessage $ UnusedDctorExplicitImport tn ddiff
_ -> return ()

return ()

_ -> return ()
Expand Down Expand Up @@ -102,10 +109,14 @@ findUnusedImports (Module _ _ _ mdecls mexports) env usedImps = do

matchName :: (ProperName -> Maybe ProperName) -> Maybe ModuleName -> Name -> Maybe String
matchName _ qual (IdentName (Qualified q x)) | q == qual = Just $ showIdent x
matchName _ qual (IsProperName (Qualified q x)) | q == qual = Just $ runProperName x
matchName _ qual (TypeName (Qualified q x)) | q == qual = Just $ runProperName x
matchName lookupDc qual (DctorName (Qualified q x)) | q == qual = runProperName <$> lookupDc x
matchName _ _ _ = Nothing

matchClass :: Maybe ModuleName -> Name -> Maybe String
matchClass qual (ClassName (Qualified q x)) | q == qual = Just $ runProperName x
matchClass _ _ = Nothing

matchDctor :: Maybe ModuleName -> Name -> Maybe ProperName
matchDctor qual (DctorName (Qualified q x)) | q == qual = Just x
matchDctor _ _ = Nothing
Expand All @@ -114,6 +125,7 @@ runDeclRef :: DeclarationRef -> Maybe String
runDeclRef (PositionedDeclarationRef _ _ ref) = runDeclRef ref
runDeclRef (ValueRef ident) = Just $ showIdent ident
runDeclRef (TypeRef pn _) = Just $ runProperName pn
runDeclRef (TypeClassRef pn) = Just $ runProperName pn
runDeclRef _ = Nothing

getTypeRef :: DeclarationRef -> Maybe (ProperName, Maybe [ProperName])
Expand Down
4 changes: 2 additions & 2 deletions src/Language/PureScript/Sugar/Names.hs
Original file line number Diff line number Diff line change
Expand Up @@ -226,13 +226,13 @@ renameInModule env imports (Module ss coms mn decls exps) =
updateConstraints pos = traverse (\(name, ts) -> (,) <$> updateClassName name pos <*> traverse (updateTypesEverywhere pos) ts)

updateTypeName :: Qualified ProperName -> Maybe SourceSpan -> m (Qualified ProperName)
updateTypeName = update UnknownType (importedTypes imports) (resolveType . exportedTypes) IsProperName
updateTypeName = update UnknownType (importedTypes imports) (resolveType . exportedTypes) TypeName

updateDataConstructorName :: Qualified ProperName -> Maybe SourceSpan -> m (Qualified ProperName)
updateDataConstructorName = update (flip UnknownDataConstructor Nothing) (importedDataConstructors imports) (resolveDctor . exportedTypes) DctorName

updateClassName :: Qualified ProperName -> Maybe SourceSpan -> m (Qualified ProperName)
updateClassName = update UnknownTypeClass (importedTypeClasses imports) (resolve . exportedTypeClasses) IsProperName
updateClassName = update UnknownTypeClass (importedTypeClasses imports) (resolve . exportedTypeClasses) ClassName

updateValueName :: Qualified Ident -> Maybe SourceSpan -> m (Qualified Ident)
updateValueName = update UnknownValue (importedValues imports) (resolve . exportedValues) IdentName
Expand Down

0 comments on commit 66dcb6c

Please sign in to comment.