I'm working on a completion (intellisense) facility for C# in emacs.
The idea is, if a user types a fragment, then asks for completion via a particular keystroke combination, the completion facility will use .NET reflection to determine the possible completions.
Doing this requires that the type of the thing being completed, be known. If it's a string, it has a set of known methods; if it's an Int32, it has a separate set of methods, and so on.
Using semantic, a code lexer/parser package available in emacs, I can locate the variable declarations, and their types. Given that, it's straightforward to use reflection to get the methods and properties on the type, and then present the list of options to the user.
The problem arrives when the code uses var in the declaration.
How can I reliably determine the actual type used, when the variable is declared with the var keyword? Just to be clear, I don't need to determine it at runtime. I want to determine it at "Design time".
So far the best idea I have is:
extract the declaration statement, eg var foo = "a string value";
concatenate a statement foo.GetType();
dynamically compile the resulting C# fragment it into a new assembly
load the assembly into a new AppDomain, run the framgment and get the return type.
unload and discard the assembly
This sounds awfully heavyweight, for each completion request in the editor.
Any better ideas out there?