# How Macros Work

Macroforge performs compile-time code generation by parsing your TypeScript,
expanding macros, and outputting transformed code. This happens before your code
runs, resulting in zero runtime overhead.

## Compile-Time Expansion

Unlike runtime solutions that use reflection or proxies, Macroforge expands
macros at compile time:

1. **Parse**: Your TypeScript code is parsed into an AST using SWC
2. **Find**: Macroforge finds `@derive` decorators and their associated items
3. **Expand**: Each macro generates new code based on the class structure
4. **Output**: The transformed TypeScript is written out, ready for normal
   compilation

Before (Your Code)

```
/** @derive(Debug) */
class User {
    name: string;
}
```

After (Generated)

```
class User {
    name: string;

    static toString(value: User): string {
        return userToString(value);
    }
}

export function userToString(value: User): string {
    const parts: string[] = [];
    parts.push('name: ' + value.name);
    return 'User { ' + parts.join(', ') + ' }';
}
```

## Zero Runtime Overhead

Because code generation happens at compile time, there's no:

- Runtime reflection or metadata
- Proxy objects or wrappers
- Additional dependencies in your bundle
- Performance cost at runtime

The generated code is plain TypeScript that compiles to efficient JavaScript.

## Source Mapping

Macroforge tracks the relationship between your source code and the expanded
output. This means:

- Errors in generated code point back to your source
- Debugging works correctly
- IDE features like "go to definition" work as expected

Error positioning

The TypeScript plugin uses source mapping to show errors at the `@derive`
decorator position, not in the generated code.

## Execution Flow

Your Source Code

with @derive decorators

SWC Parser

TypeScript → AST

Macro Expansion Engine

Finds @derive decorators, runs macros, generates new AST nodes

Code Generator

AST → TypeScript

Expanded TypeScript

ready for normal compilation

## Integration Points

Macroforge integrates at two key points:

### IDE (TypeScript Plugin)

The TypeScript plugin intercepts language server calls to provide:

- Diagnostics that reference your source, not expanded code
- Completions for generated methods
- Hover information showing what macros generate

### Build (Vite Plugin)

The Vite plugin runs macro expansion during the build process:

- Transforms files before they reach the TypeScript compiler
- Generates type declaration files (.d.ts)
- Produces metadata for debugging

## Next Steps

- [Learn about the derive system](../docs/concepts/derive-system)
- [Explore the architecture](../docs/concepts/architecture)
