Skip to content

Commit 9b1ad9c

Browse files
author
John Messerly
committed
fixes #231, mixin application (aka ClassTypeAlias) implicit ctors
[email protected] Review URL: https://codereview.chromium.org/1193083002.
1 parent 4e7920c commit 9b1ad9c

File tree

4 files changed

+46
-10
lines changed

4 files changed

+46
-10
lines changed

pkg/dev_compiler/lib/runtime/dart/_internal.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,12 +1778,20 @@ dart_library.library('dart/_internal', null, /* Imports */[
17781778
});
17791779
let UnmodifiableListMixin = UnmodifiableListMixin$();
17801780
let FixedLengthListBase$ = dart.generic(function(E) {
1781-
class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), FixedLengthListMixin$(E)) {}
1781+
class FixedLengthListBase extends dart.mixin(collection.ListBase$(E), FixedLengthListMixin$(E)) {
1782+
FixedLengthListBase() {
1783+
super.ListBase(...arguments);
1784+
}
1785+
}
17821786
return FixedLengthListBase;
17831787
});
17841788
let FixedLengthListBase = FixedLengthListBase$();
17851789
let UnmodifiableListBase$ = dart.generic(function(E) {
1786-
class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), UnmodifiableListMixin$(E)) {}
1790+
class UnmodifiableListBase extends dart.mixin(collection.ListBase$(E), UnmodifiableListMixin$(E)) {
1791+
UnmodifiableListBase() {
1792+
super.ListBase(...arguments);
1793+
}
1794+
}
17871795
return UnmodifiableListBase;
17881796
});
17891797
let UnmodifiableListBase = UnmodifiableListBase$();

pkg/dev_compiler/lib/runtime/dart/async.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3368,8 +3368,16 @@ dart_library.library('dart/async', null, /* Imports */[
33683368
return null;
33693369
}
33703370
}
3371-
class _NoCallbackAsyncStreamController extends dart.mixin(_StreamController, _AsyncStreamControllerDispatch, _NoCallbacks) {}
3372-
class _NoCallbackSyncStreamController extends dart.mixin(_StreamController, _SyncStreamControllerDispatch, _NoCallbacks) {}
3371+
class _NoCallbackAsyncStreamController extends dart.mixin(_StreamController, _AsyncStreamControllerDispatch, _NoCallbacks) {
3372+
_NoCallbackAsyncStreamController() {
3373+
super._StreamController(...arguments);
3374+
}
3375+
}
3376+
class _NoCallbackSyncStreamController extends dart.mixin(_StreamController, _SyncStreamControllerDispatch, _NoCallbacks) {
3377+
_NoCallbackSyncStreamController() {
3378+
super._StreamController(...arguments);
3379+
}
3380+
}
33733381
let _NotificationHandler = dart.typedef('_NotificationHandler', () => dart.functionType(dart.dynamic, []));
33743382
function _runGuarded(notificationHandler) {
33753383
if (notificationHandler == null)

pkg/dev_compiler/lib/runtime/dart/collection.js

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2321,7 +2321,11 @@ dart_library.library('dart/collection', null, /* Imports */[
23212321
});
23222322
let _UnmodifiableMapMixin = _UnmodifiableMapMixin$();
23232323
let UnmodifiableMapBase$ = dart.generic(function(K, V) {
2324-
class UnmodifiableMapBase extends dart.mixin(MapBase$(K, V), _UnmodifiableMapMixin$(K, V)) {}
2324+
class UnmodifiableMapBase extends dart.mixin(MapBase$(K, V), _UnmodifiableMapMixin$(K, V)) {
2325+
UnmodifiableMapBase() {
2326+
super.MapBase(...arguments);
2327+
}
2328+
}
23252329
return UnmodifiableMapBase;
23262330
});
23272331
let UnmodifiableMapBase = UnmodifiableMapBase$();
@@ -2474,7 +2478,11 @@ dart_library.library('dart/collection', null, /* Imports */[
24742478
});
24752479
let MapView = MapView$();
24762480
let UnmodifiableMapView$ = dart.generic(function(K, V) {
2477-
class UnmodifiableMapView extends dart.mixin(MapView$(K, V), _UnmodifiableMapMixin$(K, V)) {}
2481+
class UnmodifiableMapView extends dart.mixin(MapView$(K, V), _UnmodifiableMapMixin$(K, V)) {
2482+
UnmodifiableMapView() {
2483+
super.MapView(...arguments);
2484+
}
2485+
}
24782486
return UnmodifiableMapView;
24792487
});
24802488
let UnmodifiableMapView = UnmodifiableMapView$();

pkg/dev_compiler/lib/src/codegen/js_codegen.dart

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,7 +310,6 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
310310

311311
@override
312312
visitFunctionTypeAlias(FunctionTypeAlias node) {
313-
// If we've already emitted this class, skip it.
314313
var element = node.element;
315314
var type = element.type;
316315
var name = element.name;
@@ -329,11 +328,25 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
329328

330329
@override
331330
JS.Statement visitClassTypeAlias(ClassTypeAlias node) {
332-
// If we've already emitted this class, skip it.
333331
var element = node.element;
334332

333+
// Forward all generative constructors from the base class.
334+
var body = [];
335+
336+
var supertype = element.supertype;
337+
if (!supertype.isObject) {
338+
for (var ctor in element.constructors) {
339+
var parentCtor = supertype.lookUpConstructor(ctor.name, ctor.library);
340+
var fun = js.call('function() { super.#(...#); }', [
341+
_constructorName(parentCtor),
342+
new JS.Identifier('arguments', allowRename: false)
343+
]);
344+
body.add(new JS.Method(_constructorName(ctor), fun));
345+
}
346+
}
347+
335348
var classDecl = new JS.ClassDeclaration(new JS.ClassExpression(
336-
new JS.Identifier(element.name), _classHeritage(element), []));
349+
new JS.Identifier(element.name), _classHeritage(element), body));
337350

338351
return _finishClassDef(element.type, classDecl);
339352
}
@@ -354,7 +367,6 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
354367

355368
@override
356369
JS.Statement visitClassDeclaration(ClassDeclaration node) {
357-
// If we've already emitted this class, skip it.
358370
var classElem = node.element;
359371
var type = classElem.type;
360372
var jsName = findAnnotation(classElem, _isJsNameAnnotation);

0 commit comments

Comments
 (0)