about summary refs log tree commit diff
path: root/lib/types.nix
diff options
context:
space:
mode:
authorRobert Hensing <robert@roberthensing.nl>2024-01-29 08:54:02 +0100
committerRobert Hensing <robert@roberthensing.nl>2024-04-04 11:54:45 +0200
commit4c7d990badc4a6ef9adcffb0790902de94faa51e (patch)
tree607bcda127af6914021c5687990c36e146c83268 /lib/types.nix
parente090bb55f0599afcdfda63f3e7e27bfd1cfd0691 (diff)
lib.types.attrTag: Provide declarations, definitions
Diffstat (limited to 'lib/types.nix')
-rw-r--r--lib/types.nix21
1 files changed, 19 insertions, 2 deletions
diff --git a/lib/types.nix b/lib/types.nix
index 43c4b72ad3509..02532a991e987 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -628,7 +628,16 @@ rec {
             (n: opt:
               builtins.addErrorContext "while checking that attrTag tag ${lib.strings.escapeNixIdentifier n} is an option with a type${inAttrPosSuffix args.tags n}" (
                 assert opt._type == "option";
-                opt
+                opt // {
+                  declarations = opt.declarations or (
+                    let pos = builtins.unsafeGetAttrPos n args.tags;
+                    in if pos == null then [] else [ pos.file ]
+                  );
+                  declarationPositions = opt.declarationPositions or (
+                    let pos = builtins.unsafeGetAttrPos n args.tags;
+                    in if pos == null then [] else [ pos ]
+                  );
+                }
               ))
             args.tags;
         choicesStr = concatMapStringsSep ", " lib.strings.escapeNixIdentifier (attrNames tags);
@@ -640,7 +649,10 @@ rec {
           mapAttrs
             (tagName: tagOption: {
               "${lib.showOption prefix}" =
-                tagOption // { loc = prefix ++ [ tagName ]; };
+                tagOption // {
+                  loc = prefix ++ [ tagName ];
+                  definitions = [];
+                };
             })
             tags;
         substSubModules = m: attrTagWith { tags = mapAttrs (n: opt: opt // { type = (opt.type or types.unspecified).substSubModules m; }) tags; };
@@ -685,6 +697,11 @@ rec {
                       #        It is also returned though, but use of the attribute seems rare?
                       [tagName]
                       [ (wrapOptionDecl a.tags.${tagName}) (wrapOptionDecl bOpt) ]
+                    // {
+                      # mergeOptionDecls is not idempotent in these attrs:
+                      declarations = a.tags.${tagName}.declarations ++ bOpt.declarations;
+                      declarationPositions = a.tags.${tagName}.declarations ++ bOpt.declarations;
+                    }
                   )
                   (builtins.intersectAttrs a.tags b.tags);
           };