@@ -1923,6 +1923,114 @@ def update(self):
1923
1923
builder .parse (data )
1924
1924
1925
1925
1926
+ def test_issue940_metaclass_subclass_property ():
1927
+ node = builder .extract_node (
1928
+ """
1929
+ class BaseMeta(type):
1930
+ @property
1931
+ def __members__(cls):
1932
+ return ['a', 'property']
1933
+ class Parent(metaclass=BaseMeta):
1934
+ pass
1935
+ class Derived(Parent):
1936
+ pass
1937
+ Derived.__members__
1938
+ """
1939
+ )
1940
+ inferred = next (node .infer ())
1941
+ assert isinstance (inferred , nodes .List )
1942
+ assert [c .value for c in inferred .elts ] == ['a' , 'property' ]
1943
+
1944
+
1945
+ def test_issue940_property_grandchild ():
1946
+ node = builder .extract_node (
1947
+ """
1948
+ class Grandparent:
1949
+ @property
1950
+ def __members__(self):
1951
+ return ['a', 'property']
1952
+ class Parent(Grandparent):
1953
+ pass
1954
+ class Child(Parent):
1955
+ pass
1956
+ Child().__members__
1957
+ """
1958
+ )
1959
+ inferred = next (node .infer ())
1960
+ assert isinstance (inferred , nodes .List )
1961
+ assert [c .value for c in inferred .elts ] == ['a' , 'property' ]
1962
+
1963
+
1964
+ def test_issue940_metaclass_property ():
1965
+ node = builder .extract_node (
1966
+ """
1967
+ class BaseMeta(type):
1968
+ @property
1969
+ def __members__(cls):
1970
+ return ['a', 'property']
1971
+ class Parent(metaclass=BaseMeta):
1972
+ pass
1973
+ Parent.__members__
1974
+ """
1975
+ )
1976
+ inferred = next (node .infer ())
1977
+ assert isinstance (inferred , nodes .List )
1978
+ assert [c .value for c in inferred .elts ] == ['a' , 'property' ]
1979
+
1980
+
1981
+ def test_issue940_with_metaclass_class_context_property ():
1982
+ node = builder .extract_node (
1983
+ """
1984
+ class BaseMeta(type):
1985
+ pass
1986
+ class Parent(metaclass=BaseMeta):
1987
+ @property
1988
+ def __members__(cls):
1989
+ return ['a', 'property']
1990
+ class Derived(Parent):
1991
+ pass
1992
+ Derived.__members__
1993
+ """
1994
+ )
1995
+ inferred = next (node .infer ())
1996
+ assert not isinstance (inferred , nodes .List )
1997
+ assert isinstance (inferred , objects .Property )
1998
+
1999
+
2000
+ def test_issue940_metaclass_values_funcdef ():
2001
+ node = builder .extract_node (
2002
+ """
2003
+ class BaseMeta(type):
2004
+ def __members__(cls):
2005
+ return ['a', 'func']
2006
+ class Parent(metaclass=BaseMeta):
2007
+ pass
2008
+ Parent.__members__()
2009
+ """
2010
+ )
2011
+ inferred = next (node .infer ())
2012
+ assert isinstance (inferred , nodes .List )
2013
+ assert [c .value for c in inferred .elts ] == ['a' , 'func' ]
2014
+
2015
+
2016
+ def test_issue940_metaclass_derived_funcdef ():
2017
+ node = builder .extract_node (
2018
+ """
2019
+ class BaseMeta(type):
2020
+ def __members__(cls):
2021
+ return ['a', 'func']
2022
+ class Parent(metaclass=BaseMeta):
2023
+ pass
2024
+ class Derived(Parent):
2025
+ pass
2026
+ Derived.__members__()
2027
+ """
2028
+ )
2029
+ inferred_result = next (node .infer ())
2030
+ assert isinstance (inferred_result , nodes .List )
2031
+ assert [c .value for c in inferred_result .elts ] == ['a' , 'func' ]
2032
+
2033
+
1926
2034
def test_metaclass_cannot_infer_call_yields_an_instance ():
1927
2035
node = builder .extract_node (
1928
2036
"""
0 commit comments