Skip to content

Commit b135692

Browse files
committed
Psi/extensions: fix resolve for F# 8 types without attribute
1 parent d195cfd commit b135692

File tree

8 files changed

+89
-1
lines changed

8 files changed

+89
-1
lines changed

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/Cache2/Parts/FSharpTypePart.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using JetBrains.Annotations;
44
using JetBrains.Metadata.Reader.API;
55
using JetBrains.Metadata.Reader.Impl;
6+
using JetBrains.ReSharper.Plugins.FSharp.ProjectModel;
67
using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree;
78
using JetBrains.ReSharper.Plugins.FSharp.Util;
89
using JetBrains.ReSharper.Psi;
@@ -81,13 +82,19 @@ public TypePart GetFirstPart()
8182

8283
public override HybridCollection<IMethod> FindExtensionMethod(ExtensionMethodInfo info)
8384
{
84-
if (!TypeElement.HasAttributeInstance(PredefinedType.EXTENSION_ATTRIBUTE_CLASS, false))
85+
var typeElement = TypeElement;
86+
if (typeElement == null)
8587
return HybridCollection<IMethod>.Empty;
8688

8789
var declaration = GetDeclaration();
8890
if (declaration == null)
8991
return HybridCollection<IMethod>.Empty;
9092

93+
var languageLevel = declaration.GetFSharpLanguageLevel();
94+
if (languageLevel < FSharpLanguageLevel.FSharp80 &&
95+
!typeElement.HasAttributeInstance(PredefinedType.EXTENSION_ATTRIBUTE_CLASS, false))
96+
return HybridCollection<IMethod>.Empty;
97+
9198
var result = HybridCollection<IMethod>.Empty;
9299
foreach (var memberDeclaration in declaration.MemberDeclarations)
93100
if (info.ShortName == memberDeclaration.DeclaredName &&
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Ns;
2+
3+
public class Class1
4+
{
5+
public Class1()
6+
{
7+
string s1 = 1.Ext();
8+
string s2 = 1.ExtNoTypeAttr();
9+
}
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Ns
2+
3+
open System.Runtime.CompilerServices
4+
5+
[<Extension>]
6+
module Module1 =
7+
[<Extension; CompiledName("Ext")>]
8+
let ext (i: int) = i.ToString()
9+
10+
module Module2 =
11+
[<Extension; CompiledName("ExtNoTypeAttr")>]
12+
let ext (i: int) = i.ToString()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
using Ns;
2+
3+
public class Class1
4+
{
5+
public Class1()
6+
{
7+
string s1 = 1.Ext();
8+
string s2 = 1.|ExtNoTypeAttr|(0)();
9+
}
10+
}
11+
12+
---------------------------------------------------------
13+
(0): ReSharper Error Highlighting: Cannot resolve symbol 'ExtNoTypeAttr'
14+
M:Ns.Module1.Ext(System.Int32)
15+
M:Ns.Module1.Ext(System.Int32)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Ns;
2+
3+
public class Class1
4+
{
5+
public Class1()
6+
{
7+
string s1 = 1.Ext();
8+
string s2 = 1.ExtNoTypeAttr();
9+
}
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
namespace Ns
2+
3+
open System.Runtime.CompilerServices
4+
5+
[<Extension>]
6+
module Module1 =
7+
[<Extension; CompiledName("Ext")>]
8+
let ext (i: int) = i.ToString()
9+
10+
module Module2 =
11+
[<Extension; CompiledName("ExtNoTypeAttr")>]
12+
let ext (i: int) = i.ToString()
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Ns;
2+
3+
public class Class1
4+
{
5+
public Class1()
6+
{
7+
string s1 = 1.Ext();
8+
string s2 = 1.ExtNoTypeAttr();
9+
}
10+
}
11+
12+
---------------------------------------------------------
13+
M:Ns.Module1.Ext(System.Int32)
14+
M:Ns.Module1.Ext(System.Int32)
15+
M:Ns.Module2.ExtNoTypeAttr(System.Int32)
16+
M:Ns.Module2.ExtNoTypeAttr(System.Int32)

ReSharper.FSharp/test/src/FSharp.Tests/Cache/CSharpResolveTest.fs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Tests.Features
33
open JetBrains.ProjectModel
44
open JetBrains.ReSharper.FeaturesTestFramework.Daemon
55
open JetBrains.ReSharper.Plugins.FSharp
6+
open JetBrains.ReSharper.Plugins.FSharp.ProjectModel
67
open JetBrains.ReSharper.Plugins.FSharp.Tests
78
open JetBrains.ReSharper.TestFramework
89
open NUnit.Framework
@@ -105,6 +106,11 @@ type CSharpResolveTest() =
105106
[<Test>] member x.``Properties 20 - Simple property with accessors``() = x.DoNamedTest()
106107
[<Test>] member x.``Properties 21 - static val``() = x.DoNamedTest()
107108

109+
[<FSharpLanguageLevel(FSharpLanguageLevel.FSharp70)>]
110+
[<Test>] member x.``Module bindings - Extension 01 - F# 7``() = x.DoNamedTest()
111+
[<FSharpLanguageLevel(FSharpLanguageLevel.FSharp80)>]
112+
[<Test>] member x.``Module bindings - Extension 02 - F# 8``() = x.DoNamedTest()
113+
108114
[<Test>] member x.``Module bindings 01 - Simple``() = x.DoNamedTest()
109115
[<Test>] member x.``Module bindings 02 - Records``() = x.DoNamedTest()
110116
[<Test>] member x.``Module bindings 03 - extension methods 01``() = x.DoNamedTest()

0 commit comments

Comments
 (0)