Skip to content

Commit 5c0522a

Browse files
committed
Quick fixes: better reference binding when adding Extension attribute
1 parent b827329 commit 5c0522a

21 files changed

+79
-71
lines changed

ReSharper.FSharp/src/FSharp.Psi.Features/src/Generate/GenerateOverrides.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ let generateMember (context: IFSharpTreeNode) (indent: int) (element: IFSharpGen
6666
if element.Mfv.IsCliEvent() then
6767
let attribute = context.CreateElementFactory().CreateAttribute("CLIEvent")
6868
FSharpAttributesUtil.addOuterAttributeListWithIndent true indent memberDeclaration
69-
FSharpAttributesUtil.addAttribute memberDeclaration.AttributeLists.[0] attribute
69+
FSharpAttributesUtil.addAttribute memberDeclaration.AttributeLists.[0] attribute |> ignore
7070

7171
if element.AddTypes then
7272
let lastParam = memberDeclaration.ParametersDeclarations.LastOrDefault()

ReSharper.FSharp/src/FSharp.Psi.Features/src/Intentions/ToLiteralAction.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,6 @@ type ToLiteralAction(dataProvider: FSharpContextActionDataProvider) =
6161

6262
let attributeList = getAttributeList binding
6363
let attribute = binding.CreateElementFactory().CreateAttribute("Literal")
64-
FSharpAttributesUtil.addAttribute attributeList attribute
64+
FSharpAttributesUtil.addAttribute attributeList attribute |> ignore
6565

6666
null

ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/AddExtensionAttributeFix.fs

Lines changed: 23 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,15 @@
33
open JetBrains.ReSharper.Plugins.FSharp.Psi
44
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings
55
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes
6-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Util
6+
open JetBrains.ReSharper.Psi
77
open JetBrains.ReSharper.Psi.ExtensionsAPI
88
open JetBrains.ReSharper.Resources.Shell
99
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
10-
open JetBrains.ReSharper.Psi.Tree
1110
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Util.FSharpAttributesUtil
1211

1312
type AddExtensionAttributeFix(warning: ExtensionMemberInNonExtensionTypeWarning) =
1413
inherit FSharpQuickFixBase()
1514

16-
let [<Literal>] extensionNamespaceName = "System.Runtime.CompilerServices"
1715
let [<Literal>] attributeName = "Extension"
1816

1917
let declaration =
@@ -23,32 +21,33 @@ type AddExtensionAttributeFix(warning: ExtensionMemberInNonExtensionTypeWarning)
2321
| letModuleDec -> letModuleDec :> _
2422
if isNotNull attributeOwner then attributeOwner.GetContainingTypeDeclaration() else null
2523

26-
override x.Text = sprintf "Add 'Extension' attribute to '%s'" declaration.SourceName
24+
override x.Text = $"Add 'Extension' attribute to '{declaration.SourceName}'"
2725

2826
override x.IsAvailable _ =
29-
match declaration with
30-
| :? ITopLevelModuleLikeDeclaration -> false
31-
| _ -> isValid declaration
27+
isValid declaration
3228

3329
override x.ExecutePsiTransaction _ =
3430
use writeCookie = WriteLockCookie.Create(warning.Attr.IsPhysical())
3531
use disableFormatter = new DisableCodeFormatter()
3632

33+
let attributeList =
34+
match declaration with
35+
| :? IDeclaredModuleDeclaration as moduleDecl ->
36+
if moduleDecl.AttributeLists.IsEmpty then
37+
addOuterAttributeList true moduleDecl
38+
moduleDecl.AttributeLists.[0]
39+
40+
| :? IFSharpTypeOrExtensionDeclaration as t ->
41+
getTypeDeclarationAttributeList t
42+
43+
| _ -> null
44+
45+
if isNull attributeList then () else
46+
3747
let attribute = warning.Attr.CreateElementFactory().CreateAttribute(attributeName)
38-
match declaration with
39-
| :? INestedModuleDeclaration as m ->
40-
match tryGetOpen m extensionNamespaceName with
41-
| Some _ ->
42-
let file = declaration.FSharpFile
43-
let settingsStore = file.GetSettingsStoreWithEditorConfig()
44-
addOpen (m.GetDocumentStartOffset()) file settingsStore extensionNamespaceName
45-
| None -> ()
46-
47-
if m.AttributeLists.IsEmpty then
48-
addOuterAttributeList true m
49-
addAttribute m.AttributeLists.[0] attribute
50-
51-
| :? IFSharpTypeOrExtensionDeclaration as t ->
52-
let attributeList = getTypeDeclarationAttributeList t
53-
addAttribute attributeList attribute
54-
| _ -> ()
48+
let attribute = addAttribute attributeList attribute
49+
50+
let reference = attribute.ReferenceName.Reference
51+
let extensionTypeElement = attribute.GetPsiModule().GetPredefinedType().ExtensionAttribute.GetTypeElement()
52+
let importHelper = LanguageManager.Instance.GetService<IFSharpQuickFixUtilComponent>(attribute.Language)
53+
importHelper.BindTo(reference, extensionTypeElement) |> ignore

ReSharper.FSharp/src/FSharp.Psi.Features/src/QuickFixes/ToAbstractFix.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ type ToAbstractFix(error: NoImplementationGivenTypeError) =
2323

2424
let attributeList = getTypeDeclarationAttributeList typeDecl
2525
let attribute = typeDecl.CreateElementFactory().CreateAttribute("AbstractClass")
26-
addAttribute attributeList attribute
26+
addAttribute attributeList attribute |> ignore

ReSharper.FSharp/src/FSharp.Psi.Features/src/Util/FSharpAttributesUtil.fs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ let addAttribute (attributeList: IAttributeList) (attribute: IAttribute) =
2323
Whitespace()
2424
] |> ignore
2525

26+
attribute
27+
2628

2729
let addAttributeAfter (anchor: IAttribute) (attribute: IAttribute) =
2830
let anchor, seenSemi =

ReSharper.FSharp/src/FSharp.Psi/src/Impl/FSharpReferenceBindingUtil.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private static INamespace GetNamespace([NotNull] IClrDeclaredElement declaredEle
5555

5656
private static bool IsNamespaceQualifierRequired([NotNull] FSharpSymbolReference reference)
5757
{
58-
var attribute = reference.GetTreeNode().GetContainingNode<IAttribute>();
58+
var attribute = reference.GetTreeNode().GetContainingNode<IAttribute>(true);
5959
return NamedModuleDeclarationNavigator.GetByAttribute(attribute) != null;
6060
}
6161

Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
namespace Test
1+
namespace Ns
22

33
open System.Runtime.CompilerServices
44

55
module Module =
6-
76
[<{caret}Extension>]
8-
let a() = 5
7+
let f x = 5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
namespace Test
1+
namespace Ns
22

33
open System.Runtime.CompilerServices
44

55
[<Extension>]
66
module Module =
7-
87
[<{caret}Extension>]
9-
let a() = 5
8+
let f x = 5
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
1-
namespace Test
1+
namespace Ns
22

33
module Module =
44
open System.Runtime.CompilerServices
55

66
[<{caret}Extension>]
7-
let a() = 5
8-
7+
let f x = 5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace Test
1+
namespace Ns
22

33
open System.Runtime.CompilerServices
44

@@ -7,5 +7,4 @@ module Module =
77
open System.Runtime.CompilerServices
88

99
[<{caret}Extension>]
10-
let a() = 5
11-
10+
let f x = 5

0 commit comments

Comments
 (0)