@@ -470,7 +470,31 @@ final: prev: {
470 { compiler.nix-name = args.compiler-nix-name; };
470 { compiler.nix-name = args.compiler-nix-name; };
471 extra-hackages = args.extra-hackages or [];
471 extra-hackages = args.extra-hackages or [];
473− in { inherit (pkg-set.config) hsPkgs; inherit pkg-set; plan-nix = plan.nix; };
473+ in addProjectAndPackageAttrs { inherit (pkg-set.config) hsPkgs; inherit pkg-set; plan-nix = plan.nix; };
475+ # Take `hsPkgs` from the `rawProject` and update all the packages and
476+ # components so they have a `.project` attribute and as well as
477+ # a `.package` attribute on the components.
478+ addProjectAndPackageAttrs = rawProject:
479+ final.lib.fix (project: rawProject // {
480+ hsPkgs = (final.lib.mapAttrs (n: package:
485+ components = final.lib.mapAttrs (n: v:
486+ if n == "library" || n == "all"
487+ then v // { inherit project package; }
488+ else final.lib.mapAttrs (_: c: c // { inherit project package; }) v
489+ ) package.components;
494+ # These are functions not packages
495+ inherit (rawProject.hsPkgs) shellFor ghcWithHoogle ghcWithPackages;
475 cabalProject = args: let p = cabalProject' args;
499 cabalProject = args: let p = cabalProject' args;
476 in p.hsPkgs // {
500 in p.hsPkgs // {
@@ -495,7 +519,7 @@ final: prev: {
495 ++ (args.modules or [])
519 ++ (args.modules or [])
496 ++ final.lib.optional (args ? ghc) { ghc.package = args.ghc; };
520 ++ final.lib.optional (args ? ghc) { ghc.package = args.ghc; };
498− in { inherit (pkg-set.config) hsPkgs; inherit pkg-set; stack-nix = stack.nix; };
522+ in addProjectAndPackageAttrs { inherit (pkg-set.config) hsPkgs; inherit pkg-set; stack-nix = stack.nix; };
500 stackProject = args: let p = stackProject' args;
524 stackProject = args: let p = stackProject' args;
501 in p.hsPkgs // {
525 in p.hsPkgs // {