Codegen was developed by working backwards from real-world, large-scale codebase migrations. Instead of starting with abstract syntax trees and parser theory, we started with the question: “How do developers actually think about code changes?”This practical origin led to four core principles that shape Codegen’s design:
Write code that reads like natural language, without worrying about abstract syntax trees or parser internals. Codegen provides high-level APIs that map directly to the transformations developers want to perform:
Copy
Ask AI
# Methods that read like Englishfunction.rename("new_name") # Not ast.update_node(function_node, "name", "new_name")function.move_to_file("new_file.py") # Not ast.relocate_node(function_node, "new_file.py")# Clean, readable propertiesif function.is_async: # Not ast.get_node_attribute(function_node, "async") print(function.name) # Not ast.get_node_name(function_node)# Natural iteration patternsfor usage in function.usages: # Not ast.find_references(function_node) print(f"Used in {usage.file.name}")
Focus on your high-level intent while Codegen handles the intricate details.Codegen operations handle the edge cases - it should be hard to break lint.
Codegen frontloads as much as possible to enable fast, efficient transformations.It is built with the insight that each codebase only needs to be parsed once per commit.
Learn more about parsing the codebase graph in the How it
Works guide.
Codegen embraces Python’s strength as a “glue language” - its ability to seamlessly integrate different tools and APIs. This makes it natural to compose Codegen with your existing toolchain:
Build complex transforms by combining simpler operations
Integrate Codegen with your existing tools (linters, type checkers, test frameworks, AI tools)
Python’s rich ecosystem makes it ideal for code manipulation tasks. Codegen is
designed to be one tool in your toolbox, not a replacement for your entire
workflow.