Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1546)

Unified Diff: pkg/compiler/lib/src/kernel/env.dart

Issue 3005823002: Handle forwarding constructors to unnamed mixin applications (Closed)
Patch Set: Updated cf. comments Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: pkg/compiler/lib/src/kernel/env.dart
diff --git a/pkg/compiler/lib/src/kernel/env.dart b/pkg/compiler/lib/src/kernel/env.dart
index e7c2318424774a52468b87ef018b2993325d81e3..2ee702c2a85770f929ae455572a26f422ede9ed5 100644
--- a/pkg/compiler/lib/src/kernel/env.dart
+++ b/pkg/compiler/lib/src/kernel/env.dart
@@ -258,7 +258,7 @@ class ClassEnvImpl implements ClassEnv {
initializers: <ir.Initializer>[superInitializer]);
}
- void _ensureMaps() {
+ void _ensureMaps(KernelToElementMapBase elementMap) {
if (_memberMap == null) {
_memberMap = <String, ir.Member>{};
_setterMap = <String, ir.Member>{};
@@ -302,6 +302,11 @@ class ClassEnvImpl implements ClassEnv {
addMembers(cls, includeStatic: true);
if (isUnnamedMixinApplication && _constructorMap.isEmpty) {
+ // Ensure that constructors are created for the superclass in case it
+ // is also an unnamed mixin application.
+ ClassEntity superclass = elementMap.getClass(cls.superclass);
+ elementMap.elementEnvironment.lookupConstructor(superclass, '');
+
// Unnamed mixin applications have no constructors when read from .dill.
// For each generative constructor in the superclass we make a
// corresponding forwarding constructor in the subclass.
@@ -311,6 +316,7 @@ class ClassEnvImpl implements ClassEnv {
var superclassSubstitution = getSubstitutionMap(cls.supertype);
var superclassCloner =
new CloneVisitor(typeSubstitution: superclassSubstitution);
+
for (var superclassConstructor in cls.superclass.constructors) {
var forwardingConstructor = _buildForwardingConstructor(
superclassCloner, superclassConstructor);
@@ -327,7 +333,7 @@ class ClassEnvImpl implements ClassEnv {
/// returned.
MemberEntity lookupMember(KernelToElementMap elementMap, String name,
{bool setter: false}) {
- _ensureMaps();
+ _ensureMaps(elementMap);
ir.Member member = setter ? _setterMap[name] : _memberMap[name];
return member != null ? elementMap.getMember(member) : null;
}
@@ -335,7 +341,7 @@ class ClassEnvImpl implements ClassEnv {
/// Calls [f] for each member of [cls].
void forEachMember(
KernelToElementMap elementMap, void f(MemberEntity member)) {
- _ensureMaps();
+ _ensureMaps(elementMap);
_memberMap.values.forEach((ir.Member member) {
f(elementMap.getMember(member));
});
@@ -351,7 +357,7 @@ class ClassEnvImpl implements ClassEnv {
/// Return the [ConstructorEntity] for the constructor [name] in [cls].
ConstructorEntity lookupConstructor(
KernelToElementMap elementMap, String name) {
- _ensureMaps();
+ _ensureMaps(elementMap);
ir.Member constructor = _constructorMap[name];
return constructor != null ? elementMap.getConstructor(constructor) : null;
}
@@ -359,7 +365,7 @@ class ClassEnvImpl implements ClassEnv {
/// Calls [f] for each constructor of [cls].
void forEachConstructor(
KernelToElementMap elementMap, void f(ConstructorEntity constructor)) {
- _ensureMaps();
+ _ensureMaps(elementMap);
_constructorMap.values.forEach((ir.Member constructor) {
f(elementMap.getConstructor(constructor));
});

Powered by Google App Engine
This is Rietveld 408576698