lol

lib.types.attrTag: Fix declarationPositions after merge

+18 -4
+17 -3
lib/tests/modules/types-attrTag.nix
··· 1 - { lib, config, ... }: 1 + { lib, config, options, ... }: 2 2 let 3 3 inherit (lib) mkOption types; 4 4 forceDeep = x: builtins.deepSeq x x; 5 + mergedSubOption = (options.merged.type.getSubOptions options.merged.loc).extensible."merged.<name>"; 5 6 in 6 7 { 7 8 options = { ··· 98 99 merged.positive.yay = 100; 99 100 merged.extensi-foo.extensible = "foo"; 100 101 merged.extensi-bar.extensible = "bar"; 101 - okChecks = 102 + okChecks = builtins.addErrorContext "while evaluating the assertions" ( 102 103 assert config.intStrings.hello == { right = "hello world"; }; 103 104 assert config.intStrings.numberOne == { left = 1; }; 104 105 assert config.merged.negative == { nay = false; }; ··· 115 116 assert config.docs."submodules.<name>.qux".visible == true; 116 117 # Not available (yet?) 117 118 # assert config.docs."submodules.<name>.qux".declarationsWithPositions == [ ... ]; 119 + assert options.submodules.declarations == [ __curPos.file ]; 120 + assert lib.length options.submodules.declarationPositions == 1; 121 + assert (lib.head options.submodules.declarationPositions).file == __curPos.file; 122 + assert options.merged.declarations == [ __curPos.file __curPos.file ]; 123 + assert lib.length options.merged.declarationPositions == 2; 124 + assert (lib.elemAt options.merged.declarationPositions 0).file == __curPos.file; 125 + assert (lib.elemAt options.merged.declarationPositions 1).file == __curPos.file; 126 + assert (lib.elemAt options.merged.declarationPositions 0).line != (lib.elemAt options.merged.declarationPositions 1).line; 127 + assert mergedSubOption.declarations == [ __curPos.file __curPos.file ]; 128 + assert lib.length mergedSubOption.declarationPositions == 2; 129 + assert (lib.elemAt mergedSubOption.declarationPositions 0).file == __curPos.file; 130 + assert (lib.elemAt mergedSubOption.declarationPositions 1).file == __curPos.file; 131 + assert (lib.elemAt mergedSubOption.declarationPositions 0).line != (lib.elemAt mergedSubOption.declarationPositions 1).line; 118 132 assert lib.length config.docs."merged.<name>.extensible".declarations == 2; 119 - true; 133 + true); 120 134 }; 121 135 }
+1 -1
lib/types.nix
··· 707 707 // { 708 708 # mergeOptionDecls is not idempotent in these attrs: 709 709 declarations = a.tags.${tagName}.declarations ++ bOpt.declarations; 710 - declarationPositions = a.tags.${tagName}.declarations ++ bOpt.declarations; 710 + declarationPositions = a.tags.${tagName}.declarationPositions ++ bOpt.declarationPositions; 711 711 } 712 712 ) 713 713 (builtins.intersectAttrs a.tags b.tags);