// Copyright (c) 2018, 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 'package:analyzer_fe_comparison/src/analyzer.dart' as analyzer; import 'package:analyzer_fe_comparison/src/comparison_node.dart'; import 'package:analyzer_fe_comparison/src/kernel.dart' as kernel; import 'package:path/path.dart' as path; /// Compares the analyzer and kernel representations of a package, and prints /// the resulting diff. void comparePackages( String platformPath, String projectLibPath, String packagesFilePath) async { ComparisonNode analyzerNode = await analyzer.analyzePackage(projectLibPath); var packagesFileUri = Uri.file(packagesFilePath); var inputs = []; for (var library in analyzerNode.children) { inputs.add(Uri.parse(library.text)); } var platformUri = Uri.file(platformPath); ComparisonNode kernelNode = await kernel.analyzePackage(inputs, packagesFileUri, platformUri); print(ComparisonNode.diff(kernelNode, analyzerNode, 'CFE', 'analyzer')); } /// Compares the analyzer and kernel representations of a test file, and prints /// the resulting diff. /// /// Only libraries reached by a "file:" URI are compared. void compareTestPrograms( String sourcePath, String platformPath, String packagesFilePath) async { var packagesFileUri = Uri.file(packagesFilePath); var platformUri = Uri.file(platformPath); ComparisonNode kernelNode = await kernel.analyzeProgram( path.toUri(sourcePath), packagesFileUri, platformUri, (uri) => uri.scheme == 'file'); if (kernelNode.text == 'Error occurred') { // TODO(paulberry): really we should verify that the analyzer detects an // error as well. But that's not easy to do right now because we use the // front end to chase imports so that we know which files to pass to the // analyzer, and we can't rely on the front end import chasing when an error // occurred. print('No differences found (skipped due to front end compilation error)'); return; } String startingPath; var inputs = []; for (var library in kernelNode.children) { var filePath = path.fromUri(Uri.parse(library.text)); if (startingPath == null) { startingPath = path.dirname(filePath); } else { while (!path.isWithin(startingPath, filePath)) { startingPath = path.dirname(startingPath); } } inputs.add(filePath); } ComparisonNode analyzerNode = await analyzer.analyzeFiles(startingPath, inputs); if (kernelNode == analyzerNode) { print('No differences found!'); } else { print('Differences found:'); print(ComparisonNode.diff(kernelNode, analyzerNode, 'CFE', 'analyzer')); } }