elm-review/src/Lint/Rule/NoImportingEverything.elm

77 lines
1.7 KiB
Elm
Raw Normal View History

2019-06-03 01:30:24 +03:00
module Lint.Rule.NoImportingEverything exposing (rule, Configuration)
2019-07-03 15:19:29 +03:00
{-| Forbid importing everything from your module. This can especially be confusing to newcomers when the exposed
functions and types are unknown to them.
2019-06-03 01:30:24 +03:00
2019-07-03 15:19:29 +03:00
## Fail
2019-06-03 01:30:24 +03:00
import Html exposing (..)
2019-07-03 15:19:29 +03:00
## Success
2019-06-03 01:30:24 +03:00
import Html exposing (div, p, textarea)
2019-07-03 15:19:29 +03:00
# Rule and configuration
@docs rule, Configuration
2019-06-03 01:30:24 +03:00
-}
import Elm.Syntax.Exposing as Exposing
import Elm.Syntax.Import exposing (Import)
import Elm.Syntax.Node as Node exposing (Node)
import Elm.Syntax.Range exposing (Range)
2019-06-26 14:47:00 +03:00
import Lint.Rule as Rule exposing (Error, Rule)
2019-06-03 01:30:24 +03:00
import Lint.Util as Util
{-| Configuration for the rule.
-}
type alias Configuration =
{ exceptions : List String }
{-| Forbid importing everything from your module. This can especially be confusing to newcomers when the exposed
functions and types are unknown to them.
config =
[ ( Critical, NoImportingEverything.rule { exceptions = [ "Html" ] }
2019-06-03 01:30:24 +03:00
]
-}
rule : Configuration -> Rule
2019-06-15 22:14:40 +03:00
rule config =
Rule.newSchema "NoImportingEverything"
|> Rule.withSimpleImportVisitor (importVisitor config)
2019-06-24 01:32:27 +03:00
|> Rule.fromSchema
2019-06-03 01:30:24 +03:00
error : Range -> String -> Error
error range name =
2019-06-26 14:47:00 +03:00
Rule.error ("Do not expose everything from " ++ name) range
2019-06-03 01:30:24 +03:00
importVisitor : Configuration -> Node Import -> List Error
importVisitor config node =
2019-06-03 01:30:24 +03:00
let
{ moduleName, exposingList } =
Node.value node
name : String
name =
Util.moduleName moduleName
in
if List.member name config.exceptions then
[]
2019-06-03 01:30:24 +03:00
else
case exposingList |> Maybe.map Node.value of
Just (Exposing.All range) ->
[ error range name ]
2019-06-03 01:30:24 +03:00
_ ->
[]