Skip to content

Commit

Permalink
Add with keyword to SynTypeDefn and SynExceptionDefn. (#12609)
Browse files Browse the repository at this point in the history
* Add withKeyword to SynTypeDefn.

* Add withKeyword to SynExceptionDefn.
  • Loading branch information
nojaf authored Jan 18, 2022
1 parent 00aa118 commit 7f7d848
Show file tree
Hide file tree
Showing 10 changed files with 92 additions and 30 deletions.
6 changes: 3 additions & 3 deletions src/fsharp/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -3004,7 +3004,7 @@ module TcExceptionDeclarations =
binds, exnc


let TcExnDefn cenv envInitial parent (SynExceptionDefn(core, aug, m), scopem) =
let TcExnDefn cenv envInitial parent (SynExceptionDefn(core, _, aug, m), scopem) =
let binds1, exnc = TcExnDefnCore cenv envInitial parent core
let envMutRec = AddLocalExnDefnAndReport cenv.tcSink scopem (AddLocalTycons cenv.g cenv.amap scopem [exnc] envInitial) exnc

Expand Down Expand Up @@ -5561,10 +5561,10 @@ and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial
let decls = [ MutRecShape.Open (MutRecDataForOpen(target, m, moduleRange, ref [])) ]
decls, (openOk, moduleAbbrevOk, attrs)

| SynModuleDecl.Exception (SynExceptionDefn(repr, members, _), _m) ->
| SynModuleDecl.Exception (SynExceptionDefn(repr, _, members, _), _m) ->
let (SynExceptionDefnRepr(synAttrs, SynUnionCase(_, id, _args, _, _, _), _repr, doc, vis, m)) = repr
let compInfo = SynComponentInfo(synAttrs, None, [], [id], doc, false, vis, id.idRange)
let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, None, SynTypeDefnRepr.Exception repr, members, None, m)) ]
let decls = [ MutRecShape.Tycon(SynTypeDefn(compInfo, None, SynTypeDefnRepr.Exception repr, None, members, None, m)) ]
decls, (false, false, attrs)

| SynModuleDecl.HashDirective _ ->
Expand Down
2 changes: 2 additions & 0 deletions src/fsharp/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1578,6 +1578,7 @@ type SynExceptionDefn =

| SynExceptionDefn of
exnRepr: SynExceptionDefnRepr *
withKeyword: range option *
members: SynMemberDefns *
range: range

Expand Down Expand Up @@ -1612,6 +1613,7 @@ type SynTypeDefn =
typeInfo: SynComponentInfo *
equalsRange: range option *
typeRepr: SynTypeDefnRepr *
withKeyword: range option *
members: SynMemberDefns *
implicitConstructor: SynMemberDefn option *
range: range
Expand Down
2 changes: 2 additions & 0 deletions src/fsharp/SyntaxTree.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -1759,6 +1759,7 @@ type SynExceptionDefn =

| SynExceptionDefn of
exnRepr: SynExceptionDefnRepr *
withKeyword: range option *
members: SynMemberDefns *
range: range

Expand Down Expand Up @@ -1796,6 +1797,7 @@ type SynTypeDefn =
typeInfo: SynComponentInfo *
equalsRange: range option *
typeRepr: SynTypeDefnRepr *
withKeyword: range option *
members: SynMemberDefns *
implicitConstructor: SynMemberDefn option *
range: range
Expand Down
53 changes: 33 additions & 20 deletions src/fsharp/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -1323,21 +1323,21 @@ moduleDefn:
| opt_attributes opt_declVisibility typeKeyword tyconDefn tyconDefnList
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
let xmlDoc = grabXmlDoc(parseState, $1, 1)
let (SynTypeDefn(SynComponentInfo(cas, a, cs, b, _xmlDoc, d, d2, d3), mEquals, e, f, g, h)) = $4
let (SynTypeDefn(SynComponentInfo(cas, a, cs, b, _xmlDoc, d, d2, d3), mEquals, e, mWith, f, g, h)) = $4
_xmlDoc.MarkAsInvalid()
let attrs = $1@cas
let mTc = (h, attrs) ||> unionRangeWithListBy (fun (a: SynAttributeList) -> a.Range)
let tc = (SynTypeDefn(SynComponentInfo(attrs, a, cs, b, xmlDoc, d, d2, d3), mEquals, e, f, g, mTc))
let tc = (SynTypeDefn(SynComponentInfo(attrs, a, cs, b, xmlDoc, d, d2, d3), mEquals, e, mWith, f, g, mTc))
let types = tc :: $5
[ SynModuleDecl.Types(types, (rhs parseState 3, types) ||> unionRangeWithListBy (fun t -> t.Range) ) ] }

