a16714d0

By: Tom Sydney Kerckhove <syd@cs-syd.eu>

Let ListLit be skipped by the call its list is an argument of

A list literal whose elements are the pieces of a message is a list nobody
asserts the elements of, so every one of them is a mutant that can only be
killed by pinning wording. There was no way to say so short of turning the
operator off everywhere: ListLit read no config at all, and the one targeted
key in the family, ConstEmptyList's skip-strings, tests whether the element
type is Char and so does not see a list of strings.

So ListLit now reads skip-calls-to, naming the calls whose arguments it leaves
alone:

    operators:
      ListLit:
        skip-calls-to:
          - logInfo
          - fail

Any enclosing call counts, not only the immediate one. That is the whole point
rather than a generalisation for its own sake: the call a message's list
literal is the immediate argument of is always mconcat or unwords, never the
function that says what the message is for. In `fail $ mconcat ["unknown: ",
x]` it is fail that makes the list a message, and it is two applications out.

The walker therefore carries the calls an expression is inside, innermost
first, pushed when it descends into an argument. $ is seen through on both its
paths: the HsApp chain the typechecker expands it into, whose head is $ rather
than the function, and the OpApp it can still be.

Example.ListLitCallsLib exercises it, through both the direct and the $ form,
and nix/mutation.yaml names its report function. Without the entry the example
check reports those two list literals; with it they are gone and the module
generates nothing.

Total

2h08m29s

Created Started Finished

Time to Start Worker time Duration Time to finish Idle
Config 52s 1s 1s 53s 52s
Eval 1m07s 1m14s 1m14s 2m22s 14s
Build 2m21s 8m24s 2h06m36s 2h08m58s 1h58m11s
Deploy 2h08m58s 23s 23s 2h09m21s 0s
Suite 52s 10m04s 2h08m29s 2h09m21s 1h59m17s

Timeline

Config Eval Build Deploy Compressed gap
0s2m1h6m1h7m1h8m1h9m1h13m1h26m2h7m2h8m2h9m