Metastatic.Adapters.Ruby
(Metastatic v0.10.4)
View Source
Ruby language adapter for MetaAST transformations.
Bridges between Ruby AST (M1) and MetaAST (M2), enabling cross-language code analysis and transformation for Ruby source code.
Ruby AST Structure (M1)
Ruby uses the parser gem which represents AST as nodes with:
type- Symbol representing the syntactic constructchildren- List of child nodes or valueslocation- Source location information
Examples
# Variable assignment
%{type: "lvasgn", children: ["x", %{type: "int", children: [42]}]}
# Method call
%{type: "send", children: [receiver, :method_name, args...]}
# Binary operation
%{type: "send", children: [left, :+, right]}M1 ↔ M2 Transformations
This adapter performs bidirectional transformations between Ruby AST (M1) and MetaAST (M2):
Literals
# M1 → M2
%{type: "int", children: [42]} → {:literal, :integer, 42}
%{type: "float", children: [3.14]} → {:literal, :float, 3.14}
%{type: "str", children: ["hello"]} → {:literal, :string, "hello"}
%{type: "true"} → {:literal, :boolean, true}
%{type: "nil"} → {:literal, :null, nil}
%{type: "sym", children: [:foo]} → {:literal, :symbol, :foo}Variables
%{type: "lvar", children: [:x]} → {:variable, "x"}
%{type: "ivar", children: [:@x]} → {:variable, "@x"}Binary Operations
# x + 5
%{type: "send", children: [x_node, :+, five_node]} → {:binary_op, :arithmetic, :+, left, right}Round-Trip Fidelity
The adapter achieves >95% round-trip fidelity for M2.1 (Core) constructs. Metadata preserves information like:
- Line numbers and columns
- Variable scopes (local, instance, class, global)
- Original syntax variants
Usage
# Parse Ruby source
{:ok, ast} = Metastatic.Adapters.Ruby.parse("x = 42")
# Transform to MetaAST
{:ok, meta_ast, metadata} = Metastatic.Adapters.Ruby.to_meta(ast)
# Transform back to Ruby AST
{:ok, ast2} = Metastatic.Adapters.Ruby.from_meta(meta_ast, metadata)
# Unparse to source
{:ok, source} = Metastatic.Adapters.Ruby.unparse(ast2)