/* 'exception' definitions */
| opt_attributes opt_declVisibility exconDefn
{ if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2))
let (SynExceptionDefn(SynExceptionDefnRepr(cas, a, b, c, d, d2), e, f)) = $3
let (SynExceptionDefn(SynExceptionDefnRepr(cas, a, b, c, d, d2), withKeyword, e, f)) = $3
let f = (f, $1) ||> unionRangeWithListBy (fun a -> a.Range)
let xmlDoc = grabXmlDoc(parseState, $1, 1)
let ec = (SynExceptionDefn(SynExceptionDefnRepr($1@cas, a, b, xmlDoc, d, d2), e, f))
let ec = (SynExceptionDefn(SynExceptionDefnRepr($1@cas, a, b, xmlDoc, d, d2), withKeyword, e, f))
[ SynModuleDecl.Exception(ec, f) ] }

/* 'module' definitions */
Expand Down Expand Up @@ -1555,17 +1555,17 @@ tyconDefnList:
{ let xmlDoc = grabXmlDoc(parseState, [], 1)
let tyconDefn =
if xmlDoc.IsEmpty then $2 else
let (SynTypeDefn(SynComponentInfo (a, typars, c, lid, _xmlDoc, fixity, vis, rangeOfLid), mEquals, typeRepr, members, implicitConstructor, range)) = $2
let (SynTypeDefn(SynComponentInfo (a, typars, c, lid, _xmlDoc, fixity, vis, rangeOfLid), mEquals, typeRepr, mWith, members, implicitConstructor, range)) = $2
_xmlDoc.MarkAsInvalid()
SynTypeDefn(SynComponentInfo (a, typars, c, lid, xmlDoc, fixity, vis, rangeOfLid), mEquals, typeRepr, members, implicitConstructor, range)
SynTypeDefn(SynComponentInfo (a, typars, c, lid, xmlDoc, fixity, vis, rangeOfLid), mEquals, typeRepr, mWith, members, implicitConstructor, range)
tyconDefn :: $3 }
|
{ [] }

/* A type definition */
tyconDefn:
| typeNameInfo
{ SynTypeDefn($1, None, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), [], None, $1.Range) }
{ SynTypeDefn($1, None, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), None, [], None, $1.Range) }

| typeNameInfo opt_equals tyconDefnRhsBlock
{ match $2 with
Expand All @@ -1577,20 +1577,20 @@ tyconDefn:
raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsEqualsMissingInTypeDefinition(typeNameId.ToString()))

let nameRange = rhs parseState 1
let (tcDefRepr:SynTypeDefnRepr), members = $3 nameRange
let (tcDefRepr:SynTypeDefnRepr), mWith ,members = $3 nameRange
let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range
let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem:SynMemberDefn) -> mem.Range)
SynTypeDefn($1, $2, tcDefRepr, members, None, mWhole) }
SynTypeDefn($1, $2, tcDefRepr, mWith, members, None, mWhole) }

| typeNameInfo tyconDefnAugmentation
{ let mWithKwd, classDefns = $2
let m = (rhs parseState 1, classDefns) ||> unionRangeWithListBy (fun mem -> mem.Range)
SynTypeDefn($1, None, SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation mWithKwd, [], m), classDefns, None, m) }
SynTypeDefn($1, None, SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Augmentation mWithKwd, [], m), None, classDefns, None, m) }

| typeNameInfo opt_attributes opt_declVisibility opt_HIGH_PRECEDENCE_APP simplePatterns optAsSpec EQUALS tyconDefnRhsBlock
{ let vis, spats, az = $3, $5, $6
let nameRange = rhs parseState 1
let (tcDefRepr, members) = $8 nameRange
let (tcDefRepr, mWith, members) = $8 nameRange
let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = $1
let mEquals = rhs parseState 7
// Gets the XML doc comments prior to the implicit constructor
Expand All @@ -1603,7 +1603,7 @@ tyconDefn:
let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range
let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem:SynMemberDefn) -> mem.Range)

