/* 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 #include #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__FLAGS`` or * ``CMAKE_POLICY_DEFAULT_CMP``, 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): * * * ````, ````, ````: identifier * (``[A-Za-z][A-Za-z0-9_]*``). * * ````, ````: identifier with * hyphens (``[A-Za-z][A-Za-z0-9_-]*``). * * ````: exactly 4 ASCII digits (``[0-9]{4}``). * * ````: 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/.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 ```` or ````. */ 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(); }