// Copyright 2014 The Flutter Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import 'dart:collection'; import 'dart:io'; final TokenLogger tokenLogger = TokenLogger(); /// Class to keep track of used tokens and versions. class TokenLogger { TokenLogger(); void init({ required Map<String, dynamic> allTokens, required Map<String, List<String>> versionMap }){ _allTokens = allTokens; _versionMap = versionMap; } /// Map of all tokens to their values. late Map<String, dynamic> _allTokens; // Map of versions to their token files. late Map<String, List<String>> _versionMap; // Sorted set of used tokens. final SplayTreeSet<String> _usedTokens = SplayTreeSet<String>(); // Set of tokens that were referenced on some templates, but do not exist. final Set<String> _unavailableTokens = <String>{}; void clear() { _allTokens.clear(); _versionMap.clear(); _usedTokens.clear(); _unavailableTokens.clear(); } /// Logs a token. void log(String token) { if (!_allTokens.containsKey(token)) { _unavailableTokens.add(token); return; } _usedTokens.add(token); } /// Prints version usage to the console. void printVersionUsage({required bool verbose}) { final String versionsString = 'Versions used: ${_versionMap.keys.join(', ')}'; print(versionsString); if (verbose) { for (final String version in _versionMap.keys) { print(' $version:'); final List<String> files = List<String>.from(_versionMap[version]!); files.sort(); for (final String file in files) { print(' $file'); } } print(''); } } /// Prints tokens usage to the console. void printTokensUsage({required bool verbose}) { final Set<String> allTokensSet = _allTokens.keys.toSet(); if (verbose) { for (final String token in SplayTreeSet<String>.from(allTokensSet).toList()) { if (_usedTokens.contains(token)) { print('✅ $token'); } else { print('❌ $token'); } } print(''); } print('Tokens used: ${_usedTokens.length}/${_allTokens.length}'); if (_unavailableTokens.isNotEmpty) { print(''); print('\x1B[31m' 'Some referenced tokens do not exist: ${_unavailableTokens.length}' '\x1B[0m'); for (final String token in _unavailableTokens) { print(' $token'); } } } /// Dumps version and tokens usage to a file. void dumpToFile(String path) { final File file = File(path); file.createSync(recursive: true); final String versionsString = 'Versions used, ${_versionMap.keys.join(', ')}'; file.writeAsStringSync('$versionsString\n${_usedTokens.join(',\n')}\n'); } }