Sign in

    printer

    A MoonBit AST printer for string serialization of Abstract Syntax Tree nodes from moonbitlang/parser/syntax, designed for code generation and AST visualization workflows.

    ast
    printer
    code-generation
    syntax-tree
    moonbit
    compiler
    serialization
    Download zip
    Version
    0.1.0
    License
    Apache-2.0
    Last updated
    last year
    Downloads
    37

    #illusory0x0/printer

    A MoonBit AST printer for the moonbitlang/parser/syntax package. This package provides string serialization for MoonBit Abstract Syntax Tree nodes, enabling code generation and AST visualization.

    #Features

    • Partial AST Coverage: Implements printing for core @syntax types from moonbitlang/parser/syntax (33 out of 63 available types)
    • Trait-Based Design: Uses SyntaxPrinter trait for consistent, extensible printing behavior
    • Code Generation Ready: Designed specifically for code generation workflows, not pretty-printing
    • Property-Based Testing: Thoroughly tested using moonbitlang/core packages as test datasets

    #Usage

    #Basic Printing

    Convert any AST node to a string using the to_string function:

    ///|
    test "basic printing" {
    let source = "let value = 42"
    let parsed = @parser.parse_string(source).0.unsafe_head()
    let output = @printer.to_string(parsed)
    inspect(output, content="let value = 42")
    }

    #Custom Printing

    Use the SyntaxPrinter trait directly for more control:

    ///|
    test "custom printing with StringBuilder" {
    let source = "let result = 1 + 2 * 3"
    let parsed = @parser.parse_string(source).0.unsafe_head()
    let builder = StringBuilder::new()
    @printer.SyntaxPrinter::print(parsed, builder)
    let result = builder.to_string()
    inspect(result, content="let result = 1 + 2 * 3")
    }

    #Function Declarations

    ///|
    test "function declaration printing" {
    let func_source = "fn add(x : Int, y : Int) -> Int { x + y }"
    let parsed = @parser.parse_string(func_source).0.unsafe_head()
    let printed = @printer.to_string(parsed)
    inspect(printed, content="fn add(x : Int, y : Int) -> Int { x + y }")
    }

    #Type Definitions

    ///|
    test "type definition printing" {
    let type_source = "struct Point { x : Int; y : Int }"
    let parsed = @parser.parse_string(type_source).0.unsafe_head()
    let output = @printer.to_string(parsed)
    inspect(output, content="struct Point { x : Int; y : Int; }")
    }

    #API Reference

    #Core Functions

    • to_string[T : SyntaxPrinter](value : T) -> String: Convert any AST node to string
    • SyntaxPrinter::print(Self, StringBuilder) -> Unit: Print AST node to StringBuilder

    #Supported AST Types

    The SyntaxPrinter trait is implemented for 33 key AST node types, including:

    • Expressions: Expr, Constant
    • Declarations: FunDecl, TypeDecl, DeclBody, Impl
    • Types: Type, TypeName, TypeVarBinder, TypeVarConstraint, ErrorType
    • Functions: Func, Parameter, Argument, ArgumentKind
    • Patterns: Pattern, ArrayPattern, ArrayPatterns, ConstrPatArg, FieldPat, MapPatElem, DotDotBinder
    • Basic Elements: Binder, Var, Label, LongIdent, ConstrName, Constructor, ConstrId
    • Other Types: Accessor, SpreadableElem, FieldDef, Visibility

    See the complete list of implemented types in the package interface (pkg.generated.mbti).

    #Design Goals

    This package prioritizes functional correctness over formatting aesthetics:

    • Generates syntactically valid MoonBit code
    • Maintains semantic equivalence with original AST
    • Optimized for code generation pipelines
    • Minimal formatting for maximum compatibility

    #Testing

    The package uses property-based testing with moonbitlang/core as the test dataset, ensuring reliability across diverse AST structures.

    SyntaxPrinter

    pub trait SyntaxPrinter {
    print(Self, StringBuilder) -> Unit
    }

    print

    fn[Self : SyntaxPrinter] print(_ : Self, _ : StringBuilder) -> Unit

    to_string

    fn[T : SyntaxPrinter] to_string(value : T) -> String

    Convenience function to convert any Printer-implementing type to string

    Powered by MoonBit

    Site sourceReport issuePackagesBuild queueSkillsStatistics

    © 2026 mooncakes.io