================
@@ -1913,7 +1916,7 @@ def type(self):
         return self._type
 
     @property
-    def canonical(self):
+    def canonical(self) -> Cursor | None:
         """Return the canonical Cursor corresponding to this Cursor.
----------------
Endilll wrote:

> That said, the input to it comes from clang_getCanonicalCursor which does not 
> seem to ever return the Null-Cursor

Are you sure? It seems that if you pass null cursor to it, you get null cursor 
back: 
https://github.com/llvm/llvm-project/blob/ec29f83a02841bb61df88f5fede0054f18c1b367/clang/tools/libclang/CIndex.cpp#L7438-L7440

> so we could theoretically constrain the return type here to just Cursor, by 
> asserting isinstance(the_return_value, Cursor), but this is a bit ugly... 
> what do you think?

Looking at `Cursor.from_cursor_result` and `Cursor.from_result`, it seems that 
Python bindings make a serious effort to map null cursor to `None`. Which means 
there should be no way to call `Cursor` methods on a null cursor. Which means 
that `clang_getCanonicalCursor` will never return null cursor back. So I agree 
that we should drop `| None` part of type hint.

Instead of the assert you propose, I think all `Cursor` methods should assert 
that `self` is not a null cursor, and ideally avoid calling `getNullCursor` on 
every method invocation. That said, we're already are not shy to call it in 
`from_result` and `from_cursor_result`, so it might be an acceptable overhead.

https://github.com/llvm/llvm-project/pull/138103
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to