Skip to content
This repository was archived by the owner on Dec 23, 2024. It is now read-only.

Commit e6e7c89

Browse files
dungpaKevinRansom
authored andcommitted
Colorize F# signature help (dotnet#2034)
* Colorize F# signature help * Remove unnecessary symbol API * Fix assembly references
1 parent 6c45eda commit e6e7c89

File tree

3 files changed

+59
-8
lines changed

3 files changed

+59
-8
lines changed

CommonConstants.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,6 @@ module internal FSharpCommonConstants =
2020
[<Literal>]
2121
let FSharpContentTypeName = "F#"
2222
[<Literal>]
23+
let FSharpSignatureHelpContentTypeName = "F# Signature Help"
24+
[<Literal>]
2325
let FSharpLanguageServiceCallbackName = "F# Language Service"

Completion/SignatureHelp.fs

Lines changed: 52 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Microsoft.VisualStudio.FSharp.Editor
44

55
open System
6+
open System.Text.RegularExpressions
67
open System.Composition
78
open System.Collections.Concurrent
89
open System.Collections.Generic
@@ -181,20 +182,49 @@ type internal FSharpSignatureHelpProvider
181182
let paramDoc = XmlDocumentation.BuildMethodParamText(documentationBuilder, method.XmlDoc, p.ParameterName)
182183
let doc = if String.IsNullOrWhiteSpace(paramDoc) then [||]
183184
else [| TaggedText(TextTags.Text, paramDoc) |]
184-
yield (p.ParameterName,p.IsOptional,doc,[| TaggedText(TextTags.Text,p.Display) |]) |]
185+
let parameterParts =
186+
if isStaticArgTip then
187+
[| TaggedText(TextTags.Class, p.Display) |]
188+
else
189+
let str = p.Display
190+
match str.IndexOf(':') with
191+
| -1 -> [| TaggedText(TextTags.Parameter, str) |]
192+
| 0 ->
193+
[| TaggedText(TextTags.Punctuation, ":");
194+
TaggedText(TextTags.Class, str.[1..]) |]
195+
| i ->
196+
[| TaggedText(TextTags.Parameter, str.[..i-1]);
197+
TaggedText(TextTags.Punctuation, ":");
198+
TaggedText(TextTags.Class, str.[i+1..]) |]
199+
yield (p.ParameterName, p.IsOptional, doc, parameterParts)
200+
|]
185201

186202
let hasParamComments (pcs: (string*bool*TaggedText[]*TaggedText[])[]) =
187203
pcs |> Array.exists (fun (_, _, doc, _) -> doc.Length > 0)
188204

189-
let summaryText = if String.IsNullOrWhiteSpace(summaryDoc) then [| TaggedText() |]
190-
elif (hasParamComments parameters) then [| TaggedText(TextTags.Text, summaryDoc + "\n") |]
191-
else [| TaggedText(TextTags.Text, summaryDoc) |]
192-
205+
let summaryText =
206+
let doc =
207+
if String.IsNullOrWhiteSpace summaryDoc then
208+
String.Empty
209+
elif hasParamComments parameters then
210+
summaryDoc + "\n"
211+
else
212+
summaryDoc
213+
[| TaggedText(TextTags.Text, doc) |]
214+
193215
// Prepare the text to display
194-
let descriptionParts = [| TaggedText(TextTags.Text, method.TypeText) |]
195-
let prefixParts = [| TaggedText(TextTags.Text, methodGroup.MethodName); TaggedText(TextTags.Punctuation, (if isStaticArgTip then "<" else "(")) |]
216+
let descriptionParts =
217+
let str = method.TypeText
218+
if str.StartsWith(":", StringComparison.OrdinalIgnoreCase) then
219+
[| TaggedText(TextTags.Punctuation, ":");
220+
TaggedText(TextTags.Class, str.[1..]) |]
221+
else
222+
[| TaggedText(TextTags.Text, str) |]
223+
let prefixParts =
224+
[| TaggedText(TextTags.Method, methodGroup.MethodName);
225+
TaggedText(TextTags.Punctuation, (if isStaticArgTip then "<" else "(")) |]
196226
let separatorParts = [| TaggedText(TextTags.Punctuation, ", ") |]
197-
let suffixParts = [| TaggedText(TextTags.Text, (if isStaticArgTip then ">" else ")")) |]
227+
let suffixParts = [| TaggedText(TextTags.Punctuation, (if isStaticArgTip then ">" else ")")) |]
198228

199229
let completionItem = (method.HasParamArrayArg, summaryText, prefixParts, separatorParts, suffixParts, parameters, descriptionParts)
200230
// FSROSLYNTODO: Do we need a cache like for completion?
@@ -244,3 +274,17 @@ type internal FSharpSignatureHelpProvider
244274
return null
245275
} |> CommonRoslynHelpers.StartAsyncAsTask cancellationToken
246276

277+
open System.ComponentModel.Composition
278+
open Microsoft.VisualStudio.Utilities
279+
open Microsoft.VisualStudio.Text
280+
open Microsoft.VisualStudio.Text.Classification
281+
open Microsoft.CodeAnalysis.Editor.Implementation.IntelliSense.SignatureHelp.Presentation
282+
283+
// Enable colorized signature help for F# buffers
284+
285+
[<Export(typeof<IClassifierProvider>)>]
286+
[<ContentType(FSharpCommonConstants.FSharpSignatureHelpContentTypeName)>]
287+
type FSharpSignatureHelpClassifierProvider [<ImportingConstructor>] (typeMap) =
288+
interface IClassifierProvider with
289+
override __.GetClassifier (buffer: ITextBuffer) =
290+
buffer.Properties.GetOrCreateSingletonProperty(fun _ -> SignatureHelpClassifier(buffer, typeMap) :> _)

ContentType.fs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ module FSharpStaticTypeDefinitions =
1515
[<BaseDefinition(ContentTypeNames.RoslynContentType)>]
1616
let FSharpContentTypeDefinition = ContentTypeDefinition()
1717

18+
[<Export>]
19+
[<Name(FSharpCommonConstants.FSharpSignatureHelpContentTypeName)>]
20+
[<BaseDefinition("sighelp")>]
21+
let FSharpSignatureHelpContentTypeDefinition = ContentTypeDefinition()
22+
1823
[<ExportContentTypeLanguageService(FSharpCommonConstants.FSharpContentTypeName, FSharpCommonConstants.FSharpLanguageName)>]
1924
type FSharpContentType [<System.Composition.ImportingConstructor>](contentTypeRegistry : IContentTypeRegistryService) =
2025
member this.contentTypeRegistryService = contentTypeRegistry

0 commit comments

Comments
 (0)