Skip to content

Commit

Permalink
fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
DedSec256 committed Feb 12, 2025
1 parent da03f82 commit 098f0f5
Show file tree
Hide file tree
Showing 21 changed files with 403 additions and 89 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,6 @@ type public Strings() =
static member FSharpTypeHints_TopLevelMembers_Description = Strings.ResourceManager.GetString("FSharpTypeHints_TopLevelMembers_Description")
static member FSharpTypeHints_LocalBindings_Description = Strings.ResourceManager.GetString("FSharpTypeHints_LocalBindings_Description")
static member FSharpTypeHints_ShowPipeReturnTypes_Description = Strings.ResourceManager.GetString("FSharpTypeHints_ShowPipeReturnTypes_Description")
static member FSharpTypeHints_HideSameLinePipe_Description = Strings.ResourceManager.GetString("FSharpTypeHints_HideSameLinePipe_Description")
static member FSharpTypeHints_HideSameLinePipe_Description = Strings.ResourceManager.GetString("FSharpTypeHints_HideSameLinePipe_Description")
static member FSharpTypeHints_OtherPatterns_Description = Strings.ResourceManager.GetString("FSharpTypeHints_OtherPatterns_Description")
static member FSharpTypeHints_OtherPatternsSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_OtherPatternsSettings_Header")
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,10 @@
<data name="FSharpTypeHints_HideSameLinePipe_Description" xml:space="preserve">
<value>Hide when |&gt; is on same line as argument</value>
</data>
<data name="FSharpTypeHints_OtherPatterns_Description" xml:space="preserve">
<value>Type hints for other patterns</value>
</data>
<data name="FSharpTypeHints_OtherPatternsSettings_Header" xml:space="preserve">
<value>Other patterns</value>
</data>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -191,7 +191,12 @@ type FSharpTypeHintOptions =
[<SettingsEntry(PushToHintMode.PushToShowHints,
DescriptionResourceType = typeof<Strings>,
DescriptionResourceName = nameof(Strings.FSharpTypeHints_LocalBindings_Description))>]
mutable ShowTypeHintsForLocalBindings: PushToHintMode }
mutable ShowTypeHintsForLocalBindings: PushToHintMode

[<SettingsEntry(PushToHintMode.PushToShowHints,
DescriptionResourceType = typeof<Strings>,
DescriptionResourceName = nameof(Strings.FSharpTypeHints_OtherPatterns_Description))>]
mutable ShowTypeHintsForOtherPatterns: PushToHintMode }


[<OptionsPage("FSharpOptionsPage", "F#", typeof<ProjectModelThemedIcons.Fsharp>)>]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,5 @@ type public Strings() =
static member FSharpTypeHints_TopLevelMembersSettings_Comment = Strings.ResourceManager.GetString("FSharpTypeHints_TopLevelMembersSettings_Comment")
static member FSharpTypeHints_ShowPipeReturnTypes_Description = Strings.ResourceManager.GetString("FSharpTypeHints_ShowPipeReturnTypes_Description")
static member FSharpTypeHints_HideSameLinePipe_Description = Strings.ResourceManager.GetString("FSharpTypeHints_HideSameLinePipe_Description")
static member FSharpTypeHints_PipesSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_PipesSettings_Header")
static member FSharpTypeHints_PipesSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_PipesSettings_Header")
static member FSharpTypeHints_PatternsSettings_Header = Strings.ResourceManager.GetString("FSharpTypeHints_PatternsSettings_Header")
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,7 @@
<data name="FSharpTypeHints_PipesSettings_Header" xml:space="preserve">
<value>Pipe operators</value>
</data>
<data name="FSharpTypeHints_PatternsSettings_Header" xml:space="preserve">
<value>Patterns</value>
</data>
</root>
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,7 @@ type FSharpTopLevelMembersTypeHintBulbActionsProvider private () =
type FSharpLocalBindingTypeHintBulbActionsProvider private () =
inherit FSharpTypeHintBulbActionsProvider((fun x -> x.ShowTypeHintsForLocalBindings), Strings.FSharpTypeHints_LocalBindingsSettings_Header)
static member val Instance = FSharpLocalBindingTypeHintBulbActionsProvider()

