LSP: Handle textDocument/documentSymbol
#548
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This change allows the LSP to provide a list of symbols for the current document, which includes a nested hierarchical view of types and their fields, enums and their variants, instance and static methods for each, as well as top-level variables and functions.
Doing this caused a few bugs and gaps to surface, which are also fixed as part of this changeset. These include:
Lexer: Consider a \t as a whitespace character when previously it wasn't.
Typechecker: When adding a TypedModule to the Project, make sure to use the normalized path name, with
/a/b/../c
resolved to/a/c
(previously this wasn't the case).Language service: If the TypedModule isn't currently present in the project, pre-emptively typecheck the current module rather than waiting for a save. This is helpful because it allows for more seamless go-to-definition and hover commands, but also because I think if the symbols aren't resolved correctly when the file first opens, vscode will ignore subsequent symbols provided by
textDocument/documentSymbol
. I also cleaned up residual "virtual file system" changes which had been commented out but which can now be disregarded because I don't think I'm going to be doing that any time soon.