Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit20b6f6b

Browse files
authored
Converted FSharpEditorFactory and TextViewCreationListener to F# and moved it to FSharp.Editor; fixed alt+enter for script files (dotnet#4625)
1 parent5c04a89 commit20b6f6b

File tree

14 files changed

+326
-387
lines changed

14 files changed

+326
-387
lines changed

‎vsintegration/src/FSharp.Editor/Commands/FsiCommandService.fs‎

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,17 @@ open Microsoft.VisualStudio.FSharp.Interactive
1717

1818
typeinternalFsiCommandFilter(serviceProvider: System.IServiceProvider)=
1919

20-
letprojectSystemPackage=
20+
letloadPackage(guidString:string)=
2121
lazy(
2222
letshell= serviceProvider.GetService(typeof<SVsShell>):?> IVsShell
23-
letpackageToBeLoadedGuid= ref(Guid"{91a04a73-4f2c-4e7c-ad38-c1a68e7da05c}")// FSharp ProjectSystem guid
23+
letpackageToBeLoadedGuid= ref(Guid(guidString))
2424
match shell.LoadPackage packageToBeLoadedGuidwith
2525
| VSConstants.S_OK, pkg->
2626
pkg:?> Package
2727
|_->null)
2828

29+
letfsiPackage= loadPackage FSharpConstants.fsiPackageGuidString
30+
2931
let mutablenextTarget=null
3032

3133
memberx.AttachToViewAdapter(viewAdapter:IVsTextView)=
@@ -38,13 +40,13 @@ type internal FsiCommandFilter(serviceProvider: System.IServiceProvider) =
3840
interface IOleCommandTargetwith
3941
memberx.Exec(pguidCmdGroup,nCmdId,nCmdexecopt,pvaIn,pvaOut)=
4042
if pguidCmdGroup= VSConstants.VsStd11&& nCmdId= uint32 VSConstants.VSStd11CmdID.ExecuteSelectionInInteractivethen
41-
Hooks.OnMLSendprojectSystemPackage.Value FsiEditorSendAction.ExecuteSelectionnullnull
43+
Hooks.OnMLSendfsiPackage.Value FsiEditorSendAction.ExecuteSelectionnullnull
4244
VSConstants.S_OK
4345
elif pguidCmdGroup= VSConstants.VsStd11&& nCmdId= uint32 VSConstants.VSStd11CmdID.ExecuteLineInInteractivethen
44-
Hooks.OnMLSendprojectSystemPackage.Value FsiEditorSendAction.ExecuteLinenullnull
46+
Hooks.OnMLSendfsiPackage.Value FsiEditorSendAction.ExecuteLinenullnull
4547
VSConstants.S_OK
4648
elif pguidCmdGroup= Guids.guidInteractive&& nCmdId= uint32 Guids.cmdIDDebugSelectionthen
47-
Hooks.OnMLSendprojectSystemPackage.Value FsiEditorSendAction.DebugSelectionnullnull
49+
Hooks.OnMLSendfsiPackage.Value FsiEditorSendAction.DebugSelectionnullnull
4850
VSConstants.S_OK
4951
elifnot(isNull nextTarget)then
5052
nextTarget.Exec(&pguidCmdGroup, nCmdId, nCmdexecopt, pvaIn, pvaOut)
@@ -62,7 +64,7 @@ type internal FsiCommandFilter(serviceProvider: System.IServiceProvider) =
6264
elif pguidCmdGroup= Guids.guidInteractivethen
6365
for i=0to int cCmds-1do
6466
if prgCmds.[i].cmdID= uint32 Guids.cmdIDDebugSelectionthen
65-
letdbgState= Hooks.GetDebuggerStateprojectSystemPackage.Value
67+
letdbgState= Hooks.GetDebuggerStatefsiPackage.Value
6668
if dbgState= FsiDebuggerState.AttachedNotToFSIthen
6769
prgCmds.[i].cmdf<- uint32 OLECMDF.OLECMDF_INVISIBLE
6870
else

