Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/fsharp/CheckDeclarations.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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, _, _) -> ()
Expand Down Expand Up @@ -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) ->
Expand Down Expand Up @@ -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 _ ->
Expand Down
1 change: 1 addition & 0 deletions src/fsharp/SyntaxTree.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1877,6 +1877,7 @@ type SynTypeDefn =
typeInfo: SynComponentInfo *
typeRepr: SynTypeDefnRepr *
members: SynMemberDefns *
implicitConstructor: SynMemberDefn option *
range: range

/// Gets the syntax range of this construct
Expand Down
12 changes: 6 additions & 6 deletions src/fsharp/pars.fsy
Original file line number Diff line number Diff line change
Expand Up @@ -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) ) ] }

Expand Down Expand Up @@ -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 (
Expand All @@ -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
Expand All @@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceAssemblyContent.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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, _, _)) =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should walk the implicit ctor if it's there

let isTypeExtensionOrAlias =
match repr with
| SynTypeDefnRepr.ObjectModel (SynTypeDefnKind.TyconAugmentation, _, _)
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 @@ -702,7 +702,7 @@ module InterfaceStubGenerator =
| SynModuleDecl.Open _ ->
None

and walkSynTypeDefn(TypeDefn(_componentInfo, representation, members, range)) =
and walkSynTypeDefn(TypeDefn(_componentInfo, representation, members, _, range)) =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should walk the implicit ctor if it's there

if not <| rangeContainsPos range pos then
None
else
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 @@ -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)) =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should walk the implicit ctor if it's there?

let topMembers = processMembers membDefns FSharpEnclosingEntityKind.Class |> snd
match repr with
| SynTypeDefnRepr.Exception repr -> processExnDefnRepr baseName [] repr
Expand Down Expand Up @@ -686,7 +686,7 @@ module NavigateTo =
| SynModuleDecl.HashDirective _
| SynModuleDecl.Open _ -> ()

and walkSynTypeDefn(TypeDefn(componentInfo, representation, members, _)) container =
and walkSynTypeDefn(TypeDefn(componentInfo, representation, members, _, _)) container =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should walk the implicit ctor if it's there

let container = addComponentInfo ContainerType.Type NavigableItemKind.Type componentInfo false container
walkSynTypeDefnRepr representation container
for m in members do
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 @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceStructure.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
6 changes: 3 additions & 3 deletions src/fsharp/service/ServiceUntypedParse.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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)) =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should walk the implicit ctor if it's there

Copy link
Member Author

@auduchinok auduchinok Jan 29, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I expect it to walk in it for object model types if it already does (via repr members), this behaviour hasn't changed. Do you mean it should walk in it for types that don't allow implicit constructors too? This PR only adds possibly thrown out constructors back, so it's possible to inspect them via syntax tree inside non-object model types too (via a separate field that is ignored by the type checker).

if not (isMatchRange m) then [] else
[ for memb in membDefns do yield! walkMember memb
match repr with
Expand Down Expand Up @@ -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, _, _)) =
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should walk the implicit ctor if it's there

walkComponentInfo false info
|> Option.orElse (walkTypeDefnRepr repr)
|> Option.orElse (List.tryPick walkMember members)
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/service/ServiceXmlDocParser.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
2 changes: 1 addition & 1 deletion tests/service/InteractiveCheckerTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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) =
Expand Down
2 changes: 1 addition & 1 deletion tests/service/ServiceUntypedParseTests.fs
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand Down