// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. 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:core'; import 'dart:io'; import 'package:analyzer/dart/analysis/utilities.dart'; import 'package:analyzer/dart/ast/ast.dart'; import 'package:analyzer/src/dart/analysis/experiments.dart'; import 'package:path/path.dart' as path; import 'package:test/test.dart'; import 'package:test_reflective_loader/test_reflective_loader.dart'; import '../generated/parser_test_base.dart'; main() { _analyzerRootComponents = path.split(path.fromUri(Platform.script)); int index = _analyzerRootComponents.lastIndexOf('analyzer'); _analyzerRootComponents = _analyzerRootComponents.sublist(0, index + 1); defineReflectiveSuite(() { defineReflectiveTests(ErrorCodeValuesTest); }); } late List _analyzerRootComponents; @reflectiveTest class ErrorCodeValuesTest extends ParserTestCase { bool bad() { return false; } List getDeclaredCodes(List relativeComponents) { List declaredCodes = []; CompilationUnit definingUnit = parseFile(relativeComponents); for (CompilationUnitMember declaration in definingUnit.declarations) { if (declaration is ClassDeclaration) { var extendsClause = declaration.extendsClause; if (extendsClause != null && extendsClause.superclass.name.name == 'ErrorCode') { String className = declaration.name.name; for (ClassMember member in declaration.members) { if (member is FieldDeclaration && member.isStatic) { var fields = member.fields; if ((fields.type == null ? bad() : true) && fields.type!.toSource() == className) { String fieldName = fields.variables[0].name.name; declaredCodes.add(className + '.' + fieldName); } } } } } } return declaredCodes; } List getListedCodes() { List listedCodes = []; CompilationUnit listingUnit = parseFile(['lib', 'error', 'error.dart']); TopLevelVariableDeclaration declaration = listingUnit.declarations .whereType() .firstWhere((member) => member.variables.variables[0].name.name == 'errorCodeValues'); var listLiteral = declaration.variables.variables[0].initializer as ListLiteral; for (var element in listLiteral.elements.cast()) { listedCodes.add(element.name); } return listedCodes; } CompilationUnit parseFile(List relativeComponents) { List pathComponents = _analyzerRootComponents.toList() ..addAll(relativeComponents); String filePath = path.normalize(path.joinAll(pathComponents)); return parseString( path: filePath, content: File(filePath).readAsStringSync(), featureSet: ExperimentStatus.latestWithNullSafety, ).unit; } test_errorCodeValues() { List listedCodes = getListedCodes(); List missingCodes = []; List> declaringPaths = [ ['lib', 'src', 'analysis_options', 'error', 'option_codes.dart'], ['lib', 'src', 'dart', 'error', 'ffi_code.dart'], ['lib', 'src', 'dart', 'error', 'hint_codes.dart'], ['lib', 'src', 'dart', 'error', 'lint_codes.dart'], ['lib', 'src', 'dart', 'error', 'todo_codes.dart'], ['lib', 'src', 'dart', 'error', 'syntactic_errors.dart'], ['lib', 'src', 'error', 'codes.dart'], ['..', '_fe_analyzer_shared', 'lib', 'src', 'scanner', 'errors.dart'] ]; for (List path in declaringPaths) { for (String declaredCode in getDeclaredCodes(path)) { if (!listedCodes.contains(declaredCode)) { missingCodes.add(declaredCode); } } } expect(missingCodes, isEmpty); } }