type FSharpOtherPatternsTypeHintBulbActionsProvider private () =
inherit FSharpTypeHintBulbActionsProvider((fun x -> x.ShowTypeHintsForOtherPatterns), Strings.FSharpTypeHints_OtherPatternsSettings_Header)
static member val Instance = FSharpOtherPatternsTypeHintBulbActionsProvider()
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ type FSharpTypeHintsOptionsPage(lifetime: Lifetime, optionsPageContext: OptionsP
this.AddHeader(Strings.FSharpTypeHints_LocalBindingsSettings_Header) |> ignore
this.AddVisibilityOption(fun (s: FSharpTypeHintOptions) -> s.ShowTypeHintsForLocalBindings)

this.AddHeader(Strings.FSharpTypeHints_OtherPatternsSettings_Header) |> ignore
this.AddVisibilityOption(fun (s: FSharpTypeHintOptions) -> s.ShowTypeHintsForOtherPatterns)


this.AddHeader(Strings.FSharpTypeHints_PipesSettings_Header) |> ignore
this.AddBoolOption((fun (s: FSharpTypeHintOptions) -> s.ShowPipeReturnTypes),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Stages
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
open JetBrains.ReSharper.Plugins.FSharp.Psi.Util
open JetBrains.ReSharper.Plugins.FSharp.Settings
open JetBrains.ReSharper.Plugins.FSharp.Util
open JetBrains.ReSharper.Psi.Tree
Expand All @@ -21,28 +22,39 @@ open JetBrains.ReSharper.Plugins.FSharp.Psi.Services.Util.TypeAnnotationsUtil
open JetBrains.TextControl.DocumentMarkup.Adornments.IntraTextAdornments

type private NodesRequiringHints =
{ TopLevelNodes: VisibilityConsumer<ITreeNode>; LocalNodes: VisibilityConsumer<ITreeNode> } with
{ TopLevelNodes: VisibilityConsumer<ITreeNode>
LocalNodes: VisibilityConsumer<ITreeNode>
OtherPatterns: VisibilityConsumer<ITreeNode> } with

member x.HasVisibleItems =
x.TopLevelNodes.HasVisibleItems ||
x.LocalNodes.HasVisibleItems
x.LocalNodes.HasVisibleItems ||
x.OtherPatterns.HasVisibleItems

type private FSharpTypeHintSettings =
{ TopLevelMembers: PushToHintMode; LocalBindings: PushToHintMode } with
{ TopLevelMembers: PushToHintMode
LocalBindings: PushToHintMode
OtherPatterns: PushToHintMode } with

static member Create(settingsStore: IContextBoundSettingsStore) =
{ TopLevelMembers = settingsStore.GetValue(fun (key: FSharpTypeHintOptions) -> key.ShowTypeHintsForTopLevelMembers)
.EnsureInlayHintsDefault(settingsStore)
LocalBindings = settingsStore.GetValue(fun (key: FSharpTypeHintOptions) -> key.ShowTypeHintsForLocalBindings)
.EnsureInlayHintsDefault(settingsStore) }
.EnsureInlayHintsDefault(settingsStore)
OtherPatterns = settingsStore.GetValue(fun (key: FSharpTypeHintOptions) -> key.ShowTypeHintsForOtherPatterns)
.EnsureInlayHintsDefault(settingsStore)}

member x.IsDisabled =
x.TopLevelMembers = PushToHintMode.Never &&
x.LocalBindings = PushToHintMode.Never
x.LocalBindings = PushToHintMode.Never &&
x.OtherPatterns = PushToHintMode.Never


type private MembersVisitor(settings) =
inherit TreeNodeVisitor<NodesRequiringHints>()
let disabledForTopBindings = settings.TopLevelMembers = PushToHintMode.Never
let disabledForLocalBindings = settings.LocalBindings = PushToHintMode.Never
let disabledForOtherPatterns = settings.OtherPatterns = PushToHintMode.Never

let isTopLevelMember (node: ITreeNode) =
match node with
Expand All @@ -51,12 +63,18 @@ type private MembersVisitor(settings) =
| :? IConstructorDeclaration -> true
| _ -> false

let isLocalBinding (node: ITreeNode) =
match node with
| :? ILocalBinding
| :? ILambdaExpr -> true
| _ -> false

override x.VisitNode(node, context) =
if settings.LocalBindings = PushToHintMode.Never && isTopLevelMember node then () else
if disabledForLocalBindings && disabledForOtherPatterns && isTopLevelMember node then () else

for child in node.Children() do
if settings.TopLevelMembers = PushToHintMode.Never &&
isTopLevelMember child then x.VisitNode(child, context) else
if disabledForTopBindings && isTopLevelMember child || disabledForLocalBindings && isLocalBinding child
then x.VisitNode(child, context) else

match child with
| :? IFSharpTreeNode as treeNode -> treeNode.Accept(x, context)
Expand Down Expand Up @@ -99,11 +117,20 @@ type private MembersVisitor(settings) =
x.VisitNode(constructor, context)

override x.VisitForEachExpr(forEachExpr, context) =
let result = collectTypeHintAnchorsForEachExpr forEachExpr
context.LocalNodes.AddRange(result)
if not disabledForOtherPatterns then
let result = collectTypeHintAnchorsForEachExpr forEachExpr
context.OtherPatterns.AddRange(result)

x.VisitNode(forEachExpr, context)

override x.VisitMatchClause(matchClause, context) =
if not disabledForOtherPatterns then
let result = collectTypeHintAnchorsForMatchClause matchClause
context.OtherPatterns.AddRange(result)

x.VisitNode(matchClause, context)


type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSettingsStore, daemonProcess: IDaemonProcess, settings) =
inherit FSharpDaemonStageProcessBase(fsFile, daemonProcess)
static let defaultDisplayContext = FSharpDisplayContext.Empty.WithShortTypeNames(true)
Expand Down Expand Up @@ -182,7 +209,13 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet
createTypeHintHighlighting fcsType defaultDisplayContext range pushToHintMode actionsProvider false
|> ValueSome

