-
Notifications
You must be signed in to change notification settings - Fork 15.2k
[cindex] Add support for calling getFullyQualifiedName to the Python binding. #135420
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
Conversation
|
Thank you for submitting a Pull Request (PR) to the LLVM Project! This PR will be automatically labeled and the relevant teams will be notified. If you wish to, you can add reviewers by using the "Reviewers" section on this page. If this is not working for you, it is probably because you do not have write permissions for the repository. In which case you can instead tag reviewers by name in a comment by using If you have received no comments on your PR for a week, you can request a review by "ping"ing the PR by adding a comment “Ping”. The common courtesy "ping" rate is once a week. Please remember that you are asking for valuable time from other developers. If you have further questions, they may be answered by the LLVM GitHub User Guide. You can also ask questions in a comment on this PR, on the LLVM Discord or on the forums. |
|
@llvm/pr-subscribers-clang Author: Brian Cody (epistax) ChangesFull diff: https://github.com/llvm/llvm-project/pull/135420.diff 6 Files Affected:
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index 2319534a6f121..5830dc2149348 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -2593,6 +2593,17 @@ def get_canonical(self):
"""
return Type.from_result(conf.lib.clang_getCanonicalType(self), (self,))
+ def get_fully_qualified_name(self, policy, with_global_ns_prefix = False):
+ """
+ Get the fully qualified name for a type.
+
+ This includes full qualification of all template parameters.
+
+ policy - This PrintingPolicy can further refine the type formatting
+ with_global_ns_prefix - If true, function will prepend a '::' to qualified names
+ """
+ return _CXString.from_result(conf.lib.clang_getFullyQualifiedName(self, policy, with_global_ns_prefix))
+
def is_const_qualified(self):
"""Determine whether a Type has the "const" qualifier set.
@@ -4022,6 +4033,7 @@ def set_property(self, property, value):
("clang_getTypeSpelling", [Type], _CXString),
("clang_hashCursor", [Cursor], c_uint),
("clang_isAttribute", [CursorKind], bool),
+ ("clang_getFullyQualifiedName", [Type, PrintingPolicy, c_uint], _CXString),
("clang_isConstQualifiedType", [Type], bool),
("clang_isCursorDefinition", [Cursor], bool),
("clang_isDeclaration", [CursorKind], bool),
diff --git a/clang/bindings/python/tests/cindex/test_type.py b/clang/bindings/python/tests/cindex/test_type.py
index a9473e1dc2458..b2a82a00b4f40 100644
--- a/clang/bindings/python/tests/cindex/test_type.py
+++ b/clang/bindings/python/tests/cindex/test_type.py
@@ -535,6 +535,28 @@ def test_pretty(self):
pp.set_property(PrintingPolicyProperty.SuppressTagKeyword, False)
self.assertEqual(f.type.get_canonical().pretty_printed(pp), "struct X")
+ def test_fully_qualified_name(self):
+ source = """
+ namespace home {
+ class Bar {
+ };
+ class Foo {
+ public:
+ void setIt(Bar*);
+ };
+ }
+ class A : public home::Foo {
+ };
+ """
+ tu = get_tu(source, lang="cpp")
+ c = get_cursor(tu, "A")
+ pp = PrintingPolicy.create(c)
+ base = list(c.get_children())[0].type.get_declaration()
+ set_it = list(base.get_children())[1]
+ arg = list(set_it.get_arguments())[0]
+ self.assertEqual(arg.type.get_fully_qualified_name(pp), "home::Bar *")
+ self.assertEqual(arg.type.get_fully_qualified_name(pp, True), "::home::Bar *")
+
def test_base_classes(self):
source = """
class A { int a; };
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 9c45965dc4d82..f228a32acd51d 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -589,6 +589,8 @@ libclang
--------
- Added ``clang_visitCXXMethods``, which allows visiting the methods
of a class.
+- Added ``clang_getFullyQualifiedName``, which provides fully qualified type names as
+ instructed by a PrintingPolicy.
- Fixed a buffer overflow in ``CXString`` implementation. The fix may result in
increased memory allocation.
@@ -643,6 +645,8 @@ Python Binding Changes
the cursor is a specialization of.
- Added ``Type.get_methods``, a binding for ``clang_visitCXXMethods``, which
allows visiting the methods of a class.
+- Added ``Type.getFullyQualifiedName``, which provides fully qualified type names as
+ instructed by a PrintingPolicy.
OpenMP Support
--------------
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index 38e2417dcd181..25700a48c928c 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -4223,6 +4223,18 @@ CINDEX_LINKAGE CXString clang_getCursorPrettyPrinted(CXCursor Cursor,
CINDEX_LINKAGE CXString clang_getTypePrettyPrinted(CXType CT,
CXPrintingPolicy cxPolicy);
+/**
+ * Get the fully qualified name for a type.
+ *
+ * This includes full qualification of all template parameters.
+ *
+ * Policy - Further refine the type formatting
+ * WithGlobalNsPrefix - If non-zero, function will prepend a '::' to qualified
+ * names
+ */
+CINDEX_LINKAGE CXString clang_getFullyQualifiedName(
+ CXType CT, CXPrintingPolicy Policy, unsigned WithGlobalNsPrefix);
+
/**
* Retrieve the display name for the entity referenced by this cursor.
*
diff --git a/clang/tools/libclang/CXType.cpp b/clang/tools/libclang/CXType.cpp
index 2c9ef282b8abc..ffa942d10669c 100644
--- a/clang/tools/libclang/CXType.cpp
+++ b/clang/tools/libclang/CXType.cpp
@@ -19,6 +19,7 @@
#include "clang/AST/DeclObjC.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/AST/Expr.h"
+#include "clang/AST/QualTypeNames.h"
#include "clang/AST/RecordLayout.h"
#include "clang/AST/Type.h"
#include "clang/Basic/AddressSpaces.h"
@@ -328,6 +329,22 @@ CXString clang_getTypePrettyPrinted(CXType CT, CXPrintingPolicy cxPolicy) {
return cxstring::createDup(OS.str());
}
+CXString clang_getFullyQualifiedName(CXType CT, CXPrintingPolicy cxPolicy,
+ unsigned int WithGlobalNsPrefix) {
+ const QualType T = GetQualType(CT);
+ if (T.isNull())
+ return cxstring::createEmpty();
+ const CXTranslationUnit TU = GetTU(CT);
+ const ASTContext &Ctx = cxtu::getASTUnit(TU)->getASTContext();
+ const PrintingPolicy *UserPolicy = static_cast<PrintingPolicy *>(cxPolicy);
+ const bool WithGlobalNs = (WithGlobalNsPrefix != 0);
+
+ const std::string Str =
+ TypeName::getFullyQualifiedName(T, Ctx, *UserPolicy, WithGlobalNs);
+
+ return cxstring::createDup(Str);
+}
+
CXType clang_getTypedefDeclUnderlyingType(CXCursor C) {
using namespace cxcursor;
CXTranslationUnit TU = cxcursor::getCursorTU(C);
diff --git a/clang/tools/libclang/libclang.map b/clang/tools/libclang/libclang.map
index 07471ca42c97e..9a5e381113d37 100644
--- a/clang/tools/libclang/libclang.map
+++ b/clang/tools/libclang/libclang.map
@@ -431,6 +431,7 @@ LLVM_19 {
LLVM_20 {
global:
+ clang_getFullyQualifiedName;
clang_getOffsetOfBase;
clang_getTypePrettyPrinted;
clang_isBeforeInTranslationUnit;
|
|
✅ With the latest revision this PR passed the Python code formatter. |
DeinAlptraum
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Re Python: A few minor nits, otherwise this looks good to me.
@Endilll can you review the C++ side?
Endilll
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM
Co-authored-by: Jannick Kremer <[email protected]>
Co-authored-by: Jannick Kremer <[email protected]>
Co-authored-by: Jannick Kremer <[email protected]>
|
@epistax I just realized you don't have perms to merge, right? |
That's right. Yep this is ready from my side. I'd appreciate it if you merged! Thanks |
|
@epistax Congratulations on having your first Pull Request (PR) merged into the LLVM Project! Your changes will be combined with recent changes from other authors, then tested by our build bots. If there is a problem with a build, you may receive a report in an email or a comment on this PR. Please check whether problems have been caused by your change specifically, as the builds can include changes from many authors. It is not uncommon for your change to be included in a build that fails due to someone else's changes, or infrastructure issues. How to do this, and the rest of the post-merge process, is covered in detail here. If your change does cause a problem, it may be reverted, or you can revert it yourself. This is a normal part of LLVM development. You can fix your changes and open a new PR to merge them again. If you don't get any reports, no action is required from you. Your changes are working as expected, well done! |
|
Done. Thank you for your contribution! |
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/186/builds/8223 Here is the relevant piece of the build log for the reference |
We're coming from llvm 11. There was a change made back in 15f3cd6 that changed how type spelling works. Previous we were given namespaces of the types within the spelling, and this was necessary in our use-case. There is a more appropriate function available but it was not being exposed over the Python bindings. This PR is intended to make make this already-existing functionality accessible.