Skip to content

Commit 267d0a5

Browse files
authored
Fix setter first (#13435)
* Respect the order of SynBindings in SynMemberDefn.GetSetMember. * Remove unnecessary tests. * Add release notes entry for SynMemberDefn.GetSetMember.
1 parent 3e66a60 commit 267d0a5

File tree

5 files changed

+45
-86
lines changed

5 files changed

+45
-86
lines changed

release-notes.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ These release notes track our current efforts to document changes to the F# proj
3434
`a + b` is parsed as `SynLongIdent([op_Addition], [], [Some (OriginalNotation "+")])`.
3535
* `SynMeasure` was extended with [SynMeasure.Paren](https://fsharp.github.io/fsharp-compiler-docs/reference/fsharp-compiler-syntax-synmeasure.html#Paren) case.
3636
* Dynamic expressions (like `x?y`) are now represented as [SynExpr.Dynamic](https://fsharp.github.io/fsharp-compiler-docs/reference/fsharp-compiler-syntax-synexpr.html#Dynamic) in the Untyped Syntax Tree.
37+
* Members with `get` and/or `set` are now represented as [SynMemberDefn.GetSetMember](https://fsharp.github.io/fsharp-compiler-docs/reference/fsharp-compiler-syntax-synmemberdefn.html#GetSetMember) in the Untyped Syntax Tree.
3738

3839
### F# 6.0 / Visual Studio 17.0
3940

src/Compiler/SyntaxTree/ParseHelpers.fs

Lines changed: 9 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -764,42 +764,17 @@ let mkSynMemberDefnGetSet
764764
let setter = tryMkSynMemberDefnMember s
765765

766766
match getter, setter with
767-
| Some (SynMemberDefn.Member (getBinding, mGet), getIdent), Some (SynMemberDefn.Member (setBinding, mSet), setIdent) ->
768-
let range = unionRanges mGet mSet
767+
| Some (SynMemberDefn.Member (getBinding, m1), GetIdent mGet), Some (SynMemberDefn.Member (setBinding, m2), SetIdent mSet)
768+
| Some (SynMemberDefn.Member (setBinding, m1), SetIdent mSet), Some (SynMemberDefn.Member (getBinding, m2), GetIdent mGet) ->
769+
let range = unionRanges m1 m2
769770

770771
let trivia =
771-
match getIdent, setIdent with
772-
| GetIdent mGet, SetIdent mSet
773-
| SetIdent mSet, GetIdent mGet ->
774-
{
775-
WithKeyword = mWith
776-
GetKeyword = Some mGet
777-
AndKeyword = mAnd
778-
SetKeyword = Some mSet
779-
}
780-
| OtherIdent, GetIdent mGet
781-
| GetIdent mGet, OtherIdent ->
782-
{
783-
WithKeyword = mWith
784-
GetKeyword = Some mGet
785-
AndKeyword = mAnd
786-
SetKeyword = None
787-
}
788-
| OtherIdent, SetIdent mSet
789-
| SetIdent mSet, OtherIdent ->
790-
{
791-
WithKeyword = mWith
792-
GetKeyword = None
793-
AndKeyword = mAnd
794-
SetKeyword = Some mSet
795-
}
796-
| _ ->
797-
{
798-
WithKeyword = mWith
799-
AndKeyword = mAnd
800-
GetKeyword = None
801-
SetKeyword = None
802-
}
772+
{
773+
WithKeyword = mWith
774+
GetKeyword = Some mGet
775+
AndKeyword = mAnd
776+
SetKeyword = Some mSet
777+
}
803778

804779
[ SynMemberDefn.GetSetMember(Some getBinding, Some setBinding, range, trivia) ]
805780
| Some (SynMemberDefn.Member (binding, m), getOrSet), None

tests/FSharp.Compiler.ComponentTests/Conformance/ClassTypes/GetSetMembers/GetSetMembers.fs

Lines changed: 0 additions & 51 deletions
This file was deleted.

tests/FSharp.Compiler.ComponentTests/FSharp.Compiler.ComponentTests.fsproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@
3232
<Compile Include="Conformance\ClassTypes\ExplicitObjectConstructors\ExplicitObjectConstructors.fs" />
3333
<Compile Include="Conformance\ClassTypes\ImplicitObjectConstructors\ImplicitObjectConstructors.fs" />
3434
<Compile Include="Conformance\ClassTypes\ValueRestriction\ValueRestriction.fs" />
35-
<Compile Include="Conformance\ClassTypes\GetSetMembers\GetSetMembers.fs" />
3635
<Compile Include="Conformance\DelegateTypes\DelegateDefinition.fs" />
3736
<Compile Include="Conformance\DeclarationElements\AccessibilityAnnotations\Basic\Basic.fs" />
3837
<Compile Include="Conformance\DeclarationElements\AccessibilityAnnotations\OnOverridesAndIFaceImpl\OnOverridesAndIFaceImpl.fs" />

tests/service/Symbols.fs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -785,6 +785,41 @@ type Foo =
785785
assertRange (3, 4) (5, 54) m
786786
| _ -> Assert.Fail "Could not get valid AST"
787787

788+
[<Test>]
789+
let ``SynTypeDefn with member with set/get`` () =
790+
let parseResults =
791+
getParseResults
792+
"""
793+
type A() =
794+
member this.Z with set (_:int):unit = () and get():int = 1
795+
"""
796+
797+
match parseResults with
798+
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
799+
SynModuleDecl.Types(
800+
typeDefns = [ SynTypeDefn(typeRepr = SynTypeDefnRepr.ObjectModel(members = [
801+
SynMemberDefn.ImplicitCtor _
802+
SynMemberDefn.GetSetMember(Some (SynBinding(headPat = SynPat.LongIdent(extraId = Some getIdent))),
803+
Some (SynBinding(headPat = SynPat.LongIdent(extraId = Some setIdent))),
804+
m,
805+
{ WithKeyword = mWith
806+
GetKeyword = Some mGet
807+
AndKeyword = Some mAnd
808+
SetKeyword = Some mSet })
809+
])) ]
810+
)
811+
]) ])) ->
812+
Assert.AreEqual("get", getIdent.idText)
813+
Assert.AreEqual("set", setIdent.idText)
814+
assertRange (3, 18) (3, 22) mWith
815+
assertRange (3, 23) (3, 26) mSet
816+
assertRange (3, 23) (3, 26) setIdent.idRange
817+
assertRange (3, 45) (3, 48) mAnd
818+
assertRange (3, 49) (3, 52) mGet
819+
assertRange (3, 49) (3, 52) getIdent.idRange
820+
assertRange (3, 4) (3, 62) m
821+
| _ -> Assert.Fail "Could not get valid AST"
822+
788823
module SyntaxExpressions =
789824
[<Test>]
790825
let ``SynExpr.Do contains the range of the do keyword`` () =

0 commit comments

Comments
 (0)