Skip to content

Commit ce37105

Browse files
auduchinokpsfinaki
andauthored
Parser: more unfinished type recovery (#15585)
* Parser: rework missing type body recovery * Update baselines * Adjust the code fix * nah baselines * Remove error declaration --------- Co-authored-by: Petr <[email protected]>
1 parent 09143a5 commit ce37105

File tree

59 files changed

+543
-186
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

59 files changed

+543
-186
lines changed

src/Compiler/FSComp.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1526,7 +1526,6 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl
15261526
3351,chkFeatureNotRuntimeSupported,"Feature '%s' is not supported by target runtime."
15271527
3352,typrelInterfaceMemberNoMostSpecificImplementation,"Interface member '%s' does not have a most specific implementation."
15281528
3353,chkFeatureNotSupportedInLibrary,"Feature '%s' requires the F# library for language version %s or greater."
1529-
3360,parsEqualsMissingInTypeDefinition,"Unexpected token in type definition. Expected '=' after the type '%s'."
15301529
useSdkRefs,"Use reference assemblies for .NET framework references when available (Enabled by default)."
15311530
optsGetLangVersions,"Display the allowed values for language version."
15321531
optsSetLangVersion,"Specify language version such as 'latest' or 'preview'."

src/Compiler/Service/FSharpParseFileResults.fs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,24 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
505505
let result = SyntaxTraversal.Traverse(pos, input, visitor)
506506
result.IsSome
507507

508+
member _.IsPositionWithinTypeDefinition pos =
509+
let visitor =
510+
{ new SyntaxVisitorBase<_>() with
511+
override _.VisitComponentInfo(path, _) =
512+
let typeDefs =
513+
path
514+
|> List.filter (function
515+
| SyntaxNode.SynModule (SynModuleDecl.Types _) -> true
516+
| _ -> false)
517+
518+
match typeDefs with
519+
| [] -> None
520+
| _ -> Some true
521+
}
522+
523+
let result = SyntaxTraversal.Traverse(pos, input, visitor)
524+
result.IsSome
525+
508526
member _.IsBindingALambdaAtPosition pos =
509527
let visitor =
510528
{ new SyntaxVisitorBase<_>() with

src/Compiler/Service/FSharpParseFileResults.fsi

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ type public FSharpParseFileResults =
6868
/// Determines if the expression or pattern at the given position has a type annotation
6969
member IsTypeAnnotationGivenAtPosition: pos -> bool
7070

71+
/// Determines if the given position is bound to a type definition
72+
member IsPositionWithinTypeDefinition: pos -> bool
73+
7174
/// Determines if the binding at the given position is bound to a lambda expression
7275
member IsBindingALambdaAtPosition: pos -> bool
7376

src/Compiler/pars.fsy

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,24 +1588,6 @@ tyconDefn:
15881588
let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = None; WithKeyword = None }
15891589
SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), [], None, $1.Range, trivia) }
15901590