‎vsintegration/src/FSharp.Editor/Common/Constants.fs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ module internal FSharpConstants =
1010
[<Literal>]
1111
/// "871D2A70-12A2-4e42-9440-425DD92A4116"
1212
letpackageGuidString="871D2A70-12A2-4e42-9440-425DD92A4116"
13+
14+
[<Literal>]
15+
/// "871D2A70-12A2-4e42-9440-425DD92A4116" - FSharp Package
16+
letfsiPackageGuidString="871D2A70-12A2-4e42-9440-425DD92A4116"
1317

1418
[<Literal>]
1519
/// "BC6DD5A5-D4D6-4dab-A00D-A51242DBAF1B"

‎vsintegration/src/FSharp.Editor/FSharp.Editor.fsproj‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
<CompileInclude="Options\SettingsPersistence.fs" />
3939
<CompileInclude="Options\UIHelpers.fs" />
4040
<CompileInclude="Options\EditorOptions.fs" />
41+
<CompileInclude="LanguageService\FSharpEditorFactory.fs" />
42+
<CompileInclude="LanguageService\TextViewCreationListener.fs" />
4143
<CompileInclude="LanguageService\Tokenizer.fs" />
4244
<CompileInclude="LanguageService\Symbols.fs" />
4345
<CompileInclude="LanguageService\FSharpCheckerExtensions.fs" />
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
namespaceMicrosoft.VisualStudio.FSharp.Editor
2+
3+
openSystem
4+
openSystem.Runtime.InteropServices
5+
openMicrosoft.VisualStudio
6+
openMicrosoft.VisualStudio.Editor
7+
openMicrosoft.VisualStudio.Shell
8+
openMicrosoft.VisualStudio.Shell.Interop
9+
openMicrosoft.VisualStudio.TextManager.Interop
10+
openMicrosoft.VisualStudio.Utilities
11+
openMicrosoft.VisualStudio.ComponentModelHost
12+
13+
typeShellPackage= Microsoft.VisualStudio.Shell.Package
14+
15+
[<RequireQualifiedAccess>]
16+
moduleConstants=
17+
18+
[<Literal>]
19+
letFSharpEditorFactoryIdString="8a5aa6cf-46e3-4520-a70a-7393d15233e9"
20+
21+
[<Literal>]
22+
letFSharpContentType="F#"
23+
24+
// _VSPHYSICALVIEWATTRIBUTES.PVA_SupportsPreview = 2
25+
// F# doesn't allow to express a cast of an enum as a literal; we have to put the number here directly.
26+
[<Literal>]
27+
letFSharpEditorFactoryPhysicalViewAttributes=2
28+
29+
[<Guid(Constants.FSharpEditorFactoryIdString)>]
30+
typeFSharpEditorFactory(parentPackage: ShellPackage)=
31+
32+
letserviceProvider=
33+
if parentPackage=nullthen
34+
nullArg"parentPackage"
35+
parentPackage:> IServiceProvider
36+
letcomponentModel= serviceProvider.GetService(typeof<SComponentModel>):?> IComponentModel
37+
leteditorAdaptersFactoryService= componentModel.GetService<IVsEditorAdaptersFactoryService>()
38+
letcontentTypeRegistryService= componentModel.GetService<IContentTypeRegistryService>()
39+
40+
letsetWindowBuffer oleServiceProvider(textBuffer:IVsTextBuffer)(ppunkDocView:byref<nativeint>)(ppunkDocData:byref<nativeint>)(pbstrEditorCaption:byref<string>)=
41+
// If the text buffer is marked as read-only, ensure that the padlock icon is displayed
42+
// next the new window's title and that [Read Only] is appended to title.
43+
letreadOnlyFlags=
44+
(BUFFERSTATEFLAGS.BSF_FILESYS_READONLY||| BUFFERSTATEFLAGS.BSF_USER_READONLY)
45+
|> LanguagePrimitives.EnumToValue
46+
|> uint32
47+
48+
let mutabletextBufferFlags=0u
49+
letreadOnlyStatus=
50+
if(ErrorHandler.Succeeded(textBuffer.GetStateFlags(&textBufferFlags))&&0u<>(textBufferFlags&&& readOnlyFlags))then
51+
READONLYSTATUS.ROSTATUS_ReadOnly
52+
else
53+
READONLYSTATUS.ROSTATUS_NotReadOnly
54+
55+
letcodeWindow= editorAdaptersFactoryService.CreateVsCodeWindowAdapter(oleServiceProvider);
56+
codeWindow.SetBuffer(textBuffer:?> IVsTextLines)
57+
|> ignore
58+
codeWindow.GetEditorCaption(readOnlyStatus,&pbstrEditorCaption)
59+
|> ignore
60+
61+
ppunkDocView<- Marshal.GetIUnknownForObject(codeWindow);
62+
ppunkDocData<- Marshal.GetIUnknownForObject(textBuffer);
63+
64+
VSConstants.S_OK;
65+
66+
let mutableoleServiceProviderOpt= None
67+
68+
interface IVsEditorFactorywith
69+
70+
member__.Close()= VSConstants.S_OK
71+
72+
member__.CreateEditorInstance(_grfCreateDoc,_pszMkDocument,_pszPhysicalView,_pvHier,_itemid,punkDocDataExisting,ppunkDocView,ppunkDocData,pbstrEditorCaption,pguidCmdUI,pgrfCDW)=
73+
ppunkDocView<- IntPtr.Zero
74+
ppunkDocData<- IntPtr.Zero
75+
pbstrEditorCaption<- String.Empty
76+
77+
//pguidCmdUI is the highest priority Guid that Visual Studio Shell looks at when translating key strokes into editor commands.
78+
//Here we intentionally set it to Guid.Empty so it will not play a part in translating keystrokes at all. The next highest priority
79+
//will be commands tied to this FSharpEditorFactory (such as Alt-Enter).
80+
//However, because we are setting pguidCmdUI, we are not going to get typical text editor commands bound to this editor unless we inherit
81+
//those keybindings on the IVsWindowFrame in which our editor lives.
82+
pguidCmdUI<- Guid.Empty
83+
pgrfCDW<-0
84+
85+
match oleServiceProviderOptwith
86+
| None-> VSConstants.E_FAIL
87+
| Some oleServiceProvider->
88+
// Is this document already open? If so, let's see if it's a IVsTextBuffer we should re-use. This allows us
89+
// to properly handle multiple windows open for the same document.
90+
if punkDocDataExisting<> IntPtr.Zerothen
91+
match Marshal.GetObjectForIUnknown(punkDocDataExisting)with
92+
|:? IVsTextBufferas textBuffer->
93+
setWindowBuffer oleServiceProvider textBuffer&ppunkDocView&ppunkDocData&pbstrEditorCaption
94+
|_->
95+
VSConstants.VS_E_INCOMPATIBLEDOCDATA
96+
else
97+
// We need to create a text buffer now.
98+
letcontentType= contentTypeRegistryService.GetContentType(Constants.FSharpContentType)
99+
lettextBuffer= editorAdaptersFactoryService.CreateVsTextBufferAdapter(oleServiceProvider, contentType)
100+
setWindowBuffer oleServiceProvider textBuffer&ppunkDocView&ppunkDocData&pbstrEditorCaption
101+
102+
member__.MapLogicalView(rguidLogicalView,pbstrPhysicalView)=
103+
pbstrPhysicalView<-null
104+
105+
match rguidLogicalViewwith
106+
| xwhen
107+
x= VSConstants.LOGVIEWID.Primary_guid||
108+
x= VSConstants.LOGVIEWID.Debugging_guid||
109+
x= VSConstants.LOGVIEWID.Code_guid||
110+
x= VSConstants.LOGVIEWID.TextView_guid->
111+
VSConstants.S_OK
112+
|_->
113+
VSConstants.E_NOTIMPL
114+
115+
member__.SetSite(packageServiceProvider)=
116+
oleServiceProviderOpt<- Some packageServiceProvider
117+
VSConstants.S_OK
118+

