I assume that this repository here (larimar) is the LSP that nobodywasishere had been working on, but there hasn’t been any activity in it for a while. So I hope I’m not beating a dead horse, since it might no longer be in your interest, but I’d like to add something here still anyway.
As we know, LSPs like Crystalline have to infer prior context to determine which types are available or imported, or which types are passed to untyped arguments of a function or method.
Aside from being slow, it doesn’t work well at all when you’re building something like a framework or library, where you’re often creating classes/functions/methods in advance before they’re ‘actually’ used. Over the course of my career, I’ve noticed that for these cases it’s definitely the better choice to be explicit rather than implicit, or translated into this context: you should definitely type your inputs to ensure that all future cases are covered.
For example, all the Python LSPs I’ve used so far also don’t look at the context and require you to specify types. Although in the case of modules, it’s the language that forces you to import them in every file, which Crystal doesn’t need of course. However, I’m not sure what the best approach is here.
Although I think context-based completion can still be useful, it should definitely only be used as fallback, and prioritize/only use types when they are provided.