Skip to content

Commit c1bf64a

Browse files
authored
Psi/Property: refactor properties with indexed accessors (#1020)
1 parent aca8a7a commit c1bf64a

File tree

39 files changed

+96
-103
lines changed

39 files changed

+96
-103
lines changed

ReSharper.FSharp/src/FSharp/FSharp.Psi.Features/src/LanguageService/FSharpDeclaredElementIconProvider.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ type FSharpDeclaredElementIconProvider() =
7878
| :? IActivePatternCase ->
7979
PsiSymbolsThemedIcons.EnumMember.Id
8080

81-
| :? IFSharpProperty as property when property.HasExplicitAccessors ->
81+
| :? IFSharpProperty as property when property.IsIndexerLike ->
8282
canApplyExtensions <- false
8383

8484
let icon = PsiSymbolsThemedIcons.Property.Id

ReSharper.FSharp/src/FSharp/FSharp.Psi.Features/src/Search/FSharpGeneratedElementsSearch.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type FSharpGeneratedElementsSearch() =
1717
match dataContext.GetData(PsiDataConstants.DECLARED_ELEMENTS) with
1818
| null -> false
1919
| elements ->
20-
elements |> Seq.forall (fun el -> el :? IFSharpGeneratedFromUnionCase || el :? IFSharpExplicitAccessor)
20+
elements |> Seq.forall (fun el -> el :? IFSharpGeneratedFromUnionCase || el :? IFSharpIndexedAccessor)
2121

2222
override x.GetElementCandidates(context: IDataContext, _, _) =
2323
match context.GetData(PsiDataConstants.DECLARED_ELEMENTS) with
@@ -29,7 +29,7 @@ type FSharpGeneratedElementsSearch() =
2929
let originElement =
3030
match element with
3131
| :? IFSharpGeneratedFromUnionCase as case -> case.OriginElement
32-
| :? IFSharpExplicitAccessor as accessor -> accessor.OriginElement
32+
| :? IFSharpIndexedAccessor as accessor -> accessor.OriginElement
3333
| _ -> null
3434

3535
if isNotNull originElement then

ReSharper.FSharp/src/FSharp/FSharp.Psi.Intentions/src/QuickFixes/SpecifyParameterTypeFix.fs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ type SpecifyPropertyTypeFix(qualifiedExpr: IQualifiedExpr) =
9898

9999
override this.IsApplicable(declaredElement: IDeclaredElement) =
100100
let fsProperty = declaredElement.As<IFSharpProperty>()
101-
isNotNull fsProperty && fsProperty.Getter :? ImplicitAccessor && not fsProperty.HasExplicitAccessors
101+
isNotNull fsProperty && fsProperty.Getter :? ImplicitAccessor && not fsProperty.IsIndexerLike
102102

103103
override this.IsApplicable(decl: IDeclaration) =
104104
match decl with

ReSharper.FSharp/src/FSharp/FSharp.Psi.Services/src/Refactorings/Rename.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,8 @@ type FSharpRenameHelper(namingService: FSharpNamingService) =
120120
| null -> EmptyArray.Instance :> _
121121
| parameter -> [| parameter :> IDeclaredElement |] :> _
122122

123-
| :? IFSharpProperty as property ->
124-
property.GetExplicitAccessors() |> Seq.cast
123+
| :? IFSharpProperty as property when property.IsIndexerLike ->
124+
property.Accessors |> Seq.cast
125125

126126
| :? IFSharpModule -> EmptyArray.Instance :> _
127127

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/IFSharpExplicitAccessor.cs renamed to ReSharper.FSharp/src/FSharp/FSharp.Psi/src/IFSharpIndexedAccessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace JetBrains.ReSharper.Plugins.FSharp.Psi
44
{
5-
public interface IFSharpExplicitAccessor : IMethod, IFSharpParameterOwner, ISecondaryDeclaredElement
5+
public interface IFSharpIndexedAccessor : IMethod, IFSharpParameterOwner, ISecondaryDeclaredElement
66
{
77
AccessorKind Kind { get; }
88
}
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
using System.Collections.Generic;
2-
using JetBrains.Annotations;
3-
using JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Cache2.Parts;
42
using JetBrains.ReSharper.Psi;
53

64
namespace JetBrains.ReSharper.Plugins.FSharp.Psi
75
{
86
public interface IFSharpProperty : IProperty, IFSharpParameterOwner, IFSharpRepresentationAccessRightsOwner
97
{
10-
public bool HasExplicitAccessors { get; }
11-
public IEnumerable<IFSharpExplicitAccessor> GetExplicitAccessors();
12-
13-
[NotNull] public IEnumerable<IFSharpExplicitAccessor> FSharpExplicitGetters { get; }
14-
[NotNull] public IEnumerable<IFSharpExplicitAccessor> FSharpExplicitSetters { get; }
8+
public bool IsIndexerLike { get; }
9+
public IEnumerable<IMethod> Accessors { get; }
1510
}
1611
}

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpPropertyAccessor.cs renamed to ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpIndexedAccessor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55

66
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement
77
{
8-
internal class FSharpPropertyAccessor(ITypeMemberDeclaration declaration)
9-
: FSharpMethodBase<AccessorDeclaration>(declaration), IFSharpExplicitAccessor
8+
internal class FSharpIndexedAccessor(ITypeMemberDeclaration declaration)
9+
: FSharpMethodBase<AccessorDeclaration>(declaration), IFSharpIndexedAccessor
1010
{
1111
public IClrDeclaredElement OriginElement => GetDeclaration()?.OwnerMember.DeclaredElement;
1212
public AccessorKind Kind => GetDeclaration()?.Kind ?? AccessorKind.UNKNOWN;
@@ -15,7 +15,7 @@ internal class FSharpPropertyAccessor(ITypeMemberDeclaration declaration)
1515
public override IList<IDeclaration> GetDeclarations() => [GetDeclaration()];
1616

1717
public override bool Equals(object obj) =>
18-
obj is FSharpPropertyAccessor accessor && base.Equals(accessor);
18+
obj is FSharpIndexedAccessor accessor && base.Equals(accessor);
1919

2020
public override int GetHashCode() => ShortName.GetHashCode();
2121
}

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpIndexerProperty.cs renamed to ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpIndexerLikeIndexerProperty.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@
55

66
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement
77
{
8-
internal class FSharpIndexerProperty : FSharpPropertyWithExplicitAccessors
8+
internal class FSharpIndexerProperty(IMemberSignatureOrDeclaration declaration)
9+
: FSharpIndexerLikeProperty(declaration)
910
{
10-
public FSharpIndexerProperty(IMemberSignatureOrDeclaration declaration) : base(declaration)
11-
{
12-
}
13-
1411
public override bool IsReadable => HasPublicAccessor(AccessorKind.GETTER);
1512
public override bool IsWritable => HasPublicAccessor(AccessorKind.SETTER);
1613
public override bool IsDefault => true;
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree;
4+
using JetBrains.ReSharper.Psi;
5+
using JetBrains.ReSharper.Psi.Tree;
6+
7+
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement
8+
{
9+
internal class FSharpIndexerLikeProperty(IMemberSignatureOrDeclaration declaration)
10+
: FSharpPropertyBase<IMemberSignatureOrDeclaration>(declaration), IFSharpProperty
11+
{
12+
public override bool IsReadable => GetIndexedAccessors(AccessorKind.GETTER).Any();
13+
public override bool IsWritable => GetIndexedAccessors(AccessorKind.SETTER).Any();
14+
15+
public override AccessRights GetAccessRights() => AccessRights.PRIVATE;
16+
public AccessRights RepresentationAccessRights => base.GetAccessRights();
17+
18+
public bool IsIndexerLike => true;
19+
public IEnumerable<IMethod> Accessors => IndexedAccessors;
20+
21+
private IEnumerable<IFSharpIndexedAccessor> IndexedAccessors
22+
{
23+
get
24+
{
25+
foreach (var declaration in GetDeclarations())
26+
if (declaration is IMemberDeclaration member)
27+
foreach (var accessorDeclaration in member.AccessorDeclarationsEnumerable)
28+
if (accessorDeclaration
29+
is { IsIndexerLike: true }
30+
and ITypeMemberDeclaration { DeclaredElement: IFSharpIndexedAccessor accessor })
31+
yield return accessor;
32+
}
33+
}
34+
35+
private IEnumerable<IFSharpIndexedAccessor> GetIndexedAccessors(AccessorKind kind) =>
36+
IndexedAccessors.Where(accessor => accessor.Kind == kind);
37+
}
38+
}

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/Impl/DeclaredElement/FSharpProperty.cs

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,28 @@
44
using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree;
55
using JetBrains.ReSharper.Psi;
66
using JetBrains.ReSharper.Psi.Tree;
7-
using JetBrains.Util;
87

98
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement
109
{
11-
internal class FSharpProperty<TDeclaration> : FSharpPropertyMemberBase<TDeclaration>, IFSharpProperty
10+
internal class FSharpProperty<TDeclaration>(
11+
[NotNull] ITypeMemberDeclaration declaration,
12+
[NotNull] FSharpMemberOrFunctionOrValue mfv)
13+
: FSharpPropertyMemberBase<TDeclaration>(declaration, mfv), IFSharpProperty
1214
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration
1315
{
14-
public FSharpProperty([NotNull] ITypeMemberDeclaration declaration,
15-
[NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv)
16-
{
17-
}
18-
1916
public override bool IsStatic => GetContainingType() is IFSharpModule || base.IsStatic;
2017

2118
public AccessRights RepresentationAccessRights => GetAccessRights();
2219

23-
public bool HasExplicitAccessors => false;
24-
public IEnumerable<IFSharpExplicitAccessor> GetExplicitAccessors() => EmptyList<IFSharpExplicitAccessor>.Instance;
20+
public bool IsIndexerLike => false;
2521

26-
public IEnumerable<IFSharpExplicitAccessor> FSharpExplicitGetters => EmptyList<IFSharpExplicitAccessor>.Instance;
27-
public IEnumerable<IFSharpExplicitAccessor> FSharpExplicitSetters => EmptyList<IFSharpExplicitAccessor>.Instance;
22+
public IEnumerable<IMethod> Accessors
23+
{
24+
get
25+
{
26+
if (Getter is {} getter) yield return getter;
27+
if (Setter is {} setter) yield return setter;
28+
}
29+
}
2830
}
2931
}

0 commit comments

Comments
 (0)