24
24
25
25
import gi
26
26
import gi ._gi as GI
27
+ import gir
27
28
import parse
28
29
29
30
gi .require_version ("GIRepository" , "2.0" )
34
35
35
36
ObjectT = Union [ModuleType , Type [Any ]]
36
37
38
+ DEPRECATION_DOCS : dict [str , str ] = {}
39
+
37
40
38
41
def _object_get_props (
39
42
obj : GI .ObjectInfo ,
@@ -339,9 +342,16 @@ def _build(parent: ObjectT, namespace: str, overrides: dict[str, str]) -> str:
339
342
typings = "from typing import Any, Callable, Literal, Optional, Tuple, Type, TypeVar, Sequence"
340
343
341
344
typevars : list [str ] = []
342
- imports : list [str ] = []
345
+ imports : list [str ] = [
346
+ """
347
+ try:
348
+ from warnings import deprecated
349
+ except ImportError:
350
+ from typing_extensions import deprecated
351
+ """
352
+ ]
343
353
if "cairo" in ns :
344
- imports = ["import cairo" ]
354
+ imports + = ["import cairo" ]
345
355
typevars .append ('_SomeSurface = TypeVar("_SomeSurface", bound=cairo.Surface)' )
346
356
ns .remove ("cairo" )
347
357
@@ -507,6 +517,29 @@ def _check_override(prefix: str, name: str, overrides: dict[str, str]) -> Option
507
517
return None
508
518
509
519
520
+ def _check_deprecation (obj : Any , full_name : str , default_message : str ) -> str :
521
+ ret = ""
522
+ if hasattr (obj , "is_deprecated" ):
523
+ if obj .is_deprecated ():
524
+ message = (
525
+ # Currently not implemented:
526
+ # https://gitlab.gnome.org/GNOME/gobject-introspection/-/issues/80
527
+ (
528
+ obj .get_attribute ("deprecated" )
529
+ if hasattr (obj , "get_attribute" )
530
+ else None
531
+ )
532
+ or (
533
+ DEPRECATION_DOCS [full_name ]
534
+ if full_name in DEPRECATION_DOCS
535
+ else None
536
+ )
537
+ or default_message
538
+ )
539
+ ret += f'@deprecated("{ message } ")\n '
540
+ return ret
541
+
542
+
510
543
def _gi_build_stub (
511
544
parent : ObjectT ,
512
545
current_namespace : str ,
@@ -601,6 +634,12 @@ def _gi_build_stub(
601
634
602
635
# Functions
603
636
for name in sorted (functions ):
637
+ full_name = _generate_full_name (prefix_name , name )
638
+ ret += _check_deprecation (
639
+ functions [name ],
640
+ full_name ,
641
+ f"This { 'method' if in_class else 'function' } is deprecated" ,
642
+ )
604
643
override = _check_override (prefix_name , name , overrides )
605
644
if override :
606
645
ret += override + "\n "
@@ -615,13 +654,18 @@ def _gi_build_stub(
615
654
616
655
# Classes
617
656
for name , obj in sorted (classes .items ()):
657
+ full_name = _generate_full_name (prefix_name , name )
658
+
659
+ if hasattr (obj , "__info__" ):
660
+ ret += _check_deprecation (
661
+ obj .__info__ , full_name , "This class is deprecated"
662
+ )
663
+
618
664
override = _check_override (prefix_name , name , overrides )
619
665
if override :
620
666
ret += override + "\n \n "
621
667
continue
622
668
623
- full_name = _generate_full_name (prefix_name , name )
624
-
625
669
classret = _gi_build_stub (
626
670
obj ,
627
671
current_namespace ,
@@ -804,13 +848,18 @@ def _gi_build_stub(
804
848
805
849
# Flags
806
850
for name , obj in sorted (flags .items ()):
851
+ full_name = _generate_full_name (prefix_name , name )
852
+
853
+ if hasattr (obj , "__info__" ):
854
+ ret += _check_deprecation (
855
+ obj .__info__ , full_name , "This class is deprecated"
856
+ )
857
+
807
858
override = _check_override (prefix_name , name , overrides )
808
859
if override :
809
860
ret += override + "\n \n "
810
861
continue
811
862
812
- full_name = _generate_full_name (prefix_name , name )
813
-
814
863
if current_namespace == "GObject" :
815
864
if name != "GFlags" :
816
865
base = "GFlags"
@@ -847,13 +896,18 @@ def _gi_build_stub(
847
896
848
897
# Enums
849
898
for name , obj in sorted (enums .items ()):
899
+ full_name = _generate_full_name (prefix_name , name )
900
+
901
+ if hasattr (obj , "__info__" ):
902
+ ret += _check_deprecation (
903
+ obj .__info__ , full_name , "This class is deprecated"
904
+ )
905
+
850
906
override = _check_override (prefix_name , name , overrides )
851
907
if override :
852
908
ret += override + "\n \n "
853
909
continue
854
910
855
- full_name = _generate_full_name (prefix_name , name )
856
-
857
911
if current_namespace == "GObject" :
858
912
if name != "GEnum" :
859
913
base = "GEnum"
@@ -940,6 +994,8 @@ def start(module: str, version: str, overrides: dict[str, str]) -> str:
940
994
941
995
args = parser .parse_args ()
942
996
997
+ DEPRECATION_DOCS = gir .load_gir (args .module , args .version )
998
+
943
999
if args .output :
944
1000
overrides : dict [str , str ] = {}
945
1001
try :
0 commit comments