Commit 370e5e9e by Zachary Snow

package item nesting performance optimization

parent e72d372d
...@@ -49,7 +49,7 @@ convertDescription pis (orig @ Part{}) = ...@@ -49,7 +49,7 @@ convertDescription pis (orig @ Part{}) =
else Part attrs extern kw lifetime name ports items' else Part attrs extern kw lifetime name ports items'
where where
Part attrs extern kw lifetime name ports items = orig Part attrs extern kw lifetime name ports items = orig
items' = addItems pis Set.empty items items' = addItems pis Set.empty (map addUsedPIs items)
convertDescription _ other = other convertDescription _ other = other
-- attempt to fix simple declaration order issues -- attempt to fix simple declaration order issues
...@@ -57,7 +57,7 @@ reorderDescription :: Description -> Description ...@@ -57,7 +57,7 @@ reorderDescription :: Description -> Description
reorderDescription (Part attrs extern kw lifetime name ports items) = reorderDescription (Part attrs extern kw lifetime name ports items) =
Part attrs extern kw lifetime name ports items' Part attrs extern kw lifetime name ports items'
where where
items' = addItems localPIs Set.empty items items' = addItems localPIs Set.empty (map addUsedPIs items)
localPIs = Map.fromList $ mapMaybe toPIElem items localPIs = Map.fromList $ mapMaybe toPIElem items
toPIElem :: ModuleItem -> Maybe (Identifier, PackageItem) toPIElem :: ModuleItem -> Maybe (Identifier, PackageItem)
toPIElem (MIPackageItem item) = Just (piName item, item) toPIElem (MIPackageItem item) = Just (piName item, item)
...@@ -65,8 +65,8 @@ reorderDescription (Part attrs extern kw lifetime name ports items) = ...@@ -65,8 +65,8 @@ reorderDescription (Part attrs extern kw lifetime name ports items) =
reorderDescription other = other reorderDescription other = other
-- iteratively inserts missing package items exactly where they are needed -- iteratively inserts missing package items exactly where they are needed
addItems :: PIs -> Idents -> [ModuleItem] -> [ModuleItem] addItems :: PIs -> Idents -> [(ModuleItem, Idents)] -> [ModuleItem]
addItems pis existingPIs (item : items) = addItems pis existingPIs ((item, usedPIs) : items) =
if not $ Set.disjoint existingPIs thisPI then if not $ Set.disjoint existingPIs thisPI then
-- this item was re-imported earlier in the module -- this item was re-imported earlier in the module
addItems pis existingPIs items addItems pis existingPIs items
...@@ -75,18 +75,25 @@ addItems pis existingPIs (item : items) = ...@@ -75,18 +75,25 @@ addItems pis existingPIs (item : items) =
item : addItems pis (Set.union existingPIs thisPI) items item : addItems pis (Set.union existingPIs thisPI) items
else else
-- this item has at least one un-met dependency -- this item has at least one un-met dependency
addItems pis existingPIs (head itemsToAdd : item : items) addItems pis existingPIs (addUsedPIs chosen : (item, usedPIs) : items)
where where
thisPI = execWriter $ collectPIsM item thisPI = execWriter $ collectPIsM item
usedPIs = execWriter $
traverseNestedModuleItemsM (traverseIdentsM writeIdent) item
writeIdent :: Identifier -> Writer Idents Identifier
writeIdent x = tell (Set.singleton x) >> return x
neededPIs = Set.difference (Set.difference usedPIs existingPIs) thisPI neededPIs = Set.difference (Set.difference usedPIs existingPIs) thisPI
itemsToAdd = map MIPackageItem $ Map.elems $ itemsToAdd = map MIPackageItem $ Map.elems $
Map.restrictKeys pis neededPIs Map.restrictKeys pis neededPIs
chosen = head itemsToAdd
addItems _ _ [] = [] addItems _ _ [] = []
-- augment a module item with the set of identifiers it uses
addUsedPIs :: ModuleItem -> (ModuleItem, Idents)
addUsedPIs item =
(item, usedPIs)
where
usedPIs = execWriter $
traverseNestedModuleItemsM (traverseIdentsM writeIdent) item
writeIdent :: Identifier -> Writer Idents Identifier
writeIdent x = tell (Set.singleton x) >> return x
-- writes down the names of package items -- writes down the names of package items
collectPIsM :: ModuleItem -> Writer Idents () collectPIsM :: ModuleItem -> Writer Idents ()
collectPIsM (MIPackageItem item) = collectPIsM (MIPackageItem item) =
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment