From 9f2fdd62c1c7d164dea817506e79670ef6060e29 Mon Sep 17 00:00:00 2001 From: cartermp Date: Sun, 10 May 2020 21:58:29 -0700 Subject: [PATCH 1/2] Use roslyn API to show unopened namespace in extended completion --- .../Completion/CompletionProvider.fs | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs index 9ec89f069dd..11a0439e4b1 100644 --- a/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs +++ b/vsintegration/src/FSharp.Editor/Completion/CompletionProvider.fs @@ -139,10 +139,10 @@ type internal FSharpCompletionProvider declarationItems |> Array.iteri (fun number declarationItem -> let glyph = Tokenizer.FSharpGlyphToRoslynGlyph (declarationItem.Glyph, declarationItem.Accessibility) - let name = + let namespaceName = match declarationItem.NamespaceToOpen with - | Some namespaceToOpen -> sprintf "%s (open %s)" declarationItem.Name namespaceToOpen - | _ -> declarationItem.Name + | Some namespaceToOpen -> namespaceToOpen + | _ -> null // Icky, but this is how roslyn handles it let filterText = match declarationItem.NamespaceToOpen, declarationItem.Name.Split '.' with @@ -153,8 +153,14 @@ type internal FSharpCompletionProvider | _, idents -> Array.last idents let completionItem = - FSharpCommonCompletionItem.Create(name, null, rules = getRules intellisenseOptions.ShowAfterCharIsTyped, glyph = Nullable glyph, filterText = filterText) - .AddProperty(FullNamePropName, declarationItem.FullName) + FSharpCommonCompletionItem.Create( + declarationItem.Name, + null, + rules = getRules intellisenseOptions.ShowAfterCharIsTyped, + glyph = Nullable glyph, + filterText = filterText, + inlineDescription = namespaceName) + .AddProperty(FullNamePropName, declarationItem.FullName) let completionItem = match declarationItem.Kind with @@ -163,7 +169,7 @@ type internal FSharpCompletionProvider | _ -> completionItem let completionItem = - if name <> declarationItem.NameInCode then + if declarationItem.Name <> declarationItem.NameInCode then completionItem.AddProperty(NameInCodePropName, declarationItem.NameInCode) else completionItem From b45b8b592a68e060cbfa5f70c9553c9930f7cced Mon Sep 17 00:00:00 2001 From: cartermp Date: Mon, 11 May 2020 12:11:43 -0700 Subject: [PATCH 2/2] Properly add open decls when at the top of a file --- .../src/FSharp.Editor/Common/RoslynHelpers.fs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/vsintegration/src/FSharp.Editor/Common/RoslynHelpers.fs b/vsintegration/src/FSharp.Editor/Common/RoslynHelpers.fs index ae8c5fe4fb6..83b79f198c3 100644 --- a/vsintegration/src/FSharp.Editor/Common/RoslynHelpers.fs +++ b/vsintegration/src/FSharp.Editor/Common/RoslynHelpers.fs @@ -187,19 +187,30 @@ module internal OpenDeclarationHelper = let getLineStr line = sourceText.Lines.[line].ToString().Trim() let pos = ParsedInput.adjustInsertionPoint getLineStr ctx - let docLine = pos.Line - 1 + let docLine = Line.toZ pos.Line let lineStr = (String.replicate pos.Column " ") + "open " + ns - let sourceText = sourceText |> insert docLine lineStr + + // If we're at the top of a file (e.g., F# script) then add a newline before adding the open declaration + let sourceText = + if docLine = 0 then + sourceText + |> insert docLine Environment.NewLine + |> insert docLine lineStr + else + sourceText |> insert docLine lineStr + // if there's no a blank line between open declaration block and the rest of the code, we add one let sourceText = if sourceText.Lines.[docLine + 1].ToString().Trim() <> "" then sourceText |> insert (docLine + 1) "" else sourceText + let sourceText = // for top level module we add a blank line between the module declaration and first open statement if (pos.Column = 0 || ctx.ScopeKind = ScopeKind.Namespace) && docLine > 0 && not (sourceText.Lines.[docLine - 1].ToString().Trim().StartsWith "open") then sourceText |> insert docLine "" else sourceText + sourceText, minPos |> Option.defaultValue 0