- Status: accepted
- Deciders: Chris Simon
- Date: 2021-10-23
Use a common Language Server following the Language Server Protocol to ensure effective re-use across multiple IDEs.
The vision of Contextive is to provide a suite of tools to assist with the consistent usage of a Ubiquitous Language in code and documentation. The concept of a Ubiquitous Language is drawn directly from the discipline of Domain Driven Design.
To ensure the ubiquity of the language it is important that the Contextive tools are useful and usable in a variety of contexts.
This decision record captures the thinking around how best to ensure this as the project gets started.
- Developers work across a number of IDEs (e.g. Visual Studio 2019/2022, Visual Studio Code, IntelliJ, Eclipse, NetBeans, vim, emacs, etc.)
- The various IDEs have a range of extension development languages/frameworks
- Contextive is going to have a small development team, so we will prioritize reuse of components over independent ownership to start with.
- Completely separate implementations per IDE
- Common Language Server
- Use the Language Server Protocol to allow minimal implementations per IDE which communicate with the Language Server
Chosen option: "Common Language Server" using the "Language Server Protocol", because it is probably the option that will allow Contextive to be useful in more IDEs with less effort.
- Generally the same positive consequences as described in the Language Server Protocol documentation as the reason for its existence
- Constrained by the capabilities of the Language Server Protocol
- More complexity when deploying extensions, e.g.:
- still need to determine if the Contextive Language Server will be bundled with extensions or need to be downloaded separately?
- what if a user is using multiple IDEs, will they share a Language Server Process, or have separate processes?
- Use of Language Server Protocol Custom Messages may have varying levels of support in different IDE Frameworks
- Good, because it would allow a fully customizable experience in each IDE, allowing to make the most of each IDEs capabilities
- Good, because issues in one extension would not affect other extensions
- Bad, there would potentially be a lot of duplicate logic across multiple languages, e.g. Typescript, .NET, Java
- Bad, because inevitably the supported feature set would drive across IDE implementations
- Good, because it should be easier to add Contextive to more IDEs
- Good, because it follows a standard and familiar protocol structure for IDE extension developers
- Good, because new features added to the Language Server will immediately be supported in all IDEs
- Bad, because deploying the Language Server with the IDE extension (and managing updates) adds an extra level of complexity