7171from typing import (
7272 Any ,
7373 Callable ,
74+ cast as Tcast ,
7475 Generic ,
7576 Optional ,
77+ Sequence ,
7678 Type as TType ,
7779 TypeVar ,
7880 TYPE_CHECKING ,
@@ -314,6 +316,8 @@ def is_in_system_header(self):
314316 return conf .lib .clang_Location_isInSystemHeader (self ) # type: ignore [no-any-return]
315317
316318 def __eq__ (self , other ):
319+ if not isinstance (other , SourceLocation ):
320+ return False
317321 return conf .lib .clang_equalLocations (self , other ) # type: ignore [no-any-return]
318322
319323 def __ne__ (self , other ):
@@ -372,6 +376,8 @@ def end(self):
372376 return conf .lib .clang_getRangeEnd (self ) # type: ignore [no-any-return]
373377
374378 def __eq__ (self , other ):
379+ if not isinstance (other , SourceRange ):
380+ return False
375381 return conf .lib .clang_equalRanges (self , other ) # type: ignore [no-any-return]
376382
377383 def __ne__ (self , other ):
@@ -1556,6 +1562,8 @@ def from_location(tu, location):
15561562 return cursor
15571563
15581564 def __eq__ (self , other ):
1565+ if not isinstance (other , Cursor ):
1566+ return False
15591567 return conf .lib .clang_equalCursors (self , other ) # type: ignore [no-any-return]
15601568
15611569 def __ne__ (self , other ):
@@ -1746,7 +1754,7 @@ def get_definition(self):
17461754
17471755 def get_usr (self ):
17481756 """Return the Unified Symbol Resolution (USR) for the entity referenced
1749- by the given cursor (or None) .
1757+ by the given cursor.
17501758
17511759 A Unified Symbol Resolution (USR) is a string that identifies a
17521760 particular entity (function, class, variable, etc.) within a
@@ -2776,7 +2784,7 @@ def pretty_printed(self, policy):
27762784 return _CXString .from_result (conf .lib .clang_getTypePrettyPrinted (self , policy ))
27772785
27782786 def __eq__ (self , other ):
2779- if type (other ) != type ( self ):
2787+ if not isinstance (other , Type ):
27802788 return False
27812789
27822790 return conf .lib .clang_equalTypes (self , other ) # type: ignore [no-any-return]
@@ -2886,10 +2894,9 @@ def kind(self):
28862894 def string (self ):
28872895 res = conf .lib .clang_getCompletionChunkCompletionString (self .cs , self .key )
28882896
2889- if res :
2890- return CompletionString (res )
2891- else :
2892- None
2897+ if not res :
2898+ return None
2899+ return CompletionString (res )
28932900
28942901 def isKindOptional (self ):
28952902 return self .__kindNumber == 0
@@ -2955,6 +2962,13 @@ def __getitem__(self, key):
29552962 raise IndexError
29562963 return CompletionChunk (self .obj , key )
29572964
2965+ if TYPE_CHECKING :
2966+ # Defining __getitem__ and __len__ is enough to make an iterable
2967+ # but the typechecker doesn't understand that.
2968+ def __iter__ (self ):
2969+ for i in range (len (self )):
2970+ yield self [i ]
2971+
29582972 @property
29592973 def priority (self ):
29602974 return conf .lib .clang_getCompletionPriority (self .obj ) # type: ignore [no-any-return]
@@ -2970,7 +2984,7 @@ def briefComment(self):
29702984 return _CXString .from_result (
29712985 conf .lib .clang_getCompletionBriefComment (self .obj )
29722986 )
2973- return _CXString ()
2987+ return ""
29742988
29752989 def __repr__ (self ):
29762990 return (
@@ -3155,8 +3169,8 @@ def from_source(
31553169 a list via args. These can be used to specify include paths, warnings,
31563170 etc. e.g. ["-Wall", "-I/path/to/include"].
31573171
3158- In-memory file content can be provided via unsaved_files. This is an
3159- iterable of 2-tuples. The first element is the filename (str or
3172+ In-memory file content can be provided via unsaved_files. This is a
3173+ list of 2-tuples. The first element is the filename (str or
31603174 PathLike). The second element defines the content. Content can be
31613175 provided as str source code or as file objects (anything with a read()
31623176 method). If a file object is being used, content will be read until EOF
@@ -3328,13 +3342,15 @@ def get_extent(self, filename, locations):
33283342 start_location , end_location = locations
33293343
33303344 if hasattr (start_location , "__len__" ):
3345+ start_location = Tcast (Sequence [int ], start_location )
33313346 start_location = SourceLocation .from_position (
33323347 self , f , start_location [0 ], start_location [1 ]
33333348 )
33343349 elif isinstance (start_location , int ):
33353350 start_location = SourceLocation .from_offset (self , f , start_location )
33363351
33373352 if hasattr (end_location , "__len__" ):
3353+ end_location = Tcast (Sequence [int ], end_location )
33383354 end_location = SourceLocation .from_position (
33393355 self , f , end_location [0 ], end_location [1 ]
33403356 )
@@ -3464,6 +3480,8 @@ def get_tokens(self, locations=None, extent=None):
34643480 2-tuple of SourceLocation or as a SourceRange. If both are defined,
34653481 behavior is undefined.
34663482 """
3483+ if locations is None and extent is None :
3484+ raise TypeError ("get_tokens() requires at least one argument" )
34673485 if locations is not None :
34683486 extent = SourceRange (start = locations [0 ], end = locations [1 ])
34693487
@@ -3510,11 +3528,11 @@ def __ne__(self, other) -> bool:
35103528 @staticmethod
35113529 def from_result (res , arg ):
35123530 assert isinstance (res , c_object_p )
3513- res = File (res )
3531+ file = File (res )
35143532
35153533 # Copy a reference to the TranslationUnit to prevent premature GC.
3516- res ._tu = arg ._tu
3517- return res
3534+ file ._tu = arg ._tu
3535+ return file
35183536
35193537
35203538class FileInclusion :
@@ -3593,7 +3611,7 @@ def filename(self):
35933611 def arguments (self ):
35943612 """
35953613 Get an iterable object providing each argument in the
3596- command line for the compiler invocation as a _CXString .
3614+ command line for the compiler invocation as a string .
35973615
35983616 Invariant : the first argument is the compiler executable
35993617 """
0 commit comments