about summary refs log tree commit diff
path: root/lib/types.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/types.nix')
-rw-r--r--lib/types.nix10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/types.nix b/lib/types.nix
index 5c4b963106178..91b040d24553b 100644
--- a/lib/types.nix
+++ b/lib/types.nix
@@ -568,6 +568,11 @@ rec {
       { modules
       , specialArgs ? {}
       , shorthandOnlyDefinesConfig ? false
+
+        # Internal variable to avoid `_key` collisions regardless
+        # of `extendModules`. Wired through by `evalModules`.
+        # Test case: lib/tests/modules, "168767"
+      , extensionOffset ? 0
       }@attrs:
       let
         inherit (lib.modules) evalModules;
@@ -579,11 +584,11 @@ rec {
         allModules = defs: imap1 (n: { value, file }:
           if isFunction value
           then setFunctionArgs
-                (args: lib.modules.unifyModuleSyntax file "${toString file}-${toString n}" (value args))
+                (args: lib.modules.unifyModuleSyntax file "${toString file}-${toString (n + extensionOffset)}" (value args))
                 (functionArgs value)
           else if isAttrs value
           then
-            lib.modules.unifyModuleSyntax file "${toString file}-${toString n}" (shorthandToModule value)
+            lib.modules.unifyModuleSyntax file "${toString file}-${toString (n + extensionOffset)}" (shorthandToModule value)
           else value
         ) defs;
 
@@ -620,6 +625,7 @@ rec {
           (base.extendModules {
             modules = [ { _module.args.name = last loc; } ] ++ allModules defs;
             prefix = loc;
+            extensionOffset = extensionOffset + length defs;
           }).config;
         emptyValue = { value = {}; };
         getSubOptions = prefix: (base.extendModules