| /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying |
| file LICENSE.rst or https://cmake.org/licensing for details. */ |
| #pragma once |
| |
| #include "cmConfigure.h" // IWYU pragma: keep |
| |
| #include <cstddef> |
| |
| #include <cm/string_view> |
| |
| #include "cmCacheDocumentationTable.h" |
| |
| /** \namespace cmCachePatternTable |
| * \brief Compile-time pattern-matching fallback for built-in CMake cache |
| * variable documentation. |
| * |
| * The pattern table is a hand-maintained list of placeholder-shaped |
| * tooltips, e.g. ``CMAKE_<LANG>_FLAGS`` or |
| * ``CMAKE_POLICY_DEFAULT_CMP<NNNN>``, that complement the exact-match |
| * entries in ``cmCacheDocumentationTable``. It is consulted only on |
| * the miss path: ``cmCacheDocumentationTable::Get`` first attempts an |
| * exact-match lookup, then falls back to ``cmCachePatternTable::Match`` |
| * for names that follow a known template shape. |
| * |
| * Placeholder lexical classes recognized by the matcher (see |
| * ``cmCachePatternTable.cxx`` for details): |
| * |
| * * ``<LANG>``, ``<CONFIG>``, ``<PackageName>``: identifier |
| * (``[A-Za-z][A-Za-z0-9_]*``). |
| * * ``<PROJECT-NAME>``, ``<an-attribute>``: identifier with |
| * hyphens (``[A-Za-z][A-Za-z0-9_-]*``). |
| * * ``<NNNN>``: exactly 4 ASCII digits (``[0-9]{4}``). |
| * * ``<n>``: exactly 1 ASCII digit (``[0-9]``). |
| * |
| * Matching is leftmost-anchor, lazy on each placeholder, with full |
| * input consumption required at the end. The matcher is intentionally |
| * permissive: per-language or per-configuration restrictions documented |
| * in the corresponding ``Help/variable/<NAME>.rst`` file are reproduced |
| * in the entry's Summary prose, not enforced by the matcher. First |
| * fully-matching entry in ``kPatterns[]`` wins; entries are kept in |
| * ``(numPlaceholders ASC, totalLiteralLen DESC, Pattern ASC)`` order so |
| * that more-specific patterns are tried before less specific ones. |
| */ |
| namespace cmCachePatternTable { |
| |
| /** \brief A single row in the pattern documentation table. |
| * |
| * The ``Pattern`` and ``Summary`` views reference storage with static |
| * lifetime. ``Pattern`` is a literal template string containing one or |
| * more angle-bracketed placeholders such as ``<LANG>`` or ``<NNNN>``. |
| */ |
| struct Entry |
| { |
| cm::string_view Pattern; |
| cm::string_view Summary; |
| }; |
| |
| /** \brief Look up the built-in documentation for \a varName by pattern. |
| * |
| * Walks ``kPatterns[]`` in declaration order and returns the first |
| * entry whose ``Pattern`` template fully matches \a varName under the |
| * lexical classes above. On miss returns an empty ``Summary``. |
| * Performs no allocation; runs in ``O(N * |varName|)`` for the small |
| * (~30) table. |
| * |
| * The result type is reused from ``cmCacheDocumentationTable`` so that |
| * the single call site in ``cmCacheDocumentationTable::Get`` can return |
| * either an exact-match or a pattern-match result without translation. |
| */ |
| cmCacheDocumentationTable::LookupResult Match(cm::string_view varName); |
| |
| /** \brief Iterate the underlying pattern table. |
| * |
| * Exposed for the ``testCacheDocumentationTable`` unit test in |
| * ``Tests/CMakeLib``, which verifies that the entries are well-formed |
| * and obey the canonical ordering rule. Callers should not rely on a |
| * particular entry count or ordering beyond what the unit test |
| * asserts. |
| */ |
| Entry const* EntriesBegin(); |
| Entry const* EntriesEnd(); |
| std::size_t EntriesSize(); |
| |
| } |