diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index 0d249968402..4b2e5afc1d6 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -132,6 +132,16 @@ runTests { expected = [ 1 1 0 ]; }; + testFunctionArgsFunctor = { + expr = functionArgs { __functor = self: { a, b }: null; }; + expected = { a = false; b = false; }; + }; + + testFunctionArgsSetFunctionArgs = { + expr = functionArgs (setFunctionArgs (args: args.x) { x = false; }); + expected = { x = false; }; + }; + # STRINGS testConcatMapStrings = { diff --git a/lib/trivial.nix b/lib/trivial.nix index c8ef5599ccd..7956ba4bde6 100644 --- a/lib/trivial.nix +++ b/lib/trivial.nix @@ -334,7 +334,10 @@ rec { has the same return type and semantics as builtins.functionArgs. setFunctionArgs : (a → b) → Map String Bool. */ - functionArgs = f: f.__functionArgs or (builtins.functionArgs f); + functionArgs = f: + if f ? __functor + then f.__functionArgs or (lib.functionArgs (f.__functor f)) + else builtins.functionArgs f; /* Check whether something is a function or something annotated with function args.