Prepare for being able to supply multiple moduleVisitors to a project rule

This commit is contained in:
Jeroen Engels 2020-03-18 23:56:52 +01:00
parent 3b2449af08
commit 8f83d4161f

View File

@ -718,7 +718,7 @@ type ProjectRuleSchema projectContext moduleContext
, fromModuleToProject : ModuleKey -> Node ModuleName -> moduleContext -> projectContext , fromModuleToProject : ModuleKey -> Node ModuleName -> moduleContext -> projectContext
, foldProjectContexts : projectContext -> projectContext -> projectContext , foldProjectContexts : projectContext -> projectContext -> projectContext
} }
, moduleVisitor : ModuleRuleSchema {} moduleContext -> ModuleRuleSchema { hasAtLeastOneVisitor : () } moduleContext , moduleVisitorCreators : List (ModuleRuleSchema {} moduleContext -> ModuleRuleSchema { hasAtLeastOneVisitor : () } moduleContext)
, elmJsonVisitors : List (Maybe { elmJsonKey : ElmJsonKey, project : Elm.Project.Project } -> projectContext -> ( List Error, projectContext )) , elmJsonVisitors : List (Maybe { elmJsonKey : ElmJsonKey, project : Elm.Project.Project } -> projectContext -> ( List Error, projectContext ))
, readmeVisitors : List (Maybe { readmeKey : ReadmeKey, content : String } -> projectContext -> ( List Error, projectContext )) , readmeVisitors : List (Maybe { readmeKey : ReadmeKey, content : String } -> projectContext -> ( List Error, projectContext ))
, dependenciesVisitors : List (Dict String Review.Project.Dependency.Dependency -> projectContext -> ( List Error, projectContext )) , dependenciesVisitors : List (Dict String Review.Project.Dependency.Dependency -> projectContext -> ( List Error, projectContext ))
@ -934,7 +934,7 @@ newProjectRuleSchema name_ { moduleVisitor, initProjectContext, fromProjectToMod
, fromModuleToProject = fromModuleToProject , fromModuleToProject = fromModuleToProject
, foldProjectContexts = foldProjectContexts , foldProjectContexts = foldProjectContexts
} }
, moduleVisitor = moduleVisitor , moduleVisitorCreators = [ moduleVisitor ]
, elmJsonVisitors = [] , elmJsonVisitors = []
, readmeVisitors = [] , readmeVisitors = []
, dependenciesVisitors = [] , dependenciesVisitors = []
@ -1119,6 +1119,8 @@ runProjectRule ((ProjectRuleSchema schema) as wrappedSchema) startCache exceptio
|> List.map .path |> List.map .path
|> Set.fromList |> Set.fromList
-- TODO make it so we don't compute modules at all if there are no module visitors
-- We can probably do that by setting an initial context, and then just replacing in the call to visitModuleForProjectRule
computeModule : ProjectRuleCache projectContext -> List ProjectModule -> ProjectModule -> { source : String, errors : List Error, context : projectContext } computeModule : ProjectRuleCache projectContext -> List ProjectModule -> ProjectModule -> { source : String, errors : List Error, context : projectContext }
computeModule cache importedModules module_ = computeModule cache importedModules module_ =
let let
@ -1149,10 +1151,15 @@ runProjectRule ((ProjectRuleSchema schema) as wrappedSchema) startCache exceptio
|> List.foldl schema.context.foldProjectContexts initialContext |> List.foldl schema.context.foldProjectContexts initialContext
|> schema.context.fromProjectToModule moduleKey moduleNameNode_ |> schema.context.fromProjectToModule moduleKey moduleNameNode_
-- TODO Make it so that we only compute the module visitors once
moduleVisitor : ModuleRuleSchema { hasAtLeastOneVisitor : () } moduleContext moduleVisitor : ModuleRuleSchema { hasAtLeastOneVisitor : () } moduleContext
moduleVisitor = moduleVisitor =
emptySchema "" initialModuleContext List.foldl
|> schema.moduleVisitor (\addVisitors (ModuleRuleSchema moduleVisitorSchema) ->
addVisitors (ModuleRuleSchema moduleVisitorSchema)
)
(emptySchema "" initialModuleContext)
schema.moduleVisitorCreators
|> reverseVisitors |> reverseVisitors
( fileErrors, context ) = ( fileErrors, context ) =
@ -1286,7 +1293,7 @@ noImportedModulesHaveANewContext importedModules invalidatedModules =
|> Set.isEmpty |> Set.isEmpty
visitModuleForProjectRule : ModuleRuleSchema { hasAtLeastOneVisitor : () } moduleContext -> moduleContext -> ProjectModule -> ( List Error, moduleContext ) visitModuleForProjectRule : ModuleRuleSchema a moduleContext -> moduleContext -> ProjectModule -> ( List Error, moduleContext )
visitModuleForProjectRule (ModuleRuleSchema schema) = visitModuleForProjectRule (ModuleRuleSchema schema) =
let let
declarationVisitors : InAndOut (DirectedVisitor Declaration moduleContext) declarationVisitors : InAndOut (DirectedVisitor Declaration moduleContext)