@@ -9,6 +9,7 @@ open System.Collections.Concurrent
99open System.Collections .Generic
1010open System.Collections .Immutable
1111open System.ComponentModel .Composition
12+ open System.ComponentModel .Design
1213open System.Diagnostics
1314open System.IO
1415open System.Linq
@@ -56,10 +57,10 @@ type internal FSharpCheckerProvider
5657let mmd = amd.GetModules().[ 0 ]
5758let mmr = mmd.GetMetadataReader()
5859
59- // "lifetime is timed to Metadata you got from the GetMetadata(…). As long as you hold it strongly, raw
60+ // "lifetime is timed to Metadata you got from the GetMetadata(…). As long as you hold it strongly, raw
6061// memory we got from metadata reader will be alive. Once you are done, just let everything go and
6162// let finalizer handle resource rather than calling Dispose from Metadata directly. It is shared metadata.
62- // You shouldn’t dispose it directly."
63+ // You shouldn’t dispose it directly."
6364
6465let objToHold = box md
6566
@@ -305,54 +306,96 @@ type internal FSharpCheckerWorkspaceServiceFactory
305306member this.Checker = checkerProvider.Checker
306307member this.FSharpProjectOptionsManager = projectInfoManager}
307308
308- type
309- [<Guid( FSharpConstants.packageGuidString) >]
310- [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.IntelliSenseOptionPage>, " F#" , null , " IntelliSense" , " 6008" ) >]
311- [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.QuickInfoOptionPage>, " F#" , null , " QuickInfo" , " 6009" ) >]
312- [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.CodeFixesOptionPage>, " F#" , null , " Code Fixes" , " 6010" ) >]
313- [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.LanguageServicePerformanceOptionPage>, " F#" , null , " Performance" , " 6011" ) >]
314- [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.CodeLensOptionPage>, " F#" , null , " Code Lens" , " 6012" ) >]
315- [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.AdvancedSettingsOptionPage>, " F#" , null , " Advanced" , " 6012" ) >]
316- [<ProvideFSharpVersionRegistration( FSharpConstants.projectPackageGuidString, " Microsoft Visual F#" ) >]
317- [<ProvideLanguageService( languageService= typeof< FSharpLanguageService>,
318- strLanguageName= FSharpConstants.FSharpLanguageName,
319- languageResourceID= 100 ,
320- MatchBraces= true ,
321- MatchBracesAtCaret= true ,
322- ShowCompletion= true ,
323- ShowMatchingBrace= true ,
324- ShowSmartIndent= true ,
325- EnableAsyncCompletion= true ,
326- QuickInfo= true ,
327- DefaultToInsertSpaces= true ,
328- CodeSense= true ,
329- DefaultToNonHotURLs= true ,
330- RequestStockColors= true ,
331- EnableCommenting= true ,
332- CodeSenseDelay= 100 ,
333- ShowDropDownOptions= true ) >]
334- internal FSharpPackage() =
309+ [<Guid( FSharpConstants.packageGuidString) >]
310+ [<ProvideOptionPage( typeof< Microsoft.VisualStudio.FSharp.Interactive.FsiPropertyPage>,
311+ " F# Tools" , " F# Interactive" , // category/sub-category on Tools>Options...
312+ 6000 s, 6001 s, // resource id for localisation of the above
313+ true ) >]// true = supports automation
314+ [<ProvideKeyBindingTable( " {dee22b65-9761-4a26-8fb2-759b971d6dfc}" , 6001 s) >] // <-- resource ID for localised name
315+ [<ProvideToolWindow( typeof< Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow>,
316+ // The following should place the ToolWindow with the OutputWindow by default.
317+ Orientation= ToolWindowOrientation.Bottom,
318+ Style= VsDockStyle.Tabbed,
319+ PositionX= 0 ,
320+ PositionY= 0 ,
321+ Width= 360 ,
322+ Height= 120 ,
323+ Window= " 34E76E81-EE4A-11D0-AE2E-00A0C90FFFC3" ) >]
324+ [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.IntelliSenseOptionPage>, " F#" , null , " IntelliSense" , " 6008" ) >]
325+ [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.QuickInfoOptionPage>, " F#" , null , " QuickInfo" , " 6009" ) >]
326+ [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.CodeFixesOptionPage>, " F#" , null , " Code Fixes" , " 6010" ) >]
327+ [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.LanguageServicePerformanceOptionPage>, " F#" , null , " Performance" , " 6011" ) >]
328+ [<ProvideLanguageEditorOptionPage( typeof< OptionsUI.AdvancedSettingsOptionPage>, " F#" , null , " Advanced" , " 6012" ) >]
329+ [<ProvideFSharpVersionRegistration( FSharpConstants.projectPackageGuidString, " Microsoft Visual F#" ) >]
330+ // 64 represents a hex number. It needs to be greater than 37 so the TextMate editor will not be chosen as higher priority.
331+ [<ProvideEditorExtension( typeof< FSharpEditorFactory>, " .fs" , 64 ) >]
332+ [<ProvideEditorExtension( typeof< FSharpEditorFactory>, " .fsi" , 64 ) >]
333+ [<ProvideEditorExtension( typeof< FSharpEditorFactory>, " .fsscript" , 64 ) >]
334+ [<ProvideEditorExtension( typeof< FSharpEditorFactory>, " .fsx" , 64 ) >]
335+ [<ProvideEditorExtension( typeof< FSharpEditorFactory>, " .ml" , 64 ) >]
336+ [<ProvideEditorExtension( typeof< FSharpEditorFactory>, " .mli" , 64 ) >]
337+ [<ProvideEditorFactory( typeof< FSharpEditorFactory>, 101 s, CommonPhysicalViewAttributes= Constants.FSharpEditorFactoryPhysicalViewAttributes) >]
338+ [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fs" ) >]
339+ [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fsi" ) >]
340+ [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fsx" ) >]
341+ [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fsscript" ) >]
342+ [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .ml" ) >]
343+ [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .mli" ) >]
344+ [<ProvideLanguageService( languageService= typeof< FSharpLanguageService>,
345+ strLanguageName= FSharpConstants.FSharpLanguageName,
346+ languageResourceID= 100 ,
347+ MatchBraces= true ,
348+ MatchBracesAtCaret= true ,
349+ ShowCompletion= true ,
350+ ShowMatchingBrace= true ,
351+ ShowSmartIndent= true ,
352+ EnableAsyncCompletion= true ,
353+ QuickInfo= true ,
354+ DefaultToInsertSpaces= true ,
355+ CodeSense= true ,
356+ DefaultToNonHotURLs= true ,
357+ RequestStockColors= true ,
358+ EnableCommenting= true ,
359+ CodeSenseDelay= 100 ,
360+ ShowDropDownOptions= true ) >]
361+ type internal FSharpPackage () as this=
335362inherit AbstractPackage< FSharpPackage, FSharpLanguageService>()
336363
364+ let mutable vfsiToolWindow = Unchecked.defaultof< Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow>
365+ let GetToolWindowAsITestVFSI () =
366+ if vfsiToolWindow= Unchecked.defaultof<_> then
367+ vfsiToolWindow<- this.FindToolWindow( typeof< Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow>, 0 , true ) :?> Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow
368+ vfsiToolWindow:> Microsoft.VisualStudio.FSharp.Interactive.ITestVFSI
369+
370+ // FSI-LINKAGE-POINT: unsited init
371+ do Microsoft.VisualStudio.FSharp.Interactive.Hooks.fsiConsoleWindowPackageCtorUnsited( this:> Package)
372+
337373override this.Initialize () =
338374base .Initialize()
375+
339376 this.ComponentModel.GetService< SettingsPersistence.ISettings>() |> ignore
340377
378+ // FSI-LINKAGE-POINT: sited init
379+ let commandService = this.GetService( typeof< IMenuCommandService>) :?> OleMenuCommandService// FSI-LINKAGE-POINT
380+ Microsoft.VisualStudio.FSharp.Interactive.Hooks.fsiConsoleWindowPackageInitalizeSited( this:> Package) commandService
381+ // FSI-LINKAGE-POINT: private method GetDialogPage forces fsi options to be loaded
382+ let _fsiPropertyPage = this.GetDialogPage( typeof< Microsoft.VisualStudio.FSharp.Interactive.FsiPropertyPage>)
383+ ()
384+
341385override this.RoslynLanguageName = FSharpConstants.FSharpLanguageName
342386override this.CreateWorkspace () = this.ComponentModel.GetService< VisualStudioWorkspaceImpl>()
343387override this.CreateLanguageService () = FSharpLanguageService( this)
344- override this.CreateEditorFactories () = Seq.empty < IVsEditorFactory >
388+ override this.CreateEditorFactories () = seq { yield FSharpEditorFactory ( this ) :> IVsEditorFactory }
345389override this.RegisterMiscellaneousFilesWorkspaceInformation ( _ ) = ()
346390
347- type
348- [<Guid( FSharpConstants.languageServiceGuidString) >]
349- [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fs" ) >]
350- [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fsi" ) >]
351- [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fsx" ) >]
352- [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .fsscript" ) >]
353- [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .ml" ) >]
354- [<ProvideLanguageExtension( typeof< FSharpLanguageService>, " .mli" ) >]
355- internal FSharpLanguageService( package: FSharpPackage) =
391+ interface Microsoft.VisualStudio.FSharp.Interactive.ITestVFSIwith
392+ member this.SendTextInteraction ( s : string ) =
393+ GetToolWindowAsITestVFSI() .SendTextInteraction( s)
394+ member this.GetMostRecentLines ( n : int ) : string [] =
395+ GetToolWindowAsITestVFSI() .GetMostRecentLines( n)
396+
397+ [<Guid( FSharpConstants.languageServiceGuidString) >]
398+ type internal FSharpLanguageService ( package : FSharpPackage ) =
356399inherit AbstractLanguageService< FSharpPackage, FSharpLanguageService>( package)
357400
358401let projectInfoManager = package.ComponentModel.DefaultExportProvider.GetExport< FSharpProjectOptionsManager>() .Value