{
  "fileTypes": ["cmake", "CMakeLists.txt"],
  "name": "CMake",
  "scopeName": "source.cmake",
  "patterns": [
    { "include": "#bracketComment" },
    { "include": "#lineComment" },
    { "include": "#bracketArgument" },
    { "include": "#quoted" },
    { "include": "#generatorExpression" },
    { "include": "#variableReference" },
    { "include": "#envVariableReference" },
    { "include": "#cacheVariableReference" },
    { "comment": "Deprecated keywords — all old entries removed per #4613 (collisions with user variable names like SOURCE_FILES). Re-add here when CMake deprecates new keywords.", "include": "#deprecatedKeywords" },
    { "include": "#scopedControlFlowCommand" },
    { "include": "#scopedListCommand" },
    { "include": "#scopedStringCommand" },
    { "include": "#scopedMessageCommand" },
    { "include": "#scopedProjectCommand" },
    { "include": "#scopedSetCommand" },
    { "include": "#scopedInstallCommand" },
    { "include": "#scopedFindPackageHandleStdArgsCommand" },
    { "include": "#scopedExternalContentCommand" },
    { "include": "#commandControl" },
    { "include": "#conditionalControl" },
    { "include": "#loopControl" },
    { "include": "#returnControl" },
    { "include": "#scopedPropertyCommand" },
    { "include": "#builtInCommands" },
    { "include": "#knownVariables" },
    { "include": "#properties" },
    { "include": "#commandProperties" },
    { "include": "#commandInvocationIdentifier" },
    { "include": "#operators" },
    { "include": "#boolean" },
    { "include": "#unquoted" }
  ],
  "repository": {
    "escape": {
      "name": "constant.character.escape.cmake",
      "match": "\\\\(.|$)"
    },
    "variableReference": {
      "name": "variable.other.cmake",
      "begin": "\\$\\{",
      "beginCaptures": { "0": { "name": "punctuation.section.variable.begin.cmake" } },
      "end": "\\}",
      "endCaptures": { "0": { "name": "punctuation.section.variable.end.cmake" } },
      "patterns": [
        { "include": "#knownVariables" }
      ]
    },
    "envVariableReference": {
      "name": "variable.other.env.cmake",
      "match": "\\$ENV\\{\\w+\\}"
    },
    "cacheVariableReference": {
      "name": "variable.other.cache.cmake",
      "match": "\\$CACHE\\{\\w+\\}"
    },
    "boolean": {
      "name": "constant.language.boolean.cmake",
      "match": "\\b(?i:TRUE|FALSE|ON|OFF|YES|NO)\\b"
    },
    "quoted": {
      "name": "string.quoted.double.cmake",
      "begin": "\"",
      "end": "\"",
      "patterns": [
        { "include": "#escape" },
        { "include": "#variableReference" },
        { "include": "#envVariableReference" },
        { "include": "#cacheVariableReference" },
        { "include": "#generatorExpression" }
      ]
    },
    "unquoted": {
      "comment": "Unquoted arguments. Escape sequences (\\n, \\;, etc.) are not highlighted here — the begin/end patterns both exclude backslash so #escape can never match. This matches the convention of the reference grammar (twxs/vs.language.cmake) and the pre-refactoring behavior. Fixing this properly would require a zero-width begin approach that adds significant complexity for negligible benefit, since escape sequences in unquoted arguments are rare in practice.",
      "name": "string.unquoted.cmake",
      "begin": "[^\\s()#\"\\\\][^\\s()#\"\\\\]*",
      "end": "(?=\\s|\\(|\\)|#|\"|\\\\|$)",
      "patterns": [
        { "include": "#variableReference" },
        { "include": "#envVariableReference" },
        { "include": "#cacheVariableReference" }
      ]
    },
    "bracketComment": {
      "name": "comment.block.bracket.cmake",
      "begin": "#\\[(=*)\\[",
      "beginCaptures": { "0": { "name": "punctuation.definition.comment.begin.cmake" } },
      "end": "\\]\\1\\]",
      "endCaptures": { "0": { "name": "punctuation.definition.comment.end.cmake" } }
    },
    "lineComment": {
      "name": "comment.line.number-sign.cmake",
      "match": "#(.*)$",
      "captures": { "1": { "name": "comment.line.cmake" } }
    },
    "bracketArgument": {
      "name": "variable.parameter.cmake",
      "begin": "\\[(=*)\\[",
      "beginCaptures": { "0": { "name": "punctuation.definition.string.begin.cmake" } },
      "end": "\\]\\1\\]",
      "endCaptures": { "0": { "name": "punctuation.definition.string.end.cmake" } }
    },
    "generatorExpression": {
      "comment": "Do not start a generator expression at escaped $< sequences, such as CMake regex patterns matching a literal generator expression prefix.",
      "name": "meta.generator-expression.cmake",
      "begin": "(?<!\\\\)\\$<",
      "beginCaptures": { "0": { "name": "punctuation.definition.generator-expression.begin.cmake" } },
      "end": ">",
      "endCaptures": { "0": { "name": "punctuation.definition.generator-expression.end.cmake" } },
      "patterns": [
        { "include": "#generatorExpression" },
        { "include": "#variableReference" },
        { "include": "#envVariableReference" },
        { "include": "#cacheVariableReference" },
        {
          "name": "keyword.other.generator-expression.cmake",
          "match": "[A-Za-z_][A-Za-z0-9_]*"
        }
      ]
    },
    "commonArgPatterns": {
      "patterns": [
        { "include": "#bracketComment" },
        { "include": "#lineComment" },
        { "include": "#bracketArgument" },
        { "include": "#quoted" },
        { "include": "#generatorExpression" },
        { "include": "#variableReference" },
        { "include": "#envVariableReference" },
        { "include": "#cacheVariableReference" },
        { "include": "#boolean" },
        { "include": "#knownVariables" }
      ]
    },
    "nestedParens": {
      "comment": "Nested parentheses inside scoped commands (e.g. generator expressions, function calls in arguments)",
      "begin": "\\(",
      "end": "\\)",
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" }
      ]
    },
    "conditionalOperators": {
      "comment": "Shared conditional operators for if/elseif/while: comparisons, tests, logic",
      "name": "keyword.operator.cmake",
      "match": "\\b(?i:NOT|AND|OR|COMMAND|POLICY|TARGET|TEST|DEFINED|IN_LIST|EXISTS|IS_ABSOLUTE|IS_DIRECTORY|IS_SYMLINK|IS_NEWER_THAN|MATCHES|LESS|GREATER|EQUAL|LESS_EQUAL|GREATER_EQUAL|STRLESS|STRGREATER|STREQUAL|STRLESS_EQUAL|STRGREATER_EQUAL|VERSION_LESS|VERSION_GREATER|VERSION_EQUAL|VERSION_LESS_EQUAL|VERSION_GREATER_EQUAL|PATH_EQUAL)\\b"
    },
    "nestedParensIf": {
      "comment": "Nested parentheses inside if/elseif/while with operators, e.g. if((NOT EXISTS ...))",
      "begin": "\\(",
      "end": "\\)",
      "patterns": [
        { "include": "#nestedParensIf" },
        { "include": "#commonArgPatterns" },
        { "include": "#conditionalOperators" }
      ]
    },
    "scopedControlFlowCommand": {
      "comment": "Unified control-flow scoped rule for if/elseif, foreach, and while (PR #4740 reviewer feedback). Consolidates the former per-command rules into one. Separate capture groups preserve keyword.control.conditional.cmake (if/elseif) vs keyword.control.loop.cmake (foreach/while). Inner patterns include both conditional operators and foreach-specific keywords; false-positive risk from the union is negligible since these keywords don't overlap in practice.",
      "begin": "^\\s*\\b(?i:(if|elseif)|(foreach|while))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "keyword.control.conditional.cmake" },
        "2": { "name": "keyword.control.loop.cmake" },
        "3": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParensIf" },
        { "include": "#commonArgPatterns" },
        { "include": "#conditionalOperators" },
        {
          "comment": "foreach()-specific iteration keywords",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:IN|RANGE|ZIP_LISTS|LISTS|ITEMS)\\b"
        }
      ]
    },
    "scopedListCommand": {
      "comment": "list() with scoped sub-commands",
      "begin": "\\b(?i:(list))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "list() sub-commands and keywords (from CMake docs: list subcommands, SORT options, FILTER modes, TRANSFORM actions/selectors)",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:LENGTH|GET|APPEND|FILTER|FIND|INSERT|JOIN|POP_BACK|POP_FRONT|PREPEND|REMOVE_ITEM|REMOVE_AT|REMOVE_DUPLICATES|REVERSE|SORT|SUBLIST|TRANSFORM|INCLUDE|EXCLUDE|REGEX|COMPARE|CASE|ORDER|ASCENDING|DESCENDING|GENEX_STRIP|STRIP|TOLOWER|TOUPPER|REPLACE|AT|FOR|NATURAL|OUTPUT_VARIABLE)\\b"
        }
      ]
    },
    "scopedStringCommand": {
      "comment": "string() with scoped sub-commands",
      "begin": "\\b(?i:(string))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "string() sub-commands and keywords",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:FIND|REPLACE|REGEX|MATCH|MATCHALL|APPEND|TOLOWER|TOUPPER|LENGTH|SUBSTRING|STRIP|GENEX_STRIP|REPEAT|JOIN|ASCII|HEX|CONFIGURE|MAKE_C_IDENTIFIER|RANDOM|TIMESTAMP|UUID|JSON|COMPARE|PREPEND|MD5|SHA1|SHA224|SHA256|SHA384|SHA512|SHA3_224|SHA3_256|SHA3_384|SHA3_512|ALPHABET|NAMESPACE|TYPE|MEMBER|GET|SET|REMOVE|ERROR_VARIABLE|UTC|NOTEQUAL)\\b"
        }
      ]
    },
    "scopedMessageCommand": {
      "comment": "message() with scoped log levels",
      "begin": "\\b(?i:(message))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "message() log levels",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:FATAL_ERROR|SEND_ERROR|WARNING|AUTHOR_WARNING|DEPRECATION|NOTICE|STATUS|VERBOSE|DEBUG|TRACE|CHECK_START|CHECK_PASS|CHECK_FAIL|CONFIGURE_LOG|APPEND)\\b"
        }
      ]
    },
    "scopedProjectCommand": {
      "comment": "project() with scoped keywords",
      "begin": "\\b(?i:(project))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "project() keywords — all get same scope for consistent coloring (#4508)",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:VERSION|DESCRIPTION|HOMEPAGE_URL|LANGUAGES|COMPAT_VERSION|SPDX_LICENSE)\\b"
        },
        {
          "comment": "Language identifiers used in project(... LANGUAGES ...)",
          "name": "constant.language.cmake",
          "match": "\\b(?:C|CXX|CSharp|CUDA|OBJC|OBJCXX|Fortran|HIP|ISPC|Swift|ASM|ASM_NASM|ASM_MARMASM|ASM_MASM|Java|NONE)\\b"
        }
      ]
    },
    "scopedSetCommand": {
      "comment": "set()/unset() with scoped keywords",
      "begin": "\\b(?i:(set|unset))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "set() keywords",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:CACHE|PARENT_SCOPE|FORCE|BOOL|STRING|FILEPATH|PATH|INTERNAL)\\b"
        }
      ]
    },
    "scopedInstallCommand": {
      "comment": "install() with scoped keywords",
      "begin": "\\b(?i:(install))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "install() keywords",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:TARGETS|FILES|PROGRAMS|DIRECTORY|SCRIPT|CODE|EXPORT|ARCHIVE|LIBRARY|RUNTIME|OBJECTS|FRAMEWORK|BUNDLE|PRIVATE_HEADER|PUBLIC_HEADER|RESOURCE|INCLUDES|DESTINATION|PERMISSIONS|CONFIGURATIONS|COMPONENT|NAMELINK_COMPONENT|NAMELINK_ONLY|NAMELINK_SKIP|OPTIONAL|EXCLUDE_FROM_ALL|RENAME|FILES_MATCHING|PATTERN|REGEX|TYPE|EXPORT_LINK_INTERFACE_LIBRARIES|NAMESPACE|FILE|FILE_SET|CXX_MODULES_BMI|RUNTIME_DEPENDENCIES|RUNTIME_DEPENDENCY_SET)\\b"
        }
      ]
    },
    "scopedFindPackageHandleStdArgsCommand": {
      "comment": "find_package_handle_standard_args() and find_package_check_version() with scoped keywords (module: FindPackageHandleStandardArgs)",
      "begin": "\\b(?i:(find_package_handle_standard_args|find_package_check_version))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "find_package_handle_standard_args() / find_package_check_version() keywords",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:REQUIRED_VARS|VERSION_VAR|HANDLE_VERSION_RANGE|HANDLE_COMPONENTS|CONFIG_MODE|NAME_MISMATCHED|REASON_FAILURE_MESSAGE|FAIL_MESSAGE|FOUND_VAR|DEFAULT_MSG|RESULT_MESSAGE_VARIABLE)\\b"
        }
      ]
    },
    "scopedExternalContentCommand": {
      "comment": "FetchContent and ExternalProject commands with scoped keywords (modules: FetchContent, ExternalProject). Merged because FetchContent passes through most ExternalProject options, so the keyword union is correct for both.",
      "begin": "\\b(?i:(FetchContent_Declare|FetchContent_MakeAvailable|FetchContent_Populate|FetchContent_GetProperties|FetchContent_SetPopulated|ExternalProject_Add|ExternalProject_Add_Step|ExternalProject_Add_StepTargets|ExternalProject_Add_StepDependencies|ExternalProject_Get_Property))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        { "include": "#commonArgPatterns" },
        {
          "comment": "FetchContent + ExternalProject keywords: directories, download, VCS, update/patch, configure, build, install, test, logging, terminal, step, and misc",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:PREFIX|TMP_DIR|STAMP_DIR|LOG_DIR|DOWNLOAD_DIR|SOURCE_DIR|BINARY_DIR|INSTALL_DIR|SUBBUILD_DIR|URL|URL_HASH|URL_MD5|DOWNLOAD_NAME|DOWNLOAD_EXTRACT_TIMESTAMP|DOWNLOAD_NO_EXTRACT|DOWNLOAD_NO_PROGRESS|DOWNLOAD_COMMAND|TIMEOUT|INACTIVITY_TIMEOUT|HTTP_USERNAME|HTTP_PASSWORD|HTTP_HEADER|TLS_VERSION|TLS_VERIFY|TLS_CAINFO|NETRC|NETRC_FILE|GIT_REPOSITORY|GIT_TAG|GIT_REMOTE_NAME|GIT_SUBMODULES|GIT_SUBMODULES_RECURSE|GIT_SHALLOW|GIT_PROGRESS|GIT_CONFIG|GIT_REMOTE_UPDATE_STRATEGY|SVN_REPOSITORY|SVN_REVISION|SVN_USERNAME|SVN_PASSWORD|SVN_TRUST_CERT|HG_REPOSITORY|HG_TAG|CVS_REPOSITORY|CVS_MODULE|CVS_TAG|UPDATE_COMMAND|UPDATE_DISCONNECTED|PATCH_COMMAND|CONFIGURE_COMMAND|CMAKE_COMMAND|CMAKE_GENERATOR|CMAKE_GENERATOR_PLATFORM|CMAKE_GENERATOR_TOOLSET|CMAKE_GENERATOR_INSTANCE|CMAKE_ARGS|CMAKE_CACHE_ARGS|CMAKE_CACHE_DEFAULT_ARGS|SOURCE_SUBDIR|CONFIGURE_HANDLED_BY_BUILD|BUILD_COMMAND|BUILD_IN_SOURCE|BUILD_ALWAYS|BUILD_BYPRODUCTS|BUILD_JOB_SERVER_AWARE|INSTALL_COMMAND|INSTALL_BYPRODUCTS|INSTALL_JOB_SERVER_AWARE|TEST_COMMAND|TEST_BEFORE_INSTALL|TEST_AFTER_INSTALL|TEST_EXCLUDE_FROM_MAIN|LOG_DOWNLOAD|LOG_UPDATE|LOG_PATCH|LOG_CONFIGURE|LOG_BUILD|LOG_INSTALL|LOG_TEST|LOG_MERGED_STDOUTERR|LOG_OUTPUT_ON_FAILURE|USES_TERMINAL_DOWNLOAD|USES_TERMINAL_UPDATE|USES_TERMINAL_PATCH|USES_TERMINAL_CONFIGURE|USES_TERMINAL_BUILD|USES_TERMINAL_INSTALL|USES_TERMINAL_TEST|DEPENDS|EXCLUDE_FROM_ALL|STEP_TARGETS|INDEPENDENT_STEP_TARGETS|LIST_SEPARATOR|COMMAND|DEPENDEES|DEPENDERS|COMMENT|ALWAYS|BYPRODUCTS|EXCLUDE_FROM_MAIN|WORKING_DIRECTORY|LOG|USES_TERMINAL|JOB_SERVER_AWARE|INDEPENDENT|SYSTEM|OVERRIDE_FIND_PACKAGE|FIND_PACKAGE_ARGS|QUIET|POPULATED)\\b"
        }
      ]
    },
    "scopedPropertyCommand": {
      "comment": "Property commands (set_property, get_property, etc.) with scoped keywords and property names",
      "begin": "\\b(?i:(set_property|get_property|define_property|set_source_files_properties|set_target_properties|get_target_property|set_tests_properties|get_test_property|set_directory_properties|get_directory_property))\\b\\s*(\\()",
      "beginCaptures": {
        "1": { "name": "support.function.cmake" },
        "2": { "name": "punctuation.section.arguments.begin.cmake" }
      },
      "end": "\\)",
      "endCaptures": { "0": { "name": "punctuation.section.arguments.end.cmake" } },
      "patterns": [
        { "include": "#nestedParens" },
        {
          "comment": "Property command scope keywords",
          "name": "keyword.other.cmake",
          "match": "\\b(?i:GLOBAL|DIRECTORY|TARGET|SOURCE|INSTALL|TEST|CACHE|PROPERTY|APPEND|APPEND_STRING|BRIEF_DOCS|FULL_DOCS|INHERITED)\\b"
        },
        {
          "comment": "Well-known CMake properties for targets, sources, tests, directories, and global scope",
          "name": "support.type.property.cmake",
          "match": "\\b(?i:COMPILE_OPTIONS|COMPILE_FEATURES|COMPILE_FLAGS|COMPILE_DEFINITIONS(_\\w+)?|LINK_OPTIONS|LINK_FLAGS(_\\w+)?|LINK_LIBRARIES|LINK_DEPENDS|LINK_SEARCH_END_STATIC|LINK_SEARCH_START_STATIC|INTERFACE_COMPILE_DEFINITIONS|INTERFACE_COMPILE_OPTIONS|INTERFACE_COMPILE_FEATURES|INTERFACE_SOURCES|INTERFACE_LINK_LIBRARIES|INTERFACE_INCLUDE_DIRECTORIES|INTERFACE_SYSTEM_INCLUDE_DIRECTORIES|INTERFACE_POSITION_INDEPENDENT_CODE|INTERFACE_HEADER_SETS|PRECOMPILE_HEADERS|UNITY_BUILD(_\\w+)?|LINK_WHAT_YOU_USE|VERIFY_INTERFACE_HEADER_SETS|OPTIMIZE_DEPENDENCIES|HEADER_SETS|POSITION_INDEPENDENT_CODE|INTERPROCEDURAL_OPTIMIZATION(_\\w+)?|EXCLUDE_FROM_ALL|SOURCES|OUTPUT_NAME(_\\w+)?|RUNTIME_OUTPUT_DIRECTORY(_\\w+)?|LIBRARY_OUTPUT_DIRECTORY(_\\w+)?|ARCHIVE_OUTPUT_(DIRECTORY|NAME)(_\\w+)?|PDB_OUTPUT_DIRECTORY|PDB_NAME(_\\w+)?|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|SKIP_BUILD_RPATH|BUILD_WITH_INSTALL_RPATH|INSTALL_NAME_DIR|SOVERSION|VERSION|PREFIX|SUFFIX|DEBUG_POSTFIX|\\w+_POSTFIX|LINKER_LANGUAGE|FOLDER|LABELS|TIMEOUT|WILL_FAIL|COST|PASS_REGULAR_EXPRESSION|FAIL_REGULAR_EXPRESSION|FIXTURES_REQUIRED|FIXTURES_SETUP|FIXTURES_CLEANUP|RESOURCE_LOCK|PROCESSORS|RUN_SERIAL|WORKING_DIRECTORY|GENERATED|LANGUAGE|HEADER_FILE_ONLY|SYMBOLIC|OBJECT_DEPENDS|WRAP_EXCLUDE|MACOSX_PACKAGE_LOCATION|XCODE_ATTRIBUTE_\\w+|VS_GLOBAL_\\w+|VS_DOTNET_REFERENCES|VS_SCC_(AUXPATH|LOCALPATH|PROJECTNAME|PROVIDER)|MAP_IMPORTED_CONFIG_\\w+|IMPORTED(_\\w+)?|IMPORT_PREFIX|IMPORT_SUFFIX|AUTOMOC|AUTOMOC_MOC_OPTIONS|AUTOUIC|AUTORCC|ENABLE_EXPORTS|DEFINE_SYMBOL|OSX_ARCHITECTURES(_\\w+)?|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MACOSX_RPATH|STATIC_LIBRARY_FLAGS(_\\w+)?|WIN32_EXECUTABLE|VS_WINRT_EXTENSIONS|VS_WINRT_REFERENCES|COMPATIBLE_INTERFACE_BOOL|COMPATIBLE_INTERFACE_STRING|COMPATIBLE_INTERFACE_NUMBER_MAX|COMPATIBLE_INTERFACE_NUMBER_MIN|NO_SONAME|HAS_CXX|GNUtoMS|FRAMEWORK|BUNDLE(_EXTENSION)?)\\b"
        },
        { "include": "#commonArgPatterns" }
      ]
    },
    "deprecatedKeywords": {
      "comment": "Deprecated CMake keywords. All previous entries (ABSTRACT_FILES, BUILD_NAME, SOURCE_FILES, SOURCE_FILES_REMOVE, VTK_MAKE_INSTANTIATOR, VTK_WRAP_JAVA, VTK_WRAP_PYTHON, VTK_WRAP_TCL, WRAP_EXCLUDE_FILES) were removed per #4613 because they were removed from CMake 20+ years ago and collide with common user variable names like SOURCE_FILES. Re-add entries here when CMake deprecates new keywords that need highlighting.",
      "name": "invalid.deprecated.cmake",
      "match": "(?!x)x"
    },
    "builtInCommands": {
      "comment": "CMake built-in commands, legacy/deprecated commands, and well-known standard module commands (FindPackageHandleStandardArgs, FetchContent, ExternalProject). The (?=\\s*\\() lookahead is intentional — it prevents command names from being highlighted when used as string arguments (e.g. inside cmake_language(CALL ...)). This is a good trade-off: reduces false positives at the cost of not highlighting the rare case of command names as arguments.",
      "name": "support.function.cmake",
      "match": "\\b(?i:add_compile_definitions|add_compile_options|add_custom_command|add_custom_target|add_definitions|add_dependencies|add_executable|add_library|add_link_options|add_subdirectory|add_test|aux_source_directory|block|build_command|build_name|cmake_file_api|cmake_host_system_information|cmake_language|cmake_minimum_required|cmake_parse_arguments|cmake_path|cmake_pkg_config|cmake_policy|configure_file|create_test_sourcelist|ctest_build|ctest_configure|ctest_coverage|ctest_empty_binary_directory|ctest_memcheck|ctest_read_custom_files|ctest_run_script|ctest_sleep|ctest_start|ctest_submit|ctest_test|ctest_update|ctest_upload|define_property|enable_language|enable_testing|endblock|execute_process|exec_program|export|export_library_dependencies|ExternalProject_Add|ExternalProject_Add_Step|ExternalProject_Add_StepTargets|ExternalProject_Add_StepDependencies|ExternalProject_Get_Property|FetchContent_Declare|FetchContent_GetProperties|FetchContent_MakeAvailable|FetchContent_Populate|FetchContent_SetPopulated|file|find_file|find_library|find_package|find_package_check_version|find_package_handle_standard_args|find_path|find_program|fltk_wrap_ui|get_cmake_property|get_directory_property|get_filename_component|get_property|get_source_file_property|get_target_property|get_test_property|include|include_directories|include_external_msproject|include_guard|include_regular_expression|install|install_files|install_programs|install_targets|link_directories|link_libraries|list|load_cache|load_command|make_directory|mark_as_advanced|math|message|option|output_required_files|project|qt_wrap_cpp|qt_wrap_ui|remove|remove_definitions|return|separate_arguments|set|set_directory_properties|set_property|set_source_files_properties|set_target_properties|set_tests_properties|site_name|source_group|string|subdirs|subdir_depends|target_compile_definitions|target_compile_features|target_compile_options|target_include_directories|target_link_directories|target_link_libraries|target_link_options|target_precompile_headers|target_sources|try_compile|try_run|unset|use_mangled_mesa|utility_source|variable_requires|variable_watch|write_file)\\b(?=\\s*\\()"
    },
    "commandInvocationIdentifier": {
      "comment": "Generic function call identifier — matches any word before '('. Catches user-defined functions/macros.",
      "name": "entity.name.function.cmake",
      "match": "\\b[a-zA-Z_][a-zA-Z0-9_]*\\b(?=\\s*\\()"
    },
    "knownVariables": {
      "comment": "Well-known CMake variables: system/platform detection, behavior-changing, build-control, and information-providing. Consolidated from systemVariables, changeBehaviorVariables, controlBuildVariables, provideInformationVariables — all rendered identically by standard themes (support.type prefix).",
      "name": "support.type.variable.cmake",
      "match": "\\b(?i:APPLE|BORLAND|CMAKE_CL_64|CMAKE_COMPILER_2005|CMAKE_HOST_APPLE|CMAKE_HOST_SYSTEM|CMAKE_HOST_SYSTEM_NAME|CMAKE_HOST_SYSTEM_PROCESSOR|CMAKE_HOST_SYSTEM_VERSION|CMAKE_HOST_UNIX|CMAKE_HOST_WIN32|CMAKE_LIBRARY_ARCHITECTURE|CMAKE_LIBRARY_ARCHITECTURE_REGEX|CMAKE_OBJECT_PATH_MAX|CMAKE_SYSTEM|CMAKE_SYSTEM_NAME|CMAKE_SYSTEM_PROCESSOR|CMAKE_SYSTEM_VERSION|CYGWIN|MSVC|MSVC_IDE|MSVC_VERSION|MSVC_TOOLSET_VERSION|UNIX|WIN32|XCODE_VERSION|ANDROID|IOS|LINUX|MSYS|WINCE|WINDOWS_PHONE|WINDOWS_STORE|CMAKE_CROSSCOMPILING|CMAKE_SIZEOF_VOID_P|BUILD_SHARED_LIBS|(CMAKE_)?(ABSOLUTE_DESTINATION_FILES|AUTOMOC_RELAXED_MODE|BACKWARDS_COMPATIBILITY|BUILD_TYPE|COLOR_MAKEFILE|CONFIGURATION_TYPES|DEBUG_TARGET_PROPERTIES|DISABLE_FIND_PACKAGE_\\w+|FIND_LIBRARY_PREFIXES|FIND_LIBRARY_SUFFIXES|IGNORE_PATH|INCLUDE_PATH|INSTALL_DEFAULT_COMPONENT_NAME|INSTALL_PREFIX|LIBRARY_PATH|MFC_FLAG|MODULE_PATH|NOT_USING_CONFIG_FLAGS|POLICY_DEFAULT_CMP\\w+|PREFIX_PATH|PROGRAM_PATH|SKIP_INSTALL_ALL_DEPENDENCY|SYSTEM_IGNORE_PATH|SYSTEM_INCLUDE_PATH|SYSTEM_LIBRARY_PATH|SYSTEM_PREFIX_PATH|SYSTEM_PROGRAM_PATH|USER_MAKE_RULES_OVERRIDE|WARN_ON_ABSOLUTE_INSTALL_DESTINATION)|(CMAKE_)?(\\w+_POSTFIX|ARCHIVE_OUTPUT_DIRECTORY|AUTOMOC|AUTOMOC_MOC_OPTIONS|BUILD_WITH_INSTALL_RPATH|DEBUG_POSTFIX|EXE_LINKER_FLAGS|EXE_LINKER_FLAGS_\\w+|Fortran_FORMAT|Fortran_MODULE_DIRECTORY|GNUtoMS|INCLUDE_CURRENT_DIR|INCLUDE_CURRENT_DIR_IN_INTERFACE|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|LIBRARY_OUTPUT_DIRECTORY|LIBRARY_PATH_FLAG|LINK_DEF_FILE_FLAG|LINK_DEPENDS_NO_SHARED|LINK_INTERFACE_LIBRARIES|LINK_LIBRARY_FILE_FLAG|LINK_LIBRARY_FLAG|MACOSX_BUNDLE|NO_BUILTIN_CHRPATH|PDB_OUTPUT_DIRECTORY|COMPILE_PDB_OUTPUT_DIRECTORY|POSITION_INDEPENDENT_CODE|RUNTIME_OUTPUT_DIRECTORY|SKIP_BUILD_RPATH|SKIP_INSTALL_RPATH|TRY_COMPILE_CONFIGURATION|USE_RELATIVE_PATHS|WIN32_EXECUTABLE)|EXECUTABLE_OUTPUT_PATH|LIBRARY_OUTPUT_PATH|CMAKE_(AR|ARGC|ARGV0|BINARY_DIR|BUILD_TOOL|C_STANDARD|C_STANDARD_REQUIRED|CXX_STANDARD|CXX_STANDARD_REQUIRED|C_COMPILER|CXX_COMPILER|C_COMPILER_ID|CXX_COMPILER_ID|C_FLAGS|CXX_FLAGS|C_FLAGS_DEBUG|C_FLAGS_RELEASE|C_FLAGS_MINSIZEREL|C_FLAGS_RELWITHDEBINFO|CXX_FLAGS_DEBUG|CXX_FLAGS_RELEASE|CXX_FLAGS_MINSIZEREL|CXX_FLAGS_RELWITHDEBINFO|CACHEFILE_DIR|CACHE_MAJOR_VERSION|CACHE_MINOR_VERSION|CACHE_PATCH_VERSION|CFG_INTDIR|COMMAND|CROSSCOMPILING|CTEST_COMMAND|CURRENT_BINARY_DIR|CURRENT_LIST_DIR|CURRENT_LIST_FILE|CURRENT_LIST_LINE|CURRENT_SOURCE_DIR|CURRENT_FUNCTION|CURRENT_FUNCTION_LIST_DIR|CURRENT_FUNCTION_LIST_FILE|CURRENT_FUNCTION_LIST_LINE|DL_LIBS|EDIT_COMMAND|EXECUTABLE_SUFFIX|EXTRA_GENERATOR|EXTRA_SHARED_LIBRARY_SUFFIXES|GENERATOR|GENERATOR_PLATFORM|GENERATOR_TOOLSET|HOME_DIRECTORY|IMPORT_LIBRARY_PREFIX|IMPORT_LIBRARY_SUFFIX|LINK_LIBRARY_SUFFIX|MAJOR_VERSION|MAKE_PROGRAM|MINOR_VERSION|PARENT_LIST_FILE|PATCH_VERSION|PROJECT_NAME|RANLIB|ROOT|SCRIPT_MODE_FILE|SHARED_LIBRARY_PREFIX|SHARED_LIBRARY_SUFFIX|SHARED_LINKER_FLAGS|SHARED_MODULE_PREFIX|SHARED_MODULE_SUFFIX|SIZEOF_VOID_P|SKIP_RPATH|SOURCE_DIR|STANDARD_LIBRARIES|STATIC_LIBRARY_PREFIX|STATIC_LIBRARY_SUFFIX|TWEAK_VERSION|USING_VC_FREE_TOOLS|VERBOSE_MAKEFILE|VERSION|EXPORT_COMPILE_COMMANDS|TOOLCHAIN_FILE|SYSROOT|STAGING_PREFIX|FIND_ROOT_PATH|FIND_ROOT_PATH_MODE_PROGRAM|FIND_ROOT_PATH_MODE_LIBRARY|FIND_ROOT_PATH_MODE_INCLUDE|FIND_ROOT_PATH_MODE_PACKAGE)|PROJECT_BINARY_DIR|PROJECT_NAME|PROJECT_SOURCE_DIR|PROJECT_VERSION|PROJECT_VERSION_MAJOR|PROJECT_VERSION_MINOR|PROJECT_VERSION_PATCH|PROJECT_VERSION_TWEAK|PROJECT_DESCRIPTION|PROJECT_HOMEPAGE_URL|CMAKE_\\w+_COMPILER_VERSION|CMAKE_\\w+_COMPILER_FRONTEND_VARIANT|CMAKE_\\w+_SIMULATE_ID|CMAKE_\\w+_SIMULATE_VERSION|CMAKE_\\w+_EXTENSIONS|CMAKE_\\w+_STANDARD_REQUIRED|CMAKE_\\w+_COMPILE_FEATURES|CMAKE_MSVC_RUNTIME_LIBRARY|CMAKE_INTERPROCEDURAL_OPTIMIZATION|CMAKE_UNITY_BUILD(_\\w+)?|CMAKE_COMPILE_WARNING_AS_ERROR|CMAKE_COLOR_DIAGNOSTICS|CMAKE_LINK_WHAT_YOU_USE|CMAKE_VERIFY_INTERFACE_HEADER_SETS|CMAKE_OPTIMIZE_DEPENDENCIES|CMAKE_BUILD_RPATH(_USE_ORIGIN)?|\\w+_BINARY_DIR|\\w+_SOURCE_DIR)\\b"
    },
    "properties": {
      "comment": "CMake properties for cache entries, source files, tests, directories, global scope, and targets. Consolidated from 6 category-specific rules — all rendered identically by standard themes (support.type prefix). commandProperties is kept separate (support.function prefix = different theme color).",
      "name": "support.type.property.cmake",
      "match": "\\b(?i:ADVANCED|HELPSTRING|MODIFIED|STRINGS|TYPE|VALUE|ABSTRACT|COMPILE_DEFINITIONS|COMPILE_DEFINITIONS_&lt;CONFIG&gt;|COMPILE_FLAGS|EXTERNAL_OBJECT|Fortran_FORMAT|GENERATED|HEADER_FILE_ONLY|KEEP_EXTENSION|LABELS|LANGUAGE|LOCATION|MACOSX_PACKAGE_LOCATION|OBJECT_DEPENDS|OBJECT_OUTPUTS|SYMBOLIC|WRAP_EXCLUDE|DEPENDS|EXCLUDE_FROM_ALL|NAME|PASS_REGULAR_EXPRESSION|RUN_SERIAL|RUN_TESTS|TIMEOUT|ADDITIONAL_MAKE_CLEAN_FILES|CACHE_VARIABLES|CLEAN_NO_CUSTOM|COMPILE_DEFINITIONS_\\w+|DEFINITIONS|IMPLICIT_DEPENDS_INCLUDE_TRANSFORM|INCLUDE_DIRECTORIES|INCLUDE_REGULAR_EXPRESSION|INTERPROCEDURAL_OPTIMIZATION|INTERPROCEDURAL_OPTIMIZATION_\\w+|LINK_DIRECTORIES|LISTFILE_STACK|MACROS|PARENT_DIRECTORY|RULE_LAUNCH_COMPILE|RULE_LAUNCH_CUSTOM|RULE_LAUNCH_LINK|TEST_INCLUDE_FILE|VARIABLES|VS_GLOBAL_SECTION_POST_\\w+|VS_GLOBAL_SECTION_PRE_\\w+|ALLOW_DUPLICATE_CUSTOM_TARGETS|DEBUG_CONFIGURATIONS|DISABLED_FEATURES|ENABLED_FEATURES|ENABLED_LANGUAGES|FIND_LIBRARY_USE_LIB64_PATHS|FIND_LIBRARY_USE_OPENBSD_VERSIONING|GLOBAL_DEPENDS_DEBUG_MODE|GLOBAL_DEPENDS_NO_CYCLES|IN_TRY_COMPILE|PACKAGES_FOUND|PACKAGES_NOT_FOUND|PREDEFINED_TARGETS_FOLDER|REPORT_UNDEFINED_PROPERTIES|RULE_MESSAGES|TARGET_ARCHIVES_MAY_BE_SHARED_LIBS|TARGET_SUPPORTS_SHARED_LIBS|USE_FOLDERS|__CMAKE_DELETE_CACHE_CHANGE_VARS_|\\w+_(OUTPUT_NAME|POSTFIX)|ARCHIVE_OUTPUT_(DIRECTORY(_\\w+)?|NAME(_\\w+)?)|AUTOMOC(_MOC_OPTIONS)?|BUILD_WITH_INSTALL_RPATH|BUNDLE(_EXTENSION)?|COMPATIBLE_INTERFACE_BOOL|COMPATIBLE_INTERFACE_STRING|COMPILE_(DEFINITIONS(_\\w+)?|FLAGS)|DEBUG_POSTFIX|DEFINE_SYMBOL|ENABLE_EXPORTS|EchoString|FOLDER|FRAMEWORK|Fortran_(FORMAT|MODULE_DIRECTORY)|GENERATOR_FILE_NAME|GNUtoMS|HAS_CXX|IMPORTED|IMPORTED_(CONFIGURATIONS|IMPLIB(_\\w+)?|LINK_DEPENDENT_LIBRARIES(_\\w+)?|LINK_INTERFACE_LANGUAGES(_\\w+)?|LINK_INTERFACE_LIBRARIES(_\\w+)?|LINK_INTERFACE_MULTIPLICITY(_\\w+)?|LOCATION(_\\w+)?|NO_SONAME(_\\w+)?|SONAME(_\\w+)?)|IMPORT_PREFIX|IMPORT_SUFFIX|INSTALL_NAME_DIR|INSTALL_RPATH|INSTALL_RPATH_USE_LINK_PATH|INTERFACE|INTERFACE_COMPILE_DEFINITIONS|INTERFACE_INCLUDE_DIRECTORIES|LIBRARY_OUTPUT_DIRECTORY(_\\w+)?|LIBRARY_OUTPUT_NAME(_\\w+)?|LINKER_LANGUAGE|LINK_DEPENDS|LINK_FLAGS(_\\w+)?|LINK_INTERFACE_LIBRARIES(_\\w+)?|LINK_INTERFACE_MULTIPLICITY(_\\w+)?|LINK_LIBRARIES|LINK_SEARCH_END_STATIC|LINK_SEARCH_START_STATIC|LOCATION(_\\w+)?|MACOSX_BUNDLE|MACOSX_BUNDLE_INFO_PLIST|MACOSX_FRAMEWORK_INFO_PLIST|MAP_IMPORTED_CONFIG_\\w+|NO_SONAME|OSX_ARCHITECTURES(_\\w+)?|OUTPUT_NAME(_\\w+)?|PDB_NAME(_\\w+)?|POST_INSTALL_SCRIPT|PREFIX|PRE_INSTALL_SCRIPT|PRIVATE|PRIVATE_HEADER|PROJECT_LABEL|PUBLIC|PUBLIC_HEADER|RESOURCE|RULE_LAUNCH_(COMPILE|CUSTOM|LINK)|RUNTIME_OUTPUT_(DIRECTORY(_\\w+)?|NAME(_\\w+)?)|SKIP_BUILD_RPATH|SOURCES|SOVERSION|STATIC_LIBRARY_FLAGS(_\\w+)?|SUFFIX|VERSION|VS_DOTNET_REFERENCES|VS_GLOBAL_(\\w+|KEYWORD|PROJECT_TYPES)|VS_KEYWORD|VS_SCC_(AUXPATH|LOCALPATH|PROJECTNAME|PROVIDER)|VS_WINRT_EXTENSIONS|VS_WINRT_REFERENCES|WIN32_EXECUTABLE|XCODE_ATTRIBUTE_\\w+)\\b"
    },
    "commandProperties": {
      "name": "support.function.commandProperty.cmake",
      "match": "\\b(?i:ALL|APPEND|BOOL|BUILD|BYPRODUCTS|CACHE|CAPTURE_CMAKE_ERROR|CMAKE_FIND_PACKAGE_NAME|CMAKE_FIND_ROOT_PATH_BOTH|CMAKE_FLAGS|COMMAND|COMMAND_EXPAND_LISTS|COMMENT|COMPILE_DEFINITIONS|COMPILE_OUTPUT_VARIABLE|COMPONENT|CONDITION|CONFIGURATION|CONFIGURATIONS|CONTENT|COPY_FILE|COPY_FILE_ERROR|COPYONLY|DEFECT_COUNT|DEPENDS|DEPFILE|DESTINATION|DIRECTORY|DOC|ENCODING|END|ESCAPE_QUOTES|EXCLUDE|EXCLUDE_FIXTURE|EXCLUDE_FIXTURE_CLEANUP|EXCLUDE_FIXTURE_SETUP|EXCLUDE_FROM_ALL|EXCLUDE_LABEL|EXPECTED_HASH|EXPECTED_MD|EXPR|FILEPATH|FILES|FILTER|FIND|FLAGS|GET|GLOBAL|HINTS|HTTPHEADER|IMPLICIT_DEPENDS|INACTIVITY_TIMEOUT|INCLUDE|INCLUDE_LABEL|INPUT|INPUT_FILE|INSERT|INSTALL|INTERNAL|LABELS|LENGTH|LENGTH_MAXIMUM|LENGTH_MINIMUM|LIMIT_COUNT|LIMIT_INPUT|LIMIT_OUTPUT|LINK_LIBRARIES|LOG|MAIN_DEPENDENCY|MD|NAMES|NETRC|NETRC_FILE|NEWLINE_CONSUME|NEWLINE_STYLE|NO_CMAKE_FIND_ROOT_PATH|NO_HEX_CONVERSION|NUMBER_ERRORS|NUMBER_WARNINGS|ONLY_CMAKE_FIND_ROOT_PATH|OPTIONAL|OPTIONS|OUTPUT|OUTPUT_QUIET|OUTPUT_VARIABLE|PACKAGE_FIND_NAME|PACKAGE_VERSION|PARALLEL_LEVEL|PARTS|PATH|PATH_SUFFIXES|PERMISSIONS|PRE_BUILD|PREFIX|PROJECT_NAME|QUIET|REGEX|REGULAR_EXPRESSION|REMOVE_AT|REMOVE_DUPLICATES|RENAME|RESULT_VARIABLE|RESULTS_VARIABLE|RETRY_COUNT|RETRY_DELAY|RETURN_VALUE|REVERSE|RUN_OUTPUT_VARIABLE|SCHEDULE_RANDOM|SHOW_PROGRESS|SORT|SOURCE|SOURCES|START|STATIC|STATUS|STOP_TIME|STRIDE|STRING|TARGET|TEST|TEST_LOAD|TIMEOUT|TLS_CAINFO|TLS_VERIFY|TREE|TYPE|USERPWD|USES_TERMINAL|VARIABLE|VERBATIM|WORKING_DIRECTORY)\\b"
    },
    "operators": {
      "comment": "Flat fallback for operators — scopedControlFlowCommand provides better precision for if()/elseif()/while() but this catches edge cases",
      "name": "keyword.operator.cmake",
      "match": "\\b(?i:ABSOLUTE|AND|COMMAND|DEFINED|DIRECTORY|EQUAL|EXISTS|GREATER|GREATER_EQUAL|IN_LIST|IS_ABSOLUTE|IS_DIRECTORY|IS_NEWER_THAN|IS_SYMLINK|LAST_EXT|LESS|LESS_EQUAL|MATCHES|NAME|NAME_WE|NAME_WLE|NOT|NOTFOUND|OR|PATH|PATHS|POLICY|PROGRAM|REALPATH|STREQUAL|STRGREATER|STRGREATER_EQUAL|STRING|STRLESS|STRLESS_EQUAL|TARGET|TEST|VERSION_EQUAL|VERSION_GREATER|VERSION_GREATER_EQUAL|VERSION_LESS)\\b"
    },
    "commandControl": {
      "name": "keyword.control.command.cmake",
      "match": "^\\s*\\b(?i:macro|endmacro|function|endfunction)\\b"
    },
    "conditionalControl": {
      "name": "keyword.control.conditional.cmake",
      "match": "^\\s*\\b(?i:if|elseif|else|endif)\\b"
    },
    "loopControl": {
      "name": "keyword.control.loop.cmake",
      "match": "^\\s*\\b(?i:foreach|endforeach|while|endwhile|break|continue)\\b"
    },
    "returnControl": {
      "name": "keyword.control.return.cmake",
      "match": "\\b(?i:return)\\b"
    }
  }
}
