Showing posts with label Visual Studio. Show all posts
Showing posts with label Visual Studio. Show all posts
2011-06-26
Problems with the VS SDK
It looks this will not be as easy as I expected to use F# for the Visual Studio plugin (based on IronStudio). It is not just terribly slow, but it looks like the template for creating VS studio language integration is using some parts with dependent types. Yes, I know it might be only my limitations not seeing an obvious solution to this, but it looks like the project classes the ToolsPackage class and the SolutionAdviser classes are too interdependent... I have to think how should I solve this problem.
2011-06-02
Ook
Today I have finished the port of the sample Ook language extension from C# to F#. It was interesting, as I was learning both the Visual Studio extension mechanisms, and also F#. The only problem remaining, that the Visual Studio crashes when I try to edit (add a module to the vsixmanifest file) with the VSIX editor.
It was not too easy task, some of the problems:
- Implementing an interface with events:
let tagsChangedHandlers = new ResizeArray<EventHandler<SnapshotSpanEventArgs>>()
interface ITagger<ooktokentag> with
member this.add_TagsChanged v = tagsChangedHandlers.Add v |> ignore
member this.remove_TagsChanged v = tagsChangedHandlers.Remove v |> ignore - Properly setting up the project file was not so easy either (at least I now know what are the ProjectTypeGuids for C#, F# and the VS SDK)
- I had to move the TemplateQuickInfoControllerProvider and TemplateQuickInfoController classes to the same file (I am not sure how to do this if both classes have attributes)
- There are no implicit conversions
- One of the most annoying thing was when there was an error in my F# code and when I tried to correct it and saved the file the Visual Studio just crashed
- You have to use refs instead of mutable variables if you would like to get the result from a method (not so surprising, maybe I should read fully the Expert F# 2.0 before further coding)
- I have not found a simple way to emulate early return from methods
- It was pretty annoying to find that the unbox gives an int by default, which is not so much fun if you want a uint16, this solved the problem:
member private this.GetTypeChar(pvaIn : IntPtr) : char =
let x : uint16 = unbox(Marshal.GetObjectForNativeVariant(pvaIn))
char(x)
In general it was not so bad. I really liked the way it pushed me to make things more independent and be aware of the dependencies. I think because of the legacy API it is not a perfect fit for F# (and to be honest I have not transformed to a really functional solution), but everything can be worked around.
Although the F# Visual Studio plugin is terribly slow... I was typing and typing when finally I got back the cursor and the code completion and other things. I hope this was just because of an extension for Visual Studio, although except the F# refactor those useful, so those will stay.
Subscribe to:
Posts (Atom)