blob: ec15a85c4528b8f756e13d28ee702ee3f3bd25b0 [file] [log] [blame]
# Copyright 2025 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import os
import sys
from xml.dom import minidom
import path_util
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'histograms'))
import extract_histograms
import histogram_paths
import merge_xml
_METRIC_FILES_WITH_ENUMS = [
path_util.GetInputFile('tools/metrics/ukm/ukm.xml'),
path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml'),
]
def _get_enums_from_histogram_files(files: list[str]) -> set[str]:
"""Finds the names of all referenced enums from the specified XML files."""
merged = merge_xml.MergeFiles(files)
histograms, _ = extract_histograms.ExtractHistogramsFromDom(merged)
enums_used_in_file = set()
for _, data in histograms.items():
# Skip non-enum histograms.
if 'enumDetails' not in data:
continue
enum_name = data['enumDetails']['name']
enums_used_in_file.add(enum_name)
return enums_used_in_file
def _get_enums_referenced_by_metric_nodes(files: list[str]) -> set[str]:
"""Finds enums used by ukm.xml and similar files."""
enums_used_in_files = set()
for file_path in files:
with open(file_path, 'r') as f:
document = minidom.parse(f)
for node in document.getElementsByTagName('metric'):
if not 'enum' in node.attributes:
continue
enums_used_in_files.add(node.attributes['enum'].value)
return enums_used_in_files
def get_enums_used_in_files() -> set[str]:
"""Finds the names of all referenced enums from the specified XML files."""
logging.info(f'Reading histogram XML files...')
enum_names = _get_enums_from_histogram_files(histogram_paths.ALL_XMLS)
logging.info(f'Found {len(enum_names)} enums from histograms.')
metric_enum_names = (
_get_enums_referenced_by_metric_nodes(_METRIC_FILES_WITH_ENUMS))
logging.info(f'Found {len(metric_enum_names)} enums from ukm and dwa.')
enum_names.update(metric_enum_names)
logging.info(f'Found {len(enum_names)} enums total.')
return enum_names