[lldb] Add matching based on Python callbacks for data formatters.
authorJorge Gorbe Moya <jgorbe@google.com>
Tue, 11 Oct 2022 07:44:06 +0000 (00:44 -0700)
committerJorge Gorbe Moya <jgorbe@google.com>
Wed, 19 Oct 2022 19:53:38 +0000 (12:53 -0700)
commitd76566417e592cfac9c710f82575473b1b4a9285
tree0dba28904c3700ccfad579cb02f3b2c23dc8dded
parentb8b740c834ae39691b3247b30d30f00cae2b9e10
[lldb] Add matching based on Python callbacks for data formatters.

This patch adds a new matching method for data formatters, in addition
to the existing exact typename and regex-based matching. The new method
allows users to specify the name of a Python callback function that
takes a `SBType` object and decides whether the type is a match or not.

Here is an overview of the changes performed:

- Add a new `eFormatterMatchCallback` matching type, and logic to handle
  it in `TypeMatcher` and `SBTypeNameSpecifier`.

- Extend `FormattersMatchCandidate` instances with a pointer to the
  current `ScriptInterpreter` and the `TypeImpl` corresponding to the
  candidate type, so we can run registered callbacks and pass the type
  to them. All matcher search functions now receive a
  `FormattersMatchCandidate` instead of a type name.

- Add some glue code to ScriptInterpreterPython and the SWIG bindings to
  allow calling a formatter matching callback. Most of this code is
  modeled after the equivalent code for watchpoint callback functions.

- Add an API test for the new callback-based matching feature.

For more context, please check the RFC thread where this feature was
originally discussed:
https://discourse.llvm.org/t/rfc-python-callback-for-data-formatters-type-matching/64204/11

Differential Revision: https://reviews.llvm.org/D135648
30 files changed:
lldb/bindings/python/python-swigsafecast.swig
lldb/bindings/python/python-wrapper.swig
lldb/include/lldb/API/SBType.h
lldb/include/lldb/DataFormatters/DataVisualization.h
lldb/include/lldb/DataFormatters/FormatClasses.h
lldb/include/lldb/DataFormatters/FormatManager.h
lldb/include/lldb/DataFormatters/FormattersContainer.h
lldb/include/lldb/DataFormatters/TypeCategory.h
lldb/include/lldb/DataFormatters/TypeCategoryMap.h
lldb/include/lldb/Interpreter/ScriptInterpreter.h
lldb/include/lldb/Target/Language.h
lldb/include/lldb/lldb-enumerations.h
lldb/source/API/SBTypeNameSpecifier.cpp
lldb/source/Commands/CommandObjectType.cpp
lldb/source/DataFormatters/DataVisualization.cpp
lldb/source/DataFormatters/FormatManager.cpp
lldb/source/DataFormatters/TypeCategory.cpp
lldb/source/DataFormatters/TypeCategoryMap.cpp
lldb/source/Plugins/Language/ObjC/ObjCLanguage.cpp
lldb/source/Plugins/Language/ObjC/ObjCLanguage.h
lldb/source/Plugins/ScriptInterpreter/Python/SWIGPythonBridge.h
lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPython.cpp
lldb/source/Plugins/ScriptInterpreter/Python/ScriptInterpreterPythonImpl.h
lldb/source/Target/Language.cpp
lldb/test/API/functionalities/data-formatter/callback-matching/Makefile [new file with mode: 0644]
lldb/test/API/functionalities/data-formatter/callback-matching/TestDataFormatterCallbackMatching.py [new file with mode: 0644]
lldb/test/API/functionalities/data-formatter/callback-matching/formatters_with_callback.py [new file with mode: 0644]
lldb/test/API/functionalities/data-formatter/callback-matching/main.cpp [new file with mode: 0644]
lldb/unittests/DataFormatter/FormattersContainerTest.cpp
lldb/unittests/ScriptInterpreter/Python/PythonTestSuite.cpp