Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extend signature AST walking #161

Merged
merged 4 commits into from
Nov 14, 2023
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
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.20.1] - 2023-11-14

### Fixed
* [Extend signature AST walking](https://github.com/ionide/FSharp.Analyzers.SDK/pull/161) (thanks @nojaf!)

## [0.20.0] - 2023-11-13

### Fixed
Expand Down
25 changes: 22 additions & 3 deletions src/FSharp.Analyzers.SDK/ASTCollecting.fs
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,8 @@ module ASTCollecting =
default _.WalkTypeDefnRepr typeDefnRepr = ()
abstract WalkTypeDefn: SynTypeDefn -> unit
default _.WalkTypeDefn typeDefn = ()
abstract WalkTypeDefnSig: typeDefn: SynTypeDefnSig -> unit
default _.WalkTypeDefnSig typeDefn = ()

let walkAst (walker: SyntaxCollectorBase) (input: ParsedInput) : unit =

Expand Down Expand Up @@ -562,6 +564,20 @@ module ASTCollecting =
Option.iter walkMember implicitCtor
List.iter walkMember members

and walkTypeDefnSig (SynTypeDefnSig(info, repr, members, r, _) as s) =
walker.WalkTypeDefnSig s

let isTypeExtensionOrAlias =
match repr with
| SynTypeDefnSigRepr.ObjectModel(kind = SynTypeDefnKind.Augmentation _)
| SynTypeDefnSigRepr.ObjectModel(kind = SynTypeDefnKind.Abbrev)
| SynTypeDefnSigRepr.Simple(repr = SynTypeDefnSimpleRepr.TypeAbbrev _) -> true
| _ -> false

walkComponentInfo isTypeExtensionOrAlias info
walkTypeDefnSigRepr repr
List.iter walkMemberSig members

and walkSynModuleDecl (decl: SynModuleDecl) =
walker.WalkSynModuleDecl decl

Expand All @@ -585,10 +601,13 @@ module ASTCollecting =

match decl with
| SynModuleSigDecl.ModuleAbbrev _ -> ()
| SynModuleSigDecl.NestedModule _ -> ()
| SynModuleSigDecl.NestedModule(moduleInfo = info; moduleDecls = decls) ->
walkComponentInfo false info
List.iter walkSynModuleSigDecl decls
| SynModuleSigDecl.Val(s, _range) -> walkValSig s
| SynModuleSigDecl.Types _ -> ()
| SynModuleSigDecl.Exception _ -> ()
| SynModuleSigDecl.Types(types, _) -> List.iter walkTypeDefnSig types
| SynModuleSigDecl.Exception(exnSig = SynExceptionSig(exnRepr = SynExceptionDefnRepr(caseName = unionCase))) ->
walkUnionCase unionCase
| SynModuleSigDecl.Open _ -> ()
| SynModuleSigDecl.HashDirective _ -> ()
| SynModuleSigDecl.NamespaceFragment _ -> ()
Expand Down
66 changes: 34 additions & 32 deletions src/FSharp.Analyzers.SDK/ASTCollecting.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -10,127 +10,129 @@ module ASTCollecting =

/// Overwriting this member hooks up a custom operation for a module or namespace syntax element.
abstract WalkSynModuleOrNamespace: moduleOrNamespace: SynModuleOrNamespace -> unit
default WalkSynModuleOrNamespace: moduleOrNamespace: FSharp.Compiler.Syntax.SynModuleOrNamespace -> unit
default WalkSynModuleOrNamespace: moduleOrNamespace: SynModuleOrNamespace -> unit

/// Overwriting this member hooks up a custom operation for a module or namespace syntax element in a signature file.
abstract WalkSynModuleOrNamespaceSig: moduleOrNamespaceSig: SynModuleOrNamespaceSig -> unit

default WalkSynModuleOrNamespaceSig:
moduleOrNamespaceSig: FSharp.Compiler.Syntax.SynModuleOrNamespaceSig -> unit
default WalkSynModuleOrNamespaceSig: moduleOrNamespaceSig: SynModuleOrNamespaceSig -> unit

/// Overwriting this member hooks up a custom operation for an attribute.
abstract WalkAttribute: attribute: SynAttribute -> unit
default WalkAttribute: attribute: FSharp.Compiler.Syntax.SynAttribute -> unit
default WalkAttribute: attribute: SynAttribute -> unit

/// Overwriting this member hooks up a custom operation for declarations inside a module.
abstract WalkSynModuleDecl: moduleDecl: SynModuleDecl -> unit
default WalkSynModuleDecl: moduleDecl: FSharp.Compiler.Syntax.SynModuleDecl -> unit
default WalkSynModuleDecl: moduleDecl: SynModuleDecl -> unit

/// Overwriting this member hooks up a custom operation for declarations inside a module or namespace in a signature file.
abstract WalkSynModuleSigDecl: moduleSigDecl: SynModuleSigDecl -> unit
default WalkSynModuleSigDecl: moduleSigDecl: FSharp.Compiler.Syntax.SynModuleSigDecl -> unit
default WalkSynModuleSigDecl: moduleSigDecl: SynModuleSigDecl -> unit

/// Overwriting this member hooks up a custom operation for syntax expressions.
abstract WalkExpr: expr: SynExpr -> unit
default WalkExpr: expr: FSharp.Compiler.Syntax.SynExpr -> unit
default WalkExpr: expr: SynExpr -> unit

/// Overwriting this member hooks up a custom operation for type parameters.
abstract WalkTypar: typar: SynTypar -> unit
default WalkTypar: typar: FSharp.Compiler.Syntax.SynTypar -> unit
default WalkTypar: typar: SynTypar -> unit

/// Overwriting this member hooks up a custom operation for explicit declarations of type parameters.
abstract WalkTyparDecl: typarDecl: SynTyparDecl -> unit
default WalkTyparDecl: typarDecl: FSharp.Compiler.Syntax.SynTyparDecl -> unit
default WalkTyparDecl: typarDecl: SynTyparDecl -> unit

/// Overwriting this member hooks up a custom operation for type constraints.
abstract WalkTypeConstraint: typeConstraint: SynTypeConstraint -> unit
default WalkTypeConstraint: typeConstraint: FSharp.Compiler.Syntax.SynTypeConstraint -> unit
default WalkTypeConstraint: typeConstraint: SynTypeConstraint -> unit

/// Overwriting this member hooks up a custom operation for types.
abstract WalkType: ``type``: SynType -> unit
default WalkType: ``type``: FSharp.Compiler.Syntax.SynType -> unit
default WalkType: ``type``: SynType -> unit

/// Overwriting this member hooks up a custom operation for member signatures.
abstract WalkMemberSig: memberSig: SynMemberSig -> unit
default WalkMemberSig: memberSig: FSharp.Compiler.Syntax.SynMemberSig -> unit
default WalkMemberSig: memberSig: SynMemberSig -> unit

/// Overwriting this member hooks up a custom operation for F# patterns.
abstract WalkPat: pat: SynPat -> unit
default WalkPat: pat: FSharp.Compiler.Syntax.SynPat -> unit
default WalkPat: pat: SynPat -> unit

/// Overwriting this member hooks up a custom operation for type parameters for a member of function.
abstract WalkValTyparDecls: valTyparDecls: SynValTyparDecls -> unit
default WalkValTyparDecls: valTyparDecls: FSharp.Compiler.Syntax.SynValTyparDecls -> unit
default WalkValTyparDecls: valTyparDecls: SynValTyparDecls -> unit

/// Overwriting this member hooks up a custom operation for a binding of a 'let' or 'member' declaration.
abstract WalkBinding: binding: SynBinding -> unit
default WalkBinding: binding: FSharp.Compiler.Syntax.SynBinding -> unit
default WalkBinding: binding: SynBinding -> unit

/// Overwriting this member hooks up a custom operation for simple F# patterns.
abstract WalkSimplePat: simplePat: SynSimplePat -> unit
default WalkSimplePat: simplePat: FSharp.Compiler.Syntax.SynSimplePat -> unit
default WalkSimplePat: simplePat: SynSimplePat -> unit

/// Overwriting this member hooks up a custom operation for interface implementations.
abstract WalkInterfaceImpl: interfaceImpl: SynInterfaceImpl -> unit
default WalkInterfaceImpl: interfaceImpl: FSharp.Compiler.Syntax.SynInterfaceImpl -> unit
default WalkInterfaceImpl: interfaceImpl: SynInterfaceImpl -> unit

/// Overwriting this member hooks up a custom operation for clauses in a 'match' expression.
abstract WalkClause: matchClause: SynMatchClause -> unit
default WalkClause: matchClause: FSharp.Compiler.Syntax.SynMatchClause -> unit
default WalkClause: matchClause: SynMatchClause -> unit

/// Overwriting this member hooks up a custom operation for the parts of an interpolated string.
abstract WalkInterpolatedStringPart: interpolatedStringPart: SynInterpolatedStringPart -> unit

default WalkInterpolatedStringPart:
interpolatedStringPart: FSharp.Compiler.Syntax.SynInterpolatedStringPart -> unit
default WalkInterpolatedStringPart: interpolatedStringPart: SynInterpolatedStringPart -> unit

/// Overwriting this member hooks up a custom operation for units of measure annotations.
abstract WalkMeasure: measure: SynMeasure -> unit
default WalkMeasure: measure: FSharp.Compiler.Syntax.SynMeasure -> unit
default WalkMeasure: measure: SynMeasure -> unit

/// Overwriting this member hooks up a custom operation for the name of a type definition or module.
abstract WalkComponentInfo: componentInfo: SynComponentInfo -> unit
default WalkComponentInfo: componentInfo: FSharp.Compiler.Syntax.SynComponentInfo -> unit
default WalkComponentInfo: componentInfo: SynComponentInfo -> unit

/// Overwriting this member hooks up a custom operation for the right-hand-side of a type definition.
abstract WalkTypeDefnSigRepr: typeDefnSigRepr: SynTypeDefnSigRepr -> unit
default WalkTypeDefnSigRepr: typeDefnSigRepr: FSharp.Compiler.Syntax.SynTypeDefnSigRepr -> unit
default WalkTypeDefnSigRepr: typeDefnSigRepr: SynTypeDefnSigRepr -> unit

/// Overwriting this member hooks up a custom operation for the right-hand-side of union definition, excluding members.
abstract WalkUnionCaseType: unionCaseKind: SynUnionCaseKind -> unit
default WalkUnionCaseType: unionCaseKind: FSharp.Compiler.Syntax.SynUnionCaseKind -> unit
default WalkUnionCaseType: unionCaseKind: SynUnionCaseKind -> unit

/// Overwriting this member hooks up a custom operation for the cases of an enum definition.
abstract WalkEnumCase: enumCase: SynEnumCase -> unit
default WalkEnumCase: enumCase: FSharp.Compiler.Syntax.SynEnumCase -> unit
default WalkEnumCase: enumCase: SynEnumCase -> unit

/// Overwriting this member hooks up a custom operation for field declarations in a record or class.
abstract WalkField: field: SynField -> unit
default WalkField: field: FSharp.Compiler.Syntax.SynField -> unit
default WalkField: field: SynField -> unit

/// Overwriting this member hooks up a custom operation for the core of a simple type definition.
abstract WalkTypeDefnSimple: typeDefnSimpleRepr: SynTypeDefnSimpleRepr -> unit
default WalkTypeDefnSimple: typeDefnSimpleRepr: FSharp.Compiler.Syntax.SynTypeDefnSimpleRepr -> unit
default WalkTypeDefnSimple: typeDefnSimpleRepr: SynTypeDefnSimpleRepr -> unit

/// Overwriting this member hooks up a custom operation for a 'val' definition in an abstract slot or a signature file.
abstract WalkValSig: valSig: SynValSig -> unit
default WalkValSig: valSig: FSharp.Compiler.Syntax.SynValSig -> unit
default WalkValSig: valSig: SynValSig -> unit

/// Overwriting this member hooks up a custom operation for an element within a type definition.
abstract WalkMember: memberDefn: SynMemberDefn -> unit
default WalkMember: memberDefn: FSharp.Compiler.Syntax.SynMemberDefn -> unit
default WalkMember: memberDefn: SynMemberDefn -> unit

/// Overwriting this member hooks up a custom operation for the cases of an union definition.
abstract WalkUnionCase: unionCase: SynUnionCase -> unit
default WalkUnionCase: unionCase: FSharp.Compiler.Syntax.SynUnionCase -> unit
default WalkUnionCase: unionCase: SynUnionCase -> unit

/// Overwriting this member hooks up a custom operation for the right hand side of a type or exception declaration.
abstract WalkTypeDefnRepr: typeDefnRepr: SynTypeDefnRepr -> unit
default WalkTypeDefnRepr: typeDefnRepr: FSharp.Compiler.Syntax.SynTypeDefnRepr -> unit
default WalkTypeDefnRepr: typeDefnRepr: SynTypeDefnRepr -> unit

/// Overwriting this member hooks up a custom operation for a type or exception declaration.
abstract WalkTypeDefn: typeDefn: SynTypeDefn -> unit
default WalkTypeDefn: typeDefn: FSharp.Compiler.Syntax.SynTypeDefn -> unit
default WalkTypeDefn: typeDefn: SynTypeDefn -> unit

/// Overwriting this member hooks up a custom operation for a type or exception signature declaration.
abstract WalkTypeDefnSig: typeDefn: SynTypeDefnSig -> unit
default WalkTypeDefnSig: typeDefn: SynTypeDefnSig -> unit

/// Traverses the whole AST and calls the appropriate members of the given SyntaxCollectorBase
/// to process the syntax elements.
Expand Down