Roadmap
As a volunteer-run Open Source effort, we cannot commit to a timeline. We’re actively looking for corporate sponsors, with some prospects in sight.
In progress for after version 2023.1
Specifying bulk protocol
We’ve decided[1] to specify protocols only by their conceptual features. The first such protocol will be the Bulk Repository access API. It is used to store and retrieve nodes in batches at the moment of invocation.[2] It is intended for CRUD operations on (larger) sets of nodes, and enables integration with "simple" editor (i.e. no real-time collaboration). Additionally, this API allows to list the available Partitions, get Languages known to the repository, and request unused node ids.
Envisioned
We highly encourage any participation in LionWeb. So if you’d like to work on some of these features, or even only have an urgent need for them: let us know! This will influence the feature’s priority.
The list below is in no particular order.
Delta protocol
As described in our reference architecture, via delta protocol a client receives an initial snapshot similar to the bulk case. Afterwards, the client continues to receive changes (aka deltas) from the repo; it also writes back changes continuously.[3]
Standard derived models
We intend to support several common language (workbench) functionalities via derived models. For each functionality, LionWeb would define a base language. Any implementation might use these base languages directly, or define its own extension languages.
As an example, LionWeb’s validation base language might define concepts for Error
, Warning
, and Info
.
My validator implementation would create instances of Error
and Info
, but also include a custom compiler-based validation language that defines GeneratorWarning
and CompilerWarning
as specializations of Warning
.
A client that only knows about LionWeb’s validation base language can process both of the specialized warnings in a generic fashion.
Another, compiler-aware client might display GeneratorWarning
s differently than CompilerWarning
s.
Base language candidates are typically common language functionalities that might be expensive to calculate. This includes:
Validation
Checking a model for consistency and other errors is one of the most common operations on models. It might also be expensive: if we wanted to assure globally unique names, we had to check all named things in our model on every name change. The basic structure of validation is very similar in most systems: any issue has a severity level, refers to a node, might relate to a feature, and provides an error message.[4]
Scoping
Calculating the scope of visible targets at any given place is necessary for both parser-based clients (for name binding / linking) and projectional clients / IDEs (for auto-completion). Similar to validation, the basic structure of scoping is very similar in most systems; this base language would condense the common concepts.[5]
Typesystem
We need to calculate the type of a node in several contexts, including validation (e.g. "do the types of these assigned nodes match?") and scoping (e.g. "which members does the thing on the left side of the dot have?").[6]
Access control
Different users might have different level of access to the whole repository, or parts of it. Some users might have read-only access (e.g. via public web), whereas others can write to the repository.[7]
Versioning / Live collaboration
A repository might support version control and/or live collaboration of users.
The repository might have a version control backend like git, or support live collaboration like Google Docs.[8]
Note
|
These two features are lumped into one because from an implementation point of view, both need a history of all edit actions to actually work. |
Locking
A repository might support locking the whole repository, partitions, or subtrees. The lock might be established with optimistic or pessimistic locking strategies.[9]
Federation
A repository A might access a different repository B, and provide B's contents to A's users. The two repositories might be synchronized on a regular schedule, or continuously.[10]
Global symbol index
A global index of (fully qualified) names can be very useful for any kind of name lookup, for example in parser-based name resolution, scoping, or auto-completion.[11]
Identifier mapping API
Different clients might refer to the same node by different ids. The repository might support them by automatically mapping between the repository’s internal id, and the id known to each client.[12]
Language migration API
Support a common way how to handle language migrations, e.g. by specific messages like "I’m about to migrate this partition", or "You must not use language X in a version older than abc".[13]
Store invalid text typed at arbitrary place
Given a valid input with invalid text at few places, both tolerant parsers and projectional editors can provide a "mostly correct" AST representation. Internally, they have some way of keeping the invalid text around. We could support a standard way to store such invalid text in the repository.[14]
Define a standard way to represent model diffs
Calculating the difference between two sets of nodes is common, complex, and potentially expensive task. It might be useful to have a standard format to exchange the difference, and the Delta protocol could provide a solid base.[15]
Complex query API
More complex filters for Specifying bulk protocol and/or Delta protocol might help saving communication overhead. For example, I might query via bulk only for Dog concepts, or only receive delta updates for Dogs with furColor == red.[16]
Commented nodes
In source code it’s very common to comment out a part of the contents. We might come up with a standard way to support similar functionality to comment out some nodes.[17]
Support custom DataTypes
Shared annotations in built-ins language
We might add some Annotations to the built-ins language, e.g. range constraints on integers, implementation per platform, @Deprecated
, etc.[19]
Another useful set of annotations would be review comments: For any kind of collaboration, it’s very helpful for reviewers to attach their remarks directly to their context — think of the blue speech bubbles in the right margin of a Word document.[20]
Support ordered / unordered containments / references
For some use cases (e.g. merging), it might be useful to know that the order of features does not matter.[21]
Interpretation API
In most advanced DSLs, we want to evaluate or "execute" models directly, i.e. without intermediate generation step. Interpreters can be implemented in various ways, but usually have a very standard interface.[22]
File generation API
Most modeling systems want to create some artifacts from the model contents, for example source code, documents, or images. This interface can be standardized to receive some input nodes, maybe some parameters, and result in one or more files.[23]
Note
|
This functionality concerns model-to-text / model-to-binary generators. Model-to-model generators would be implemented as Processors that run on-demand. |
Versions
2024.1
-
Specified Bulk Repository Access API
-
Removed built-in
JSON
primitive datatype -
Added StructuredDataType
2023.1
Stable serialization format (including JSON schema) and meta-metamodel describing Languages, Concepts, Interfaces, Annotations, Enumerations, PrimitiveTypes, Properties, Containments, and References. The standard library contains classifiers Node and INamed, and primitive types Boolean, String, Integer, and JSON.
History
2023
November
-
Initial release 2023.1
-
Presentation at LangDevCon 2023
May
-
First public presentation at MPS Community Meetup 2023
2022
October
-
Start of regular LionWeb core group meetings
September
-
Founding Meeting at LangDevCon 2022
-
Set up LionWeb-io GitHub organization