Skip to content
  • Matthew Pickering's avatar
    Remove transitive information about modules and packages from interface files · 38faeea1
    Matthew Pickering authored and Marge Bot's avatar Marge Bot committed
    This commit modifies interface files so that *only* direct information
    about modules and packages is stored in the interface file.
    
    * Only direct module and direct package dependencies are stored in the
    interface files.
    * Trusted packages are now stored separately as they need to be checked
      transitively.
    * hs-boot files below the compiled module in the home module are stored
      so that eps_is_boot can be calculated in one-shot mode without loading
      all interface files in the home package.
    * The transitive closure of signatures is stored separately
    
    This is important for two reasons
    
    * Less recompilation is needed, as motivated by #16885, a lot of
    redundant compilation was triggered when adding new imports deep in the
    module tree as all the parent interface files had to be redundantly
    updated.
    * Checking an interface file is cheaper because you don't have to
    perform a transitive traversal to check the dependencies are up-to-date.
    
    In the code, places where we would have used the transitive closure, we
    instead compute the necessary transitive closure. The closure is not
    computed very often, was already happening in checkDependencies, and
    was already happening in getLinkDeps.
    
    Fixes #16885
    
    -------------------------
    Metric Decrease:
        MultiLayerModules
        T13701
        T13719
    -------------------------
    38faeea1