1591-
| typeNameInfo opt_equals tyconDefnRhsBlock
1592-
{ match $2 with
1593-
| Some _ -> ()
1594-
| None ->
1595-
let (SynComponentInfo(_, _, _, lid, _, _, _, _)) = $1
1596-
// While the spec doesn't allow long idents here, the parser doesn't enforce this, so take one ident
1597-
let typeNameId = List.last lid
1598-
raiseParseErrorAt (rhs parseState 2) (FSComp.SR.parsEqualsMissingInTypeDefinition(typeNameId.ToString()))
1599-
1600-
let nameRange = rhs parseState 1
1601-
let (tcDefRepr: SynTypeDefnRepr), mWith, members = $3 nameRange
1602-
let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range
1603-
let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem: SynMemberDefn) -> mem.Range)
1604-
1605-
fun leadingKeyword ->
1606-
let trivia: SynTypeDefnTrivia = { LeadingKeyword = leadingKeyword; EqualsRange = $2; WithKeyword = mWith }
1607-
SynTypeDefn($1, tcDefRepr, members, None, mWhole, trivia) }
1608-
16091591
| typeNameInfo tyconDefnAugmentation
16101592
{ let mWithKwd, classDefns = $2
16111593
let m = (rhs parseState 1, classDefns) ||> unionRangeWithListBy (fun mem -> mem.Range)
@@ -1632,11 +1614,21 @@ tyconDefn:
16321614

16331615
let tcDefRepr =
16341616
match tcDefRepr, memberCtorPattern with
1617+
| SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None _, m), Some ctor ->
1618+
reportParseErrorAt m (FSComp.SR.parsEmptyTypeDefinition())
1619+
SynTypeDefnRepr.ObjectModel(SynTypeDefnKind.Unspecified, [ctor], unionRanges m mEquals)
1620+
1621+
| SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, m), _ ->
1622+
reportParseErrorAt m (FSComp.SR.parsEmptyTypeDefinition())
1623+
tcDefRepr
1624+
16351625
| SynTypeDefnRepr.ObjectModel(k, cspec, m), Some ctor ->
16361626
SynTypeDefnRepr.ObjectModel(k, ctor :: cspec, m)
1627+
16371628
| _, Some ctor ->
16381629
reportParseErrorAt (rhs2 parseState 1 5) (FSComp.SR.parsOnlyClassCanTakeValueArguments ())
16391630
tcDefRepr
1631+
16401632
| _ ->
16411633
match az with
16421634
| Some(_, Some id) ->
@@ -1685,7 +1677,7 @@ tyconDefn:
16851677

16861678
fun leadingKeyword ->
16871679
let trivia = { SynTypeDefnTrivia.Zero with LeadingKeyword = leadingKeyword }
1688-
SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mName, trivia) }
1680+
SynTypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None(mName), mName), members, None, mWhole, trivia) }
16891681

16901682

16911683
/* The right-hand-side of a type definition */
@@ -1715,6 +1707,10 @@ tyconDefnRhsBlock:
17151707
let tcDefRepr, members = $2 nameRange (checkForMultipleAugmentations m ($4 @ optClassDefn) [])
17161708
tcDefRepr, mWith, members) }
17171709

1710+
| OBLOCKBEGIN oblockend
1711+
{ fun mName ->
1712+
SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None mName, mName), None, [] }
1713+
17181714
| tyconDefnRhs opt_classDefn
17191715
{ let m = rhs parseState 1
17201716
let mWith, optClassDefn = $2
@@ -1775,15 +1771,15 @@ tyconClassDefn:
17751771

17761772
/* The right-hand-side of a object type definition where the class/interface/struct kind has not been specified */
17771773
classDefnBlockKindUnspecified:
1778-
| OBLOCKBEGIN classDefnMembers recover
1774+
| OBLOCKBEGIN classDefnMembersAtLeastOne recover
17791775
{ if not $3 then reportParseErrorAt (rhs parseState 3) (FSComp.SR.parsUnexpectedEndOfFileTypeDefinition())
17801776
let mopt =
17811777
match $2 with
17821778
| _ :: _ -> Some((rhs parseState 1, $2) ||> unionRangeWithListBy (fun (d: SynMemberDefn) -> d.Range))
17831779
| _ -> None
17841780
false, $2, mopt }
17851781

1786-
| OBLOCKBEGIN classDefnMembers oblockend
1782+
| OBLOCKBEGIN classDefnMembersAtLeastOne oblockend
17871783
{ let mopt =
17881784
match $2 with
17891785
| _ :: _ -> Some((rhs parseState 1, $2) ||> unionRangeWithListBy (fun (d: SynMemberDefn) -> d.Range))

src/Compiler/xlf/FSComp.txt.cs.xlf

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compiler/xlf/FSComp.txt.de.xlf

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compiler/xlf/FSComp.txt.es.xlf

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compiler/xlf/FSComp.txt.fr.xlf

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compiler/xlf/FSComp.txt.it.xlf

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/Compiler/xlf/FSComp.txt.ja.xlf

Lines changed: 0 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)