SynTypeDefn($1, Some mEquals, tcDefRepr, members, Some memberCtorPattern, mWhole) }
SynTypeDefn($1, Some mEquals, tcDefRepr, mWith, members, Some memberCtorPattern, mWhole) }


/* The right-hand-side of a type definition */
Expand All @@ -1617,17 +1617,28 @@ tyconDefnRhsBlock:
/* block still needs to be considered and may occur indented or undented from the core type */
/* representation. */
| OBLOCKBEGIN tyconDefnRhs opt_OBLOCKSEP classDefnMembers opt_classDefn oblockend opt_classDefn
{ let m = unionRanges (rhs parseState 1) (match $7 with [] -> (match $5 with [] -> (rhs parseState 4) | _ -> (rhs parseState 5)) | _ -> (rhs parseState 7))
(fun nameRange -> $2 nameRange (checkForMultipleAugmentations m ($4 @ $5) $7)) }
{ let mWith, optClassDefn = $5
let mWith2, optClassDefn2 = $7
let m = unionRanges (rhs parseState 1) (match optClassDefn2 with [] -> (match optClassDefn with [] -> (rhs parseState 4) | _ -> (rhs parseState 5)) | _ -> (rhs parseState 7))
(fun nameRange ->
let tcDefRepr, members = $2 nameRange (checkForMultipleAugmentations m ($4 @ optClassDefn) optClassDefn2)
let mWith = Option.orElse mWith2 mWith
tcDefRepr, mWith, members) }

| OBLOCKBEGIN tyconDefnRhs opt_OBLOCKSEP classDefnMembers opt_classDefn recover
{ if not $6 then reportParseErrorAt (rhs parseState 6) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition())
let m = unionRanges (rhs parseState 1) (match $5 with [] -> (rhs parseState 4) | _ -> (rhs parseState 5))
(fun nameRange -> $2 nameRange (checkForMultipleAugmentations m ($4 @ $5) [])) }
let mWith, optClassDefn = $5
let m = unionRanges (rhs parseState 1) (match optClassDefn with [] -> (rhs parseState 4) | _ -> (rhs parseState 5))
(fun nameRange ->
let tcDefRepr, members = $2 nameRange (checkForMultipleAugmentations m ($4 @ optClassDefn) [])
tcDefRepr, mWith, members) }

| tyconDefnRhs opt_classDefn
{ let m = rhs parseState 1
(fun nameRange -> $1 nameRange $2) }
let mWith, optClassDefn = $2
(fun nameRange ->
let tcDefRepr, members = $1 nameRange optClassDefn
tcDefRepr, mWith, members) }


/* The right-hand-side of a type definition */
Expand Down Expand Up @@ -2158,10 +2169,11 @@ opt_interfaceImplDefn:

opt_classDefn:
| WITH classDefnBlock declEnd
{ $2 }
{ let mWithKwd = rhs parseState 1
(Some mWithKwd), $2 }

| /* EMPTY */
{ [] }
{ None, [] }


/* An 'inherits' definition in an object type definition */
Expand Down Expand Up @@ -2608,7 +2620,8 @@ fieldDecl:
/* An exception definition */
exconDefn:
| exconCore opt_classDefn
{ SynExceptionDefn($1, $2, ($1.Range, $2) ||> unionRangeWithListBy (fun cd -> cd.Range) ) }
{ let mWith, optClassDefn = $2
SynExceptionDefn($1, mWith, optClassDefn, ($1.Range, optClassDefn) ||> unionRangeWithListBy (fun cd -> cd.Range) ) }

