From 6f453785f1d18197915546dab723e6e752e2cd30 Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Thu, 28 Jan 2021 22:24:56 +0300 Subject: [PATCH 1/2] Keep parsed implicit constructor in SynTypeDefn --- src/fsharp/CheckDeclarations.fs | 6 +++--- src/fsharp/SyntaxTree.fs | 1 + src/fsharp/pars.fsy | 12 ++++++------ src/fsharp/service/ServiceAssemblyContent.fs | 2 +- src/fsharp/service/ServiceInterfaceStubGenerator.fs | 2 +- src/fsharp/service/ServiceNavigation.fs | 4 ++-- src/fsharp/service/ServiceParseTreeWalk.fs | 2 +- src/fsharp/service/ServiceStructure.fs | 2 +- src/fsharp/service/ServiceUntypedParse.fs | 6 +++--- src/fsharp/service/ServiceXmlDocParser.fs | 2 +- tests/service/InteractiveCheckerTests.fs | 2 +- tests/service/ServiceUntypedParseTests.fs | 2 +- 12 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/fsharp/CheckDeclarations.fs b/src/fsharp/CheckDeclarations.fs index 6d2d38ef19..7ef13ee100 100644 --- a/src/fsharp/CheckDeclarations.fs +++ b/src/fsharp/CheckDeclarations.fs @@ -3165,7 +3165,7 @@ module EstablishTypeDefinitionCores = [ for def in defs do match def with | SynModuleDecl.Types (typeSpecs, _) -> - for (TypeDefn(ComponentInfo(_, typars, _, ids, _, _, _, _), trepr, _, _)) in typeSpecs do + for (TypeDefn(ComponentInfo(_, typars, _, ids, _, _, _, _), trepr, _, _, _)) in typeSpecs do if isNil typars then match trepr with | SynTypeDefnRepr.ObjectModel(TyconAugmentation, _, _) -> () @@ -4642,7 +4642,7 @@ module TcDeclarations = /// where simpleRepr can contain inherit type, declared fields and virtual slots. /// body = members /// where members contain methods/overrides, also implicit ctor, inheritCall and local definitions. - let rec private SplitTyconDefn (TypeDefn(synTyconInfo, trepr, extraMembers, _)) = + let rec private SplitTyconDefn (TypeDefn(synTyconInfo, trepr, extraMembers, _, _)) = let implements1 = List.choose (function SynMemberDefn.Interface (ty, _, _) -> Some(ty, ty.Range) | _ -> None) extraMembers match trepr with | SynTypeDefnRepr.ObjectModel(kind, cspec, m) -> @@ -5528,7 +5528,7 @@ and TcModuleOrNamespaceElementsMutRec (cenv: cenv) parent typeNames m envInitial | SynModuleDecl.Exception (SynExceptionDefn(repr, members, _), _m) -> let (SynExceptionDefnRepr(synAttrs, UnionCase(_, id, _args, _, _, _), _repr, doc, vis, m)) = repr let compInfo = ComponentInfo(synAttrs, [], [], [id], doc, false, vis, id.idRange) - let decls = [ MutRecShape.Tycon(SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, m)) ] + let decls = [ MutRecShape.Tycon(SynTypeDefn.TypeDefn(compInfo, SynTypeDefnRepr.Exception repr, members, None, m)) ] decls, (false, false, attrs) | SynModuleDecl.HashDirective _ -> diff --git a/src/fsharp/SyntaxTree.fs b/src/fsharp/SyntaxTree.fs index 6e9b68280c..b1d210ebab 100644 --- a/src/fsharp/SyntaxTree.fs +++ b/src/fsharp/SyntaxTree.fs @@ -1877,6 +1877,7 @@ type SynTypeDefn = typeInfo: SynComponentInfo * typeRepr: SynTypeDefnRepr * members: SynMemberDefns * + implicitConstructor: SynMemberDefn option * range: range /// Gets the syntax range of this construct diff --git a/src/fsharp/pars.fsy b/src/fsharp/pars.fsy index cfce563057..daac933cc9 100644 --- a/src/fsharp/pars.fsy +++ b/src/fsharp/pars.fsy @@ -1271,8 +1271,8 @@ moduleDefn: /* 'type' definitions */ | opt_attributes opt_declVisibility typeKeyword tyconDefn tyconDefnList { if Option.isSome $2 then errorR(Error(FSComp.SR.parsVisibilityDeclarationsShouldComePriorToIdentifier(), rhs parseState 2)) - let (TypeDefn(ComponentInfo(cas, a, cs, b, c, d, d2, d3), e, f, g)) = $4 - let tc = (TypeDefn(ComponentInfo($1@cas, a, cs, b, c, d, d2, d3), e, f, g)) + let (TypeDefn(ComponentInfo(cas, a, cs, b, c, d, d2, d3), e, f, g, h)) = $4 + let tc = (TypeDefn(ComponentInfo($1@cas, a, cs, b, c, d, d2, d3), e, f, g, h)) let types = tc :: $5 [ SynModuleDecl.Types(types, (rhs parseState 3, types) ||> unionRangeWithListBy (fun t -> t.Range) ) ] } @@ -1499,7 +1499,7 @@ tyconDefnList: /* A type definition */ tyconDefn: | typeNameInfo - { TypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), [], $1.Range) } + { TypeDefn($1, SynTypeDefnRepr.Simple(SynTypeDefnSimpleRepr.None($1.Range), $1.Range), [], None, $1.Range) } | typeNameInfo opt_equals tyconDefnRhsBlock { if not $2 then ( @@ -1512,11 +1512,11 @@ tyconDefn: let (tcDefRepr:SynTypeDefnRepr), members = $3 nameRange let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem:SynMemberDefn) -> mem.Range) - TypeDefn($1, tcDefRepr, members, mWhole) } + TypeDefn($1, tcDefRepr, members, None, mWhole) } | typeNameInfo tyconDefnAugmentation { let m = (rhs parseState 1, $2) ||> unionRangeWithListBy (fun mem -> mem.Range) - TypeDefn($1, SynTypeDefnRepr.ObjectModel(TyconAugmentation, [], m), $2, m) } + TypeDefn($1, SynTypeDefnRepr.ObjectModel(TyconAugmentation, [], m), $2, None, m) } | typeNameInfo opt_attributes opt_declVisibility opt_HIGH_PRECEDENCE_APP simplePatterns optAsSpec EQUALS tyconDefnRhsBlock { let vis, spats, az = $3, $5, $6 @@ -1533,7 +1533,7 @@ tyconDefn: let declRange = unionRanges (rhs parseState 1) tcDefRepr.Range let mWhole = (declRange, members) ||> unionRangeWithListBy (fun (mem:SynMemberDefn) -> mem.Range) - TypeDefn($1, tcDefRepr, members, mWhole) } + TypeDefn($1, tcDefRepr, members, Some memberCtorPattern, mWhole) } /* The right-hand-side of a type definition */ diff --git a/src/fsharp/service/ServiceAssemblyContent.fs b/src/fsharp/service/ServiceAssemblyContent.fs index 69865f77f4..f768952067 100644 --- a/src/fsharp/service/ServiceAssemblyContent.fs +++ b/src/fsharp/service/ServiceAssemblyContent.fs @@ -753,7 +753,7 @@ module ParsedInput = | SynTypeDefnSigRepr.Simple(defn, _) -> walkTypeDefnSimple defn | SynTypeDefnSigRepr.Exception _ -> () - and walkTypeDefn (TypeDefn (info, repr, members, _)) = + and walkTypeDefn (TypeDefn (info, repr, members, _, _)) = let isTypeExtensionOrAlias = match repr with | SynTypeDefnRepr.ObjectModel (SynTypeDefnKind.TyconAugmentation, _, _) diff --git a/src/fsharp/service/ServiceInterfaceStubGenerator.fs b/src/fsharp/service/ServiceInterfaceStubGenerator.fs index 85b284773a..9b560ee58d 100644 --- a/src/fsharp/service/ServiceInterfaceStubGenerator.fs +++ b/src/fsharp/service/ServiceInterfaceStubGenerator.fs @@ -702,7 +702,7 @@ module InterfaceStubGenerator = | SynModuleDecl.Open _ -> None - and walkSynTypeDefn(TypeDefn(_componentInfo, representation, members, range)) = + and walkSynTypeDefn(TypeDefn(_componentInfo, representation, members, _, range)) = if not <| rangeContainsPos range pos then None else diff --git a/src/fsharp/service/ServiceNavigation.fs b/src/fsharp/service/ServiceNavigation.fs index 06165e3220..42b5f1acaa 100755 --- a/src/fsharp/service/ServiceNavigation.fs +++ b/src/fsharp/service/ServiceNavigation.fs @@ -173,7 +173,7 @@ module NavigationImpl = let nested = processMembers membDefns FSharpEnclosingEntityKind.Exception |> snd processExnDefnRepr baseName nested repr - and processTycon baseName (TypeDefn(ComponentInfo(_, _, _, lid, _, _, access, _), repr, membDefns, m)) = + and processTycon baseName (TypeDefn(ComponentInfo(_, _, _, lid, _, _, access, _), repr, membDefns, _, m)) = let topMembers = processMembers membDefns FSharpEnclosingEntityKind.Class |> snd match repr with | SynTypeDefnRepr.Exception repr -> processExnDefnRepr baseName [] repr @@ -686,7 +686,7 @@ module NavigateTo = | SynModuleDecl.HashDirective _ | SynModuleDecl.Open _ -> () - and walkSynTypeDefn(TypeDefn(componentInfo, representation, members, _)) container = + and walkSynTypeDefn(TypeDefn(componentInfo, representation, members, _, _)) container = let container = addComponentInfo ContainerType.Type NavigableItemKind.Type componentInfo false container walkSynTypeDefnRepr representation container for m in members do diff --git a/src/fsharp/service/ServiceParseTreeWalk.fs b/src/fsharp/service/ServiceParseTreeWalk.fs index e7748415c3..086a299892 100755 --- a/src/fsharp/service/ServiceParseTreeWalk.fs +++ b/src/fsharp/service/ServiceParseTreeWalk.fs @@ -653,7 +653,7 @@ module public AstTraversal = #endif ) - and traverseSynTypeDefn path (SynTypeDefn.TypeDefn(synComponentInfo, synTypeDefnRepr, synMemberDefns, tRange) as tydef) = + and traverseSynTypeDefn path (SynTypeDefn.TypeDefn(synComponentInfo, synTypeDefnRepr, synMemberDefns, _, tRange) as tydef) = let path = TraverseStep.TypeDefn tydef :: path match visitor.VisitComponentInfo synComponentInfo with diff --git a/src/fsharp/service/ServiceStructure.fs b/src/fsharp/service/ServiceStructure.fs index 9294d1b609..9cd2877c6d 100644 --- a/src/fsharp/service/ServiceStructure.fs +++ b/src/fsharp/service/ServiceStructure.fs @@ -537,7 +537,7 @@ module Structure = parseAttributes attrs | _ -> () - and parseTypeDefn (TypeDefn(ComponentInfo(_, typeArgs, _, _, _, _, _, r), objectModel, members, fullrange)) = + and parseTypeDefn (TypeDefn(ComponentInfo(_, typeArgs, _, _, _, _, _, r), objectModel, members, _, fullrange)) = let typeArgsRange = rangeOfTypeArgsElse r typeArgs let collapse = Range.endToEnd (Range.modEnd 1 typeArgsRange) fullrange match objectModel with diff --git a/src/fsharp/service/ServiceUntypedParse.fs b/src/fsharp/service/ServiceUntypedParse.fs index 626898a9db..9a11ab9eca 100755 --- a/src/fsharp/service/ServiceUntypedParse.fs +++ b/src/fsharp/service/ServiceUntypedParse.fs @@ -600,7 +600,7 @@ type FSharpParseFileResults(errors: FSharpDiagnostic[], input: ParsedInput optio yield! walkExpr true e ] // Process a class declaration or F# type declaration - let rec walkTycon (TypeDefn(ComponentInfo(_, _, _, _, _, _, _, _), repr, membDefns, m)) = + let rec walkTycon (TypeDefn(ComponentInfo(_, _, _, _, _, _, _, _), repr, membDefns, _, m)) = if not (isMatchRange m) then [] else [ for memb in membDefns do yield! walkMember memb match repr with @@ -1236,7 +1236,7 @@ module UntypedParseImpl = | SynTypeDefnSigRepr.Simple(defn, _) -> walkTypeDefnSimple defn | SynTypeDefnSigRepr.Exception(_) -> None - and walkTypeDefn (TypeDefn (info, repr, members, _)) = + and walkTypeDefn (TypeDefn (info, repr, members, _, _)) = walkComponentInfo false info |> Option.orElse (walkTypeDefnRepr repr) |> Option.orElse (List.tryPick walkMember members) @@ -1489,7 +1489,7 @@ module UntypedParseImpl = let contextFromTreePath completionPath = // detect records usage in constructor match path with - | TS.Expr(_) :: TS.Binding(_) :: TS.MemberDefn(_) :: TS.TypeDefn(SynTypeDefn.TypeDefn(ComponentInfo(_, _, _, [id], _, _, _, _), _, _, _)) :: _ -> + | TS.Expr(_) :: TS.Binding(_) :: TS.MemberDefn(_) :: TS.TypeDefn(SynTypeDefn.TypeDefn(ComponentInfo(_, _, _, [id], _, _, _, _), _, _, _, _)) :: _ -> RecordContext.Constructor(id.idText) | _ -> RecordContext.New completionPath match field with diff --git a/src/fsharp/service/ServiceXmlDocParser.fs b/src/fsharp/service/ServiceXmlDocParser.fs index 222ebdfa2b..7c1342eb05 100644 --- a/src/fsharp/service/ServiceXmlDocParser.fs +++ b/src/fsharp/service/ServiceXmlDocParser.fs @@ -96,7 +96,7 @@ module XmlDocParsing = and getXmlDocablesSynModuleOrNamespace (SynModuleOrNamespace(_, _, _, synModuleDecls, _, _, _, _)) = (synModuleDecls |> List.collect getXmlDocablesSynModuleDecl) - and getXmlDocablesSynTypeDefn (SynTypeDefn.TypeDefn(ComponentInfo(synAttributes, _, _, _, preXmlDoc, _, _, compRange), synTypeDefnRepr, synMemberDefns, tRange)) = + and getXmlDocablesSynTypeDefn (SynTypeDefn.TypeDefn(ComponentInfo(synAttributes, _, _, _, preXmlDoc, _, _, compRange), synTypeDefnRepr, synMemberDefns, _, tRange)) = let stuff = match synTypeDefnRepr with | SynTypeDefnRepr.ObjectModel(_, synMemberDefns, _) -> (synMemberDefns |> List.collect getXmlDocablesSynMemberDefn) diff --git a/tests/service/InteractiveCheckerTests.fs b/tests/service/InteractiveCheckerTests.fs index 3f24bd79df..fbaed2c1bf 100644 --- a/tests/service/InteractiveCheckerTests.fs +++ b/tests/service/InteractiveCheckerTests.fs @@ -31,7 +31,7 @@ let internal identsAndRanges (input: ParsedInput) = // TODO : attrs, typarDecls and typarConstraints [identAndRange (longIdentToString longIdent) range] let extractFromTypeDefn (typeDefn: SynTypeDefn) = - let (SynTypeDefn.TypeDefn(componentInfo, _repr, _members, _)) = typeDefn + let (SynTypeDefn.TypeDefn(componentInfo, _repr, _members, _, _)) = typeDefn // TODO : repr and members extractFromComponentInfo componentInfo let rec extractFromModuleDecl (moduleDecl: SynModuleDecl) = diff --git a/tests/service/ServiceUntypedParseTests.fs b/tests/service/ServiceUntypedParseTests.fs index 5d00a4f440..edf8d9235f 100644 --- a/tests/service/ServiceUntypedParseTests.fs +++ b/tests/service/ServiceUntypedParseTests.fs @@ -199,7 +199,7 @@ module TypeMemberRanges = let getTypeMemberRange source = let (SynModuleOrNamespace (decls = decls)) = parseSourceCodeAndGetModule source match decls with - | [ SynModuleDecl.Types ([ TypeDefn (_, SynTypeDefnRepr.ObjectModel (_, memberDecls, _), _, _) ], _) ] -> + | [ SynModuleDecl.Types ([ TypeDefn (_, SynTypeDefnRepr.ObjectModel (_, memberDecls, _), _, _, _) ], _) ] -> memberDecls |> List.map (fun memberDecl -> getRangeCoords memberDecl.Range) | _ -> failwith "Could not get member" From c1aaab523dcbc32a9bb56926b8dc080e50c00fcf Mon Sep 17 00:00:00 2001 From: Eugene Auduchinok Date: Thu, 28 Jan 2021 23:55:44 +0300 Subject: [PATCH 2/2] Update surface area --- .../FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs b/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs index a20fead075..fcb169c868 100644 --- a/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs +++ b/tests/FSharp.Compiler.Service.Tests/SurfaceArea.netstandard.fs @@ -8870,7 +8870,9 @@ FSharp.Compiler.SyntaxTree+SynTypeDefn: Microsoft.FSharp.Collections.FSharpList` FSharp.Compiler.SyntaxTree+SynTypeDefn: Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynMemberDefn] members FSharp.Compiler.SyntaxTree+SynTypeDefn: SynComponentInfo get_typeInfo() FSharp.Compiler.SyntaxTree+SynTypeDefn: SynComponentInfo typeInfo -FSharp.Compiler.SyntaxTree+SynTypeDefn: SynTypeDefn NewTypeDefn(SynComponentInfo, SynTypeDefnRepr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynMemberDefn], FSharp.Compiler.Text.Range) +FSharp.Compiler.SyntaxTree+SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTree+SynMemberDefn] get_implicitConstructor() +FSharp.Compiler.SyntaxTree+SynTypeDefn: Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTree+SynMemberDefn] implicitConstructor +FSharp.Compiler.SyntaxTree+SynTypeDefn: SynTypeDefn NewTypeDefn(SynComponentInfo, SynTypeDefnRepr, Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.SyntaxTree+SynMemberDefn], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.SyntaxTree+SynMemberDefn], FSharp.Compiler.Text.Range) FSharp.Compiler.SyntaxTree+SynTypeDefn: SynTypeDefnRepr get_typeRepr() FSharp.Compiler.SyntaxTree+SynTypeDefn: SynTypeDefnRepr typeRepr FSharp.Compiler.SyntaxTree+SynTypeDefn: System.String ToString()