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

Commitbae1e7b

Browse files
vasily-kirichenkoKevinRansom
authored andcommitted
#I completion, proper glyph for assemblies and more (dotnet#2498)
* show proper glyph for assemblies in completion list* enable file system completion on fsx files only* add #I completion* take `#I`s into account when getting items for #r and #load* tolerate leading spaces before hash directives* optimization
1 parent4b945e7 commitbae1e7b

File tree

2 files changed

+59
-31
lines changed

2 files changed

+59
-31
lines changed

‎vsintegration/src/FSharp.Editor/Completion/CompletionService.fs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ type internal FSharpCompletionService
2525
ImmutableArray.Create<CompletionProvider>(
2626
FSharpCompletionProvider(workspace, serviceProvider, checkerProvider, projectInfoManager),
2727
ReferenceDirectiveCompletionProvider(),
28-
LoadDirectiveCompletionProvider()
28+
LoadDirectiveCompletionProvider(),
29+
IncludeDirectiveCompletionProvider()
2930
// we've turned off keyword completion because it does not filter suggestion depending on context.
3031
// FSharpKeywordCompletionProvider(workspace, projectInfoManager)
3132
)

‎vsintegration/src/FSharp.Editor/Completion/FileSystemCompletion.fs‎

Lines changed: 57 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,33 @@ open System.Text.RegularExpressions
1515
openSystem.IO
1616

1717
moduleinternalFileSystemCompletion=
18-
let [<Literal>]NetworkPath="\\\\"
19-
letcommitRules= ImmutableArray.Create(CharacterSetModificationRule.Create(CharacterSetModificationKind.Replace,'"','\\',',','/'))
20-
letrules= CompletionItemRules.Create(commitCharacterRules= commitRules)
18+
let [<Literal>]privateNetworkPath="\\\\"
19+
letprivatecommitRules= ImmutableArray.Create(CharacterSetModificationRule.Create(CharacterSetModificationKind.Replace,'"','\\',',','/'))
20+
letprivaterules= CompletionItemRules.Create(commitCharacterRules= commitRules)
2121

22-
letgetQuotedPathStart(text:SourceText,position:int,quotedPathGroup:Group)=
22+
letprivategetQuotedPathStart(text:SourceText,position:int,quotedPathGroup:Group)=
2323
text.Lines.GetLineFromPosition(position).Start+ quotedPathGroup.Index
2424

25-
letgetPathThroughLastSlash(text:SourceText,position:int,quotedPathGroup:Group)=
25+
letprivategetPathThroughLastSlash(text:SourceText,position:int,quotedPathGroup:Group)=
2626
PathCompletionUtilities.GetPathThroughLastSlash(
2727
quotedPath= quotedPathGroup.Value,
2828
quotedPathStart= getQuotedPathStart(text, position, quotedPathGroup),
2929
position= position)
3030

31-
letgetTextChangeSpan(text:SourceText,position:int,quotedPathGroup:Group)=
31+
letprivategetTextChangeSpan(text:SourceText,position:int,quotedPathGroup:Group)=
3232
PathCompletionUtilities.GetTextChangeSpan(
3333
quotedPath= quotedPathGroup.Value,
3434
quotedPathStart= getQuotedPathStart(text, position, quotedPathGroup),
3535
position= position)
3636

