#compile-time #macro #macro-derive #typescript #codegen

macroforge_ts_syn

TypeScript syntax types for compile-time macro code generation

61 releases

Uses new Rust 2024

new 0.1.77 Mar 4, 2026
0.1.76 Feb 28, 2026
0.1.72 Jan 5, 2026
0.1.65 Dec 29, 2025

#127 in Procedural macros


Used in 4 crates (via macroforge_ts)

MIT license

370KB
5.5K SLoC

macroforge_ts_syn

TypeScript syntax types for compile-time macro code generation

Crates.io Documentation

TypeScript syntax types for compile-time macro code generation.

This crate provides a syn-like API for parsing and manipulating TypeScript code, enabling macro authors to work with TypeScript AST in a familiar way. It is the core infrastructure crate for the Macroforge TypeScript macro system.

Overview

The crate is organized into several modules:

  • [abi] - Application Binary Interface types for stable macro communication
  • derive - Derive input types that mirror Rust's syn::DeriveInput
  • errors - Error types and diagnostics for macro expansion
  • lower - AST lowering from SWC types to IR representations
  • parse - TypeScript parsing utilities wrapping SWC
  • quote_helpers - Macros for ergonomic code generation
  • stream - Parsing stream abstraction similar to syn::parse::ParseBuffer

Architecture

The crate follows a layered architecture:

┌─────────────────────────────────────────────────────────────┐
│                    User-Facing API                          │
│  (DeriveInput, TsStream, parse_ts_macro_input!)             │
├─────────────────────────────────────────────────────────────┤
│                    Lowering Layer                           │
│  (lower_classes, lower_interfaces, lower_enums, ...)        │
├─────────────────────────────────────────────────────────────┤
│                    IR Types (ABI Stable)                    │
│  (ClassIR, InterfaceIR, EnumIR, TypeAliasIR, ...)           │
├─────────────────────────────────────────────────────────────┤
│                    SWC Parser                               │
│  (swc_core for TypeScript/JavaScript parsing)               │
└─────────────────────────────────────────────────────────────┘

Usage Example

Here's how to use this crate in a derive macro:

use macroforge_ts_syn::{parse_ts_macro_input, DeriveInput, MacroResult, Patch};

pub fn my_derive_macro(ctx: MacroContextIR) -> MacroResult {
    // Parse the input using the syn-like API
    let input = parse_ts_macro_input!(ctx);

    // Access type information
    println!("Processing type: {}", input.name());

    // Match on the type kind
    match &input.data {
        Data::Class(class) => {
            for field in class.fields() {
                println!("Field: {}", field.name);
            }
        }
        Data::Interface(iface) => {
            // Handle interface...
        }
        Data::Enum(enum_) => {
            // Handle enum...
        }
        Data::TypeAlias(alias) => {
            // Handle type alias...
        }
    }

    // Generate code and return patches
    MacroResult::ok()
}

Helper Macros

This crate provides several helper macros for working with SWC AST nodes:

  • ident! - Create an identifier with optional formatting
  • private_ident! - Create a private (marked) identifier
  • stmt_block! - Create a block statement from statements
  • fn_expr! - Create an anonymous function expression
  • member_expr! - Create a member access expression (obj.prop)
  • assign_stmt! - Create an assignment statement
  • fn_assign! - Create a function assignment (obj.prop = function() {...})
  • proto_method! - Create a prototype method assignment

Feature Flags

  • swc - Enables SWC integration and the helper macros (enabled by default)

Re-exports

For convenience, the crate re-exports commonly used SWC types when the swc feature is enabled:

  • swc_core - The full SWC core crate
  • swc_common - Common SWC types (Span, SourceMap, etc.)
  • swc_ecma_ast - ECMAScript/TypeScript AST types
  • quote! - SWC's quote macro for AST generation

Installation

Add this to your Cargo.toml:

[dependencies]
macroforge_ts_syn = "0.1.38"

Key Exports

Structs

  • StmtVec - A wrapper type for passing a Vec<Stmt> to be used inline in function bodies.

API Reference

See the full API documentation on the Macroforge website.

License

MIT

Dependencies

~0.9–5MB
~83K SLoC