‎vsintegration/src/FSharp.Editor/LanguageService/LanguageService.fs‎

Lines changed: 80 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ open System.Collections.Concurrent
99
openSystem.Collections.Generic
1010
openSystem.Collections.Immutable
1111
openSystem.ComponentModel.Composition
12+
openSystem.ComponentModel.Design
1213
openSystem.Diagnostics
1314
openSystem.IO
1415
openSystem.Linq
@@ -305,53 +306,96 @@ type internal FSharpCheckerWorkspaceServiceFactory
305306
memberthis.Checker= checkerProvider.Checker
306307
memberthis.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.AdvancedSettingsOptionPage>,"F#",null,"Advanced","6012")>]
315-
[<ProvideFSharpVersionRegistration(FSharpConstants.projectPackageGuidString,"Microsoft Visual F#")>]
316-
[<ProvideLanguageService(languageService= typeof<FSharpLanguageService>,
317-
strLanguageName= FSharpConstants.FSharpLanguageName,
318-
languageResourceID=100,
319-
MatchBraces=true,
320-
MatchBracesAtCaret=true,
321-
ShowCompletion=true,
322-
ShowMatchingBrace=true,
323-
ShowSmartIndent=true,
324-
EnableAsyncCompletion=true,
325-
QuickInfo=true,
326-
DefaultToInsertSpaces=true,
327-
CodeSense=true,
328-
DefaultToNonHotURLs=true,
329-
RequestStockColors=true,
330-
EnableCommenting=true,
331-
CodeSenseDelay=100,
332-
ShowDropDownOptions=true)>]
333-
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+
6000s,6001s,// resource id for localisation of the above
313+
true)>]// true = supports automation
314+
[<ProvideKeyBindingTable("{dee22b65-9761-4a26-8fb2-759b971d6dfc}",6001s)>]// <-- 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>,101s, 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+
typeinternalFSharpPackage()as this=
334362
inherit AbstractPackage<FSharpPackage, FSharpLanguageService>()
335363

