Pulsar doesn’t have a cohesive IDE experience out of the box, but various packages can collaborate to provide it:
- On the backend, any package that uses
atom-languageclient, or any language server configured for use withgeneric-lsp, can provide any of the services listed below. - On the frontend, any package that consumes the services listed below can give the user a UI for the given feature.
In general, a backend provides a service and a frontend consumes it. Here are the major services that are provided by atom-languageclient and similar sources, along with the packages in PPM that can consume them:
intentions:list: Pops up a small menu at a given point in the editor.- Consumed by intentions
symbol.provider: Shows a filterable list of symbols for the current file or for the entire project. Can also support go-to-reference behavior.- Consumed by symbols-view-redux (eventually built-in; I've added support for this service to my fork of
atom-languageclient)
- Consumed by symbols-view-redux (eventually built-in; I've added support for this service to my fork of
autocomplete-provider: Lets providers offer context-specific completions for what the user is typing.- Consumed by
autocomplete-plus(built-in)
- Consumed by
code-actions: Offers a list of code actions (automatic refactors/reformats) for a given buffer context.- Consumed by none (
atom-ide-code-actionsis not standalone) - (The
intentionspackage can fill most of this gap; I’ve added that to my fork ofatom-languageclient)
- Consumed by none (
code-format.range: Allows a provider to reformat an arbitrary section of a buffer- Consumed by atom-ide-code-format
code-highlight: Allows a provider to provide a list of buffer ranges for the UI to bring attention to; used for things like “highlight references to X”- Note: very similar to
find-references, but the LSP spec says they're purposefully separate because this one “is allowed to be more fuzzy” - Consumed by none (
atom-ide-code-highlightis not standalone)
- Note: very similar to
definitions: Provides “go to definition” functionality- Consumed by atom-ide-definitions, atom-refs
find-references: The opposite ofdefinitions; given a symbol, returns all the ranges where that symbol is referenced- Consumed by pulsar-find-references, atom-refs
outline-view: Shows a hierarchical/filterable symbol view in a sidebar for a given buffer- Consumed by atom-ide-outline (which somehow caused my editor to crash when I tried it), pulsar-outline-view.
The services listed above are “pull”-style services: the frontend initiates all interaction. Several others are “push”-style services in which the backend triggers all UI updates. These services invert the provider/consumer relationship: the UI package will provide a function that the backend can call with data whenever appropriate.
linter-indie: Shows diagnostic messages — linting and other code suggestions.- Provided by linter (which also exposes more traditional “pull”-style linting services)
datatip: Shows documentation for a given token when the user hovers over it (or puts the cursor inside of it).- Provided by atom-ide-datatip
signature-help: Shows the signature of a method while the cursor is inside of the method’s arguments.- Provided by atom-ide-signature-help
I’ve omitted atom-ide-ui here because (a) it’s not currently working in Pulsar, though nobody has really investigated why; and (b) it’s an opinionated monolith. The two services that have no standalone consumers have implementations inside of atom-ide-ui that we could consult if we wanted to implement our own versions.
The vast majority of atom-ide-ui got broken into smaller atom-ide-* packages by atom-community; users can install those packages piecemeal or just install atom-ide-base to get it all at once.
- Call hierarchy is in the LSP Spec and seems to be implemented in
atom-languageclient. - Rename requests — renaming a symbol across all references in a project — is in the LSP Spec and seems to be implemented in
atom-languageclient.- I took a first pass at a package that implemented the
refactorservice described inatom-languageclient, and it manages to implement rename requests perfectly. I might publish this in the package repo if I can write some specs.
- I took a first pass at a package that implemented the