Better `inherit` error reporting (#17879) · dotnet/fsharp@14ca0c0 · GitHub
Skip to content

Commit 14ca0c0

Browse files
authored
Better inherit error reporting (#17879)
* Better `inherit` error reporting * update baselines * format code * Update tests * release notes * update tests
1 parent 3493c76 commit 14ca0c0

26 files changed

Lines changed: 74 additions & 30 deletions

File tree

‎docs/release-notes/.FSharp.Compiler.Service/9.0.200.md‎

Lines changed: 1 addition & 0 deletions

‎src/Compiler/Checking/CheckDeclarations.fs‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3622,7 +3622,11 @@ module EstablishTypeDefinitionCores =
36223622
// Note: for a mutually recursive set we can't check this condition
36233623
// until "isSealedTy" and "isClassTy" give reliable results.
36243624
superTy |> Option.iter (fun ty ->
3625-
let m = match inherits with | [] -> m | (_, m, _) :: _ -> m
3625+
let m =
3626+
match inherits with
3627+
| [] -> m
3628+
| (synType, _, _) :: _ -> synType.Range
3629+
36263630
if isSealedTy g ty then
36273631
errorR(Error(FSComp.SR.tcCannotInheritFromSealedType(), m))
36283632
elif not (isClassTy g ty) then
@@ -4292,7 +4296,7 @@ module TcDeclarations =
42924296
| SynMemberDefn.AutoProperty (range=m) :: _ -> errorR(InternalError("List.takeUntil is wrong, have auto property", m))
42934297
| SynMemberDefn.ImplicitInherit (range=m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveOneInherit(), m))
42944298
| SynMemberDefn.LetBindings (range=m) :: _ -> errorR(Error(FSComp.SR.tcTypeDefinitionsWithImplicitConstructionMustHaveLocalBindingsBeforeMembers(), m))
4295-
| SynMemberDefn.Inherit (range=m) :: _ -> errorR(Error(FSComp.SR.tcInheritDeclarationMissingArguments(), m))
4299+
| SynMemberDefn.Inherit (trivia= { InheritKeyword = m }) :: _ -> errorR(Error(FSComp.SR.tcInheritDeclarationMissingArguments(), m))
42964300
| SynMemberDefn.NestedType (range=m) :: _ -> errorR(Error(FSComp.SR.tcTypesCannotContainNestedTypes(), m))
42974301
| _ -> ()
42984302
| ds ->
@@ -4464,7 +4468,7 @@ module TcDeclarations =
44644468
let implements2 = members |> List.choose (function SynMemberDefn.Interface (interfaceType=ty) -> Some(ty, ty.Range) | _ -> None)
44654469
let inherits =
44664470
members |> List.choose (function
4467-
| SynMemberDefn.Inherit (ty, idOpt, m) -> Some(ty, m, idOpt)
4471+
| SynMemberDefn.Inherit (ty, idOpt, m, _) -> Some(ty, m, idOpt)
44684472
| SynMemberDefn.ImplicitInherit (ty, _, idOpt, m) -> Some(ty, m, idOpt)
44694473
| _ -> None)
44704474

‎src/Compiler/Driver/GraphChecking/FileContentMapping.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ let visitSynMemberDefn (md: SynMemberDefn) : FileContentEntry list =
220220
| SynMemberDefn.Interface(interfaceType, _, members, _) ->
221221
yield! visitSynType interfaceType
222222
yield! collectFromOption (List.collect visitSynMemberDefn) members
223-
| SynMemberDefn.Inherit(baseType, _, _) -> yield! visitSynType baseType
223+
| SynMemberDefn.Inherit(baseType = t) -> yield! visitSynType t
224224
| SynMemberDefn.ValField(fieldInfo, _) -> yield! visitSynField fieldInfo
225225
| SynMemberDefn.NestedType _ -> ()
226226
| SynMemberDefn.AutoProperty(attributes = attributes; typeOpt = typeOpt; synExpr = synExpr) ->

‎src/Compiler/Service/FSharpParseFileResults.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -814,7 +814,7 @@ type FSharpParseFileResults(diagnostics: FSharpDiagnostic[], input: ParsedInput,
814814
| SynMemberDefn.Interface(members = Some membs) ->
815815
for m in membs do
816816
yield! walkMember m
817-
| SynMemberDefn.Inherit(_, _, m) ->
817+
| SynMemberDefn.Inherit(range = m) ->
818818
// can break on the "inherit" clause
819819
yield! checkRange m
820820
| SynMemberDefn.ImplicitInherit(_, arg, _, m) ->

‎src/Compiler/Service/ServiceParseTreeWalk.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -996,7 +996,7 @@ module SyntaxTraversal =
996996

997997
|> pick x
998998
| ok -> ok
999-
| SynMemberDefn.Inherit(synType, _identOption, range) -> traverseInherit (synType, range)
999+
| SynMemberDefn.Inherit(synType, _identOption, range, _) -> traverseInherit (synType, range)
10001000
| SynMemberDefn.ValField _ -> None
10011001
| SynMemberDefn.NestedType(synTypeDefn, _synAccessOption, _range) -> traverseSynTypeDefn path synTypeDefn
10021002

‎src/Compiler/Service/ServiceParsedInputOps.fs‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -913,7 +913,7 @@ module ParsedInput =
913913
walkType t
914914
|> Option.orElseWith (fun () -> members |> Option.bind (List.tryPick walkMember))
915915

916-
| SynMemberDefn.Inherit(t, _, _) -> walkType t
916+
| SynMemberDefn.Inherit(baseType = t) -> walkType t
917917

918918
| SynMemberDefn.ValField(fieldInfo = field) -> walkField field
919919

@@ -2240,7 +2240,7 @@ module ParsedInput =
22402240
| SynMemberDefn.Interface(interfaceType = t; members = members) ->
22412241
walkType t
22422242
members |> Option.iter (List.iter walkMember)
2243-
| SynMemberDefn.Inherit(t, _, _) -> walkType t
2243+
| SynMemberDefn.Inherit(baseType = t) -> walkType t
22442244
| SynMemberDefn.ValField(fieldInfo = field) -> walkField field
22452245
| SynMemberDefn.NestedType(tdef, _, _) -> walkTypeDefn tdef
22462246
| SynMemberDefn.AutoProperty(attributes = Attributes attrs; typeOpt = t; synExpr = e) ->

‎src/Compiler/SyntaxTree/SyntaxTree.fs‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1496,7 +1496,7 @@ type SynMemberDefn =
14961496

14971497
| Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range
14981498

1499-
| Inherit of baseType: SynType * asIdent: Ident option * range: range
1499+
| Inherit of baseType: SynType * asIdent: Ident option * range: range * trivia: SynMemberDefnInheritTrivia
15001500

15011501
| ValField of fieldInfo: SynField * range: range
15021502

‎src/Compiler/SyntaxTree/SyntaxTree.fsi‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1670,7 +1670,7 @@ type SynMemberDefn =
16701670
| Interface of interfaceType: SynType * withKeyword: range option * members: SynMemberDefns option * range: range
16711671

16721672
/// An 'inherit' definition within a class
1673-
| Inherit of baseType: SynType * asIdent: Ident option * range: range
1673+
| Inherit of baseType: SynType * asIdent: Ident option * range: range * trivia: SynMemberDefnInheritTrivia
16741674

16751675
/// A 'val' definition within a class
16761676
| ValField of fieldInfo: SynField * range: range

‎src/Compiler/SyntaxTree/SyntaxTrivia.fs‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,9 @@ type SynMemberDefnAbstractSlotTrivia =
420420

421421
static member Zero = { GetSetKeywords = None }
422422

423+
[<NoEquality; NoComparison>]
424+
type SynMemberDefnInheritTrivia = { InheritKeyword: range }
425+
423426
[<NoEquality; NoComparison>]
424427
type SynFieldTrivia =
425428
{

‎src/Compiler/SyntaxTree/SyntaxTrivia.fsi‎

Lines changed: 4 additions & 0 deletions

0 commit comments

Comments
 (0)