diff --git a/src/Compiler/Service/ServiceParseTreeWalk.fs b/src/Compiler/Service/ServiceParseTreeWalk.fs index a1d674e2fb6..025ab8a665d 100644 --- a/src/Compiler/Service/ServiceParseTreeWalk.fs +++ b/src/Compiler/Service/ServiceParseTreeWalk.fs @@ -25,6 +25,11 @@ type SyntaxNode = | SynMemberDefn of SynMemberDefn | SynMatchClause of SynMatchClause | SynBinding of SynBinding + | SynModuleOrNamespaceSig of SynModuleOrNamespaceSig + | SynModuleSigDecl of SynModuleSigDecl + | SynValSig of SynValSig + | SynTypeDefnSig of SynTypeDefnSig + | SynMemberSig of SynMemberSig type SyntaxVisitorPath = SyntaxNode list @@ -184,6 +189,28 @@ type SyntaxVisitorBase<'T>() = ignore (path, attributes) None + /// VisitModuleOrNamespaceSig allows overriding behavior when visiting module or namespaces + abstract VisitModuleOrNamespaceSig: path: SyntaxVisitorPath * synModuleOrNamespaceSig: SynModuleOrNamespaceSig -> 'T option + + default _.VisitModuleOrNamespaceSig(path, synModuleOrNamespaceSig) = + ignore (path, synModuleOrNamespaceSig) + None + + /// VisitModuleDecl allows overriding signature module declaration behavior + abstract VisitModuleSigDecl: + path: SyntaxVisitorPath * defaultTraverse: (SynModuleSigDecl -> 'T option) * synModuleSigDecl: SynModuleSigDecl -> 'T option + + default _.VisitModuleSigDecl(path, defaultTraverse, synModuleSigDecl) = + ignore path + defaultTraverse synModuleSigDecl + + /// VisitValSig allows overriding SynValSig behavior + abstract VisitValSig: path: SyntaxVisitorPath * defaultTraverse: (SynValSig -> 'T option) * valSig: SynValSig -> 'T option + + default _.VisitValSig(path, defaultTraverse, valSig) = + ignore path + defaultTraverse valSig + /// A range of utility functions to assist with traversing an AST module SyntaxTraversal = // treat ranges as though they are half-open: [,) @@ -926,6 +953,101 @@ module SyntaxTraversal = attributes |> List.map (fun attributes -> dive () attributes.Range (fun () -> visitor.VisitAttributeApplication(origPath, attributes))) + and traverseSynModuleOrNamespaceSig origPath (SynModuleOrNamespaceSig (decls = synModuleSigDecls; range = range) as mors) = + match visitor.VisitModuleOrNamespaceSig(origPath, mors) with + | Some x -> Some x + | None -> + let path = SyntaxNode.SynModuleOrNamespaceSig mors :: origPath + + synModuleSigDecls + |> List.map (fun x -> dive x x.Range (traverseSynModuleSigDecl path)) + |> pick range mors + + and traverseSynModuleSigDecl origPath (decl: SynModuleSigDecl) = + let pick = pick decl.Range + + let defaultTraverse m = + let path = SyntaxNode.SynModuleSigDecl m :: origPath + + match m with + | SynModuleSigDecl.ModuleAbbrev (_ident, _longIdent, _range) -> None + | SynModuleSigDecl.NestedModule (moduleDecls = synModuleDecls; moduleInfo = SynComponentInfo (attributes = attributes)) -> + synModuleDecls + |> List.map (fun x -> dive x x.Range (traverseSynModuleSigDecl path)) + |> List.append (attributeApplicationDives path attributes) + |> pick decl + | SynModuleSigDecl.Val (synValSig, range) -> [ dive synValSig range (traverseSynValSig path) ] |> pick decl + | SynModuleSigDecl.Types (types = types; range = range) -> + types + |> List.map (fun t -> dive t range (traverseSynTypeDefnSig path)) + |> pick decl + | SynModuleSigDecl.Exception (_synExceptionDefn, _range) -> None + | SynModuleSigDecl.Open (_target, _range) -> None + | SynModuleSigDecl.HashDirective (parsedHashDirective, range) -> + visitor.VisitHashDirective(path, parsedHashDirective, range) + | SynModuleSigDecl.NamespaceFragment synModuleOrNamespaceSig -> traverseSynModuleOrNamespaceSig path synModuleOrNamespaceSig + + visitor.VisitModuleSigDecl(origPath, defaultTraverse, decl) + + and traverseSynValSig origPath (valSig: SynValSig) = + let defaultTraverse (SynValSig (synType = t; attributes = attributes; synExpr = expr; range = m)) = + let path = SyntaxNode.SynValSig valSig :: origPath + + [ + yield! attributeApplicationDives path attributes + yield dive t t.Range (traverseSynType path) + match expr with + | Some expr -> yield dive expr expr.Range (traverseSynExpr path) + | None -> () + ] + |> pick m valSig + + visitor.VisitValSig(origPath, defaultTraverse, valSig) + + and traverseSynTypeDefnSig origPath (SynTypeDefnSig (synComponentInfo, typeRepr, members, tRange, _) as tydef) = + let path = SyntaxNode.SynTypeDefnSig tydef :: origPath + + match visitor.VisitComponentInfo(origPath, synComponentInfo) with + | Some x -> Some x + | None -> + match synComponentInfo with + | SynComponentInfo (attributes = attributes) -> + [ + yield! attributeApplicationDives path attributes + + match typeRepr with + | SynTypeDefnSigRepr.Exception _ -> + // This node is generated in CheckExpressions.fs, not in the AST. + // But note exception declarations are missing from this tree walk. + () + | SynTypeDefnSigRepr.ObjectModel (memberSigs = memberSigs) -> + yield! memberSigs |> List.map (fun ms -> dive ms ms.Range (traverseSynMemberSig path)) + | SynTypeDefnSigRepr.Simple (synTypeDefnSimpleRepr, _range) -> + match synTypeDefnSimpleRepr with + | SynTypeDefnSimpleRepr.Record (_synAccessOption, fields, m) -> + yield dive () typeRepr.Range (fun () -> traverseRecordDefn path fields m) + | SynTypeDefnSimpleRepr.Union (_synAccessOption, cases, m) -> + yield dive () typeRepr.Range (fun () -> traverseUnionDefn path cases m) + | SynTypeDefnSimpleRepr.Enum (cases, m) -> + yield dive () typeRepr.Range (fun () -> traverseEnumDefn path cases m) + | SynTypeDefnSimpleRepr.TypeAbbrev (_, synType, m) -> + yield dive typeRepr typeRepr.Range (fun _ -> visitor.VisitTypeAbbrev(path, synType, m)) + | _ -> () + yield! members |> List.map (fun ms -> dive ms ms.Range (traverseSynMemberSig path)) + ] + |> pick tRange tydef + + and traverseSynMemberSig path (m: SynMemberSig) = + let path = SyntaxNode.SynMemberSig m :: path + + match m with + | SynMemberSig.Member (memberSig = memberSig) -> traverseSynValSig path memberSig + | SynMemberSig.Interface (interfaceType = synType) -> traverseSynType path synType + | SynMemberSig.Inherit (inheritedType = synType) -> traverseSynType path synType + | SynMemberSig.ValField(field = SynField (attributes = attributes)) -> + attributeApplicationDives path attributes |> pick m.Range attributes + | SynMemberSig.NestedType (nestedType = nestedType) -> traverseSynTypeDefnSig path nestedType + match parseTree with | ParsedInput.ImplFile file -> let l = file.Contents @@ -941,4 +1063,17 @@ module SyntaxTraversal = l |> List.map (fun x -> dive x x.Range (traverseSynModuleOrNamespace [])) |> pick fileRange l - | ParsedInput.SigFile _sigFile -> None + | ParsedInput.SigFile sigFile -> + let l = sigFile.Contents + + let fileRange = +#if DEBUG + match l with + | [] -> range0 + | _ -> l |> List.map (fun x -> x.Range) |> List.reduce unionRanges +#else + range0 // only used for asserting, does not matter in non-debug +#endif + l + |> List.map (fun x -> dive x x.Range (traverseSynModuleOrNamespaceSig [])) + |> pick fileRange l diff --git a/src/Compiler/Service/ServiceParseTreeWalk.fsi b/src/Compiler/Service/ServiceParseTreeWalk.fsi index d073ca1e73c..0a17dd468ec 100644 --- a/src/Compiler/Service/ServiceParseTreeWalk.fsi +++ b/src/Compiler/Service/ServiceParseTreeWalk.fsi @@ -17,6 +17,11 @@ type SyntaxNode = | SynMemberDefn of SynMemberDefn | SynMatchClause of SynMatchClause | SynBinding of SynBinding + | SynModuleOrNamespaceSig of SynModuleOrNamespaceSig + | SynModuleSigDecl of SynModuleSigDecl + | SynValSig of SynValSig + | SynTypeDefnSig of SynTypeDefnSig + | SynMemberSig of SynMemberSig type SyntaxVisitorPath = SyntaxNode list @@ -151,6 +156,24 @@ type SyntaxVisitorBase<'T> = abstract VisitAttributeApplication: path: SyntaxVisitorPath * attributes: SynAttributeList -> 'T option default VisitAttributeApplication: path: SyntaxVisitorPath * attributes: SynAttributeList -> 'T option + abstract VisitModuleOrNamespaceSig: + path: SyntaxVisitorPath * synModuleOrNamespaceSig: SynModuleOrNamespaceSig -> 'T option + default VisitModuleOrNamespaceSig: + path: SyntaxVisitorPath * synModuleOrNamespaceSig: SynModuleOrNamespaceSig -> 'T option + + abstract VisitModuleSigDecl: + path: SyntaxVisitorPath * defaultTraverse: (SynModuleSigDecl -> 'T option) * synModuleSigDecl: SynModuleSigDecl -> + 'T option + default VisitModuleSigDecl: + path: SyntaxVisitorPath * defaultTraverse: (SynModuleSigDecl -> 'T option) * synModuleSigDecl: SynModuleSigDecl -> + 'T option + + abstract VisitValSig: + path: SyntaxVisitorPath * defaultTraverse: (SynValSig -> 'T option) * valSig: SynValSig -> 'T option + + default VisitValSig: + path: SyntaxVisitorPath * defaultTraverse: (SynValSig -> 'T option) * valSig: SynValSig -> 'T option + module public SyntaxTraversal = val internal rangeContainsPosLeftEdgeInclusive: m1: range -> p: pos -> bool diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl index dd4fec52d42..9f3b2c381aa 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.debug.bsl @@ -9238,61 +9238,96 @@ FSharp.Compiler.Syntax.SyntaxNode+SynMatchClause: FSharp.Compiler.Syntax.SynMatc FSharp.Compiler.Syntax.SyntaxNode+SynMatchClause: FSharp.Compiler.Syntax.SynMatchClause get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn Item FSharp.Compiler.Syntax.SyntaxNode+SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynModule: FSharp.Compiler.Syntax.SynModuleDecl Item FSharp.Compiler.Syntax.SyntaxNode+SynModule: FSharp.Compiler.Syntax.SynModuleDecl get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace Item FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynModuleSigDecl: FSharp.Compiler.Syntax.SynModuleSigDecl Item +FSharp.Compiler.Syntax.SyntaxNode+SynModuleSigDecl: FSharp.Compiler.Syntax.SynModuleSigDecl get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynPat: FSharp.Compiler.Syntax.SynPat Item FSharp.Compiler.Syntax.SyntaxNode+SynPat: FSharp.Compiler.Syntax.SynPat get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynType: FSharp.Compiler.Syntax.SynType Item FSharp.Compiler.Syntax.SyntaxNode+SynType: FSharp.Compiler.Syntax.SynType get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefn Item FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefn get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefnSig: FSharp.Compiler.Syntax.SynTypeDefnSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefnSig: FSharp.Compiler.Syntax.SynTypeDefnSig get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynValSig: FSharp.Compiler.Syntax.SynValSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynValSig: FSharp.Compiler.Syntax.SynValSig get_Item() FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynBinding FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynExpr FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynMatchClause FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynMemberDefn +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynMemberSig FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModule FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModuleOrNamespace +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModuleOrNamespaceSig +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModuleSigDecl FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynPat FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynType FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynTypeDefn +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynTypeDefnSig +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynValSig FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynBinding FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynExpr FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynMatchClause FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynMemberDefn +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynMemberSig FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModule FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModuleOrNamespace +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModuleOrNamespaceSig +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModuleSigDecl FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynPat FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynType FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynTypeDefn +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynTypeDefnSig +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynValSig FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynBinding() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynExpr() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynMatchClause() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynMemberDefn() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynMemberSig() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModule() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModuleOrNamespace() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModuleOrNamespaceSig() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModuleSigDecl() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynPat() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynType() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynTypeDefn() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynTypeDefnSig() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynValSig() FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynBinding(FSharp.Compiler.Syntax.SynBinding) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynExpr(FSharp.Compiler.Syntax.SynExpr) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynMatchClause(FSharp.Compiler.Syntax.SynMatchClause) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynMemberDefn(FSharp.Compiler.Syntax.SynMemberDefn) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynMemberSig(FSharp.Compiler.Syntax.SynMemberSig) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModule(FSharp.Compiler.Syntax.SynModuleDecl) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModuleOrNamespace(FSharp.Compiler.Syntax.SynModuleOrNamespace) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModuleOrNamespaceSig(FSharp.Compiler.Syntax.SynModuleOrNamespaceSig) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModuleSigDecl(FSharp.Compiler.Syntax.SynModuleSigDecl) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynPat(FSharp.Compiler.Syntax.SynPat) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynType(FSharp.Compiler.Syntax.SynType) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynTypeDefn(FSharp.Compiler.Syntax.SynTypeDefn) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynTypeDefnSig(FSharp.Compiler.Syntax.SynTypeDefnSig) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynValSig(FSharp.Compiler.Syntax.SynValSig) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynBinding FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynExpr FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynMatchClause FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynMemberDefn +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynMemberSig FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModule FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespace +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespaceSig +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModuleSigDecl FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynPat FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynType FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefn +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefnSig +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynValSig FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+Tags FSharp.Compiler.Syntax.SyntaxNode: Int32 Tag FSharp.Compiler.Syntax.SyntaxNode: Int32 get_Tag() @@ -9311,6 +9346,8 @@ FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOptio FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitMatchClause(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynMatchClause,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynMatchClause) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleDecl(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynModuleDecl,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynModuleDecl) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleOrNamespace(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], FSharp.Compiler.Syntax.SynModuleOrNamespace) +FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleOrNamespaceSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], FSharp.Compiler.Syntax.SynModuleOrNamespaceSig) +FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleSigDecl(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynModuleSigDecl,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynModuleSigDecl) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitPat(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynPat,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynPat) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitRecordDefn(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynField], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitRecordField(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynLongIdent]) @@ -9318,6 +9355,7 @@ FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOptio FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitType(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynType,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynType) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitTypeAbbrev(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitUnionDefn(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynUnionCase], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitValSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynValSig,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynValSig) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Void .ctor() FSharp.Compiler.Syntax.TyparStaticReq+Tags: Int32 HeadType FSharp.Compiler.Syntax.TyparStaticReq+Tags: Int32 None diff --git a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl index dd4fec52d42..9f3b2c381aa 100644 --- a/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl +++ b/tests/FSharp.Compiler.Service.Tests/FSharp.Compiler.Service.SurfaceArea.netstandard20.release.bsl @@ -9238,61 +9238,96 @@ FSharp.Compiler.Syntax.SyntaxNode+SynMatchClause: FSharp.Compiler.Syntax.SynMatc FSharp.Compiler.Syntax.SyntaxNode+SynMatchClause: FSharp.Compiler.Syntax.SynMatchClause get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn Item FSharp.Compiler.Syntax.SyntaxNode+SynMemberDefn: FSharp.Compiler.Syntax.SynMemberDefn get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynMemberSig: FSharp.Compiler.Syntax.SynMemberSig get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynModule: FSharp.Compiler.Syntax.SynModuleDecl Item FSharp.Compiler.Syntax.SyntaxNode+SynModule: FSharp.Compiler.Syntax.SynModuleDecl get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace Item FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynModuleSigDecl: FSharp.Compiler.Syntax.SynModuleSigDecl Item +FSharp.Compiler.Syntax.SyntaxNode+SynModuleSigDecl: FSharp.Compiler.Syntax.SynModuleSigDecl get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynPat: FSharp.Compiler.Syntax.SynPat Item FSharp.Compiler.Syntax.SyntaxNode+SynPat: FSharp.Compiler.Syntax.SynPat get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynType: FSharp.Compiler.Syntax.SynType Item FSharp.Compiler.Syntax.SyntaxNode+SynType: FSharp.Compiler.Syntax.SynType get_Item() FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefn Item FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefn: FSharp.Compiler.Syntax.SynTypeDefn get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefnSig: FSharp.Compiler.Syntax.SynTypeDefnSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefnSig: FSharp.Compiler.Syntax.SynTypeDefnSig get_Item() +FSharp.Compiler.Syntax.SyntaxNode+SynValSig: FSharp.Compiler.Syntax.SynValSig Item +FSharp.Compiler.Syntax.SyntaxNode+SynValSig: FSharp.Compiler.Syntax.SynValSig get_Item() FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynBinding FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynExpr FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynMatchClause FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynMemberDefn +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynMemberSig FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModule FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModuleOrNamespace +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModuleOrNamespaceSig +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynModuleSigDecl FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynPat FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynType FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynTypeDefn +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynTypeDefnSig +FSharp.Compiler.Syntax.SyntaxNode+Tags: Int32 SynValSig FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynBinding FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynExpr FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynMatchClause FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynMemberDefn +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynMemberSig FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModule FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModuleOrNamespace +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModuleOrNamespaceSig +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynModuleSigDecl FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynPat FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynType FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynTypeDefn +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynTypeDefnSig +FSharp.Compiler.Syntax.SyntaxNode: Boolean IsSynValSig FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynBinding() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynExpr() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynMatchClause() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynMemberDefn() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynMemberSig() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModule() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModuleOrNamespace() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModuleOrNamespaceSig() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynModuleSigDecl() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynPat() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynType() FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynTypeDefn() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynTypeDefnSig() +FSharp.Compiler.Syntax.SyntaxNode: Boolean get_IsSynValSig() FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynBinding(FSharp.Compiler.Syntax.SynBinding) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynExpr(FSharp.Compiler.Syntax.SynExpr) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynMatchClause(FSharp.Compiler.Syntax.SynMatchClause) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynMemberDefn(FSharp.Compiler.Syntax.SynMemberDefn) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynMemberSig(FSharp.Compiler.Syntax.SynMemberSig) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModule(FSharp.Compiler.Syntax.SynModuleDecl) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModuleOrNamespace(FSharp.Compiler.Syntax.SynModuleOrNamespace) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModuleOrNamespaceSig(FSharp.Compiler.Syntax.SynModuleOrNamespaceSig) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynModuleSigDecl(FSharp.Compiler.Syntax.SynModuleSigDecl) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynPat(FSharp.Compiler.Syntax.SynPat) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynType(FSharp.Compiler.Syntax.SynType) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynTypeDefn(FSharp.Compiler.Syntax.SynTypeDefn) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynTypeDefnSig(FSharp.Compiler.Syntax.SynTypeDefnSig) +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode NewSynValSig(FSharp.Compiler.Syntax.SynValSig) FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynBinding FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynExpr FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynMatchClause FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynMemberDefn +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynMemberSig FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModule FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespace +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModuleOrNamespaceSig +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynModuleSigDecl FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynPat FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynType FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefn +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynTypeDefnSig +FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+SynValSig FSharp.Compiler.Syntax.SyntaxNode: FSharp.Compiler.Syntax.SyntaxNode+Tags FSharp.Compiler.Syntax.SyntaxNode: Int32 Tag FSharp.Compiler.Syntax.SyntaxNode: Int32 get_Tag() @@ -9311,6 +9346,8 @@ FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOptio FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitMatchClause(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynMatchClause,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynMatchClause) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleDecl(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynModuleDecl,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynModuleDecl) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleOrNamespace(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], FSharp.Compiler.Syntax.SynModuleOrNamespace) +FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleOrNamespaceSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], FSharp.Compiler.Syntax.SynModuleOrNamespaceSig) +FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitModuleSigDecl(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynModuleSigDecl,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynModuleSigDecl) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitPat(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynPat,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynPat) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitRecordDefn(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynField], FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitRecordField(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynExpr], Microsoft.FSharp.Core.FSharpOption`1[FSharp.Compiler.Syntax.SynLongIdent]) @@ -9318,6 +9355,7 @@ FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOptio FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitType(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynType,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynType) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitTypeAbbrev(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], FSharp.Compiler.Syntax.SynType, FSharp.Compiler.Text.Range) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitUnionDefn(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SynUnionCase], FSharp.Compiler.Text.Range) +FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Microsoft.FSharp.Core.FSharpOption`1[T] VisitValSig(Microsoft.FSharp.Collections.FSharpList`1[FSharp.Compiler.Syntax.SyntaxNode], Microsoft.FSharp.Core.FSharpFunc`2[FSharp.Compiler.Syntax.SynValSig,Microsoft.FSharp.Core.FSharpOption`1[T]], FSharp.Compiler.Syntax.SynValSig) FSharp.Compiler.Syntax.SyntaxVisitorBase`1[T]: Void .ctor() FSharp.Compiler.Syntax.TyparStaticReq+Tags: Int32 HeadType FSharp.Compiler.Syntax.TyparStaticReq+Tags: Int32 None diff --git a/tests/FSharp.Compiler.UnitTests/TreeVisitorTests.fs b/tests/FSharp.Compiler.UnitTests/TreeVisitorTests.fs index 60ebf8c68d4..a450e3374d2 100644 --- a/tests/FSharp.Compiler.UnitTests/TreeVisitorTests.fs +++ b/tests/FSharp.Compiler.UnitTests/TreeVisitorTests.fs @@ -75,3 +75,95 @@ let ``Visit recursive let binding`` () = match SyntaxTraversal.Traverse(pos0, parseTree, visitor) with | Some [ SynBinding(valData = SynValData(valInfo = SynValInfo(curriedArgInfos = [ [ SynArgInfo(ident = Some id) ] ]))) ] when id.idText = "n" -> () | _ -> failwith "Did not visit recursive let binding" + +[] +let ``Visit ValSig`` () = + let visitor = + { new SyntaxVisitorBase<_>() with + member x.VisitValSig(path, defaultTraverse, SynValSig(ident = SynIdent(ident = valIdent))) = + Some valIdent.idText + } + + let source = """ +module X + +val y: int -> int +""" + + let parseTree = parseSourceCode("C:\\test.fsi", source) + + match SyntaxTraversal.Traverse(pos0, parseTree, visitor) with + | Some "y" -> () + | _ -> failwith "Did not visit SynValSig" + +[] +let ``Visit nested ValSig`` () = + let visitor = + { new SyntaxVisitorBase<_>() with + member x.VisitValSig(path, defaultTraverse, SynValSig(ident = SynIdent(ident = valIdent))) = + Some valIdent.idText + } + + let source = """ +module X + +module Y = + val z: int -> int +""" + + let parseTree = parseSourceCode("C:\\test.fsi", source) + + match SyntaxTraversal.Traverse(pos0, parseTree, visitor) with + | Some "z" -> () + | _ -> failwith "Did not visit SynValSig" + +[] +let ``Visit Record in SynTypeDefnSig`` () = + let visitor = + { new SyntaxVisitorBase<_>() with + member x.VisitRecordDefn(path, fields, range) = + fields + |> List.choose (fun (SynField(idOpt = idOpt)) -> idOpt |> Option.map (fun ident -> ident.idText)) + |> String.concat "," + |> Some + } + + let source = """ +module X + +type Y = + { + A: int + B: char + C: string + } +""" + + let parseTree = parseSourceCode("C:\\test.fsi", source) + + match SyntaxTraversal.Traverse(pos0, parseTree, visitor) with + | Some "A,B,C" -> () + | _ -> failwith "Did not visit SynTypeDefnSimpleRepr.Record in SynTypeDefnSig" + +[] +let ``Visit SynValSig in SynMemberSig`` () = + let visitor = + { new SyntaxVisitorBase<_>() with + member x.VisitValSig(path, defaultTraverse, SynValSig(ident = SynIdent(ident = valIdent))) = + Some valIdent.idText + } + + let source = """ +module Lib + +type Meh = + new: unit -> Meh + member Foo: y: int -> int +""" + + let parseTree = parseSourceCode("C:\\test.fsi", source) + let pos = mkPos 6 4 + + match SyntaxTraversal.Traverse(pos, parseTree, visitor) with + | Some "Foo" -> () + | _ -> failwith "Did not visit SynValSig in SynMemberSig.Member"