Skip to main content

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
[handly-dev] An LSP Example

Greetings handly-dev,

I have just pushed to master a new exemplary implementation called "LSP Example".

The LSP example (org.eclipse.handly.examples.lsp) demonstrates a Handly-based model that can represent in a generic way any LSP-based source file. It is built on top of Eclipse LSP4J.

For information about LSP, see https://github.com/Microsoft/language-server-protocol.

Implementation note. Currently, we use symbol location range to infer a hierarchy for a given flat list of symbols in a text document, just as Eclipse LSP4E does in its SymbolModel. However, according to a recent revision of the LSP specification
 
"The range doesn't have to denote a node range in the sense of an abstract syntax tree. It can therefore not be used to re-construct a hierarchy of the symbols."
 
It appears that, for the time being, there is no protocol defined way in LSP for building a tree of symbols [1]. Since the approach we currently use clearly violates the specification, it may or may not work, depending on a language server implementation.

I hope that the value of this example goes beyond demonstrating a possible way of integration with LSP. First, the example stands on it own in that it shows a rather unusual Handly-based model without a single root element: in this model each source file is the root of a separate element tree. Second, the example goes beyond LSP because it is more about a certain architectural style than the specifics of LSP: you could use a similar approach with a custom "server protocol", for example.

A goal was to keep the example rather simple. However, it would be not too hard to expand upon it and implement a more functional standard interface for the source file (in line with the basic feature set provided by LSP), make the model pluggable (so plug-ins could contribute their own implementations of source files for a language to the common model through an extension point), or even grow the code into something production-ready (provided that LSP specifies an appropriate way to build an element tree) as an integration layer in Handly and/or a part of LSP4E if there is sufficient interest. Preferably, any of these or other enhancements should happen in a community-driven way, patches would be most welcome. It is open-source, after all ;-)

[1]: https://github.com/Microsoft/language-server-protocol/issues/327


Back to the top