| _ -> ValueNone
| pattern ->
let fcsType = pattern.TryGetFcsType()
if isNull fcsType then ValueNone else

let range = pattern.GetDocumentRange().EndOffsetRange()
createTypeHintHighlighting fcsType defaultDisplayContext range pushToHintMode actionsProvider false
|> ValueSome

let rec getHighlighting (node: ITreeNode) pushToHintMode actionsProvider =
match node with
Expand All @@ -194,7 +227,10 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet

| _ -> ValueNone

let adornNodes (topLevelNodes : ITreeNode ICollection) (localNodes : ITreeNode ICollection) =
let adornNodes
(topLevelNodes: ITreeNode ICollection)
(localNodes: ITreeNode ICollection)
(matchClauses: ITreeNode ICollection) =
let highlightingConsumer = FilteringHighlightingConsumer(daemonProcess.SourceFile, fsFile, settingsStore)

let inline adornNodes nodes pushToHintMode actionsProvider =
Expand All @@ -207,6 +243,7 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet

adornNodes topLevelNodes settings.TopLevelMembers FSharpTopLevelMembersTypeHintBulbActionsProvider.Instance
adornNodes localNodes settings.LocalBindings FSharpLocalBindingTypeHintBulbActionsProvider.Instance
adornNodes matchClauses settings.OtherPatterns FSharpOtherPatternsTypeHintBulbActionsProvider.Instance

