mirror of
https://github.com/jfmengels/elm-review.git
synced 2024-11-30 03:32:30 +03:00
Fix ModuleNameLookupTable resolving to indirect dependencies (#135)
This commit is contained in:
parent
f3da6a02bd
commit
b4f11c5ddf
@ -5712,7 +5712,7 @@ scope_pairWithNoErrors fn visited context =
|
|||||||
-- DEPENDENCIES
|
-- DEPENDENCIES
|
||||||
|
|
||||||
|
|
||||||
scope_dependenciesVisitor : Dict String Dependency -> { context | dependenciesModules : Dict String Elm.Docs.Module } -> { context | dependenciesModules : Dict String Elm.Docs.Module }
|
scope_dependenciesVisitor : Dict String Dependency -> ScopeProjectContext -> ScopeProjectContext
|
||||||
scope_dependenciesVisitor dependencies innerContext =
|
scope_dependenciesVisitor dependencies innerContext =
|
||||||
let
|
let
|
||||||
dependenciesModules : Dict String Elm.Docs.Module
|
dependenciesModules : Dict String Elm.Docs.Module
|
||||||
@ -6143,12 +6143,12 @@ registerImportExposed import_ innerContext =
|
|||||||
|
|
||||||
module_ : Elm.Docs.Module
|
module_ : Elm.Docs.Module
|
||||||
module_ =
|
module_ =
|
||||||
(case Dict.get (joinModuleName moduleName) innerContext.dependenciesModules of
|
(case Dict.get moduleName innerContext.modules of
|
||||||
Just m ->
|
Just m ->
|
||||||
Just m
|
Just m
|
||||||
|
|
||||||
Nothing ->
|
Nothing ->
|
||||||
Dict.get moduleName innerContext.modules
|
Dict.get (joinModuleName moduleName) innerContext.dependenciesModules
|
||||||
)
|
)
|
||||||
|> Maybe.withDefault
|
|> Maybe.withDefault
|
||||||
{ name = joinModuleName moduleName
|
{ name = joinModuleName moduleName
|
||||||
|
@ -1,5 +1,9 @@
|
|||||||
module ModuleNameLookupTableTest exposing (all)
|
module ModuleNameLookupTableTest exposing (all)
|
||||||
|
|
||||||
|
import Elm.Docs
|
||||||
|
import Elm.License
|
||||||
|
import Elm.Package
|
||||||
|
import Elm.Project
|
||||||
import Elm.Syntax.Declaration as Declaration exposing (Declaration)
|
import Elm.Syntax.Declaration as Declaration exposing (Declaration)
|
||||||
import Elm.Syntax.Expression as Expression exposing (Expression)
|
import Elm.Syntax.Expression as Expression exposing (Expression)
|
||||||
import Elm.Syntax.ModuleName exposing (ModuleName)
|
import Elm.Syntax.ModuleName exposing (ModuleName)
|
||||||
@ -7,12 +11,15 @@ import Elm.Syntax.Node as Node exposing (Node(..))
|
|||||||
import Elm.Syntax.Pattern as Pattern
|
import Elm.Syntax.Pattern as Pattern
|
||||||
import Elm.Syntax.Range exposing (Range)
|
import Elm.Syntax.Range exposing (Range)
|
||||||
import Elm.Syntax.TypeAnnotation as TypeAnnotation exposing (TypeAnnotation)
|
import Elm.Syntax.TypeAnnotation as TypeAnnotation exposing (TypeAnnotation)
|
||||||
|
import Elm.Version
|
||||||
import Fixtures.Dependencies as Dependencies
|
import Fixtures.Dependencies as Dependencies
|
||||||
import Review.ModuleNameLookupTable as ModuleNameLookupTable exposing (ModuleNameLookupTable)
|
import Review.ModuleNameLookupTable as ModuleNameLookupTable exposing (ModuleNameLookupTable)
|
||||||
import Review.Project as Project exposing (Project)
|
import Review.Project as Project exposing (Project)
|
||||||
|
import Review.Project.Dependency as Dependency exposing (Dependency)
|
||||||
import Review.Rule as Rule exposing (Rule)
|
import Review.Rule as Rule exposing (Rule)
|
||||||
import Review.Test
|
import Review.Test
|
||||||
import Review.Test.Dependencies
|
import Review.Test.Dependencies
|
||||||
|
import Review.Test.Dependencies.Unsafe as Unsafe
|
||||||
import Test exposing (Test, describe, test)
|
import Test exposing (Test, describe, test)
|
||||||
|
|
||||||
|
|
||||||
@ -21,6 +28,7 @@ all =
|
|||||||
describe "ModuleNameLookupTable"
|
describe "ModuleNameLookupTable"
|
||||||
[ moduleNameAtTest
|
[ moduleNameAtTest
|
||||||
, fullModuleNameAtest
|
, fullModuleNameAtest
|
||||||
|
, dependenciesTest
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
@ -446,6 +454,44 @@ type alias BAlias = {}
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
dependenciesTest : Test
|
||||||
|
dependenciesTest =
|
||||||
|
describe "Dependencies"
|
||||||
|
[ test "should not confuse a function from a local module with a module from an indirect dependency" <|
|
||||||
|
\() ->
|
||||||
|
let
|
||||||
|
lookupFunction : ModuleNameLookupTable -> Range -> Maybe ModuleName
|
||||||
|
lookupFunction =
|
||||||
|
ModuleNameLookupTable.moduleNameAt
|
||||||
|
|
||||||
|
rule : Rule
|
||||||
|
rule =
|
||||||
|
createRule
|
||||||
|
(Rule.withExpressionEnterVisitor (expressionVisitor lookupFunction))
|
||||||
|
in
|
||||||
|
[ """module A exposing (..)
|
||||||
|
import Element exposing (..)
|
||||||
|
|
||||||
|
a = value
|
||||||
|
""", """module Element exposing (value)
|
||||||
|
value = 1
|
||||||
|
""" ]
|
||||||
|
|> Review.Test.runOnModulesWithProjectData project rule
|
||||||
|
|> Review.Test.expectErrorsForModules
|
||||||
|
[ ( "A"
|
||||||
|
, [ Review.Test.error
|
||||||
|
{ message = """
|
||||||
|
<nothing>.value -> Element.value
|
||||||
|
"""
|
||||||
|
, details = [ "details" ]
|
||||||
|
, under = "module"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
)
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
type alias ModuleContext =
|
type alias ModuleContext =
|
||||||
{ lookupTable : ModuleNameLookupTable
|
{ lookupTable : ModuleNameLookupTable
|
||||||
, texts : List String
|
, texts : List String
|
||||||
@ -455,10 +501,100 @@ type alias ModuleContext =
|
|||||||
project : Project
|
project : Project
|
||||||
project =
|
project =
|
||||||
Project.new
|
Project.new
|
||||||
|
|> Project.addElmJson applicationElmJson
|
||||||
|> Project.addDependency Dependencies.elmCore
|
|> Project.addDependency Dependencies.elmCore
|
||||||
|> Project.addDependency Dependencies.elmHtml
|
|> Project.addDependency Dependencies.elmHtml
|
||||||
|> Project.addDependency Review.Test.Dependencies.elmParser
|
|> Project.addDependency Review.Test.Dependencies.elmParser
|
||||||
|> Project.addDependency Review.Test.Dependencies.elmUrl
|
|> Project.addDependency Review.Test.Dependencies.elmUrl
|
||||||
|
|> Project.addDependency xyz2dependency
|
||||||
|
|
||||||
|
|
||||||
|
applicationElmJson : { path : String, raw : String, project : Elm.Project.Project }
|
||||||
|
applicationElmJson =
|
||||||
|
{ path = "elm.json"
|
||||||
|
, raw = """{
|
||||||
|
"type": "application",
|
||||||
|
"source-directories": [
|
||||||
|
"src"
|
||||||
|
],
|
||||||
|
"elm-version": "0.19.1",
|
||||||
|
"dependencies": {
|
||||||
|
"direct": {
|
||||||
|
"elm/core": "1.0.0",
|
||||||
|
"elm/html": "1.0.0",
|
||||||
|
"elm/parser": "1.0.0",
|
||||||
|
"elm/url": "1.0.0",
|
||||||
|
"abc/xyz": "1.0.0"
|
||||||
|
},
|
||||||
|
"indirect": {
|
||||||
|
"abc/xyz2": "1.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test-dependencies": {
|
||||||
|
"direct": {},
|
||||||
|
"indirect": {}
|
||||||
|
}
|
||||||
|
}"""
|
||||||
|
, project =
|
||||||
|
Elm.Project.Application
|
||||||
|
{ elm = Elm.Version.one
|
||||||
|
, dirs = []
|
||||||
|
, depsDirect =
|
||||||
|
[ ( unsafePackageName "elm/core", Elm.Version.one )
|
||||||
|
, ( unsafePackageName "elm/html", Elm.Version.one )
|
||||||
|
, ( unsafePackageName "elm/parser", Elm.Version.one )
|
||||||
|
, ( unsafePackageName "elm/url", Elm.Version.one )
|
||||||
|
, ( unsafePackageName "abc/xyz", Elm.Version.one )
|
||||||
|
]
|
||||||
|
, depsIndirect = [ ( unsafePackageName "abc/xyz2", Elm.Version.one ) ]
|
||||||
|
, testDepsDirect = []
|
||||||
|
, testDepsIndirect = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xyz2dependency : Dependency
|
||||||
|
xyz2dependency =
|
||||||
|
Dependency.create "abc/xyz2"
|
||||||
|
xyz2elmJson
|
||||||
|
xyz2dependencyModules
|
||||||
|
|
||||||
|
|
||||||
|
xyz2elmJson : Elm.Project.Project
|
||||||
|
xyz2elmJson =
|
||||||
|
Elm.Project.Package
|
||||||
|
{ elm = Unsafe.constraint "0.19.0 <= v < 0.20.0"
|
||||||
|
, exposed = Elm.Project.ExposedList [ Unsafe.moduleName "Element" ]
|
||||||
|
, license = Elm.License.fromString "BSD-3-Clause" |> Maybe.withDefault Elm.License.bsd3
|
||||||
|
, name = Unsafe.packageName "elm/xyz"
|
||||||
|
, summary = "Fake stuff"
|
||||||
|
, deps = [ ( Unsafe.packageName "elm/core", Unsafe.constraint "1.0.0 <= v < 2.0.0" ) ]
|
||||||
|
, testDeps = []
|
||||||
|
, version = Elm.Version.fromString "1.0.0" |> Maybe.withDefault Elm.Version.one
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
xyz2dependencyModules : List Elm.Docs.Module
|
||||||
|
xyz2dependencyModules =
|
||||||
|
[ { name = "Element"
|
||||||
|
, comment = ""
|
||||||
|
, unions = []
|
||||||
|
, aliases = []
|
||||||
|
, values = []
|
||||||
|
, binops = []
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
unsafePackageName : String -> Elm.Package.Name
|
||||||
|
unsafePackageName packageName =
|
||||||
|
case Elm.Package.fromString packageName of
|
||||||
|
Just name ->
|
||||||
|
name
|
||||||
|
|
||||||
|
Nothing ->
|
||||||
|
-- unsafe, but if the generation went well, it should all be good.
|
||||||
|
unsafePackageName packageName
|
||||||
|
|
||||||
|
|
||||||
createRule : (Rule.ModuleRuleSchema {} ModuleContext -> Rule.ModuleRuleSchema { hasAtLeastOneVisitor : () } ModuleContext) -> Rule
|
createRule : (Rule.ModuleRuleSchema {} ModuleContext -> Rule.ModuleRuleSchema { hasAtLeastOneVisitor : () } ModuleContext) -> Rule
|
||||||
|
Loading…
Reference in New Issue
Block a user