Skip to content

[libclang/python] Add some logical typing changes. #138074

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
May 1, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 31 additions & 13 deletions clang/bindings/python/clang/cindex.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,10 @@
from typing import (
Any,
Callable,
cast as Tcast,
Generic,
Optional,
Sequence,
Type as TType,
TypeVar,
TYPE_CHECKING,
Expand Down Expand Up @@ -314,6 +316,8 @@ def is_in_system_header(self):
return conf.lib.clang_Location_isInSystemHeader(self) # type: ignore [no-any-return]

def __eq__(self, other):
if not isinstance(other, SourceLocation):
return False
return conf.lib.clang_equalLocations(self, other) # type: ignore [no-any-return]

def __ne__(self, other):
Expand Down Expand Up @@ -372,6 +376,8 @@ def end(self):
return conf.lib.clang_getRangeEnd(self) # type: ignore [no-any-return]

def __eq__(self, other):
if not isinstance(other, SourceRange):
return False
return conf.lib.clang_equalRanges(self, other) # type: ignore [no-any-return]

def __ne__(self, other):
Expand Down Expand Up @@ -1556,6 +1562,8 @@ def from_location(tu, location):
return cursor

def __eq__(self, other):
if not isinstance(other, Cursor):
return False
return conf.lib.clang_equalCursors(self, other) # type: ignore [no-any-return]

def __ne__(self, other):
Expand Down Expand Up @@ -1746,7 +1754,7 @@ def get_definition(self):

def get_usr(self):
"""Return the Unified Symbol Resolution (USR) for the entity referenced
by the given cursor (or None).
by the given cursor.

A Unified Symbol Resolution (USR) is a string that identifies a
particular entity (function, class, variable, etc.) within a
Expand Down Expand Up @@ -2776,7 +2784,7 @@ def pretty_printed(self, policy):
return _CXString.from_result(conf.lib.clang_getTypePrettyPrinted(self, policy))

def __eq__(self, other):
if type(other) != type(self):
if not isinstance(other, Type):
return False

return conf.lib.clang_equalTypes(self, other) # type: ignore [no-any-return]
Expand Down Expand Up @@ -2886,10 +2894,9 @@ def kind(self):
def string(self):
res = conf.lib.clang_getCompletionChunkCompletionString(self.cs, self.key)

if res:
return CompletionString(res)
else:
None
if not res:
return None
return CompletionString(res)

def isKindOptional(self):
return self.__kindNumber == 0
Expand Down Expand Up @@ -2955,6 +2962,13 @@ def __getitem__(self, key):
raise IndexError
return CompletionChunk(self.obj, key)

if TYPE_CHECKING:
# Defining __getitem__ and __len__ is enough to make an iterable
# but the typechecker doesn't understand that.
def __iter__(self):
for i in range(len(self)):
yield self[i]

@property
def priority(self):
return conf.lib.clang_getCompletionPriority(self.obj) # type: ignore [no-any-return]
Expand All @@ -2970,7 +2984,7 @@ def briefComment(self):
return _CXString.from_result(
conf.lib.clang_getCompletionBriefComment(self.obj)
)
return _CXString()
return ""

def __repr__(self):
return (
Expand Down Expand Up @@ -3155,8 +3169,8 @@ def from_source(
a list via args. These can be used to specify include paths, warnings,
etc. e.g. ["-Wall", "-I/path/to/include"].

In-memory file content can be provided via unsaved_files. This is an
iterable of 2-tuples. The first element is the filename (str or
In-memory file content can be provided via unsaved_files. This is a
list of 2-tuples. The first element is the filename (str or
PathLike). The second element defines the content. Content can be
provided as str source code or as file objects (anything with a read()
method). If a file object is being used, content will be read until EOF
Expand Down Expand Up @@ -3328,13 +3342,15 @@ def get_extent(self, filename, locations):
start_location, end_location = locations

if hasattr(start_location, "__len__"):
start_location = Tcast(Sequence[int], start_location)
start_location = SourceLocation.from_position(
self, f, start_location[0], start_location[1]
)
elif isinstance(start_location, int):
start_location = SourceLocation.from_offset(self, f, start_location)

if hasattr(end_location, "__len__"):
end_location = Tcast(Sequence[int], end_location)
end_location = SourceLocation.from_position(
self, f, end_location[0], end_location[1]
)
Expand Down Expand Up @@ -3464,6 +3480,8 @@ def get_tokens(self, locations=None, extent=None):
2-tuple of SourceLocation or as a SourceRange. If both are defined,
behavior is undefined.
"""
if locations is None and extent is None:
raise TypeError("get_tokens() requires at least one argument")
if locations is not None:
extent = SourceRange(start=locations[0], end=locations[1])

Expand Down Expand Up @@ -3502,11 +3520,11 @@ def __repr__(self):
@staticmethod
def from_result(res, arg):
assert isinstance(res, c_object_p)
res = File(res)
file = File(res)

# Copy a reference to the TranslationUnit to prevent premature GC.
res._tu = arg._tu
return res
file._tu = arg._tu
return file


class FileInclusion:
Expand Down Expand Up @@ -3585,7 +3603,7 @@ def filename(self):
def arguments(self):
"""
Get an iterable object providing each argument in the
command line for the compiler invocation as a _CXString.
command line for the compiler invocation as a string.

Invariant : the first argument is the compiler executable
"""
Expand Down
Loading