highlightingConsumer.CollectHighlightings()

Expand All @@ -216,21 +253,24 @@ type private PatternsHighlightingProcess(fsFile, settingsStore: IContextBoundSet
let documentRange = daemonProcess.Document.GetDocumentRange()
let visibleRange = daemonProcess.VisibleRange.Intersect(&documentRange)
let consumer = { TopLevelNodes = VisibilityConsumer(visibleRange, _.GetNavigationRange())
LocalNodes = VisibilityConsumer(visibleRange, _.GetNavigationRange()) }
LocalNodes = VisibilityConsumer(visibleRange, _.GetNavigationRange())
OtherPatterns = VisibilityConsumer(visibleRange, _.GetNavigationRange()) }
fsFile.Accept(MembersVisitor(settings), consumer)

let topLevelNodes = consumer.TopLevelNodes
let localNodes = consumer.LocalNodes
let matchNodes = consumer.OtherPatterns

// Partition the expressions to adorn by whether they're visible in the viewport or not
let remainingHighlightings =
if consumer.HasVisibleItems then
// Adorn visible expressions first
let visibleHighlightings = adornNodes topLevelNodes.VisibleItems localNodes.VisibleItems
let visibleHighlightings =
adornNodes topLevelNodes.VisibleItems localNodes.VisibleItems matchNodes.VisibleItems
committer.Invoke(DaemonStageResult(visibleHighlightings, visibleRange))

// Finally adorn expressions that aren't visible in the viewport
adornNodes topLevelNodes.NonVisibleItems localNodes.NonVisibleItems
adornNodes topLevelNodes.NonVisibleItems localNodes.NonVisibleItems matchNodes.NonVisibleItems

committer.Invoke(DaemonStageResult remainingHighlightings)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ let rec private visitPattern (acc: ITreeNode list) (pattern: IFSharpPattern) =
andPat.PatternsEnumerable
|> Seq.fold visitPattern acc

| :? IOrPat as orPat ->
visitPattern acc orPat.Pattern1

| :? IListConsPat
| :? IArrayOrListPat as collectionPat ->
collectionPat :: acc

| _ -> acc

let private collectPatternsRequiringAnnotations acc (parametersOwner: IParameterOwnerMemberDeclaration) =
Expand Down Expand Up @@ -84,3 +91,7 @@ let collectTypeHintAnchorsForConstructor (ctor: IConstructorDeclaration) =
let collectTypeHintAnchorsForEachExpr (forEachExpr: IForEachExpr) =
if isNull forEachExpr.InExpression then []
else visitPattern [] forEachExpr.Pattern

let collectTypeHintAnchorsForMatchClause (matchClause: IMatchClause) =
if isNull matchClause.RArrow then []
else visitPattern [] matchClause.Pattern
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
module Test

let _ =
for i = 0 to 10 do ()
for i in Seq.empty do ()
function x -> ()

match [Some 5] with
| [] -> ()
| [x] -> ()
| [x: int option] -> ()
| [x; y] -> ()
| [x; y: int option] -> ()
| [_; x] -> ()
| [_; _] -> ()
| [x; _; _] -> ()
| [x; _; Some 5] -> ()
| x :: tail -> ()
| _ :: (tail: int option list) -> ()
| x: int option :: tail -> ()
| x: int option :: _ -> ()
| x :: (tail: int option list) -> ()
| ((x :: tail): int option list) -> ()
| _ :: _ -> ()
| x :: _ -> ()
| _ :: x :: _ -> ()
| x :: _ :: _ -> ()
| x :: Some y :: _ -> ()
| x :: (y :: _) -> ()
| x :: y :: [] -> ()
| x :: [y] -> ()
| Some(x) :: tail -> ()
| [Some(x)]
| [_; Some(x)] when let x = 5 in true ->
let y = 5 in ()

match [[5]] with
| [[]] -> ()
| [[]; x] -> ()

match [|5|] with
| [||] -> ()
| [|x|] -> ()
| [|x; y|] -> ()

exception MyException of string
try () with | MyException(x) -> ()
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
module Test

let _ =
for i = 0 to 10 do ()
for i||(0) in Seq.empty do ()
function x||(1) -> ()

match [Some 5] with
| []||(2) -> ()
| [x]||(3) -> ()
| [x: int option]||(4) -> ()
| [x; y]||(5) -> ()
| [x; y: int option]||(6) -> ()
| [_; x]||(7) -> ()
| [_; _]||(8) -> ()
| [x; _; _]||(9) -> ()
| [x; _; Some 5]||(10) -> ()
| x :: tail||(11) -> ()
| _ :: (tail: int option list)||(12) -> ()
| x: int option :: tail||(13) -> ()
| x: int option :: _||(14) -> ()
| x :: (tail: int option list)||(15) -> ()
| ((x :: tail): int option list) -> ()
| _ :: _||(16) -> ()
| x :: _||(17) -> ()
| _ :: x :: _||(18) -> ()
| x :: _ :: _||(19) -> ()
| x :: Some y :: _||(20) -> ()
| x :: (y :: _)||(21) -> ()
| x :: y :: []||(22) -> ()
| x :: [y]||(23) -> ()
| Some(x) :: tail||(24) -> ()
| [Some(x)]||(25)
| [_; Some(x)] when let x||(26) = 5 in true ->
let y||(27) = 5 in ()

match [[5]] with
| [[]]||(28) -> ()
| [[]; x]||(29) -> ()

match [|5|] with
| [||]||(30) -> ()
| [|x|]||(31) -> ()
| [|x; y|]||(32) -> ()

exception MyException of string
try () with | MyException(x||(33)) -> ()

---------------------------------------------------------
(0): ReSharper Parameter Name Hint: : obj
(1): ReSharper Parameter Name Hint: : obj
(2): ReSharper Parameter Name Hint: : int option list
(3): ReSharper Parameter Name Hint: : int option list
(4): ReSharper Parameter Name Hint: : int option list
(5): ReSharper Parameter Name Hint: : int option list
(6): ReSharper Parameter Name Hint: : int option list
(7): ReSharper Parameter Name Hint: : int option list
(8): ReSharper Parameter Name Hint: : int option list
(9): ReSharper Parameter Name Hint: : int option list
(10): ReSharper Parameter Name Hint: : int option list
(11): ReSharper Parameter Name Hint: : int option list
(12): ReSharper Parameter Name Hint: : int option list
(13): ReSharper Parameter Name Hint: : int option list
(14): ReSharper Parameter Name Hint: : int option list
(15): ReSharper Parameter Name Hint: : int option list
(16): ReSharper Parameter Name Hint: : int option list
(17): ReSharper Parameter Name Hint: : int option list
(18): ReSharper Parameter Name Hint: : int option list
(19): ReSharper Parameter Name Hint: : int option list
(20): ReSharper Parameter Name Hint: : int option list
(21): ReSharper Parameter Name Hint: : int option list
(22): ReSharper Parameter Name Hint: : int option list
(23): ReSharper Parameter Name Hint: : int option list
(24): ReSharper Parameter Name Hint: : int option list
(25): ReSharper Parameter Name Hint: : int option list
(26): ReSharper Parameter Name Hint: : int
(27): ReSharper Parameter Name Hint: : int
(28): ReSharper Parameter Name Hint: : int list list
(29): ReSharper Parameter Name Hint: : int list list
(30): ReSharper Parameter Name Hint: : int array
(31): ReSharper Parameter Name Hint: : int array
(32): ReSharper Parameter Name Hint: : int array
(33): ReSharper Parameter Name Hint: : string
Loading

0 comments on commit 098f0f5

Please sign in to comment.