[clang] [cindex] Add support for calling getFullyQualifiedName to the Python binding. (PR #135420)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Apr 11 11:35:55 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: Brian Cody (epistax)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/135420.diff
6 Files Affected:
- (modified) clang/bindings/python/clang/cindex.py (+12)
- (modified) clang/bindings/python/tests/cindex/test_type.py (+22)
- (modified) clang/docs/ReleaseNotes.rst (+4)
- (modified) clang/include/clang-c/Index.h (+12)
- (modified) clang/tools/libclang/CXType.cpp (+17)
- (modified) clang/tools/libclang/libclang.map (+1)
``````````diff
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;
``````````
</details>
https://github.com/llvm/llvm-project/pull/135420
More information about the cfe-commits
mailing list