+
+
+
This tutorial demonstrates how to get the checked, typed expressions tree (TAST)
+for F# code and how to walk over the tree.
+
This can be used for creating tools such as source code analyzers and refactoring tools.
+You can also combine the information with the API available
+from symbols.
+
+NOTE: The FSharp.Compiler.Service API is subject to change when later versions of the nuget package are published
+
+
+
To access the type-checked, resolved expressions, you need to create an instance of InteractiveChecker
.
+
To use the interactive checker, reference FSharp.Compiler.Service.dll
and open the
+relevant namespaces:
+
#r "FSharp.Compiler.Service.dll"
+open System
+open System.IO
+open FSharp.Compiler.CodeAnalysis
+open FSharp.Compiler.EditorServices
+open FSharp.Compiler.Symbols
+open FSharp.Compiler.Text
+
+
+
We first parse and check some code as in the symbols tutorial.
+One difference is that we set keepAssemblyContents to true.
+
// Create an interactive checker instance
+let checker = FSharpChecker.Create(keepAssemblyContents=true)
+
+let parseAndCheckSingleFile (input) =
+ let file = Path.ChangeExtension(System.IO.Path.GetTempFileName(), "fsx")
+ File.WriteAllText(file, input)
+ // Get context representing a stand-alone (script) file
+ let projOptions, _errors =
+ checker.GetProjectOptionsFromScript(file, SourceText.ofString input, assumeDotNetFramework=false)
+ |> Async.RunSynchronously
+
+ checker.ParseAndCheckProject(projOptions)
+ |> Async.RunSynchronously
+
+
+
After type checking a file, you can access the declarations and contents of the assembly, including expressions:
+
let input2 =
+ """
+module MyLibrary
+
+open System
+
+let foo(x, y) =
+ let msg = String.Concat("Hello", " ", "world")
+ if msg.Length > 10 then
+ 10
+ else
+ 20
+
+type MyClass() =
+ member x.MyMethod() = 1
+ """
+let checkProjectResults =
+ parseAndCheckSingleFile(input2)
+
+checkProjectResults.Diagnostics // should be empty
+
+
Checked assemblies are made up of a series of checked implementation files. The "file" granularity
+matters in F# because initialization actions are triggered at the granularity of files.
+In this case there is only one implementation file in the project:
+
let checkedFile = checkProjectResults.AssemblyContents.ImplementationFiles.[0]
+
+
Checked assemblies are made up of a series of checked implementation files. The "file" granularity
+matters in F# because initialization actions are triggered at the granularity of files.
+In this case there is only one implementation file in the project:
+
let rec printDecl prefix d =
+ match d with
+ | FSharpImplementationFileDeclaration.Entity (e, subDecls) ->
+ printfn "%sEntity %s was declared and contains %d sub-declarations" prefix e.CompiledName subDecls.Length
+ for subDecl in subDecls do
+ printDecl (prefix+" ") subDecl
+ | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v, vs, e) ->
+ printfn "%sMember or value %s was declared" prefix v.CompiledName
+ | FSharpImplementationFileDeclaration.InitAction(e) ->
+ printfn "%sA top-level expression was declared" prefix
+
+
+for d in checkedFile.Declarations do
+ printDecl "" d
+
+// Entity MyLibrary was declared and contains 4 sub-declarations
+// Member or value foo was declared
+// Entity MyClass was declared and contains 0 sub-declarations
+// Member or value .ctor was declared
+// Member or value MyMethod was declared
+
+
As can be seen, the only declaration in the implementation file is that of the module MyLibrary, which
+contains fours sub-declarations.
+
+As an aside, one peculiarity here is that the member declarations (e.g. the "MyMethod" member) are returned as part of the containing module entity, not as part of their class.
+Note that the class constructor is returned as a separate declaration. The class type definition has been "split" into a constructor and the other declarations.
+
+
let myLibraryEntity, myLibraryDecls =
+ match checkedFile.Declarations.[0] with
+ | FSharpImplementationFileDeclaration.Entity (e, subDecls) -> (e, subDecls)
+ | _ -> failwith "unexpected"
+
+
What about the expressions, for example the body of function "foo"? Let's find it:
+
let (fooSymbol, fooArgs, fooExpression) =
+ match myLibraryDecls.[0] with
+ | FSharpImplementationFileDeclaration.MemberOrFunctionOrValue(v, vs, e) -> (v, vs, e)
+ | _ -> failwith "unexpected"
+
+
Here 'fooSymbol' is a symbol associated with the declaration of 'foo',
+'fooArgs' represents the formal arguments to the 'foo' function, and 'fooExpression'
+is an expression for the implementation of the 'foo' function.
+
Once you have an expression, you can work with it much like an F# quotation. For example,
+you can find its declaration range and its type:
+
fooExpression.Type // shows that the return type of the body expression is 'int'
+fooExpression.Range // shows the declaration range of the expression implementing 'foo'
+
+
+
Expressions are analyzed using active patterns, much like F# quotations.
+Here is a generic expression visitor:
+
let rec visitExpr f (e:FSharpExpr) =
+ f e
+ match e with
+ | FSharpExprPatterns.AddressOf(lvalueExpr) ->
+ visitExpr f lvalueExpr
+ | FSharpExprPatterns.AddressSet(lvalueExpr, rvalueExpr) ->
+ visitExpr f lvalueExpr; visitExpr f rvalueExpr
+ | FSharpExprPatterns.Application(funcExpr, typeArgs, argExprs) ->
+ visitExpr f funcExpr; visitExprs f argExprs
+ | FSharpExprPatterns.Call(objExprOpt, memberOrFunc, typeArgs1, typeArgs2, argExprs) ->
+ visitObjArg f objExprOpt; visitExprs f argExprs
+ | FSharpExprPatterns.Coerce(targetType, inpExpr) ->
+ visitExpr f inpExpr
+ | FSharpExprPatterns.FastIntegerForLoop(startExpr, limitExpr, consumeExpr, isUp, _, _) ->
+ visitExpr f startExpr; visitExpr f limitExpr; visitExpr f consumeExpr
+ | FSharpExprPatterns.ILAsm(asmCode, typeArgs, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.ILFieldGet (objExprOpt, fieldType, fieldName) ->
+ visitObjArg f objExprOpt
+ | FSharpExprPatterns.ILFieldSet (objExprOpt, fieldType, fieldName, valueExpr) ->
+ visitObjArg f objExprOpt
+ | FSharpExprPatterns.IfThenElse (guardExpr, thenExpr, elseExpr) ->
+ visitExpr f guardExpr; visitExpr f thenExpr; visitExpr f elseExpr
+ | FSharpExprPatterns.Lambda(lambdaVar, bodyExpr) ->
+ visitExpr f bodyExpr
+ | FSharpExprPatterns.Let((bindingVar, bindingExpr, dbg), bodyExpr) ->
+ visitExpr f bindingExpr; visitExpr f bodyExpr
+ | FSharpExprPatterns.LetRec(recursiveBindings, bodyExpr) ->
+ for _,bindingExpr,_ in recursiveBindings do visitExpr f bindingExpr
+ visitExpr f bodyExpr
+ | FSharpExprPatterns.NewArray(arrayType, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.NewDelegate(delegateType, delegateBodyExpr) ->
+ visitExpr f delegateBodyExpr
+ | FSharpExprPatterns.NewObject(objType, typeArgs, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.NewRecord(recordType, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.NewAnonRecord(recordType, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.NewTuple(tupleType, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.NewUnionCase(unionType, unionCase, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.Quote(quotedExpr) ->
+ visitExpr f quotedExpr
+ | FSharpExprPatterns.FSharpFieldGet(objExprOpt, recordOrClassType, fieldInfo) ->
+ visitObjArg f objExprOpt
+ | FSharpExprPatterns.AnonRecordGet(objExpr, recordOrClassType, fieldInfo) ->
+ visitExpr f objExpr
+ | FSharpExprPatterns.FSharpFieldSet(objExprOpt, recordOrClassType, fieldInfo, argExpr) ->
+ visitObjArg f objExprOpt; visitExpr f argExpr
+ | FSharpExprPatterns.Sequential(firstExpr, secondExpr) ->
+ visitExpr f firstExpr; visitExpr f secondExpr
+ | FSharpExprPatterns.TryFinally(bodyExpr, finalizeExpr, dbgTry, dbgFinally) ->
+ visitExpr f bodyExpr; visitExpr f finalizeExpr
+ | FSharpExprPatterns.TryWith(bodyExpr, _, _, catchVar, catchExpr, dbgTry, dbgWith) ->
+ visitExpr f bodyExpr; visitExpr f catchExpr
+ | FSharpExprPatterns.TupleGet(tupleType, tupleElemIndex, tupleExpr) ->
+ visitExpr f tupleExpr
+ | FSharpExprPatterns.DecisionTree(decisionExpr, decisionTargets) ->
+ visitExpr f decisionExpr; List.iter (snd >> visitExpr f) decisionTargets
+ | FSharpExprPatterns.DecisionTreeSuccess (decisionTargetIdx, decisionTargetExprs) ->
+ visitExprs f decisionTargetExprs
+ | FSharpExprPatterns.TypeLambda(genericParam, bodyExpr) ->
+ visitExpr f bodyExpr
+ | FSharpExprPatterns.TypeTest(ty, inpExpr) ->
+ visitExpr f inpExpr
+ | FSharpExprPatterns.UnionCaseSet(unionExpr, unionType, unionCase, unionCaseField, valueExpr) ->
+ visitExpr f unionExpr; visitExpr f valueExpr
+ | FSharpExprPatterns.UnionCaseGet(unionExpr, unionType, unionCase, unionCaseField) ->
+ visitExpr f unionExpr
+ | FSharpExprPatterns.UnionCaseTest(unionExpr, unionType, unionCase) ->
+ visitExpr f unionExpr
+ | FSharpExprPatterns.UnionCaseTag(unionExpr, unionType) ->
+ visitExpr f unionExpr
+ | FSharpExprPatterns.ObjectExpr(objType, baseCallExpr, overrides, interfaceImplementations) ->
+ visitExpr f baseCallExpr
+ List.iter (visitObjMember f) overrides
+ List.iter (snd >> List.iter (visitObjMember f)) interfaceImplementations
+ | FSharpExprPatterns.TraitCall(sourceTypes, traitName, typeArgs, typeInstantiation, argTypes, argExprs) ->
+ visitExprs f argExprs
+ | FSharpExprPatterns.ValueSet(valToSet, valueExpr) ->
+ visitExpr f valueExpr
+ | FSharpExprPatterns.WhileLoop(guardExpr, bodyExpr, dbg) ->
+ visitExpr f guardExpr; visitExpr f bodyExpr
+ | FSharpExprPatterns.BaseValue baseType -> ()
+ | FSharpExprPatterns.DefaultValue defaultType -> ()
+ | FSharpExprPatterns.ThisValue thisType -> ()
+ | FSharpExprPatterns.Const(constValueObj, constType) -> ()
+ | FSharpExprPatterns.Value(valueToGet) -> ()
+ | _ -> failwith (sprintf "unrecognized %+A" e)
+
+and visitExprs f exprs =
+ List.iter (visitExpr f) exprs
+
+and visitObjArg f objOpt =
+ Option.iter (visitExpr f) objOpt
+
+and visitObjMember f memb =
+ visitExpr f memb.Body
+
+
Let's use this expresssion walker:
+
fooExpression |> visitExpr (fun e -> printfn "Visiting %A" e)
+
+// Prints:
+//
+// Visiting Let...
+// Visiting Call...
+// Visiting Const ("Hello", ...)
+// Visiting Const (" ", ...)
+// Visiting Const ("world", ...)
+// Visiting IfThenElse...
+// Visiting Call...
+// Visiting Call...
+// Visiting Value ...
+// Visiting Const ...
+// Visiting Const ...
+// Visiting Const ...
+
+
Note that
+
+- The visitExpr function is recursive (for nested expressions).
+- Pattern matching is removed from the tree, into a form called 'decision trees'.
+
+
+
In this tutorial, we looked at the basics of working with checked declarations and expressions.
+
In practice, it is also useful to combine the information here
+with some information you can obtain from the symbols
+tutorial.
+
+
namespace System
+
namespace System.IO
+
Multiple items
namespace FSharp
--------------------
namespace Microsoft.FSharp
+
namespace FSharp.Compiler
+
namespace FSharp.Compiler.CodeAnalysis
+
namespace FSharp.Compiler.EditorServices
+
namespace FSharp.Compiler.Symbols
+
Multiple items
namespace FSharp
--------------------
namespace Microsoft.FSharp
--------------------
type FSharpAttribute =
+ member Format: context: FSharpDisplayContext -> string
+ member IsAttribute: unit -> bool
+ member AttributeType: FSharpEntity
+ member ConstructorArguments: IList<FSharpType * obj>
+ member IsUnresolved: bool
+ member NamedArguments: IList<FSharpType * string * bool * obj>
+ member Range: range
<summary>
+ Represents a custom attribute attached to F# source code or a compiler .NET component
+</summary>
+
namespace FSharp.Compiler.Text
+
val checker: FSharpChecker
+
type FSharpChecker =
+ member CheckFileInProject: parseResults: FSharpParseFileResults * fileName: string * fileVersion: int * sourceText: ISourceText * options: FSharpProjectOptions * ?userOpName: string -> Async<FSharpCheckFileAnswer>
+ member ClearCache: options: FSharpProjectOptions seq * ?userOpName: string -> unit
+ member ClearLanguageServiceRootCachesAndCollectAndFinalizeAllTransients: unit -> unit
+ member Compile: argv: string array * ?userOpName: string -> Async<FSharpDiagnostic array * int>
+ member FindBackgroundReferencesInFile: fileName: string * options: FSharpProjectOptions * symbol: FSharpSymbol * ?canInvalidateProject: bool * [<Experimental ("This FCS API is experimental and subject to change.")>] ?fastCheck: bool * ?userOpName: string -> Async<range seq>
+ member GetBackgroundCheckResultsForFileInProject: fileName: string * options: FSharpProjectOptions * ?userOpName: string -> Async<FSharpParseFileResults * FSharpCheckFileResults>
+ member GetBackgroundParseResultsForFileInProject: fileName: string * options: FSharpProjectOptions * ?userOpName: string -> Async<FSharpParseFileResults>
+ member GetBackgroundSemanticClassificationForFile: fileName: string * options: FSharpProjectOptions * ?userOpName: string -> Async<SemanticClassificationView option>
+ member GetParsingOptionsFromCommandLineArgs: sourceFiles: string list * argv: string list * ?isInteractive: bool * ?isEditing: bool -> FSharpParsingOptions * FSharpDiagnostic list + 1 overload
+ member GetParsingOptionsFromProjectOptions: options: FSharpProjectOptions -> FSharpParsingOptions * FSharpDiagnostic list
+ ...
<summary>
+ Used to parse and check F# source code.
+</summary>
+
static member FSharpChecker.Create: ?projectCacheSize: int * ?keepAssemblyContents: bool * ?keepAllBackgroundResolutions: bool * ?legacyReferenceResolver: LegacyReferenceResolver * ?tryGetMetadataSnapshot: FSharp.Compiler.AbstractIL.ILBinaryReader.ILReaderTryGetMetadataSnapshot * ?suggestNamesForErrors: bool * ?keepAllBackgroundSymbolUses: bool * ?enableBackgroundItemKeyStoreAndSemanticClassification: bool * ?enablePartialTypeChecking: bool * ?parallelReferenceResolution: bool * ?captureIdentifiersWhenParsing: bool * [<Experimental ("This parameter is experimental and likely to be removed in the future.")>] ?documentSource: DocumentSource * [<Experimental ("This parameter is experimental and likely to be removed in the future.")>] ?useSyntaxTreeCache: bool -> FSharpChecker
+
val parseAndCheckSingleFile: input: string -> FSharpCheckProjectResults
+
val input: string
+
val file: string
+
type Path =
+ static member ChangeExtension: path: string * extension: string -> string
+ static member Combine: path1: string * path2: string -> string + 3 overloads
+ static member EndsInDirectorySeparator: path: ReadOnlySpan<char> -> bool + 1 overload
+ static member Exists: path: string -> bool
+ static member GetDirectoryName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload
+ static member GetExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload
+ static member GetFileName: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload
+ static member GetFileNameWithoutExtension: path: ReadOnlySpan<char> -> ReadOnlySpan<char> + 1 overload
+ static member GetFullPath: path: string -> string + 1 overload
+ static member GetInvalidFileNameChars: unit -> char array
+ ...
<summary>Performs operations on <see cref="T:System.String" /> instances that contain file or directory path information. These operations are performed in a cross-platform manner.</summary>
+
Path.ChangeExtension(path: string, extension: string) : string
+
Path.GetTempFileName() : string
+
type File =
+ static member AppendAllLines: path: string * contents: IEnumerable<string> -> unit + 1 overload
+ static member AppendAllLinesAsync: path: string * contents: IEnumerable<string> * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 1 overload
+ static member AppendAllText: path: string * contents: string -> unit + 1 overload
+ static member AppendAllTextAsync: path: string * contents: string * encoding: Encoding * ?cancellationToken: CancellationToken -> Task + 1 overload
+ static member AppendText: path: string -> StreamWriter
+ static member Copy: sourceFileName: string * destFileName: string -> unit + 1 overload
+ static member Create: path: string -> FileStream + 2 overloads
+ static member CreateSymbolicLink: path: string * pathToTarget: string -> FileSystemInfo
+ static member CreateText: path: string -> StreamWriter
+ static member Decrypt: path: string -> unit
+ ...
<summary>Provides static methods for the creation, copying, deletion, moving, and opening of a single file, and aids in the creation of <see cref="T:System.IO.FileStream" /> objects.</summary>
+
File.WriteAllText(path: string, contents: string) : unit
File.WriteAllText(path: string, contents: string, encoding: Text.Encoding) : unit
+
val projOptions: FSharpProjectOptions
+
val _errors: FSharp.Compiler.Diagnostics.FSharpDiagnostic list
+
member FSharpChecker.GetProjectOptionsFromScript: fileName: string * source: ISourceText * ?previewEnabled: bool * ?loadedTimeStamp: DateTime * ?otherFlags: string array * ?useFsiAuxLib: bool * ?useSdkRefs: bool * ?assumeDotNetFramework: bool * ?sdkDirOverride: string * ?optionsStamp: int64 * ?userOpName: string -> Async<FSharpProjectOptions * FSharp.Compiler.Diagnostics.FSharpDiagnostic list>
+
module SourceText
+
+from FSharp.Compiler.Text
<summary>
+ Functions related to ISourceText objects
+</summary>
+
val ofString: string -> ISourceText
<summary>
+ Creates an ISourceText object from the given string
+</summary>
+
Multiple items
type Async =
+ static member AsBeginEnd: computation: ('Arg -> Async<'T>) -> ('Arg * AsyncCallback * obj -> IAsyncResult) * (IAsyncResult -> 'T) * (IAsyncResult -> unit)
+ static member AwaitEvent: event: IEvent<'Del,'T> * ?cancelAction: (unit -> unit) -> Async<'T> (requires delegate and 'Del :> Delegate)
+ static member AwaitIAsyncResult: iar: IAsyncResult * ?millisecondsTimeout: int -> Async<bool>
+ static member AwaitTask: task: Task<'T> -> Async<'T> + 1 overload
+ static member AwaitWaitHandle: waitHandle: WaitHandle * ?millisecondsTimeout: int -> Async<bool>
+ static member CancelDefaultToken: unit -> unit
+ static member Catch: computation: Async<'T> -> Async<Choice<'T,exn>>
+ static member Choice: computations: Async<'T option> seq -> Async<'T option>
+ static member FromBeginEnd: beginAction: (AsyncCallback * obj -> IAsyncResult) * endAction: (IAsyncResult -> 'T) * ?cancelAction: (unit -> unit) -> Async<'T> + 3 overloads
+ static member FromContinuations: callback: (('T -> unit) * (exn -> unit) * (OperationCanceledException -> unit) -> unit) -> Async<'T>
+ ...
--------------------
type Async<'T>
+
static member Async.RunSynchronously: computation: Async<'T> * ?timeout: int * ?cancellationToken: Threading.CancellationToken -> 'T
+
member FSharpChecker.ParseAndCheckProject: options: FSharpProjectOptions * ?userOpName: string -> Async<FSharpCheckProjectResults>
+
val input2: string
+
val checkProjectResults: FSharpCheckProjectResults
+
property FSharpCheckProjectResults.Diagnostics: FSharp.Compiler.Diagnostics.FSharpDiagnostic array with get
<summary>
+ The errors returned by processing the project
+</summary>
+
val checkedFile: FSharpImplementationFileContents
+
property FSharpCheckProjectResults.AssemblyContents: FSharpAssemblyContents with get
<summary>
+ Get a view of the overall contents of the assembly. Only valid to use if HasCriticalErrors is false.
+</summary>
+
property FSharpAssemblyContents.ImplementationFiles: FSharpImplementationFileContents list with get
<summary>
+ The contents of the implementation files in the assembly
+</summary>
+
val printDecl: prefix: string -> d: FSharpImplementationFileDeclaration -> unit
+
val prefix: string
+
val d: FSharpImplementationFileDeclaration
+
type FSharpImplementationFileDeclaration =
+ | Entity of entity: FSharpEntity * declarations: FSharpImplementationFileDeclaration list
+ | MemberOrFunctionOrValue of value: FSharpMemberOrFunctionOrValue * curriedArgs: FSharpMemberOrFunctionOrValue list list * body: FSharpExpr
+ | InitAction of action: FSharpExpr
<summary>
+ Represents a declaration in an implementation file, as seen by the F# language
+</summary>
+
union case FSharpImplementationFileDeclaration.Entity: entity: FSharpEntity * declarations: FSharpImplementationFileDeclaration list -> FSharpImplementationFileDeclaration
<summary>
+ Represents the declaration of a type
+</summary>
+
val e: FSharpEntity
+
val subDecls: FSharpImplementationFileDeclaration list
+
val printfn: format: Printf.TextWriterFormat<'T> -> 'T
+
property FSharpEntity.CompiledName: string with get
<summary>
+ Get the compiled name of the type or module, possibly with `n mangling. This is identical to LogicalName
+ unless the CompiledName attribute is used.
+</summary>
+
property List.Length: int with get
+
val subDecl: FSharpImplementationFileDeclaration
+
union case FSharpImplementationFileDeclaration.MemberOrFunctionOrValue: value: FSharpMemberOrFunctionOrValue * curriedArgs: FSharpMemberOrFunctionOrValue list list * body: FSharpExpr -> FSharpImplementationFileDeclaration
<summary>
+ Represents the declaration of a member, function or value, including the parameters and body of the member
+</summary>
+
val v: FSharpMemberOrFunctionOrValue
+
val vs: FSharpMemberOrFunctionOrValue list list
+
val e: FSharpExpr
+
property FSharpMemberOrFunctionOrValue.CompiledName: string with get
<summary>
+ Get the member name in compiled code
+</summary>
+
union case FSharpImplementationFileDeclaration.InitAction: action: FSharpExpr -> FSharpImplementationFileDeclaration
<summary>
+ Represents the declaration of a static initialization action
+</summary>
+
property FSharpImplementationFileContents.Declarations: FSharpImplementationFileDeclaration list with get
<summary>
+ Get the declarations that make up this implementation file
+</summary>
+
val myLibraryEntity: FSharpEntity
+
val myLibraryDecls: FSharpImplementationFileDeclaration list
+
val failwith: message: string -> 'T
+
val fooSymbol: FSharpMemberOrFunctionOrValue
+
val fooArgs: FSharpMemberOrFunctionOrValue list list
+
val fooExpression: FSharpExpr
+
property FSharpExpr.Type: FSharpType with get
<summary>
+ The type of the expression
+</summary>
+
property FSharpExpr.Range: range with get
<summary>
+ The range of the expression
+</summary>
+
val visitExpr: f: (FSharpExpr -> unit) -> e: FSharpExpr -> unit
+
val f: (FSharpExpr -> unit)
+
type FSharpExpr =
+ member ImmediateSubExpressions: FSharpExpr list
+ member Range: range
+ member Type: FSharpType
<summary>
+ Represents a checked and reduced expression, as seen by the F# language. The active patterns
+ in 'FSharp.Compiler.SourceCodeServices' can be used to analyze information about the expression.
+
+ Pattern matching is reduced to decision trees and conditional tests. Some other
+ constructs may be represented in reduced form.
+</summary>
+
module FSharpExprPatterns
+
+from FSharp.Compiler.Symbols
<summary>
+ A collection of active patterns to analyze expressions
+</summary>
+
active recognizer AddressOf: FSharpExpr -> FSharpExpr option
<summary>
+ Matches expressions which take the address of a location
+</summary>
+
val lvalueExpr: FSharpExpr
+
active recognizer AddressSet: FSharpExpr -> (FSharpExpr * FSharpExpr) option
<summary>
+ Matches expressions which set the contents of an address
+</summary>
+
val rvalueExpr: FSharpExpr
+
active recognizer Application: FSharpExpr -> (FSharpExpr * FSharpType list * FSharpExpr list) option
<summary>
+ Matches expressions which are the application of function values
+</summary>
+
val funcExpr: FSharpExpr
+
val typeArgs: FSharpType list
+
val argExprs: FSharpExpr list
+
val visitExprs: f: (FSharpExpr -> unit) -> exprs: FSharpExpr list -> unit
+
active recognizer Call: FSharpExpr -> (FSharpExpr option * FSharpMemberOrFunctionOrValue * FSharpType list * FSharpType list * FSharpExpr list) option
<summary>
+ Matches expressions which are calls to members or module-defined functions. When calling curried functions and members the
+ arguments are collapsed to a single collection of arguments, as done in the compiled version of these.
+</summary>
+
val objExprOpt: FSharpExpr option
+
val memberOrFunc: FSharpMemberOrFunctionOrValue
+
val typeArgs1: FSharpType list
+
val typeArgs2: FSharpType list
+
val visitObjArg: f: (FSharpExpr -> unit) -> objOpt: FSharpExpr option -> unit
+
active recognizer Coerce: FSharpExpr -> (FSharpType * FSharpExpr) option
<summary>
+ Matches expressions which coerce the type of a value
+</summary>
+
val targetType: FSharpType
+
val inpExpr: FSharpExpr
+
active recognizer FastIntegerForLoop: FSharpExpr -> (FSharpExpr * FSharpExpr * FSharpExpr * bool * FSharp.Compiler.Syntax.DebugPointAtFor * FSharp.Compiler.Syntax.DebugPointAtInOrTo) option
<summary>
+ Matches fast-integer loops (up or down)
+</summary>
+
val startExpr: FSharpExpr
+
val limitExpr: FSharpExpr
+
val consumeExpr: FSharpExpr
+
val isUp: bool
+
active recognizer ILAsm: FSharpExpr -> (string * FSharpType list * FSharpExpr list) option
<summary>
+ Matches expressions which are IL assembly code
+</summary>
+
val asmCode: string
+
active recognizer ILFieldGet: FSharpExpr -> (FSharpExpr option * FSharpType * string) option
<summary>
+ Matches expressions which fetch a field from a .NET type
+</summary>
+
val fieldType: FSharpType
+
val fieldName: string
+
active recognizer ILFieldSet: FSharpExpr -> (FSharpExpr option * FSharpType * string * FSharpExpr) option
<summary>
+ Matches expressions which set a field in a .NET type
+</summary>
+
val valueExpr: FSharpExpr
+
active recognizer IfThenElse: FSharpExpr -> (FSharpExpr * FSharpExpr * FSharpExpr) option
<summary>
+ Matches expressions which are conditionals
+</summary>
+
val guardExpr: FSharpExpr
+
val thenExpr: FSharpExpr
+
val elseExpr: FSharpExpr
+
active recognizer Lambda: FSharpExpr -> (FSharpMemberOrFunctionOrValue * FSharpExpr) option
<summary>
+ Matches expressions which are lambda abstractions
+</summary>
+
val lambdaVar: FSharpMemberOrFunctionOrValue
+
val bodyExpr: FSharpExpr
+
active recognizer Let: FSharpExpr -> ((FSharpMemberOrFunctionOrValue * FSharpExpr * FSharp.Compiler.Syntax.DebugPointAtBinding) * FSharpExpr) option
<summary>
+ Matches expressions which are let definitions
+</summary>
+
val bindingVar: FSharpMemberOrFunctionOrValue
+
val bindingExpr: FSharpExpr
+
val dbg: FSharp.Compiler.Syntax.DebugPointAtBinding
+
active recognizer LetRec: FSharpExpr -> ((FSharpMemberOrFunctionOrValue * FSharpExpr * FSharp.Compiler.Syntax.DebugPointAtBinding) list * FSharpExpr) option
<summary>
+ Matches expressions which are let-rec definitions
+</summary>
+
val recursiveBindings: (FSharpMemberOrFunctionOrValue * FSharpExpr * FSharp.Compiler.Syntax.DebugPointAtBinding) list
+
active recognizer NewArray: FSharpExpr -> (FSharpType * FSharpExpr list) option
<summary>
+ Matches array expressions
+</summary>
+
val arrayType: FSharpType
+
active recognizer NewDelegate: FSharpExpr -> (FSharpType * FSharpExpr) option
<summary>
+ Matches expressions which create an instance of a delegate type
+</summary>
+
val delegateType: FSharpType
+
val delegateBodyExpr: FSharpExpr
+
active recognizer NewObject: FSharpExpr -> (FSharpMemberOrFunctionOrValue * FSharpType list * FSharpExpr list) option
<summary>
+ Matches expressions which are calls to object constructors
+</summary>
+
val objType: FSharpMemberOrFunctionOrValue
+
active recognizer NewRecord: FSharpExpr -> (FSharpType * FSharpExpr list) option
<summary>
+ Matches record expressions
+</summary>
+
val recordType: FSharpType
+
active recognizer NewAnonRecord: FSharpExpr -> (FSharpType * FSharpExpr list) option
<summary>
+ Matches anonymous record expressions
+</summary>
+
active recognizer NewTuple: FSharpExpr -> (FSharpType * FSharpExpr list) option
<summary>
+ Matches tuple expressions
+</summary>
+
val tupleType: FSharpType
+
active recognizer NewUnionCase: FSharpExpr -> (FSharpType * FSharpUnionCase * FSharpExpr list) option
<summary>
+ Matches expressions which create an object corresponding to a union case
+</summary>
+
val unionType: FSharpType
+
val unionCase: FSharpUnionCase
+
active recognizer Quote: FSharpExpr -> FSharpExpr option
<summary>
+ Matches expressions which are quotation literals
+</summary>
+
val quotedExpr: FSharpExpr
+
active recognizer FSharpFieldGet: FSharpExpr -> (FSharpExpr option * FSharpType * FSharpField) option
<summary>
+ Matches expressions which get a field from a record or class
+</summary>
+
val recordOrClassType: FSharpType
+
val fieldInfo: FSharpField
+
active recognizer AnonRecordGet: FSharpExpr -> (FSharpExpr * FSharpType * int) option
<summary>
+ Matches expressions getting a field from an anonymous record. The integer represents the
+ index into the sorted fields of the anonymous record.
+</summary>
+
val objExpr: FSharpExpr
+
val fieldInfo: int
+
active recognizer FSharpFieldSet: FSharpExpr -> (FSharpExpr option * FSharpType * FSharpField * FSharpExpr) option
<summary>
+ Matches expressions which set a field in a record or class
+</summary>
+
val argExpr: FSharpExpr
+
active recognizer Sequential: FSharpExpr -> (FSharpExpr * FSharpExpr) option
<summary>
+ Matches sequential expressions
+</summary>
+
val firstExpr: FSharpExpr
+
val secondExpr: FSharpExpr
+
active recognizer TryFinally: FSharpExpr -> (FSharpExpr * FSharpExpr * FSharp.Compiler.Syntax.DebugPointAtTry * FSharp.Compiler.Syntax.DebugPointAtFinally) option
<summary>
+ Matches try/finally expressions
+</summary>
+
val finalizeExpr: FSharpExpr
+
val dbgTry: FSharp.Compiler.Syntax.DebugPointAtTry
+
val dbgFinally: FSharp.Compiler.Syntax.DebugPointAtFinally
+
active recognizer TryWith: FSharpExpr -> (FSharpExpr * FSharpMemberOrFunctionOrValue * FSharpExpr * FSharpMemberOrFunctionOrValue * FSharpExpr * FSharp.Compiler.Syntax.DebugPointAtTry * FSharp.Compiler.Syntax.DebugPointAtWith) option
<summary>
+ Matches try/with expressions
+</summary>
+
val catchVar: FSharpMemberOrFunctionOrValue
+
val catchExpr: FSharpExpr
+
val dbgWith: FSharp.Compiler.Syntax.DebugPointAtWith
+
active recognizer TupleGet: FSharpExpr -> (FSharpType * int * FSharpExpr) option
<summary>
+ Matches expressions which get a value from a tuple
+</summary>
+
val tupleElemIndex: int
+
val tupleExpr: FSharpExpr
+
active recognizer DecisionTree: FSharpExpr -> (FSharpExpr * (FSharpMemberOrFunctionOrValue list * FSharpExpr) list) option
<summary>
+ Matches expressions with a decision expression, each branch of which ends in DecisionTreeSuccess passing control and values to one of the targets.
+</summary>
+
val decisionExpr: FSharpExpr
+
val decisionTargets: (FSharpMemberOrFunctionOrValue list * FSharpExpr) list
+
Multiple items
module List
+
+from Microsoft.FSharp.Collections
--------------------
type List<'T> =
+ | op_Nil
+ | op_ColonColon of Head: 'T * Tail: 'T list
+ interface IReadOnlyList<'T>
+ interface IReadOnlyCollection<'T>
+ interface IEnumerable
+ interface IEnumerable<'T>
+ member GetReverseIndex: rank: int * offset: int -> int
+ member GetSlice: startIndex: int option * endIndex: int option -> 'T list
+ static member Cons: head: 'T * tail: 'T list -> 'T list
+ member Head: 'T
+ member IsEmpty: bool
+ member Item: index: int -> 'T with get
+ ...
+
val iter: action: ('T -> unit) -> list: 'T list -> unit
+
val snd: tuple: ('T1 * 'T2) -> 'T2
+
active recognizer DecisionTreeSuccess: FSharpExpr -> (int * FSharpExpr list) option
<summary>
+ Special expressions at the end of a conditional decision structure in the decision expression node of a DecisionTree .
+ The given expressions are passed as values to the decision tree target.
+</summary>
+
val decisionTargetIdx: int
+
val decisionTargetExprs: FSharpExpr list
+
active recognizer TypeLambda: FSharpExpr -> (FSharpGenericParameter list * FSharpExpr) option
<summary>
+ Matches expressions which are type abstractions
+</summary>
+
val genericParam: FSharpGenericParameter list
+
active recognizer TypeTest: FSharpExpr -> (FSharpType * FSharpExpr) option
<summary>
+ Matches expressions which test the runtime type of a value
+</summary>
+
val ty: FSharpType
+
active recognizer UnionCaseSet: FSharpExpr -> (FSharpExpr * FSharpType * FSharpUnionCase * FSharpField * FSharpExpr) option
<summary>
+ Matches expressions which set a field from a union case (only used in FSharp.Core itself)
+</summary>
+
val unionExpr: FSharpExpr
+
val unionCaseField: FSharpField
+
active recognizer UnionCaseGet: FSharpExpr -> (FSharpExpr * FSharpType * FSharpUnionCase * FSharpField) option
<summary>
+ Matches expressions which get a field from a union case
+</summary>
+
active recognizer UnionCaseTest: FSharpExpr -> (FSharpExpr * FSharpType * FSharpUnionCase) option
<summary>
+ Matches expressions which test if an expression corresponds to a particular union case
+</summary>
+
active recognizer UnionCaseTag: FSharpExpr -> (FSharpExpr * FSharpType) option
<summary>
+ Matches expressions which gets the tag for a union case
+</summary>
+
active recognizer ObjectExpr: FSharpExpr -> (FSharpType * FSharpExpr * FSharpObjectExprOverride list * (FSharpType * FSharpObjectExprOverride list) list) option
<summary>
+ Matches object expressions, returning the base type, the base call, the overrides and the interface implementations
+</summary>
+
val objType: FSharpType
+
val baseCallExpr: FSharpExpr
+
val overrides: FSharpObjectExprOverride list
+
val interfaceImplementations: (FSharpType * FSharpObjectExprOverride list) list
+
val visitObjMember: f: (FSharpExpr -> unit) -> memb: FSharpObjectExprOverride -> unit
+
active recognizer TraitCall: FSharpExpr -> (FSharpType list * string * FSharp.Compiler.Syntax.SynMemberFlags * FSharpType list * FSharpType list * FSharpExpr list) option
<summary>
+ Matches expressions for an unresolved call to a trait
+</summary>
+
val sourceTypes: FSharpType list
+
val traitName: string
+
val typeArgs: FSharp.Compiler.Syntax.SynMemberFlags
+
val typeInstantiation: FSharpType list
+
val argTypes: FSharpType list
+
active recognizer ValueSet: FSharpExpr -> (FSharpMemberOrFunctionOrValue * FSharpExpr) option
<summary>
+ Matches expressions which set the contents of a mutable variable
+</summary>
+
val valToSet: FSharpMemberOrFunctionOrValue
+
active recognizer WhileLoop: FSharpExpr -> (FSharpExpr * FSharpExpr * FSharp.Compiler.Syntax.DebugPointAtWhile) option
<summary>
+ Matches while loops
+</summary>
+
val dbg: FSharp.Compiler.Syntax.DebugPointAtWhile
+
active recognizer BaseValue: FSharpExpr -> FSharpType option
<summary>
+ Matches expressions which are uses of the 'base' value
+</summary>
+
val baseType: FSharpType
+
active recognizer DefaultValue: FSharpExpr -> FSharpType option
<summary>
+ Matches default-value expressions, including null expressions
+</summary>
+
val defaultType: FSharpType
+
active recognizer ThisValue: FSharpExpr -> FSharpType option
<summary>
+ Matches expressions which are uses of the 'this' value
+</summary>
+
val thisType: FSharpType
+
active recognizer Const: FSharpExpr -> (obj * FSharpType) option
<summary>
+ Matches constant expressions, including signed and unsigned integers, strings, characters, booleans, arrays
+ of bytes and arrays of unit16.
+</summary>
+
val constValueObj: obj
+
val constType: FSharpType
+
active recognizer Value: FSharpExpr -> FSharpMemberOrFunctionOrValue option
<summary>
+ Matches expressions which are uses of values
+</summary>
+
val valueToGet: FSharpMemberOrFunctionOrValue
+
val sprintf: format: Printf.StringFormat<'T> -> 'T
+
val exprs: FSharpExpr list
+
val objOpt: FSharpExpr option
+
module Option
+
+from Microsoft.FSharp.Core
+
val iter: action: ('T -> unit) -> option: 'T option -> unit
+
val memb: FSharpObjectExprOverride
+
property FSharpObjectExprOverride.Body: FSharpExpr with get
<summary>
+ The expression that forms the body of the method
+</summary>
+
+
+