37-
letgetItems(provider:CompletionProvider,document:Document,position:int,allowableExtensions:string[],directiveRegex:Regex)=
37+
letprivategetFileGlyph(extention:string)=
38+
match extentionwith
39+
|".exe"|".dll"-> Some Glyph.Assembly
40+
|_-> None
41+
42+
letgetItems(provider:CompletionProvider,document:Document,position:int,allowableExtensions:string list,directiveRegex:Regex,searchPaths:string list)=
3843
asyncMaybe{
44+
do! Option.guard(Path.GetExtension document.FilePath=".fsx")
3945
let!ct= liftAsync Async.CancellationToken
4046
let!text= document.GetTextAsync ct
4147
letline= text.Lines.GetLineFromPosition(position)
@@ -53,16 +59,14 @@ module internal FileSystemCompletion =
5359
do! Option.guard(not(isNull snapshot))
5460
letfileSystem= CurrentWorkingDirectoryDiscoveryService.GetService(snapshot)
5561

56-
letsearchPaths= ImmutableArray.Create(Path.GetDirectoryName document.FilePath)
57-
5862
lethelper=
5963
FileSystemCompletionHelper(
6064
provider,
6165
getTextChangeSpan(text, position, quotedPathGroup),
6266
fileSystem,
6367
Glyph.OpenFolder,
64-
Glyph.None,
65-
searchPaths= searchPaths,
68+
allowableExtensions|> List.tryPick getFileGlyph|> Option.defaultValueGlyph.None,
69+
searchPaths=Seq.toImmutableArraysearchPaths,
6670
allowableExtensions= allowableExtensions,
6771
itemRules= rules)
6872

@@ -89,38 +93,61 @@ module internal FileSystemCompletion =
8993
else
9094
None
9195

92-
typeinternalLoadDirectiveCompletionProvider()=
96+
letprivateincludeDirectiveCleanRegex= Regex("""#I\s+(@?"*(?<literal>[^"]*)"?)""", RegexOptions.Compiled||| RegexOptions.ExplicitCapture)
97+
98+
letgetIncludeDirectives(document:Document,position:int)=
99+
async{
100+
let!ct= Async.CancellationToken
101+
let!text= document.GetTextAsync(ct)
102+
letlines= text.Lines
103+
letcaretLine= text.Lines.GetLinePosition(position).Line
104+
return
105+
lines
106+
|> Seq.filter(fun x-> x.LineNumber<= caretLine)
107+
|> Seq.choose(fun line->
108+
letlineStr= line.ToString().Trim()
109+
// optimization: fail fast if the line does not start with "(optional spaces) #I"
110+
ifnot(lineStr.StartsWith"#I")then None
111+
else
112+
match includeDirectiveCleanRegex.Match lineStrwith
113+
| mwhen m.Success-> Some(m.Groups.["literal"].Value)
114+
|_-> None
115+
)
116+
|> Seq.toList
117+
}
118+
119+
[<AbstractClass>]
120+
typeinternalHashDirectiveCompletionProvider(directiveRegex: string,allowableExtensions: string list,useIncludeDirectives: bool)=
93121
inherit CommonCompletionProvider()
94122

95-
letdirectiveRegex= Regex("""#load\s+(@?"*(?<literal>"[^"]*"?))""", RegexOptions.Compiled||| RegexOptions.ExplicitCapture)
123+
letdirectiveRegex= Regex(directiveRegex, RegexOptions.Compiled||| RegexOptions.ExplicitCapture)
96124

97125
overridethis.ProvideCompletionsAsync(context)=
98126
async{
99-
let!items= FileSystemCompletion.getItems(this, context.Document, context.Position,[|".fs";".fsx"|], directiveRegex)
127+
letdefaultSearchPath= Path.GetDirectoryName context.Document.FilePath
128+
let!extraSearchPaths=
129+
if useIncludeDirectivesthen
130+
FileSystemCompletion.getIncludeDirectives(context.Document, context.Position)
131+
else async.Return[]
132+
letsearchPaths= defaultSearchPath:: extraSearchPaths
133+
let!items= FileSystemCompletion.getItems(this, context.Document, context.Position, allowableExtensions, directiveRegex, searchPaths)
100134
context.AddItems(items)
101135
}|> CommonRoslynHelpers.StartAsyncUnitAsTask context.CancellationToken
102136

103-
override__.IsInsertionTrigger(text,position,_options)= FileSystemCompletion.isInsertionTrigger(text, position)
137+
override__.IsInsertionTrigger(text,position,_)= FileSystemCompletion.isInsertionTrigger(text, position)
104138

105139
override__.GetTextChangeAsync(selectedItem,ch,cancellationToken)=
106140
match FileSystemCompletion.getTextChange(selectedItem, ch)with
107141
| Some x-> Task.FromResult(Nullable x)
108142
| None->base.GetTextChangeAsync(selectedItem, ch, cancellationToken)
109143

144+
145+
typeinternalLoadDirectiveCompletionProvider()=
146+
inherit HashDirectiveCompletionProvider("""\s*#load\s+(@?"*(?<literal>"[^"]*"?))""",[".fs";".fsx"], useIncludeDirectives=true)
147+
110148
typeinternalReferenceDirectiveCompletionProvider()=
111-
inheritCommonCompletionProvider()
149+
inheritHashDirectiveCompletionProvider("""\s*#r\s+(@?"*(?<literal>"[^"]*"?))""",[".dll";".exe"], useIncludeDirectives=true)
112150

113-
letdirectiveRegex= Regex("""#r\s+(@?"*(?<literal>"[^"]*"?))""", RegexOptions.Compiled||| RegexOptions.ExplicitCapture)
114-
115-
overridethis.ProvideCompletionsAsync(context)=
116-
async{
117-
let!items= FileSystemCompletion.getItems(this, context.Document, context.Position,[|".dll";".exe"|], directiveRegex)
118-
context.AddItems(items)
119-
}|> CommonRoslynHelpers.StartAsyncUnitAsTask context.CancellationToken
120-
121-
override__.IsInsertionTrigger(text,position,_options)= FileSystemCompletion.isInsertionTrigger(text, position)
122-
123-
override__.GetTextChangeAsync(selectedItem,ch,cancellationToken)=
124-
match FileSystemCompletion.getTextChange(selectedItem, ch)with
125-
| Some x-> Task.FromResult(Nullable x)
126-
| None->base.GetTextChangeAsync(selectedItem, ch, cancellationToken)
151+
typeinternalIncludeDirectiveCompletionProvider()=
152+
// we have to pass an extension that's not met in real life because if we pass empty list, it does not filter at all.
153+
inherit HashDirectiveCompletionProvider("""\s*#I\s+(@?"*(?<literal>"[^"]*"?))""",[".impossible_extension"], useIncludeDirectives=false)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp