Skip to content

Commit 802ba94

Browse files
committed
wip
1 parent fdfd704 commit 802ba94

File tree

36 files changed

+275
-108
lines changed

36 files changed

+275
-108
lines changed

ReSharper.FSharp/src/FSharp/FSharp.Psi.Features/src/AICore/FSharpFileSummarizer.fs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,16 +78,7 @@ type private FileSummarizerVisitor() =
7878
let addMember (memberDecl: IOverridableMemberDeclaration) (context: SummarizerContext) =
7979
let typeRepr = memberDecl.GetFcsSymbol() |> formatFcsSymbolType
8080
let accessorNames =
81-
match memberDecl with
82-
| :? IAccessorsNamesClauseOwner as prop ->
83-
match prop.AccessorsClause with
84-
| null -> Seq.empty
85-
| clause -> clause.AccessorsNamesEnumerable |> Seq.map _.Name
86-
87-
| :? IMemberSignatureOrDeclaration as memberDecl ->
88-
memberDecl.AccessorDeclarationsEnumerable |> Seq.map _.NameIdentifier.Name
89-
90-
| _ -> Seq.empty
81+
memberDecl.AccessorDeclarations |> Seq.map _.NameIdentifier.Name
9182

9283
let accessors =
9384
if Seq.isEmpty accessorNames then "" else

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -403,14 +403,14 @@ type FSharpElementFactory(languageService: IFSharpLanguageService, [<NotNull>] c
403403

404404
typeDeclaration.TypeParameterDeclarationList
405405

406-
member this.CreateAccessorsNamesClause(withGetter, withSetter) =
406+
member this.CreateAutoPropertyDeclaration(withGetter, withSetter) =
407407
let accessors = [|
408408
if withGetter then "get"
409409
if withSetter then "set" |] |> String.concat ", "
410410

411411
let source = $"member val P = 3 with {accessors}"
412412
let t = getTypeDecl source
413-
t.MemberDeclarations[0].As<IAutoPropertyDeclaration>().AccessorsClause
413+
t.MemberDeclarations[0].As<IAutoPropertyDeclaration>()
414414

415415
member this.CreateEmptyFile() = createFile ""
416416

ReSharper.FSharp/src/FSharp/FSharp.Psi.Features/src/Parsing/FSharpImplTreeBuilder.fs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -255,13 +255,13 @@ type FSharpImplTreeBuilder(lexer, document, decls, warnDirectives, lifetime, pat
255255
| SynMemberDefn.Member(binding, range) ->
256256
x.ProcessMemberBinding(mark, binding, range, None)
257257

258-
| SynMemberDefn.AbstractSlot(SynValSig(explicitTypeParams = typeParams; synType = synType; arity = arity; trivia = trivia), _, range, _) ->
258+
| SynMemberDefn.AbstractSlot(SynValSig(explicitTypeParams = typeParams; synType = synType; arity = arity; trivia = trivia), _, range, memberTrivia) ->
259259
match typeParams with
260260
| SynValTyparDecls(Some(typeParams), _) ->
261261
x.ProcessTypeParameters(typeParams, false)
262262
| _ -> ()
263263
x.ProcessReturnTypeInfo(arity, synType)
264-
x.ProcessAccessorsNamesClause(trivia, range)
264+
x.ProcessAccessorsNamesClause(trivia.WithKeyword, memberTrivia.GetSetKeywords)
265265
ElementType.ABSTRACT_MEMBER_DECLARATION
266266

267267
| SynMemberDefn.ValField(SynField(fieldType = synType), _) ->
@@ -272,16 +272,9 @@ type FSharpImplTreeBuilder(lexer, document, decls, warnDirectives, lifetime, pat
272272
match synTypeOpt with
273273
| Some synType -> x.ProcessType(synType)
274274
| _ -> ()
275-
x.MarkChameleonExpression(expr)
276-
277-
match accessorClause.WithKeyword, accessorClause.GetSetKeywords with
278-
| Some withKeyword, None ->
279-
x.MarkAndDone(withKeyword, ElementType.ACCESSORS_NAMES_CLAUSE)
280-
| Some withKeyword, Some getSetKeywords ->
281-
let range = Range.unionRanges withKeyword getSetKeywords.Range
282-
x.MarkAndDone(range, ElementType.ACCESSORS_NAMES_CLAUSE)
283-
| _ -> ()
284275

276+
x.MarkChameleonExpression(expr)
277+
x.ProcessAccessorsNamesClause(accessorClause.WithKeyword, accessorClause.GetSetKeywords)
285278
ElementType.AUTO_PROPERTY_DECLARATION
286279

287280
| _ -> failwithf "Unexpected type member: %A" typeMember

ReSharper.FSharp/src/FSharp/FSharp.Psi.Features/src/Parsing/FSharpTreeBuilderBase.fs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ type FSharpTreeBuilderBase(lexer: ILexer, document: IDocument, warnDirectives: W
147147
while x.CurrentOffset < maxOffset && x.TokenType != tokenType && not x.Eof do
148148
x.AdvanceLexer()
149149

150+
member x.AdvanceToAnyInTokenSetOrPos(tokenTypes: NodeTypeSet, pos: pos) =
151+
let maxOffset = x.GetOffset(pos)
152+
while x.CurrentOffset < maxOffset && not (tokenTypes.Contains(x.TokenType)) && not x.Eof do
153+
x.AdvanceLexer()
154+
150155
member x.MarkXmlDocOwner(xmlDoc: XmlDoc, expectedType: TokenNodeType, declarationRange: range) =
151156
let mark = x.MarkTokenOrRange(expectedType, declarationRange)
152157
if xmlDoc.HasDeclaration then
@@ -941,22 +946,34 @@ type FSharpTreeBuilderBase(lexer: ILexer, document: IDocument, warnDirectives: W
941946
x.MarkAndDone(range, ElementType.TYPE_PARAMETER_ID)
942947
x.Done(range, mark, ElementType.TYPE_REFERENCE_NAME)
943948

944-
member x.ProcessAccessorsNamesClause(trivia: SynValSigTrivia, memberRange) =
945-
match trivia.WithKeyword with
946-
| None -> ()
947-
| Some withRange ->
949+
member x.ProcessAccessorNameWithModifiers(accessorNameRange: range) =
950+
x.AdvanceToAnyInTokenSetOrPos(FSharpTokenType.AccessModifiers, accessorNameRange.Start)
951+
let mark = x.Mark()
952+
x.Done(accessorNameRange, mark, ElementType.ACCESSOR_DECLARATION)
948953

949-
let accessorsMark = x.Mark(withRange)
950-
x.Done(memberRange, accessorsMark, ElementType.ACCESSORS_NAMES_CLAUSE)
954+
member x.ProcessAccessorsNamesClause(withKeyword, getSetKeywords) =
955+
match withKeyword, getSetKeywords with
956+
| Some _, Some getSetKeywords ->
957+
match getSetKeywords with
958+
| GetSetKeywords.GetSet(getKeywordRange, setKeywordRange) ->
959+
x.ProcessAccessorNameWithModifiers(getKeywordRange)
960+
x.AdvanceToTokenOrRangeEnd(FSharpTokenType.COMMA, setKeywordRange)
961+
x.ProcessAccessorNameWithModifiers(setKeywordRange)
962+
963+
| GetSetKeywords.Get(accessorsKeywordRange)
964+
| GetSetKeywords.Set(accessorsKeywordRange) ->
965+
x.ProcessAccessorNameWithModifiers(accessorsKeywordRange)
966+
967+
| _ -> ()
951968

952969
member x.ProcessTypeMemberSignature(memberSig) =
953970
match memberSig with
954-
| SynMemberSig.Member(SynValSig(attrs, _, _, synType, arity, _, _, XmlDoc xmlDoc, _, _, _, trivia), flags, range, _) ->
971+
| SynMemberSig.Member(SynValSig(attrs, _, _, synType, arity, _, _, XmlDoc xmlDoc, _, _, _, trivia), flags, range, memberTrivia) ->
955972
let mark = x.MarkAndProcessIntro(attrs, xmlDoc, null, range)
956973
x.ProcessReturnTypeInfo(arity, synType)
957974
let elementType =
958975
if flags.IsDispatchSlot then
959-
x.ProcessAccessorsNamesClause(trivia, range)
976+
x.ProcessAccessorsNamesClause(trivia.WithKeyword, memberTrivia.GetSetKeywords)
960977
ElementType.ABSTRACT_MEMBER_DECLARATION
961978
else
962979
match flags.MemberKind with

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

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.QuickFixes
22

33
open JetBrains.ReSharper.Plugins.FSharp.Psi
44
open JetBrains.ReSharper.Plugins.FSharp.Psi.Features.Daemon.Highlightings
5-
open JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.Tree
5+
open JetBrains.ReSharper.Plugins.FSharp.Psi.Parsing
66
open JetBrains.ReSharper.Plugins.FSharp.Psi.Tree
7-
open JetBrains.ReSharper.Psi.ExtensionsAPI
7+
open JetBrains.ReSharper.Psi.ExtensionsAPI.Tree
88
open JetBrains.ReSharper.Resources.Shell
99

1010
type AddSetterFix(error: PropertyCannotBeSetError) =
1111
inherit FSharpQuickFixBase()
1212

1313
let refExpr = error.RefExpr
14-
let mutable declaration: IAccessorsNamesClauseOwner = null
14+
let mutable declaration: IOverridableMemberDeclaration = null
1515

1616
override this.IsAvailable _ =
1717
isValid refExpr &&
@@ -26,20 +26,35 @@ type AddSetterFix(error: PropertyCannotBeSetError) =
2626

2727
declaration <-
2828
match decl with
29-
| :? IAbstractMemberDeclaration as decl -> decl :> IAccessorsNamesClauseOwner
29+
| :? IAbstractMemberDeclaration as decl -> decl :> IOverridableMemberDeclaration
3030
| :? IAutoPropertyDeclaration as decl when not decl.IsVirtual -> decl
3131
| _ -> null
3232

33-
isNotNull declaration
33+
isNotNull declaration &&
34+
35+
let accessors = declaration.AccessorDeclarations
36+
accessors.All _.IsAutoPropertyAccessor
3437

3538
override this.Text = $"Add setter to '{refExpr.ShortName}'"
3639

3740
override this.ExecutePsiTransaction _ =
3841
use writeCookie = WriteLockCookie.Create(refExpr.IsPhysical())
3942

4043
let factory = refExpr.CreateElementFactory()
41-
let accessors = factory.CreateAccessorsNamesClause(true, true)
42-
43-
declaration.SetAccessorsClause(accessors) |> ignore
44-
if not (declaration.AccessorsClause.PrevSibling :? Whitespace) then
45-
addNodeBefore declaration.AccessorsClause (Whitespace(1))
44+
let autoProperty = factory.CreateAutoPropertyDeclaration(isNull (declaration.Getter()), true)
45+
let accessors = autoProperty.AccessorDeclarationsEnumerable |> Seq.toList
46+
47+
addNodesAfter declaration.LastChild
48+
[ match accessors with
49+
| [getter; setter] ->
50+
FSharpTokenType.WITH.CreateLeafElement()
51+
getter
52+
FSharpTokenType.COMMA.CreateLeafElement()
53+
setter
54+
55+
| [setter] ->
56+
FSharpTokenType.COMMA.CreateLeafElement()
57+
setter
58+
59+
| _ -> () ]
60+
|> ignore

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/FSharp.psi

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1446,7 +1446,7 @@ abstractMemberDeclaration options { stubBase="FSharpProperTypeMemberDeclarationB
14461446
identOrOpName{IDENTIFIER, Identifier}
14471447
postfixTypeParameterDeclarationList<TYPE_PARAMETER_LIST, TypeParameterList>?
14481448
returnTypeInfo<RETURN_INFO, ReturnTypeInfo>
1449-
accessorsNamesClause<ACESSORS_CLAUSE, AccessorsClause>?;
1449+
accessorDecls?;
14501450

14511451
valFieldDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras {
14521452
get { methodName="Attributes" path=<valFieldDeclaration:ATTRIBUTE_LIST/attributeList:ATTRIBUTE> };
@@ -1475,17 +1475,7 @@ autoPropertyDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBas
14751475
)?
14761476
EQUALS<FSHARP_EQUALS, EqualsToken>
14771477
chameleonExpression<CHAMELEON_EXPR, InitExpression>
1478-
accessorsNamesClause<ACESSORS_CLAUSE, AccessorsClause>?;
1479-
1480-
accessorsNamesClause:
1481-
WITH
1482-
(
1483-
fSharpIdentifier<ACESSOR, AccessorsNames>
1484-
|
1485-
fSharpIdentifier<ACESSOR, AccessorsNames>
1486-
COMMA<FSHARP_COMMA, Comma>
1487-
fSharpIdentifier<ACESSOR, AccessorsNames>
1488-
);
1478+
accessorDecls?;
14891479

14901480
accessorDeclaration options { stubBase="FSharpProperTypeMemberDeclarationBase"; } extras {
14911481
get { methodName="Expression" path=<accessorDeclaration:CHAMELEON_EXPR/chameleonExpression:EXPR> };

ReSharper.FSharp/src/FSharp/FSharp.Psi/src/IFSharpElementFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public interface IFSharpElementFactory
6565

6666
ITypeParameterDeclarationList CreateTypeParameterOfTypeList(FSharpList<string> names);
6767

68-
IAccessorsNamesClause CreateAccessorsNamesClause(bool withGetter, bool withSetter);
68+
IAutoPropertyDeclaration CreateAutoPropertyDeclaration(bool withGetter, bool withSetter);
6969

7070
IFSharpFile CreateEmptyFile();
7171
INamedModuleDeclaration CreateModule(string name);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement
1010
{
1111
internal class FSharpProperty<TDeclaration> : FSharpPropertyMemberBase<TDeclaration>, IFSharpProperty
12-
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration
12+
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration, IAccessorOwnerDeclaration
1313
{
1414
public FSharpProperty([NotNull] ITypeMemberDeclaration declaration,
1515
[NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration, mfv)

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
using JetBrains.ReSharper.Plugins.FSharp.Psi.Tree;
77
using JetBrains.ReSharper.Plugins.FSharp.Psi.Util;
88
using JetBrains.ReSharper.Psi;
9-
using JetBrains.ReSharper.Psi.Impl.Special;
109
using JetBrains.ReSharper.Psi.Resolve;
1110
using JetBrains.ReSharper.Psi.Tree;
1211

1312
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement
1413
{
1514
internal abstract class FSharpPropertyMemberBase<TDeclaration> : FSharpPropertyBase<TDeclaration>
16-
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration
15+
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration, IAccessorOwnerDeclaration
1716
{
1817
protected FSharpPropertyMemberBase([NotNull] ITypeMemberDeclaration declaration,
1918
[NotNull] FSharpMemberOrFunctionOrValue mfv) : base(declaration)
@@ -82,7 +81,7 @@ bool IsReadable(FSharpMemberOrFunctionOrValue mfv) =>
8281

8382
internal abstract class FSharpPropertyBase<TDeclaration>([NotNull] ITypeMemberDeclaration declaration)
8483
: FSharpMemberBase<TDeclaration>(declaration), IFSharpParameterOwnerMember, IProperty
85-
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration
84+
where TDeclaration : IFSharpDeclaration, IModifiersOwnerDeclaration, ITypeMemberDeclaration, IAccessorOwnerDeclaration
8685
{
8786
protected override FSharpSymbol GetActualSymbol(FSharpSymbol symbol)
8887
{
@@ -124,13 +123,19 @@ public override DeclaredElementType GetElementType() =>
124123

125124
public string GetDefaultPropertyMetadataName() => ShortName;
126125

127-
public IAccessor Getter => IsReadable ? new ImplicitAccessor(this, AccessorKind.GETTER) : null;
128-
public IAccessor Setter => IsWritable ? new ImplicitAccessor(this, AccessorKind.SETTER) : null;
126+
private IAccessor GetAccessor(AccessorKind kind) =>
127+
GetDeclaration() is { } accessorOwner &&
128+
accessorOwner.AccessorDeclarationsEnumerable.FirstOrDefault(x => x.Kind == kind) is var accessor
129+
? new FSharpPropertyImplicitAccessor(this, kind, FSharpModifiersUtil.GetAccessRights(accessor?.AccessModifier))
130+
: null;
131+
132+
public IAccessor Getter => IsReadable ? GetAccessor(AccessorKind.GETTER) : null;
133+
public IAccessor Setter => IsWritable ? GetAccessor(AccessorKind.SETTER) : null;
129134

130135
public abstract bool IsReadable { get; }
131136
public abstract bool IsWritable { get; }
132137
public bool IsRequired => false;
133-
public bool IsAuto => false;
138+
public bool IsAuto => GetDeclaration() is IAutoPropertyDeclaration;
134139
public virtual bool IsDefault => false;
135140

136141
public override bool Equals(object obj) =>
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
using JetBrains.Annotations;
2+
using JetBrains.ReSharper.Psi;
3+
using JetBrains.ReSharper.Psi.Impl.Special;
4+
5+
namespace JetBrains.ReSharper.Plugins.FSharp.Psi.Impl.DeclaredElement;
6+
7+
public class FSharpPropertyImplicitAccessor([NotNull] IOverridableMember owner, AccessorKind kind, AccessRights accessRights)
8+
: ImplicitAccessor(owner, kind)
9+
{
10+
public override AccessRights GetAccessRights() => accessRights;
11+
}

0 commit comments

Comments
 (0)