A JavaScript parser that adds defer
statements to the language, inspired by Go and V programming languages.
This library extends JavaScript with defer
functionality by transforming source code using AST manipulation. The defer
statement allows you to specify code that should run when a function exits, regardless of how it exits (normal return, exception, etc.).
function example() {
defer console.log("This runs when function exits");
if (someCondition) {
return "early return"; // defer still executes
}
return "normal return"; // defer executes here too
}
The parser uses a two-pass approach with industry-standard tools:
[Source Code] → acorn → [ESTree AST] → recast → [Final AST]
- First pass (acorn): Parses JavaScript source code into an ESTree-compatible AST, recognizing the new
defer
syntax - Second pass (recast): Transforms the AST by analyzing function bodies and inserting the necessary control structures to implement defer behavior
The two-pass approach is necessary because we need to:
- Detect all
defer
statements in a function before generating the final code - Determine the appropriate cleanup and exception handling structures
- Maintain compatibility with existing JavaScript semantics
npm install @xjslang/defer-parser
This package requires the following peer dependencies:
npm install acorn recast
import * as recast from 'recast'
import { parse as parseDefer } from './src/index.js'
const sourceCode = `
function connectToDB() {
const conn = createDBConn();
defer conn.close();
const file = openFile("/path/to/file");
defer { // you can use blocks
file.close();
// ... etc ...
}
// ... etc ...
return "done!";
}
`
// generates the AST and prints it
const transformedCode = parseDefer(sourceCode)
const result = recast.print(transformedCode)
console.log(result.code)
Transforms JavaScript code containing defer
statements.
Parameters:
code
(string): Source JavaScript code with defer statementsoptions
(object, optional): Parser options
Returns: Transformed JavaScript code as a string
- Node.js >= 20.17 || >= 22
- npm
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add some amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
This project uses ESLint and Prettier for code formatting. Run npm run lint:fix
and npm run format
before submitting PRs.
- acorn: Fast JavaScript parser that generates ESTree-compatible AST
- recast: JavaScript syntax tree transformer that preserves original formatting
src/
├── index.js # Main entry point
├── parser.js # Core parsing logic
├── builders.js # AST node builders
└── libs/
└── utils.js # Utility functions