One of the key features of an LSP is auto-completion based on the type.
Suppose this code:
struct Foo
x
y
end
Foo_constructor(i) = Foo(i,i)
a = Foo_constructor(3)
Now, the LSP does not recognize a
as an object of type Foo
, if you type a.
you don’t get auto completion, now a simple analysis of the code shows that no matter the i
given, you’ll always get an object of type Foo
so it would’ve been nice if that was automatic.
Now suppose this new example here:
Foo(i) = Foo(i,i)
b = Foo(3)
Now, the LSP does recognize b
as of being of type Foo
, and you get auto-completion; as b.
gives the option for both x
and y
. This may seem “good”, so “constructors” should preferably be named after their output type.
However, now consider this example: (which I admit is terrible ambiguous code)
Foo(i::Float64) = 10.
c = Foo(2.3)
Now, the LSP thinks that c
is of type Foo
! And when prompted for auto-completion it will show x
and y
which is erroneous, a fact more apparent if Foo(...)
gives an object of type Bar
with different attributes.
When dealing with projects which feature loads of struct
s (I’m now working on a Compiler after finishing the Interpreter, check out: GitHub - lucifer1004/MonkeyLang.jl: "Writing an Interpreter in GO" and "Writing a Compiler in GO" in Julia. for a similar implementation) auto-completion of variables assigned as the output of a function is mighty useful.
Now, how to go forward with this? Not sure, though in my mind a more elaborate static code analyzer might do it.