Author: Eli Friedman Date: 2025-01-10T15:11:19-08:00 New Revision: b302633bc5b93118b8a0bcaabfe0957294b9e894
URL: https://github.com/llvm/llvm-project/commit/b302633bc5b93118b8a0bcaabfe0957294b9e894 DIFF: https://github.com/llvm/llvm-project/commit/b302633bc5b93118b8a0bcaabfe0957294b9e894.diff LOG: [libclang] Allow using PrintingPolicy with types (#122386) This allows controlling pretty-printing of types the same way it works with cursors. Added: Modified: clang/bindings/python/clang/cindex.py clang/bindings/python/tests/cindex/test_type.py clang/docs/ReleaseNotes.rst clang/include/clang-c/Index.h clang/tools/libclang/CXType.cpp clang/tools/libclang/libclang.map Removed: ################################################################################ diff --git a/clang/bindings/python/clang/cindex.py b/clang/bindings/python/clang/cindex.py index 7caf0bbfd722af..710259de855f9b 100644 --- a/clang/bindings/python/clang/cindex.py +++ b/clang/bindings/python/clang/cindex.py @@ -2701,6 +2701,10 @@ 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 +3959,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..f39da8b5faf297 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 5a48d6fbc01fa3..190843f2aa6c96 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -1182,6 +1182,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 --------------- @@ -1322,10 +1324,13 @@ Sanitizers Python Binding Changes ---------------------- - Fixed an issue that led to crashes when calling ``Type.get_exception_specification_kind``. -- Added bindings for ``clang_getCursorPrettyPrinted`` and related functions, - which allow changing the formatting of pretty-printed code. -- Added binding for ``clang_Cursor_isAnonymousRecordDecl``, which allows checking if - a declaration is an anonymous union or anonymous struct. +- Added ``Cursor.pretty_printed``, a binding for ``clang_getCursorPrettyPrinted``, + and related functions, which allow changing the formatting of pretty-printed code. +- Added ``Cursor.is_anonymous_record_decl``, a binding for + ``clang_Cursor_isAnonymousRecordDecl``, which allows checking if a + declaration is an anonymous union or anonymous struct. +- Added ``Type.pretty_printed`, a binding for ``clang_getTypePrettyPrinted``, + which allows changing the formatting of pretty-printed types. OpenMP Support -------------- diff --git a/clang/include/clang-c/Index.h b/clang/include/clang-c/Index.h index 63d266dc60ec73..ad64497ceb8025 100644 --- a/clang/include/clang-c/Index.h +++ b/clang/include/clang-c/Index.h @@ -4182,6 +4182,14 @@ 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..00ba56ab3c79d5 100644 --- a/clang/tools/libclang/libclang.map +++ b/clang/tools/libclang/libclang.map @@ -436,6 +436,7 @@ LLVM_19 { LLVM_20 { global: + clang_getTypePrettyPrinted; clang_isBeforeInTranslationUnit; }; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits