blob: f35fc928d7f7caa0f6b27b5811e086f1f503d504 [file]
/* 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();
}