@@ -48,27 +48,46 @@ getfields(x::NamedTuple) = x
4848getproperties (o:: NamedTuple ) = o
4949getproperties (o:: Tuple ) = o
5050
51- function is_propertynames_overloaded (T:: Type ):: Bool
52- which (propertynames, Tuple{T}). sig != = Tuple{typeof (propertynames), Any}
51+ @static if fieldcount (Core. GeneratedFunctionStub) == 3
52+
53+ # after JuliaLang/julia#48611, generated functions should respect world ages
54+
55+ function is_propertynames_overloaded_generator (world:: UInt , source, self, obj)
56+ sig = Base. signature_type (propertynames, Tuple{obj})
57+ m = Base. _which (sig; world)
58+ has_overload = m. method. sig != = Tuple{typeof (propertynames), Any}
59+ stub = Core. GeneratedFunctionStub (identity, Core. svec (:is_propertynames_overloaded , :obj ), Core. svec ())
60+ stub (world, source, :(return $ has_overload))
61+ end
62+
63+ @eval function is_propertynames_overloaded (obj)
64+ $ (Expr (:meta , :generated_only ))
65+ $ (Expr (:meta , :generated , is_propertynames_overloaded_generator))
66+ end
67+
68+ else
69+
70+ @generated function is_propertynames_overloaded (obj)
71+ sig = Base. signature_type (propertynames, Tuple{obj})
72+ m = Base. _which (sig)
73+ has_overload = m. method. sig != = Tuple{typeof (propertynames), Any}
74+ :(return $ has_overload)
75+ end
76+
5377end
5478
55- @generated function check_properties_are_fields (obj)
79+
80+ function check_properties_are_fields (obj:: T ) where T
5681 if is_propertynames_overloaded (obj)
57- return quote
58- T = typeof (obj)
59- msg = """
82+ error ("""
6083 The function `Base.propertynames` was overloaded for type `$T `.
6184 Please make sure the following methods are also overloaded for this type:
6285 ```julia
6386 ConstructionBase.setproperties
6487 ConstructionBase.getproperties # optional in VERSION >= julia v1.7
65- ```
66- """
67- error (msg)
68- end
69- else
70- :(nothing )
88+ ```""" )
7189 end
90+ return
7291end
7392
7493# names are consecutive integers: return tuple
0 commit comments