Skip to content

Names from lib end up in scope of with builtins, cause incorrect "unused" warning #606

@iFreilicht

Description

@iFreilicht

Describe the bug
Consider this simple nix file:

with (import <nixpkgs> { }).lib; with builtins; generators.toPretty { } "asdf"

It evaluates fine:

# nix eval -f repro-with-builtins.nix
"\"asdf\""

But nixd displays an "unused with expression" warning:

Screenshot 2024-10-16 at 11 01 01

When removing the expression, the warning goes away:

with builtins; generators.toPretty { } "asdf"

Screenshot 2024-10-16 at 10 57 29

However, builtins doesn't contain generators at all, that's from lib!

#  nix eval -f repro-with-builtins.nix
error:
       … while evaluating the file '/Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix':

       error: undefined variable 'generators'
       at /Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix:1:16:
            1| with builtins; generators.toPretty { } "asdf"
             |                ^
            2|

So it seems this is a bug that somehow causes with builtins; to be treated as if it imports the exact same names as with lib; would.

Logs (Required)

V[11:07:37.154] 93541: <<< {"jsonrpc":"2.0","method":"textDocument/didChange","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix","version":61},"contentChanges":[{"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":0}},"rangeLength":0,"text":"with (import <nixpkgs> { }).lib;"}]}}
I[11:07:37.154] 93541: <-- textDocument/didChange
I[11:07:37.154] 93541: --> notify textDocument/publishDiagnostics
V[11:07:37.154] 93541: >>> {"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"diagnostics":[{"code":"sema-extra-with","message":"unused `with` expression (fix available)","range":{"end":{"character":4,"line":0},"start":{"character":0,"line":0}},"relatedInformation":[],"severity":2,"source":"nixf"}],"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix","version":61}}
V[11:07:37.182] 93541: <<< {"jsonrpc":"2.0","id":46,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"},"range":{"start":{"line":0,"character":0},"end":{"line":4,"character":0}}}}
I[11:07:37.182] 93541: <-- textDocument/inlayHint(46)
I[11:07:37.182] 93541: --> reply:textDocument/inlayHint(46)
V[11:07:37.182] 93541: >>> {"id":46,"jsonrpc":"2.0","result":[]}
V[11:07:37.414] 93541: <<< {"jsonrpc":"2.0","id":47,"method":"textDocument/codeAction","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"},"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":0}},"context":{"diagnostics":[{"range":{"start":{"line":0,"character":0},"end":{"line":0,"character":4}},"message":"unused `with` expression (fix available)","code":"sema-extra-with","severity":2,"relatedInformation":[],"source":"nixf"}],"triggerKind":2}}}
I[11:07:37.414] 93541: <-- textDocument/codeAction(47)
I[11:07:37.414] 93541: --> reply:textDocument/codeAction(47)
V[11:07:37.414] 93541: >>> {"id":47,"jsonrpc":"2.0","result":[{"edit":{"changes":{"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix":[{"newText":"","range":{"end":{"character":4,"line":0},"start":{"character":0,"line":0}}},{"newText":"","range":{"end":{"character":32,"line":0},"start":{"character":31,"line":0}}},{"newText":"","range":{"end":{"character":31,"line":0},"start":{"character":5,"line":0}}}]}},"kind":"quickfix","title":"remove `with` expression"}]}
V[11:07:37.454] 93541: <<< {"jsonrpc":"2.0","id":48,"method":"textDocument/semanticTokens/full","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"}}}
I[11:07:37.454] 93541: <-- textDocument/semanticTokens/full(48)
I[11:07:37.454] 93541: --> reply:textDocument/semanticTokens/full(48)
V[11:07:37.454] 93541: >>> {"id":48,"jsonrpc":"2.0","result":{"data":[0,6,6,4,1,0,22,3,3,0,0,10,8,4,1,0,10,10,6,4,0,11,8,3,0,0,13,6,1,0],"resultId":""}}
V[11:07:37.505] 93541: <<< {"jsonrpc":"2.0","id":49,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"}}}
I[11:07:37.505] 93541: <-- textDocument/documentSymbol(49)
I[11:07:37.505] 93541: --> reply:textDocument/documentSymbol(49)
V[11:07:37.505] 93541: >>> {"id":49,"jsonrpc":"2.0","result":[{"detail":"identifier","kind":24,"name":"import","range":{"end":{"character":12,"line":0},"start":{"character":6,"line":0}},"selectionRange":{"end":{"character":12,"line":0},"start":{"character":6,"line":0}}},{"detail":"attribute name","kind":7,"name":"lib","range":{"end":{"character":31,"line":0},"start":{"character":28,"line":0}},"selectionRange":{"end":{"character":31,"line":0},"start":{"character":28,"line":0}}},{"detail":"identifier","kind":24,"name":"builtins","range":{"end":{"character":46,"line":0},"start":{"character":38,"line":0}},"selectionRange":{"end":{"character":46,"line":0},"start":{"character":38,"line":0}}},{"detail":"identifier","kind":13,"name":"generators","range":{"end":{"character":58,"line":0},"start":{"character":48,"line":0}},"selectionRange":{"end":{"character":58,"line":0},"start":{"character":48,"line":0}}},{"detail":"attribute name","kind":7,"name":"toPretty","range":{"end":{"character":67,"line":0},"start":{"character":59,"line":0}},"selectionRange":{"end":{"character":67,"line":0},"start":{"character":59,"line":0}}},{"detail":"string","kind":15,"name":"asdf","range":{"end":{"character":78,"line":0},"start":{"character":72,"line":0}},"selectionRange":{"end":{"character":78,"line":0},"start":{"character":72,"line":0}}}]}
V[11:07:37.511] 93541: <<< {"jsonrpc":"2.0","id":50,"method":"textDocument/documentSymbol","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"}}}
I[11:07:37.511] 93541: <-- textDocument/documentSymbol(50)
I[11:07:37.511] 93541: --> reply:textDocument/documentSymbol(50)
V[11:07:37.511] 93541: >>> {"id":50,"jsonrpc":"2.0","result":[{"detail":"identifier","kind":24,"name":"import","range":{"end":{"character":12,"line":0},"start":{"character":6,"line":0}},"selectionRange":{"end":{"character":12,"line":0},"start":{"character":6,"line":0}}},{"detail":"attribute name","kind":7,"name":"lib","range":{"end":{"character":31,"line":0},"start":{"character":28,"line":0}},"selectionRange":{"end":{"character":31,"line":0},"start":{"character":28,"line":0}}},{"detail":"identifier","kind":24,"name":"builtins","range":{"end":{"character":46,"line":0},"start":{"character":38,"line":0}},"selectionRange":{"end":{"character":46,"line":0},"start":{"character":38,"line":0}}},{"detail":"identifier","kind":13,"name":"generators","range":{"end":{"character":58,"line":0},"start":{"character":48,"line":0}},"selectionRange":{"end":{"character":58,"line":0},"start":{"character":48,"line":0}}},{"detail":"attribute name","kind":7,"name":"toPretty","range":{"end":{"character":67,"line":0},"start":{"character":59,"line":0}},"selectionRange":{"end":{"character":67,"line":0},"start":{"character":59,"line":0}}},{"detail":"string","kind":15,"name":"asdf","range":{"end":{"character":78,"line":0},"start":{"character":72,"line":0}},"selectionRange":{"end":{"character":78,"line":0},"start":{"character":72,"line":0}}}]}
V[11:07:37.956] 93541: <<< {"jsonrpc":"2.0","id":51,"method":"textDocument/inlayHint","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"},"range":{"start":{"line":0,"character":0},"end":{"line":4,"character":0}}}}
I[11:07:37.956] 93541: <-- textDocument/inlayHint(51)
I[11:07:37.959] 93541: --> reply:textDocument/inlayHint(51)
V[11:07:37.959] 93541: >>> {"id":51,"jsonrpc":"2.0","result":[]}
V[11:07:38.156] 93541: <<< {"jsonrpc":"2.0","id":52,"method":"textDocument/documentLink","params":{"textDocument":{"uri":"file:///Users/feuh/repos/experiments/nixd-repro/repro-with-builtins.nix"}}}
I[11:07:38.158] 93541: <-- textDocument/documentLink(52)
I[11:07:38.158] 93541: --> reply:textDocument/documentLink(52)
V[11:07:38.158] 93541: >>> {"id":52,"jsonrpc":"2.0","result":[]}

Configuration

If you have some custom configuration, please paste it here.

To Reproduce

  1. Create a file with the content with (import <nixpkgs> { }).lib; with builtins; generators.toPretty { } "asdf"
  2. Run nixd
  3. Observe the incorrect warning

Expected behavior
I would expect nixd to correctly determine that some names from with lib; are used that are not available in with builtins;

Screenshots
See above.

Additional context
None.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions