Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,18 @@ open JetBrains.ReSharper.Feature.Services.ContextActions
open JetBrains.ReSharper.Plugins.FSharp.Psi
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree
open JetBrains.ReSharper.Plugins.FSharp.Psi.Intentions.Resources
open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
open JetBrains.ReSharper.Psi
open JetBrains.ReSharper.Psi.CodeStyle
open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree
open JetBrains.ReSharper.Psi.Tree
open JetBrains.ReSharper.Resources.Shell
open JetBrains.Util

[<AutoOpen>]
module private Utils =
let createLineComment text = FSharpComment.CreateLineComment(" " + text)


[<AbstractClass>]
type DisableWarningActionBase(highlightingRanges: DocumentRange[], file: IFSharpFile) =
Expand Down Expand Up @@ -76,7 +81,7 @@ type DisableWarningOnceAction(highlightingRanges, file, severityId) =
override this.Text = Strings.FSharpDisableOnceWithComment_Text

override this.DisableNode =
FSharpComment(FSharpTokenType.LINE_COMMENT, $"// {ReSharperControlConstruct.DisableOncePrefix} {severityId}")
createLineComment $"{ReSharperControlConstruct.DisableOncePrefix} {severityId}"

override this.RestoreNode = null

Expand All @@ -86,30 +91,30 @@ type DisableAndRestoreWarningAction(highlightingRanges, file, severityId) =
override this.Text = Strings.FSharpDisableAndRestoreWithComments_Text

override this.DisableNode =
FSharpComment(FSharpTokenType.LINE_COMMENT, $"// {ReSharperControlConstruct.DisablePrefix} {severityId}")
createLineComment $"{ReSharperControlConstruct.DisablePrefix} {severityId}"

override this.RestoreNode =
FSharpComment(FSharpTokenType.LINE_COMMENT, $"// {ReSharperControlConstruct.RestorePrefix} {severityId}")
createLineComment $"{ReSharperControlConstruct.RestorePrefix} {severityId}"


type DisableWarningInFileAction(file: IFSharpFile, severityId) =
inherit ContextActionBase()
let disableAll =
severityId = ReSharperControlConstruct.DisableAllReSharperWarningsID

let findInsertRange (file: IFSharpFile) severityId =
let findPlaceToInsert (file: IFSharpFile) severityId =
let rec findLastNode (prevNode: ITreeNode) (node: ITreeNode) severityId =
match node with
| :? Whitespace
| :? NewLine -> findLastNode node node.NextSibling severityId
| :? NewLine -> findLastNode prevNode node.NextSibling severityId
| :? FSharpComment as comment ->
if comment.CommentType = CommentType.DocComment then prevNode, true else

let controlConstruct = ReSharperControlConstruct.ParseCommentText(comment.CommentText)
if not controlConstruct.IsDisable then prevNode, true else

if severityId > controlConstruct.GetControlIdsText() then
findLastNode node node.NextSibling severityId
findLastNode node.NextSibling node.NextSibling severityId
else prevNode, false

| _ -> prevNode, true
Expand All @@ -120,8 +125,30 @@ type DisableWarningInFileAction(file: IFSharpFile, severityId) =
| :? IAnonModuleDeclaration as firstModule -> firstModule.FirstChild
| _ -> file.FirstChild

let lastNode, needsAdditionalNewLine = findLastNode firstNode firstNode severityId
firstNode, lastNode, needsAdditionalNewLine
let node, needsAdditionalNewLine = findLastNode firstNode firstNode severityId
node, needsAdditionalNewLine

let removeExistingComments (file: IFSharpFile) =
let candidatesToRemove = ResizeArray()

for comment in file.Descendants<FSharpComment>() do
let info = ReSharperControlConstruct.ParseCommentText(comment.CommentText)
if info.IsRecognized then candidatesToRemove.Add((comment, info))

for comment, info in candidatesToRemove do
if disableAll then deleteChild comment else

let diagnosticIds = info.GetControlIds() |> LocalList
if not (diagnosticIds.Contains(severityId)) then () else

if diagnosticIds.Count = 1 then deleteChild comment else

diagnosticIds.Remove(severityId) |> ignore
let diagnosticIds = diagnosticIds.ToArray() |> String.concat ", "

ReSharperControlConstruct.CreateText(info.Kind, diagnosticIds)
|> createLineComment
|> replace comment

override this.Text =
if disableAll then Strings.FSharpDisableAllInspectionsInFile_Text
Expand All @@ -132,21 +159,12 @@ type DisableWarningInFileAction(file: IFSharpFile, severityId) =
override this.ExecutePsiTransaction(_, _) =
use writeCookie = WriteLockCookie.Create(file.IsPhysical())

let firstNode, lastNode, needsAdditionalNewLine = findInsertRange file severityId

let commentNode =
FSharpComment(FSharpTokenType.LINE_COMMENT, $"// {ReSharperControlConstruct.DisablePrefix} {severityId}")
removeExistingComments file
let nodeToInsertBefore, needsAdditionalNewLine = findPlaceToInsert file severityId

if firstNode == lastNode then
let commentNode = ModificationUtil.AddChildBefore(firstNode, commentNode)
if needsAdditionalNewLine then
commentNode.AddLineBreakAfter(minLineBreaks = 2) |> ignore
else
let commentNode = ModificationUtil.AddChildAfter(lastNode, commentNode)
if needsAdditionalNewLine then
commentNode.AddLineBreakAfter(minLineBreaks = 2) |> ignore
let commentNode = createLineComment $"{ReSharperControlConstruct.DisablePrefix} {severityId}"

if disableAll then
deleteChildRange firstNode lastNode
let commentNode = ModificationUtil.AddChildBefore(nodeToInsertBefore, commentNode)
if needsAdditionalNewLine then commentNode.AddLineBreakAfter(minLineBreaks = 2) |> ignore

null
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,5 @@
/// It's M
module M

// ReSharper disable once A
let _ = id{caret} 1
// ${QF_TO_EXECUTE:Disable all inspections in file}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
module M

// ReSharper disable
// ReSharper disable A, B
// ReSharper disable once B, C
let _ = id{caret} 1
// ReSharper restore A
// ReSharper restore B, C

// ${QF_TO_EXECUTE:Disable all inspections in file}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// ReSharper disable all

module M

// ReSharper disable
let _ = id{caret} 1


// ${QF_TO_EXECUTE:Disable all inspections in file}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// ReSharper disable A

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// ReSharper disable A
// ReSharper disable FSharpRedundantApplication

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// ReSharper disable Y

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// ReSharper disable FSharpRedundantApplication
// ReSharper disable Y

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/// Comment
module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// ReSharper disable FSharpRedundantApplication

/// Comment
module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// ReSharper disable A
// ReSharper enable A

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// ReSharper disable A
// ReSharper disable FSharpRedundantApplication

// ReSharper enable A

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
// A

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
// ReSharper disable FSharpRedundantApplication

// A

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// ReSharper disable FSharpRedundantApplication

// ${QF_TO_EXECUTE:Disable in file with comment}

let _ = id{caret} 1
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// ReSharper disable A
// ReSharper disable B
// ReSharper disable FSharpRedundantApplication

// Comment
/// It's m
module M
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}

// ReSharper disable FSharpRedundantApplication, B
// ReSharper restore FSharpRedundantApplication
// ReSharper disable once C, FSharpRedundantApplication
()
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// ReSharper disable FSharpRedundantApplication

module M

id{caret} 1 // ${QF_TO_EXECUTE:Disable in file with comment}

// ReSharper disable B
// ReSharper disable once C
()
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,18 @@ type DisableWarningTest() =
[<Test; Explicit>] member x.``Disable and restore 04 - Indent``() = x.DoNamedTest() // todo: formatter: fix modifications
[<Test>] member x.``Disable and restore 05``() = x.DoNamedTest()

[<Test; Explicit>] member x.``Disable in file 01``() = x.DoNamedTest() // todo: formatter: fix modifications
[<Test; Explicit>] member x.``Disable in file 02``() = x.DoNamedTest() // todo: formatter: fix modifications
[<Test>] member x.``Disable in file 01``() = x.DoNamedTest()
[<Test>] member x.``Disable in file 02``() = x.DoNamedTest()
[<Test>] member x.``Disable in file 03``() = x.DoNamedTest()
[<Test>] member x.``Disable in file 04``() = x.DoNamedTest()

[<Test>] member x.``Disable in file - Header 01``() = x.DoNamedTest()
[<Test>] member x.``Disable in file - Header 02``() = x.DoNamedTest()
[<Test>] member x.``Disable in file - Header 03``() = x.DoNamedTest()
[<Test>] member x.``Disable in file - Header 04``() = x.DoNamedTest()
[<Test>] member x.``Disable in file - Header 05``() = x.DoNamedTest()

[<Test>] member x.``Disable all 01``() = x.DoNamedTest()
[<Test>] member x.``Disable all 02``() = x.DoNamedTest()
[<Test>] member x.``Disable all 03``() = x.DoNamedTest()
[<Test>] member x.``Disable all 04``() = x.DoNamedTest()
Loading