blob: 600d455da0d7d53e5a6dd43e1478032edc863348 [file] [log] [blame]
// Copyright (c) 2014, 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.
// @dart = 2.7
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/compiler.dart' as dart2js;
import 'package:expect/expect.dart';
import '../helpers/memory_compiler.dart';
void main() {
runTest() async {
CompilationResult result =
await runCompiler(memorySourceFiles: MEMORY_SOURCE_FILES);
dart2js.Compiler compiler = result.compiler;
var closedWorld = compiler.backendClosedWorldForTesting;
var elementEnvironment = closedWorld.elementEnvironment;
lookupLibrary(name) {
return elementEnvironment.lookupLibrary(Uri.parse(name));
}
var outputUnitForMember = closedWorld.outputUnitData.outputUnitForMember;
dynamic lib = lookupLibrary("memory:lib.dart");
var a = elementEnvironment.lookupLibraryMember(lib, "a");
var b = elementEnvironment.lookupLibraryMember(lib, "b");
var c = elementEnvironment.lookupLibraryMember(lib, "c");
var d = elementEnvironment.lookupLibraryMember(lib, "d");
Expect.equals(outputUnitForMember(a), outputUnitForMember(b));
Expect.equals(outputUnitForMember(a), outputUnitForMember(c));
Expect.equals(outputUnitForMember(a), outputUnitForMember(d));
}
asyncTest(() async {
print('--test from kernel------------------------------------------------');
await runTest();
});
}
// Make sure that the implicit references to supers are found by the deferred
// loading dependency mechanism.
const Map<String, String> MEMORY_SOURCE_FILES = const {
"main.dart": """
import "lib.dart" deferred as lib;
void main() {
lib.loadLibrary().then((_) {
new lib.A2();
new lib.B2();
new lib.C3();
new lib.D3(10);
});
}
""",
"lib.dart": """
a() => print("123");
b() => print("123");
c() => print("123");
d() => print("123");
class B {
B() {
b();
}
}
class B2 extends B {
// No constructor creates a synthetic constructor that has an implicit
// super-call.
}
class A {
A() {
a();
}
}
class A2 extends A {
// Implicit super call.
A2();
}
class C1 {}
class C2 {
C2() {
c();
}
}
class C2p {
C2() {
c();
}
}
class C3 extends C2 with C1 {
// Implicit redirecting "super" call via mixin.
}
class D1 {
}
class D2 {
D2(x) {
d();
}
}
// Implicit redirecting "super" call with a parameter via mixin.
class D3 = D2 with D1;
""",
};