D — 130 Operations for AI Agents
This page is the canonical reference an AI coding agent uses to refactor, query, and analyze D code through the act MCP server. 130 operations available: 56 refactor, 18 query, 42 analysis, 14 verification. Each operation is callable from Claude Code, Cursor, Codex, OpenCode, or any MCP-compatible agent host. Click any operation for a stable anchor link suitable for citation.
Worked D examples
act101 applies D-specific idioms directly to a source file. It can wrap a resource's cleanup in a scope(exit) block, rewrite a C-style index for loop as a foreach over the array, and generate an opEquals method that compares every field of a struct or class. The generated opEquals compares fields in declaration order and returns false on the first mismatch, matching the short-circuit comparison a hand-written equality check would use. Each example below is the verbatim output of the command shown, run against the file shown.
Add a scope guard for resource cleanup
resource.d opens a file and writes to it, but never closes it if write throws.
$ act refactor-lang add_scope_guard_d --file resource.d --params '{"line":2,"cleanup_code":"f.close();","scope_kind":"exit","column":1}'
Before
void foo() {
auto f = File("x");
f.write("hello");
}
After
void foo() {
auto f = File("x");
scope(exit) {
f.close();
}
f.write("hello");
}
A scope(exit) { f.close(); } block is inserted right after f is opened, so f.close() runs when foo exits, however it exits.
Convert an index loop to foreach
app.d's main walks arr with a C-style for loop whose index i exists only to read arr[i].
$ act refactor-lang convert_for_to_foreach_d --file app.d --params '{"line":6,"column":5}'
Before
module app;
import std.stdio;
void main() {
int[] arr = [1, 2, 3, 4, 5];
for (int i = 0; i < arr.length; i++) {
writeln(arr[i]);
}
}
After
module app;
import std.stdio;
void main() {
int[] arr = [1, 2, 3, 4, 5];
foreach (i, item; arr) {
writeln(arr[i]);
}
}
The for header becomes foreach (i, item; arr), D's range-based form with the index kept; the loop body is left as written, so arr[i] still reads through i.
Generate an opEquals method from a class's fields
color.d declares Color with three fields — r, g, b — but no way to compare two instances for equality.
$ act refactor-lang generate_equals_method_d --file color.d --params '{"line":3,"column":7}'
Before
module models;
class Color {
int r;
int g;
int b;
}
After
module models;
class Color {
int r;
int g;
int b;
bool opEquals(const typeof(this) other) const {
if (this.r != other.r) return false;
if (this.g != other.g) return false;
if (this.b != other.b) return false;
return true;
}
}
A bool opEquals(const typeof(this) other) const method is appended that compares r, g, and b in turn and returns false on the first mismatch, true if all three match.
Query
18 query tools, the same on every supported language. Descriptions live in the shared reference: /docs/query-tools.
callers control_flow data_flow definition diagnostics effect_closure effect_summary fix_auto get_type graph import_organize interface mutations references repo_outline skeleton symbols symbols_batch
Refactor
| Operation | Description |
|---|---|
add-braces-d |
Add braces to single-line if/while/for/foreach bodies |
add-const-modifier-d |
Add const modifier to a variable that is never modified |
add-documentation-comment-d |
Add DDoc comment template to declaration |
add-immutable-modifier-d |
Add immutable modifier to a variable that is never modified |
add-import-d |
Add an import statement for a module |
add-missing-break-d |
Add break; to switch case that lacks a terminator |
add-missing-switch-cases-d |
Add default: case to switch statement without one |
add-null-check-d |
Add a null check guard before using a reference |
add-override-modifier-d |
Add override modifier to method declaration |
add-parameter-d |
Add a new parameter to a function definition |
add-safe-attribute-d |
Add @safe attribute to a memory-safe function |
add-scope-guard-d |
Add scope(exit) { ... } cleanup block |
convert-for-to-foreach-d |
Convert indexed for loop to foreach |
convert-foreach-to-for-d |
Convert foreach loop to indexed for loop |
convert-if-to-switch-d |
Convert if/else chain to switch statement |
convert-if-to-ternary-d |
Convert if/else statement to ternary operator |
convert-method-to-property-d |
Convert getter/setter methods to @property syntax |
convert-property-to-method-d |
Convert @property function to explicit getter/setter methods |
convert-switch-to-if-d |
Convert switch statement to if/else chain |
convert-ternary-to-if-d |
Convert ternary operator to if/else statement |
extract-method-d |
Extract code block into a new function |
extract-type-declaration-d |
Move a type declaration to a separate file |
extract-variable-d |
Extract an expression into a new local variable |
extract_function |
Extract a code selection into a new function — automatically infers parameters, return types, and inserts the call site. Use instead of manually cutting/pasting code. Works without LSP; LSP improves type inference. Params: file (string), new_name (string), start_line (u32), start_column (u32), end_line (u32), end_column (u32) [, preview (bool), receipt (bool)] |
extract_variable |
Extract an expression into a named variable — inserts the declaration and replaces the expression with the variable name. Works without LSP. Params: file (string), new_name (string), start_line (u32), start_column (u32), end_line (u32), end_column (u32) [, preview (bool)] |
generate-constructor-d |
Generate a constructor for a class or struct |
generate-documentation-template-d |
Generate DDoc /** Params: ... Returns: ... */ template |
generate-equals-method-d |
Generate opEquals and opCmp for equality comparison |
generate-field-d |
Generate a field declaration in a class/struct |
generate-getter-d |
Generate a getter method for a private field |
generate-interface-implementation-d |
Generate stub methods implementing an interface |
generate-method-stub-d |
Generate empty method with given signature in a class/struct |
generate-operator-overload-d |
Generate opAdd/opMul/etc operator overload method |
generate-parameter-validation-d |
Generate null/range checks for function parameters |
generate-setter-d |
Generate a setter method for a private field |
generate-to-string-method-d |
Generate a toString method for string representation |
generate-unittest-block-d |
Generate a unittest block for testing a function |
inline |
Inline a variable, function, or method — replace every usage with its definition body, then remove the original. The inverse of extract. Works without LSP (single-file); LSP enables cross-file inlining. Params: file (string), symbol (string) [, line (u32), preview (bool), receipt (bool)] |
inline-method-d |
Inline a method body at its call sites |
inline-variable-d |
Inline a variable declaration into its usage sites |
insert_body |
Replace a function's implementation body with new code. AST-validated — rejects if the result has parse errors, so you can't accidentally break syntax. Use instead of manual text editing for function rewrites. Params: file (string), symbol (string), code (string) [, commit (bool)] |
introduce-constant-d |
Extract magic number/string into named enum constant |
introduce-parameter-d |
Convert a local variable into a function parameter |
introduce-variable-d |
Extract expression into new local variable using auto type |
move-field-d |
Move a field to a different struct/class |
move-method-d |
Move a method to a different struct/class |
move_symbol |
Move a function, class, or type to a different file and automatically update all imports across the codebase. Use instead of manually cut/paste + fixing imports. Works without LSP (single-file); LSP enables cross-file import updates. Params: file (string), symbol (string), destination (string) [, preview (bool), receipt (bool)] |
organize-imports-d |
Sort and deduplicate import statements |
recipe_run |
Run a codemod recipe: declarative match → transform → optional verify across modeled grammars. Preview lists matches; apply writes with optional E7 receipts and all-or-nothing rollback. Returns a per-site report. |
remove-parameter-d |
Remove an unused parameter from a function definition |
remove-unreachable-code-d |
Remove code after return/break/continue/throw |
remove-unused-import-d |
Remove an unused import statement |
rename |
Rename a symbol and automatically update ALL references across the codebase. Safer and faster than find-and-replace — AST-aware, won't rename strings or comments. Works without LSP (single-file); LSP enables cross-file renames. Params: file (string), old_name (string), new_name (string) [, line (u32), column (u32), preview (bool), receipt (bool)] |
rename-identifier-d |
Rename an identifier across all references in the file |
rename-parameter-d |
Rename a function parameter across its definition and body |
use-string-interpolation-d |
Replace format() calls with D string interpolation |
Analysis
42 analysis tools, the same on every supported language. Descriptions live in the shared reference: /docs/analysis-tools.
analyze_api_diff analyze_chokepoints analyze_clones analyze_clusters analyze_cohesion analyze_conformance analyze_coupling analyze_cycle_risk analyze_cycles analyze_dead_code analyze_depth analyze_entry_points analyze_export analyze_extraction analyze_fan_balance analyze_features analyze_hotspots analyze_impact analyze_inconsistencies analyze_inheritance analyze_interface_bloat analyze_interfaces analyze_layers analyze_orphan_types analyze_patterns analyze_platform_deps analyze_readiness analyze_roles analyze_seams analyze_stability analyze_surface analyze_test_gaps analyze_thickness analyze_type_completeness churn_hotspots co_change_clusters coverage_overlay ownership_map profile_overlay simulate split_module trace_overlay
Verify
14 verify tools, the same on every supported language. Descriptions live in the shared reference: /docs/verification.
bisect_regression gate generate_test_harness scan secret_surface summarize_pr taint_flow unsafe_surface verify_behavioral_equivalence verify_contract_preserved verify_diff_semantics verify_port_parity verify_side_effects verify_test_impact