| // Copyright (c) 2021, 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:kernel/kernel.dart"; |
| import "package:expect/expect.dart"; |
| import "package:expect/minitest.dart"; |
| import "../dart_html_metrics_visitor.dart"; |
| import "package:cli_util/cli_util.dart"; |
| import "package:path/path.dart" as path; |
| import "dart:io"; |
| |
| main() async { |
| // Compile Dill |
| var sdkPath = getSdkPath(); |
| if (!sdkPath.contains("ReleaseX64")) |
| sdkPath = path.join(sdkPath, "ReleaseX64", "dart-sdk"); |
| var scriptPath = Platform.script.path; |
| var pkgPath = path.dirname( |
| path.dirname(path.dirname(path.dirname(path.dirname(scriptPath))))); |
| var compilePath = path.canonicalize( |
| path.join(pkgPath, "front_end", "tool", "_fasta", "compile.dart")); |
| var testClassesPath = path |
| .canonicalize(path.join(path.dirname(scriptPath), "test_classes.dart")); |
| var ddcOutlinePath = |
| path.canonicalize(path.join(sdkPath, "lib", "_internal", "ddc_sdk.dill")); |
| var dillPath = path |
| .canonicalize(path.join(path.dirname(scriptPath), "test_classes.dill")); |
| |
| await Process.run(path.join(sdkPath, "bin", "dart"), [ |
| compilePath, |
| "--target=dartdevc", |
| "--platform=${ddcOutlinePath}", |
| "-o=${dillPath}", |
| testClassesPath |
| ]); |
| |
| // Dill compiled from test_classes.dart using ddc. |
| var component = loadComponentFromBinary(dillPath); |
| var visitor = MetricsVisitor(["file:${testClassesPath}"]); |
| |
| component.accept(visitor); |
| |
| test("Class A does not call super", () { |
| Expect.equals(visitor.classInfo["A"].invokesSuper, false); |
| }); |
| |
| test("Class B does call super", () { |
| Expect.equals(visitor.classInfo["B"].invokesSuper, true); |
| |
| var callingMethod = visitor.classInfo["B"].methods |
| .where((m) => m.name == "testSuper") |
| .toList()[0]; |
| Expect.equals(callingMethod.invokesSuper, true); |
| }); |
| |
| test("Class C does not call super", () { |
| Expect.equals(visitor.classInfo["C"].invokesSuper, false); |
| }); |
| |
| test("Class A inherited by B", () { |
| Expect.equals(visitor.classInfo["A"].inheritedBy.contains("B"), true); |
| Expect.equals(visitor.classInfo["B"].parent, "A"); |
| }); |
| |
| test("Class B inherited by C", () { |
| Expect.equals(visitor.classInfo["B"].inheritedBy.contains("C"), true); |
| Expect.equals(visitor.classInfo["C"].parent, "B"); |
| }); |
| |
| test("Class B inherited by F", () { |
| Expect.equals(visitor.classInfo["B"].inheritedBy.contains("F"), true); |
| Expect.equals(visitor.classInfo["F"].parent, "B"); |
| }); |
| |
| test("Class C inherited by nothing", () { |
| Expect.equals(visitor.classInfo["C"].inheritedBy.length, 0); |
| }); |
| |
| test("Class D mixed with Mix1 and Mix2", () { |
| Expect.equals(visitor.classInfo["D"].mixed, true); |
| Expect.deepEquals(visitor.classInfo["D"].mixins, ["Mix1", "Mix2"]); |
| }); |
| |
| test("Class F mixed with Mix1 and Mix2", () { |
| Expect.equals(visitor.classInfo["F"].mixed, true); |
| Expect.deepEquals(visitor.classInfo["F"].mixins, ["Mix1", "Mix2"]); |
| }); |
| |
| test("Class E implements A", () { |
| Expect.equals(visitor.classInfo["E"].implementedTypes.contains("A"), true); |
| }); |
| |
| test("Class G extends A but fails to override getValue()", () { |
| Expect.equals( |
| visitor.classInfo["G"].notOverriddenMethods.contains("getValue"), true); |
| }); |
| } |