364+
let mutablevfsiToolWindow= Unchecked.defaultof<Microsoft.VisualStudio.FSharp.Interactive.FsiToolWindow>
365+
letGetToolWindowAsITestVFSI()=
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+
336373
overridethis.Initialize()=
337374
base.Initialize()
375+
338376
this.ComponentModel.GetService<SettingsPersistence.ISettings>()|> ignore
339377

378+
// FSI-LINKAGE-POINT: sited init
379+
letcommandService= 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+
340385
overridethis.RoslynLanguageName= FSharpConstants.FSharpLanguageName
341386
overridethis.CreateWorkspace()= this.ComponentModel.GetService<VisualStudioWorkspaceImpl>()
342387
overridethis.CreateLanguageService()= FSharpLanguageService(this)
343-
overridethis.CreateEditorFactories()=Seq.empty<IVsEditorFactory>
388+
overridethis.CreateEditorFactories()=seq{yield FSharpEditorFactory(this):> IVsEditorFactory}
344389
overridethis.RegisterMiscellaneousFilesWorkspaceInformation(_)=()
345390

346-
type
347-
[<Guid(FSharpConstants.languageServiceGuidString)>]
348-
[<ProvideLanguageExtension(typeof<FSharpLanguageService>,".fs")>]
349-
[<ProvideLanguageExtension(typeof<FSharpLanguageService>,".fsi")>]
350-
[<ProvideLanguageExtension(typeof<FSharpLanguageService>,".fsx")>]
351-
[<ProvideLanguageExtension(typeof<FSharpLanguageService>,".fsscript")>]
352-
[<ProvideLanguageExtension(typeof<FSharpLanguageService>,".ml")>]
353-
[<ProvideLanguageExtension(typeof<FSharpLanguageService>,".mli")>]
354-
internal FSharpLanguageService(package: FSharpPackage)=
391+
interface Microsoft.VisualStudio.FSharp.Interactive.ITestVFSIwith
392+
memberthis.SendTextInteraction(s:string)=
393+
GetToolWindowAsITestVFSI().SendTextInteraction(s)
394+
memberthis.GetMostRecentLines(n:int):string[]=
395+
GetToolWindowAsITestVFSI().GetMostRecentLines(n)
396+
397+
[<Guid(FSharpConstants.languageServiceGuidString)>]
398+
typeinternalFSharpLanguageService(package: FSharpPackage)=
355399
inherit AbstractLanguageService<FSharpPackage, FSharpLanguageService>(package)
356400

357401
letprojectInfoManager= package.ComponentModel.DefaultExportProvider.GetExport<FSharpProjectOptionsManager>().Value

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp