[clang] [libclang] Allow using PrintingPolicy with types (PR #122386)
Eli Friedman via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 9 14:56:04 PST 2025
https://github.com/efriedma-quic created https://github.com/llvm/llvm-project/pull/122386
This allows controlling pretty-printing of types the same way it works with cursors.
>From a96fbe38f697f77c12c712f5573c2158072a8d2f Mon Sep 17 00:00:00 2001
From: Eli Friedman <efriedma at quicinc.com>
Date: Tue, 17 Dec 2024 17:46:09 -0800
Subject: [PATCH] [libclang] Allow using PrintingPolicy with types
This allows controlling pretty-printing of types the same way it works
with cursors.
---
clang/bindings/python/clang/cindex.py | 6 ++++++
.../bindings/python/tests/cindex/test_type.py | 19 ++++++++++++++++++-
clang/docs/ReleaseNotes.rst | 2 ++
clang/include/clang-c/Index.h | 7 +++++++
clang/tools/libclang/CXType.cpp | 14 ++++++++++++++
clang/tools/libclang/libclang.map | 1 +
6 files changed, 48 insertions(+), 1 deletion(-)
diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py
index 7caf0bbfd722af..e01285e27fcdf9 100644
--- a/clang/bindings/python/clang/cindex.py
+++ b/clang/bindings/python/clang/cindex.py
@@ -2701,6 +2701,11 @@ def spelling(self):
"""Retrieve the spelling of this Type."""
return _CXString.from_result(conf.lib.clang_getTypeSpelling(self))
+ def pretty_printed(self, policy):
+ """Pretty-prints this Type with the given PrintingPolicy"""
+ return _CXString.from_result(conf.lib.clang_getTypePrettyPrinted(self, policy))
+
+
def __eq__(self, other):
if type(other) != type(self):
return False
@@ -3955,6 +3960,7 @@ def set_property(self, property, value):
("clang_getTypedefDeclUnderlyingType", [Cursor], Type),
("clang_getTypedefName", [Type], _CXString),
("clang_getTypeKindSpelling", [c_uint], _CXString),
+ ("clang_getTypePrettyPrinted", [Type, PrintingPolicy], _CXString),
("clang_getTypeSpelling", [Type], _CXString),
("clang_hashCursor", [Cursor], c_uint),
("clang_isAttribute", [CursorKind], bool),
diff --git a/clang/bindings/python/tests/cindex/test_type.py b/clang/bindings/python/tests/cindex/test_type.py
index e1d8c2aad1c3a4..da27ba5bda3ee0 100644
--- a/clang/bindings/python/tests/cindex/test_type.py
+++ b/clang/bindings/python/tests/cindex/test_type.py
@@ -1,6 +1,14 @@
import os
-from clang.cindex import Config, CursorKind, RefQualifierKind, TranslationUnit, TypeKind
+from clang.cindex import (
+ Config,
+ CursorKind,
+ PrintingPolicy,
+ PrintingPolicyProperty,
+ RefQualifierKind,
+ TranslationUnit,
+ TypeKind
+)
if "CLANG_LIBRARY_PATH" in os.environ:
Config.set_library_path(os.environ["CLANG_LIBRARY_PATH"])
@@ -517,3 +525,12 @@ class Template {
# Variable without a template argument.
cursor = get_cursor(tu, "bar")
self.assertEqual(cursor.get_num_template_arguments(), -1)
+
+ def test_pretty(self):
+ tu = get_tu("struct X {}; X x;", lang="cpp")
+ f = get_cursor(tu, "x")
+
+ pp = PrintingPolicy.create(f)
+ self.assertEqual(f.type.get_canonical().pretty_printed(pp), "X")
+ pp.set_property(PrintingPolicyProperty.SuppressTagKeyword, False)
+ self.assertEqual(f.type.get_canonical().pretty_printed(pp), "struct X")
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 07a1a4195427d8..d0479a94bd67ce 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -1158,6 +1158,8 @@ libclang
--------
- Add ``clang_isBeforeInTranslationUnit``. Given two source locations, it determines
whether the first one comes strictly before the second in the source code.
+- Add ``clang_getTypePrettyPrinted``. It allows controlling the PrintingPolicy used
+ to pretty-print a type.
Static Analyzer
---------------
diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h
index 63d266dc60ec73..e1f3759bb53e85 100644
--- a/clang/include/clang-c/Index.h
+++ b/clang/include/clang-c/Index.h
@@ -4182,6 +4182,13 @@ CINDEX_LINKAGE void clang_PrintingPolicy_dispose(CXPrintingPolicy Policy);
CINDEX_LINKAGE CXString clang_getCursorPrettyPrinted(CXCursor Cursor,
CXPrintingPolicy Policy);
+/**
+ * Pretty-print the underlying type using a custom printing policy.
+ *
+ * If the type is invalid, an empty string is returned.
+ */
+CINDEX_LINKAGE CXString clang_getTypePrettyPrinted(CXType CT, CXPrintingPolicy cxPolicy);
+
/**
* 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 b4df12405cf356..f97023c429bfae 100644
--- a/clang/tools/libclang/CXType.cpp
+++ b/clang/tools/libclang/CXType.cpp
@@ -313,6 +313,20 @@ CXString clang_getTypeSpelling(CXType CT) {
return cxstring::createDup(OS.str());
}
+CXString clang_getTypePrettyPrinted(CXType CT, CXPrintingPolicy cxPolicy) {
+ QualType T = GetQualType(CT);
+ if (T.isNull())
+ return cxstring::createEmpty();
+
+ SmallString<64> Str;
+ llvm::raw_svector_ostream OS(Str);
+ PrintingPolicy *UserPolicy = static_cast<PrintingPolicy *>(cxPolicy);
+
+ T.print(OS, *UserPolicy);
+
+ return cxstring::createDup(OS.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 25d8ba57d32514..c5f0be746ffe12 100644
--- a/clang/tools/libclang/libclang.map
+++ b/clang/tools/libclang/libclang.map
@@ -437,6 +437,7 @@ LLVM_19 {
LLVM_20 {
global:
clang_isBeforeInTranslationUnit;
+ clang_getTypePrettyPrinted;
};
# Example of how to add a new symbol version entry. If you do add a new symbol
More information about the cfe-commits
mailing list