@@ -48,27 +48,45 @@ 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). method
58+ has_overload = m. 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+ m = which(propertynames, Tuple{obj})
72+ has_overload = m. sig != = Tuple{typeof(propertynames), Any}
73+ :(return $ has_overload)
74+ end
75+
5376end
5477
55- @generated function check_properties_are_fields(obj)
78+
79+ function check_properties_are_fields(obj:: T ) where T
5680 if is_propertynames_overloaded(obj)
57- return quote
58- T = typeof(obj)
59- msg = """
81+ error("""
6082 The function `Base.propertynames` was overloaded for type `$T `.
6183 Please make sure the following methods are also overloaded for this type:
6284 ```julia
6385 ConstructionBase.setproperties
6486 ConstructionBase.getproperties # optional in VERSION >= julia v1.7
65- ```
66- """
67- error(msg)
68- end
69- else
70- :(nothing )
87+ ```""" )
7188 end
89+ return
7290end
7391
7492# names are consecutive integers: return tuple
0 commit comments