/* Part of an exception definition */
exconCore:
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/FSharpParseFileResults.fs
Original file line number Diff line number Diff line change
Expand Up @@ -737,7 +737,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
for d in decls do yield! walkDecl d
| SynModuleDecl.Types(tydefs, m) when isMatchRange m ->
for d in tydefs do yield! walkTycon d
| SynModuleDecl.Exception(SynExceptionDefn(SynExceptionDefnRepr _, membDefns, _), m)
| SynModuleDecl.Exception(SynExceptionDefn(SynExceptionDefnRepr _, _, membDefns, _), m)
when isMatchRange m ->
for m in membDefns do yield! walkMember m
| _ -> () ]
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceInterfaceStubGenerator.fs
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,7 @@ module InterfaceStubGenerator =
None
else
match decl with
| SynModuleDecl.Exception(SynExceptionDefn(_, synMembers, _), _) ->
| SynModuleDecl.Exception(SynExceptionDefn(_, _, synMembers, _), _) ->
List.tryPick walkSynMemberDefn synMembers
| SynModuleDecl.Let(_isRecursive, bindings, _range) ->
List.tryPick walkBinding bindings
Expand Down
4 changes: 2 additions & 2 deletions src/fsharp/service/ServiceNavigation.fs
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ module NavigationImpl =
[ createDecl(baseName, id, NavigationItemKind.Exception, FSharpGlyph.Exception, m, fldspecRange fldspec, nested, NavigationEntityKind.Exception, false, access) ]

// Process a class declaration or F# type declaration
and processExnDefn baseName (SynExceptionDefn(repr, membDefns, _)) =
and processExnDefn baseName (SynExceptionDefn(repr, _, membDefns, _)) =
let nested = processMembers membDefns NavigationEntityKind.Exception |> snd
processExnDefnRepr baseName nested repr

Expand Down Expand Up @@ -663,7 +663,7 @@ module NavigateTo =

and walkSynModuleDecl(decl: SynModuleDecl) container =
match decl with
| SynModuleDecl.Exception(SynExceptionDefn(repr, synMembers, _), _) ->
| SynModuleDecl.Exception(SynExceptionDefn(repr, _, synMembers, _), _) ->
let container = addExceptionRepr repr false container
for m in synMembers do
walkSynMemberDefn m container
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceParseTreeWalk.fs
Original file line number Diff line number Diff line change
Expand Up @@ -708,7 +708,7 @@ module SyntaxTraversal =
#endif
)

and traverseSynTypeDefn origPath (SynTypeDefn(synComponentInfo, _, synTypeDefnRepr, synMemberDefns, _, tRange) as tydef) =
and traverseSynTypeDefn origPath (SynTypeDefn(synComponentInfo, _, synTypeDefnRepr, _, synMemberDefns, _, tRange) as tydef) =
let path = SyntaxNode.SynTypeDefn tydef :: origPath

