1{ lib, options, ... }:
2let
3 discardPositions = lib.mapAttrs (k: v: v);
4in
5# unsafeGetAttrPos is unspecified best-effort behavior, so we only want to consider this test on an evaluator that satisfies some basic assumptions about this function.
6assert builtins.unsafeGetAttrPos "a" { a = true; } != null;
7assert
8 builtins.unsafeGetAttrPos "a" (discardPositions {
9 a = true;
10 }) == null;
11{
12 imports = [
13 {
14 options.imported.line14 = lib.mkOption {
15 type = lib.types.int;
16 };
17
18 # Simulates various patterns of generating modules such as
19 # programs.firefox.nativeMessagingHosts.ff2mpv. We don't expect to get
20 # line numbers for these, but we can fall back on knowing the file.
21 options.generated = discardPositions {
22 line22 = lib.mkOption {
23 type = lib.types.int;
24 };
25 };
26
27 options.submoduleLine38.extraOptLine27 = lib.mkOption {
28 default = 1;
29 type = lib.types.int;
30 };
31 }
32 ];
33
34 options.nested.nestedLine34 = lib.mkOption {
35 type = lib.types.int;
36 };
37
38 options.submoduleLine38 = lib.mkOption {
39 default = { };
40 type = lib.types.submoduleWith {
41 modules = [
42 (
43 { options, ... }:
44 {
45 options.submodDeclLine45 = lib.mkOption { };
46 }
47 )
48 { freeformType = with lib.types; lazyAttrsOf (uniq unspecified); }
49 ];
50 };
51 };
52
53 config = {
54 submoduleLine38.submodDeclLine45 =
55 (options.submoduleLine38.type.getSubOptions [ ]).submodDeclLine45.declarationPositions;
56 };
57}