Commit graph

45 commits

Author SHA1 Message Date
Marc Huisinga
f9e5f1f1fd
feat: add call hierarchy support (#3082)
This PR adds support for the "call hierarchy" feature of LSP that allows
quickly navigating both inbound and outbound call sites of functions. In
this PR, "call" is taken to mean "usage", so inbound and outbound
references of all kinds of identifiers (e.g. functions or types) can be
navigated. To implement the call hierarchy feature, this PR implements
the LSP requests `textDocument/prepareCallHierarchy`,
`callHierarchy/incomingCalls` and `callHierarchy/outgoingCalls`.

<details>
  <summary>Showing the call hierarchy (click to show image)</summary>
  

![show_call_hierarchy](https://github.com/leanprover/lean4/assets/10852073/add13943-013c-4d0a-a2d4-a7c57ad2ae26)
  
</details>

<details>
  <summary>Incoming calls (click to show image)</summary>
  

![incoming_calls](https://github.com/leanprover/lean4/assets/10852073/9a803cb4-6690-42b4-9c5c-f301f76367a7)
  
</details>

<details>
  <summary>Outgoing calls (click to show image)</summary>
  

![outgoing_calls](https://github.com/leanprover/lean4/assets/10852073/a7c4f193-51ab-4365-9473-0309319b1cfe)
  
</details>

It is based on #3159, which should be merged before this PR.

To route the parent declaration name through to the language server, the
`.ilean` format is adjusted, breaking backwards compatibility with
version 1 of the ILean format and yielding version 2.

This PR also makes the following more minor adjustments:
- `Lean.Server.findModuleRefs` now also combines the identifiers of
constants and FVars and prefers constant over FVars for the combined
identifier. This is necessary because e.g. declarations declared using
`where` yield both a constant (for usage outside of the function) and an
FVar (for usage inside of the function) with the same range, whereas we
would typically like all references to refer to the former. This also
fixes a bug introduced in #2462 where renaming a declaration declared
using `where` would not rename usages outside of the function, as well
as a bug in the unused variable linter where `where` declarations would
be reported as unused even if they were being used outside of the
function.
- The function converting `Lean.Server.RefInfo` to `Lean.Lsp.RefInfo`
now also computes the `Lean.DeclarationRanges` for parent declaration
names via `MetaM` and must hence be in `IO` now.
- Add a utility function `Array.groupByKey` to `HashMap.lean`.
- Stylistic refactoring of `Watchdog.lean` and `LanguageFeatures.lean`.
2024-01-25 14:43:23 +00:00
Mario Carneiro
b97b0ad2aa
feat: rename request handler (#2462)
This implements a request handler for the `textDocument/rename` LSP
request, enabling renames via F2. It handles both local renames (e.g.
`let x := 1; x` to `let y := 1; y`) as well as global renames
(definitions).

Unfortunately it does not work for "orphan" files outside a project, as
it uses ilean data for the current file and this does not seem to be
saved for orphan files. As a result, the test file does not work,
although one can manually test the implementation against a project such
as mathlib. (This issue already exists for the "references" request,
e.g. ctrl click on the first `x` in `let x := 1; x` takes you to the
second one only if you are not in an orphan file.)

* Fixes leanprover-community/mathlib4#7124
2023-11-21 13:10:52 +01:00
Gabriel Ebner
eeab2af7ae fix: remove Inhabited Environment instance 2022-12-21 20:08:08 +01:00
Mario Carneiro
4fefb2097f feat: hover/go-to-def/refs for options 2022-11-07 20:01:13 +01:00
Sebastian Ullrich
a03749cbe4 fix: findReferences should find only original syntax 2022-09-27 22:09:54 +02:00
Mario Carneiro
85119ba9d1 chore: move Std.* data structures to Lean.* 2022-09-26 05:46:04 -07:00
Mario Carneiro
6392c5b456 chore: import reductions 2022-09-15 14:02:38 -07:00
Mario Carneiro
850ee17346 chore: move Bootstrap.System.Uri to Init 2022-08-29 08:06:30 -07:00
Mario Carneiro
bf89c5a0f5 chore: move Std -> Bootstrap 2022-08-29 01:26:12 -07:00
Chris Lovett
50cd7debe1
feat: simple uri escaping and unescaping (#1452) 2022-08-12 19:56:05 +00:00
Mario Carneiro
ea0f177bf2 feat: add unused/deprecation diagnostic tags 2022-08-05 17:45:50 +02:00
Leonardo de Moura
e6d5349abb chore: unused variable 2022-08-02 02:24:50 -07:00
Sebastian Ullrich
de029566d1 fix: unused variables false positive with match 2022-08-01 07:09:08 -07:00
Mario Carneiro
f6211b1a74
chore: convert doc/mod comments from /- to /--//-! (#1354) 2022-07-22 12:05:31 -07:00
larsk21
ced8df3e86 fix: references of variables with equal ranges 2022-07-13 10:35:37 +02:00
Sebastian Ullrich
05c5dd4441 fix: unused variables linter: search fvar aliases in tactics 2022-06-03 22:37:38 +02:00
larsk21
b556e73657 refactor: extend Lsp.ModuleRefs in Server.References 2022-06-03 13:03:52 +02:00
larsk21
8824a479a5 fix: add additional information to Lean.Server.Reference 2022-06-03 13:03:52 +02:00
Sebastian Ullrich
d03f0b3851 fix: set of chained lexical references 2022-05-11 17:32:06 +02:00
Sebastian Ullrich
daa9e03e78 fix: combineFvars 2022-05-07 15:50:26 -07:00
Joscha
5749fb1474 fix: search for local refs only in current file
Fixed by adding the identifier's module as an argument to referringTo.
If the ident is RefIdent.const, this is ignored, but if it is
RefIdent.fvar, referringTo limits its search to the ident's module.
2022-05-03 16:53:03 +02:00
Sebastian Ullrich
2f3396e58a fix: non-termination in deduplication of lexical references 2022-05-02 09:51:14 +02:00
Sebastian Ullrich
09e4c00c68 fix: lexical references through x := e and similar macros 2022-05-01 17:46:05 +02:00
Sebastian Ullrich
a0678b5f6f refactor: rename confusing Reference.isDeclaration field 2022-05-01 16:21:15 +02:00
Joscha
196cf67eed fix: handle overlapping definitions 2022-02-06 16:52:18 +01:00
Leonardo de Moura
12e2a79170 chore: fix codebase after removing auto pure 2022-02-03 18:08:14 -08:00
larsk21
6cee7a6a31 fix: dedup references in findModuleRefs 2022-02-02 13:03:21 +01:00
Joscha
d2dcff1f9a refactor: address review comments 2022-01-31 21:36:37 +01:00
Joscha
4545e183d8 fix: go to definition in modified file 2022-01-31 21:36:37 +01:00
Joscha
ccf492b61d feat: implement partial ilean updates 2022-01-31 21:36:37 +01:00
Joscha
2423a78db4 refactor: implement suggestions 2022-01-20 17:20:01 +01:00
Sebastian Ullrich
3a926b1047 fix: use user-facing private decl name in symbol query 2022-01-20 17:20:01 +01:00
Joscha
7540889bd3 feat: implement LSP workspace symbol request 2022-01-20 17:20:01 +01:00
Joscha
d8ec900ae9 refactor: use array instead of list in AsyncElabState 2022-01-14 09:18:57 +01:00
Joscha
ab52480b69 fix: implement suggestions 2022-01-14 09:18:57 +01:00
Joscha
4bcf7ab31f style: add copyright headers 2022-01-14 09:18:57 +01:00
Joscha
b9f8f5eb38 fix: find references of function parameters 2022-01-14 09:18:57 +01:00
Joscha
7cce91acb4 refactor: move some reference-related types to Lean.Data
These types are required for worker->watchdog notifications.
2022-01-14 09:18:57 +01:00
Joscha
67aa823ae2 fix: resolve symlinks for the LSP client 2022-01-14 09:18:57 +01:00
Joscha
bce56fdc0c feat: implement reference request 2022-01-14 09:18:57 +01:00
Joscha
4fd1d22c31 feat: load and unload ileans on LSP notifications 2022-01-14 09:18:57 +01:00
Joscha
4e12cc902b feat: load ilean files from olean search path 2022-01-14 09:18:57 +01:00
Joscha
3f998c68bc feat: export reference info to ilean files 2022-01-14 09:18:57 +01:00
Joscha
96ed620933 feat: collect reference info from InfoTrees 2022-01-14 09:18:57 +01:00
Joscha
efb964956e feat: add FileRefMap and convert to/from JSON 2022-01-14 09:18:57 +01:00