match visitor.VisitComponentInfo (origPath, synComponentInfo) with
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6135,7 +6135,7 @@ FSharp.Compiler.Syntax.SynEnumCase: Microsoft.FSharp.Collections.FSharpList`1[FS
FSharp.Compiler.Syntax.SynEnumCase: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList] get_attributes()
FSharp.Compiler.Syntax.SynEnumCase: System.String ToString()
FSharp.Compiler.Syntax.SynExceptionDefn
FSharp.Compiler.Syntax.SynExceptionDefn: FSharp.Compiler.Syntax.SynExceptionDefn NewSynExceptionDefn(FSharp.Compiler.Syntax.SynExceptionDefnRepr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn], FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExceptionDefn: FSharp.Compiler.Syntax.SynExceptionDefn NewSynExceptionDefn(FSharp.Compiler.Syntax.SynExceptionDefnRepr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn], FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynExceptionDefn: FSharp.Compiler.Syntax.SynExceptionDefnRepr exnRepr
FSharp.Compiler.Syntax.SynExceptionDefn: FSharp.Compiler.Syntax.SynExceptionDefnRepr get_exnRepr()
FSharp.Compiler.Syntax.SynExceptionDefn: FSharp.Compiler.Text.Range Range
Expand All @@ -6146,6 +6146,8 @@ FSharp.Compiler.Syntax.SynExceptionDefn: Int32 Tag
FSharp.Compiler.Syntax.SynExceptionDefn: Int32 get_Tag()
FSharp.Compiler.Syntax.SynExceptionDefn: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn] get_members()
FSharp.Compiler.Syntax.SynExceptionDefn: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn] members
FSharp.Compiler.Syntax.SynExceptionDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_withKeyword()
FSharp.Compiler.Syntax.SynExceptionDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] withKeyword
FSharp.Compiler.Syntax.SynExceptionDefn: System.String ToString()
FSharp.Compiler.Syntax.SynExceptionDefnRepr
FSharp.Compiler.Syntax.SynExceptionDefnRepr: FSharp.Compiler.Syntax.SynExceptionDefnRepr NewSynExceptionDefnRepr(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynAttributeList], FSharp.Compiler.Syntax.SynUnionCase, Microsoft.FSharp.Core.FSharpOption`1[Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.Ident]], FSharp.Compiler.Xml.PreXmlDoc, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynAccess], FSharp.Compiler.Text.Range)
Expand Down Expand Up @@ -8576,7 +8578,7 @@ FSharp.Compiler.Syntax.SynTypeConstraint: System.String ToString()
FSharp.Compiler.Syntax.SynTypeDefn
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Syntax.SynComponentInfo get_typeInfo()
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Syntax.SynComponentInfo typeInfo
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefn NewSynTypeDefn(FSharp.Compiler.Syntax.SynComponentInfo, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Syntax.SynTypeDefnRepr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberDefn], FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefn NewSynTypeDefn(FSharp.Compiler.Syntax.SynComponentInfo, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], FSharp.Compiler.Syntax.SynTypeDefnRepr, Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynMemberDefn], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberDefn], FSharp.Compiler.Text.Range)
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefnRepr get_typeRepr()
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefnRepr typeRepr
FSharp.Compiler.Syntax.SynTypeDefn: FSharp.Compiler.Text.Range Range
Expand All @@ -8591,6 +8593,8 @@ FSharp.Compiler.Syntax.SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.
FSharp.Compiler.Syntax.SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynMemberDefn] implicitConstructor
FSharp.Compiler.Syntax.SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] equalsRange
FSharp.Compiler.Syntax.SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_equalsRange()
FSharp.Compiler.Syntax.SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] get_withKeyword()
FSharp.Compiler.Syntax.SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Text.Range] withKeyword
FSharp.Compiler.Syntax.SynTypeDefn: System.String ToString()
FSharp.Compiler.Syntax.SynTypeDefnKind
FSharp.Compiler.Syntax.SynTypeDefnKind+Augmentation: FSharp.Compiler.Text.Range get_withKeyword()
Expand Down
41 changes: 41 additions & 0 deletions tests/service/Symbols.fs
Original file line number Diff line number Diff line change
Expand Up @@ -453,6 +453,26 @@ type Person(name : string, age : int) =
assertRange (5, 20) (5, 21) mEquals
| _ -> Assert.Fail "Could not get valid AST"

[<Test>]
let ``SynTypeDefn with Record contains the range of the with keyword`` () =
let parseResults =
getParseResults
"""
type Foo =
{ Bar : int }
with
member this.Meh (v:int) = this.Bar + v
"""

match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace.SynModuleOrNamespace(decls = [
SynModuleDecl.Types(
typeDefns = [ SynTypeDefn(typeRepr=SynTypeDefnRepr.Simple(simpleRepr= SynTypeDefnSimpleRepr.Record _); withKeyword= Some mWithKeyword) ]
)
]) ])) ->
assertRange (4, 4) (4, 8) mWithKeyword
| _ -> Assert.Fail "Could not get valid AST"

[<Test>]
let ``SynTypeDefn with Augmentation contains the range of the with keyword`` () =
let parseResults =
Expand Down Expand Up @@ -2596,4 +2616,25 @@ match x with
)
]) ])) ->
assertRange (3, 7) (3, 8) mEquals
| _ -> Assert.Fail "Could not get valid AST"

module Exceptions =
[<Test>]
let ``SynExceptionDefn should contains the range of the with keyword`` () =
let parseResults =
getParseResults
"""
namespace X
exception Foo with
member Meh () = ()
"""

match parseResults with
| ParsedInput.ImplFile (ParsedImplFileInput (modules = [ SynModuleOrNamespace(decls = [
SynModuleDecl.Exception(
exnDefn=SynExceptionDefn(withKeyword = Some mWithKeyword)
)
]) ])) ->
assertRange (4, 14) (4, 18) mWithKeyword
| _ -> Assert.Fail "Could not get valid AST"

0 comments on commit 7f7d848

Please sign in to comment.