[clang] [libclang/python] Fix bug in `SourceRange.__contains__`, add tests (PR #101802)
Jannick Kremer via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 9 14:51:14 PDT 2024
================
@@ -386,6 +386,10 @@ def __contains__(self, other):
# same file, in between lines
if self.start.line < other.line < self.end.line:
return True
+ # between columns in one-liner range
+ elif self.start.line == other.line == self.end.line:
----------------
DeinAlptraum wrote:
Clarification because I probably expressed myself inaccurately:
On C-side, in `SourceLocation.h` we implement `operator==`, `operator<=` both as direct comparisons on the raw encoding (`SourceLocation::getRawEncoding()`). This is not file-sensitive.*
On the C/Python _bindings_ side, we already expose `clang_equalLocations`, which looks like this:
```
unsigned clang_equalLocations(CXSourceLocation loc1, CXSourceLocation loc2) {
return (loc1.ptr_data[0] == loc2.ptr_data[0] &&
loc1.ptr_data[1] == loc2.ptr_data[1] &&
loc1.int_data == loc2.int_data);
}
```
This _is_ file sensitive. The problem arises because this function is used already to implement `SourceLocation.__eq__` on the Python bindings side. This means that the internal `SourceLocation::operator==` is inconsistent with the bindings' `SourceLocation.__eq__` (the latter is file-sensitive, the former is not). The C-bindings are not affected by this as they do not implement `CXSourceLocation::opreraor==` or `CXSourceLocation::opreraor<=`.
*Note that this is not obvious from the code (at least to me) and I'm not familiar with the C side yet, so I tested this manually in Python, by exposing these operators to the Python bindings (pls don't judge me)
https://github.com/llvm/llvm-project/pull/101802
More information about the cfe-commits
mailing list