Header menu logo Fabulous.AST

Interfaces

Interfaces specify sets of related members that other classes implement. Define one as a TypeDefn whose members are AbstractMembers, and implement it on a type with InterfaceWith.

See the official F# interfaces documentation for background.

Contents

#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fantomas.Core.dll"
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fabulous.AST.dll"
#r "../../src/Fabulous.AST/bin/Release/netstandard2.1/publish/Fantomas.FCS.dll"

open Fabulous.AST
open type Fabulous.AST.Ast

Defining an Interface

An interface is a type containing only abstract members:

Oak() { AnonymousModule() { TypeDefn("INumeric") { AbstractMember("Add", [ Int(); Int() ], Int()) } } }
|> Gen.mkOak
|> Gen.run
|> printfn "%s"

// produces the following code:
type INumeric =
    abstract Add: int -> int -> int

Abstract Members with Parameters

AbstractMember accepts named or unnamed parameter types and a return type. The trailing true requests the .NET-style tupled signature:

Oak() {
    AnonymousModule() {
        TypeDefn("ISprintable") { AbstractMember("Print", [ ("format", Int()) ], Unit()) }

        TypeDefn("INumericDotNet") { AbstractMember("Add", [ Int(); Int() ], Int(), true) }
    }
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"

// produces the following code:
type ISprintable =
    abstract Print: format: int -> unit

type INumericDotNet =
    abstract Add: int * int -> int

Implementing an Interface

Implement an interface on a class with InterfaceWith, supplying the concrete members:

Oak() {
    AnonymousModule() {
        TypeDefn("SomeClass", ParenPat(TuplePat([ ParameterPat("x", Int()); ParameterPat("y", Float()) ]))) {
            InterfaceWith("IPrintable") {
                Member("this.Print()", AppExpr("printfn", [ String("%d %f"); Constant("x"); Constant("y") ]))
            }
        }
    }
}
|> Gen.mkOak
|> Gen.run
|> printfn "%s"

// produces the following code:
type SomeClass(x: int, y: float) =
    interface IPrintable with
        member this.Print() = printfn "%d %f" x y
namespace Fabulous
namespace Fabulous.AST
type Ast = class end
Multiple items
static member Ast.Oak: unit -> CollectionBuilder<Fantomas.Core.SyntaxOak.Oak,'marker>

--------------------
module Oak from Fabulous.AST
static member Ast.AnonymousModule: unit -> CollectionBuilder<Fantomas.Core.SyntaxOak.ModuleOrNamespaceNode,Fantomas.Core.SyntaxOak.ModuleDecl>
Multiple items
static member Ast.TypeDefn: name: string -> CollectionBuilder<Fantomas.Core.SyntaxOak.TypeDefn,Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.TypeDefn: name: string * constructor: WidgetBuilder<Fantomas.Core.SyntaxOak.ImplicitConstructorNode> -> CollectionBuilder<Fantomas.Core.SyntaxOak.TypeDefn,Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.TypeDefn: name: string * constructor: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> CollectionBuilder<Fantomas.Core.SyntaxOak.TypeDefn,Fantomas.Core.SyntaxOak.MemberDefn>

--------------------
module TypeDefn from Fabulous.AST
<summary> Common attributes shared by all TypeDefn widgets </summary>
static member Ast.AbstractMember: identifier: string * parameters: (string * string) seq * returnType: string * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: (string * WidgetBuilder<Fantomas.Core.SyntaxOak.Type>) seq * returnType: string * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: (string * string) seq * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: (string * WidgetBuilder<Fantomas.Core.SyntaxOak.Type>) seq * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: string seq * returnType: string * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> seq * returnType: string * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: string seq * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * parameters: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> seq * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> * ?isTupled: bool * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * returnType: string * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.AbstractMember: identifier: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> * ?hasGetter: bool * ?hasSetter: bool -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.Int: value: int -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.Int: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
type Gen = static member mkOak: root: WidgetBuilder<'node> -> 'node static member parse: source: string -> string + 1 overload static member run: oak: Oak -> string + 1 overload
<summary> Renders a widget tree to F# source and verifies the result. <c>mkOak</c> turns the root widget into a Fantomas node (recursively building its children), <c>run</c> formats that node to source (optionally with a config), and <c>parse</c> round-trips the source back through the parser to confirm it is syntactically valid. Designed for pipeline use, e.g. <c>widget |&gt; Gen.parse</c> or <c>widget |&gt; Gen.mkOak |&gt; Gen.run |&gt; Gen.parse</c>. </summary>
static member Gen.mkOak: root: WidgetBuilder<'node> -> 'node
static member Gen.run: oak: Fantomas.Core.SyntaxOak.Oak -> string
static member Gen.run: oak: Fantomas.Core.SyntaxOak.Oak * config: Fantomas.Core.FormatConfig -> string
val printfn: format: Printf.TextWriterFormat<'T> -> 'T
static member Ast.Unit: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
Multiple items
static member Ast.ParenPat: pat: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParenPat: pat: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParenPat: pat: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>

--------------------
module ParenPat from Fabulous.AST
Multiple items
static member Ast.TuplePat: values: string seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.TuplePat: values: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.TuplePat: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> seq -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>

--------------------
module TuplePat from Fabulous.AST
static member Ast.ParameterPat: name: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: string * pType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: string * pType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * pType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * pType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * pType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.ParameterPat: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern> * pType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Pattern>
static member Ast.Float: value: float -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.Float: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>
static member Ast.InterfaceWith: name: string -> CollectionBuilder<Fantomas.Core.SyntaxOak.MemberDefn,Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.InterfaceWith: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> CollectionBuilder<Fantomas.Core.SyntaxOak.MemberDefn,Fantomas.Core.SyntaxOak.MemberDefn>
static member Ast.Member: name: string * body: string * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: string * body: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: string * body: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: string * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: string * returnType: WidgetBuilder<Fantomas.Core.SyntaxOak.Type> -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * body: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.Member: name: string * body: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * returnType: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.MemberDefn>
   (+0 other overloads)
static member Ast.AppExpr: name: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: string * item: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * item: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * item: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: string * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
static member Ast.AppExpr: name: string * item: WidgetBuilder<Fantomas.Core.SyntaxOak.Expr> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Expr>
   (+0 other overloads)
Multiple items
static member Ast.String: value: WidgetBuilder<Fantomas.Core.SyntaxOak.Constant> -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.String: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>
static member Ast.String: unit -> WidgetBuilder<Fantomas.Core.SyntaxOak.Type>

--------------------
module String from Fabulous.AST

--------------------
module String from Microsoft.FSharp.Core
Multiple items
static member Ast.Constant: value: string -> WidgetBuilder<Fantomas.Core.SyntaxOak.Constant>

--------------------
module Constant from Fabulous.AST

Type something to start searching.