about summary refs log tree commit diff
path: root/lib/tests/modules/declaration-positions.nix
blob: cefd3b4e516fb7af72491ebdaa43429306b8fc1e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
{ lib, options, ... }:
let discardPositions = lib.mapAttrs (k: v: v);
in
# 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.
assert builtins.unsafeGetAttrPos "a" { a = true; } != null;
assert builtins.unsafeGetAttrPos "a" (discardPositions { a = true; }) == null;
{
  imports = [
    {
      options.imported.line10 = lib.mkOption {
        type = lib.types.int;
      };

      # Simulates various patterns of generating modules such as
      # programs.firefox.nativeMessagingHosts.ff2mpv. We don't expect to get
      # line numbers for these, but we can fall back on knowing the file.
      options.generated = discardPositions {
        line18 = lib.mkOption {
          type = lib.types.int;
        };
      };

      options.submoduleLine34.extraOptLine23 = lib.mkOption {
        default = 1;
        type = lib.types.int;
      };
    }
  ];

  options.nested.nestedLine30 = lib.mkOption {
    type = lib.types.int;
  };

  options.submoduleLine34 = lib.mkOption {
    default = { };
    type = lib.types.submoduleWith {
      modules = [
        ({ options, ... }: {
          options.submodDeclLine39 = lib.mkOption { };
        })
        { freeformType = with lib.types; lazyAttrsOf (uniq unspecified); }
      ];
    };
  };

  config = {
    submoduleLine34.submodDeclLine39 = (options.submoduleLine34.type.getSubOptions [ ]).submodDeclLine39.declarationPositions;
  };
}