@@ -6663,6 +6663,39 @@ class MyMetaClass(type):
6663
6663
class MyClass(metaclass=MyMetaClass):
6664
6664
pass
6665
6665
6666
+
6667
+ [case testMetaclassPlaceholderNode]
6668
+ from sympy.assumptions import ManagedProperties
6669
+ from sympy.ops import AssocOp
6670
+ reveal_type(AssocOp.x) # N: Revealed type is "sympy.basic.Basic"
6671
+ reveal_type(AssocOp.y) # N: Revealed type is "builtins.int"
6672
+
6673
+ [file sympy/__init__.py]
6674
+
6675
+ [file sympy/assumptions.py]
6676
+ from .basic import Basic
6677
+ class ManagedProperties(type):
6678
+ x: Basic
6679
+ y: int
6680
+ # The problem is with the next line,
6681
+ # it creates the following order (classname, metaclass):
6682
+ # 1. Basic NameExpr(ManagedProperties)
6683
+ # 2. AssocOp None
6684
+ # 3. ManagedProperties None
6685
+ # 4. Basic NameExpr(ManagedProperties [sympy.assumptions.ManagedProperties])
6686
+ # So, `AssocOp` will still have `metaclass_type` as `None`
6687
+ # and all its `mro` types will have `declared_metaclass` as `None`.
6688
+ from sympy.ops import AssocOp
6689
+
6690
+ [file sympy/basic.py]
6691
+ from .assumptions import ManagedProperties
6692
+ class Basic(metaclass=ManagedProperties): ...
6693
+
6694
+ [file sympy/ops.py]
6695
+ from sympy.basic import Basic
6696
+ class AssocOp(Basic): ...
6697
+
6698
+
6666
6699
[case testGenericOverride]
6667
6700
from typing import Generic, TypeVar, Any
6668
6701
0 commit comments