Skip to content

Type alias type #6011

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jul 21, 2025
Merged

Type alias type #6011

merged 5 commits into from
Jul 21, 2025

Conversation

youknowone
Copy link
Member

@youknowone youknowone commented Jul 20, 2025

Summary by CodeRabbit

  • New Features
    • Added a formal constructor for type aliases that enforces argument validation and provides clear error messages for incorrect usage.
    • Introduced custom construction behavior for AST nodes enabling proper initialization with optional dictionaries.
  • Bug Fixes
    • Improved argument validation for object construction to better match expected Python behavior and error reporting.
  • Refactor
    • Unified and clarified string representation logic for certain types.

Copy link
Contributor

coderabbitai bot commented Jul 20, 2025

Walkthrough

The changes introduce stricter argument validation to the object.__new__ method in the object builtin, aligning its behavior with CPython. Additionally, a formal constructor with argument validation is implemented for TypeAliasType in the typing module, and the representation logic is unified using the Representable trait. The NodeAst type in the AST module gains a custom constructor implementing the Constructor trait with a specialized slot_new method.

Changes

File(s) Change Summary
vm/src/builtins/object.rs Enhanced py_new for PyBaseObject to validate arguments and match CPython's object.__new__ logic.
vm/src/stdlib/typing.rs Added Constructor impl for TypeAliasType with argument validation; unified Representable logic; updated #[pyclass] attributes and trait signatures.
vm/src/stdlib/ast/python.rs Implemented Constructor trait for NodeAst with custom slot_new for controlled instance creation; updated #[pyclass] attribute.

Sequence Diagram(s)

sequenceDiagram
    participant Caller
    participant VM
    participant PyBaseObject
    participant PyType

    Caller->>VM: Call object.__new__(type, *args, **kwargs)
    VM->>PyType: Check __new__ and __init__ methods
    alt Arguments passed
        alt Custom __new__ or __init__
            VM->>PyBaseObject: Allow construction
        else Base __new__ and __init__
            VM->>Caller: Raise TypeError
        end
    else No arguments
        VM->>PyBaseObject: Proceed with construction
    end
Loading
sequenceDiagram
    participant Caller
    participant VM
    participant TypeAliasType

    Caller->>VM: Call TypeAliasType.__new__(cls, name, value, type_params=...)
    VM->>TypeAliasType: Validate argument count and types
    alt Argument validation fails
        VM->>Caller: Raise TypeError
    else Validation passes
        VM->>TypeAliasType: Create instance
        TypeAliasType-->>Caller: Return instance
    end
Loading
sequenceDiagram
    participant Caller
    participant VM
    participant NodeAst
    participant BaseObject

    Caller->>VM: Call NodeAst.__new__(cls, *args, **kwargs)
    VM->>NodeAst: slot_new creates base object with dict if needed
    NodeAst->>NodeAst: Call __init__ with args
    NodeAst-->>Caller: Return initialized instance
Loading

Estimated code review effort

  • vm/src/builtins/object.rs: 3 (120 minutes)
  • vm/src/stdlib/typing.rs: 3 (120 minutes)
  • vm/src/stdlib/ast/python.rs: 2 (60 minutes)

Suggested reviewers

  • arihant2math

Poem

In the warren of types, a new rule appears,
Constructors now check, and raise errors or cheers.
With arguments counted and types held tight,
The object’s creation is now just right.
Typing’s alias, too, stands proud and tall—
A hop, a skip, a bug-free call! 🐇


📜 Recent review details

Configuration used: .coderabbit.yml
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2c7692b and 09c340a.

⛔ Files ignored due to path filters (3)
  • Lib/test/test_ast/test_ast.py is excluded by !Lib/**
  • Lib/test/test_collections.py is excluded by !Lib/**
  • Lib/test/test_exception_group.py is excluded by !Lib/**
📒 Files selected for processing (1)
  • vm/src/stdlib/ast/python.rs (2 hunks)
🧰 Additional context used
📓 Path-based instructions (1)
**/*.rs

Instructions used from:

Sources:
📄 CodeRabbit Inference Engine

  • .github/copilot-instructions.md
🧠 Learnings (2)
📓 Common learnings
Learnt from: youknowone
PR: RustPython/RustPython#5945
File: vm/src/stdlib/typing.rs:132-136
Timestamp: 2025-07-11T07:16:06.225Z
Learning: In Python 3.12, TypeAliasType's __repr__ method returns just the alias name as a string (e.g., repr(A) returns 'A'), not the "<TypeAliasType AliasName>" format. This applies to type aliases created with the `type` statement syntax.
vm/src/stdlib/ast/python.rs (1)

Learnt from: CR
PR: RustPython/RustPython#0
File: .github/copilot-instructions.md:0-0
Timestamp: 2025-07-19T03:16:56.511Z
Learning: Applies to **/*.rs : Use the macro system (pyclass, pymodule, pyfunction, etc.) when implementing Python functionality in Rust

🔇 Additional comments (3)
vm/src/stdlib/ast/python.rs (3)

7-7: LGTM! Import changes are well-organized.

The additional imports are necessary for the Constructor implementation and follow Rust conventions.

Also applies to: 9-9


16-16: LGTM! Pyclass attribute correctly enables Constructor trait.

The with(Constructor) addition properly enables the custom constructor implementation while preserving existing flags.


56-82: LGTM! Well-implemented Constructor trait following established patterns.

The implementation correctly:

  • Uses slot_new for fast object creation with proper dictionary allocation
  • Delegates initialization to the existing __init__ method
  • Handles the HAS_DICT flag appropriately for conditional dictionary creation
  • Follows the pattern established elsewhere in the codebase for standardizing constructor behavior

The comment explaining AST node behavior differences from object.__new__ is helpful for understanding the design choice.

✨ Finishing Touches
  • 📝 Generate Docstrings

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@youknowone youknowone merged commit cd58d15 into RustPython:main Jul 21, 2025
12 checks passed
@youknowone youknowone deleted the type-alias-type branch July 21, 2025 05:42
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant