Skip to content
This repository was archived by the owner on Feb 22, 2018. It is now read-only.

Commit 99d9a94

Browse files
committed
1 parent 4bd449f commit 99d9a94

File tree

5 files changed

+76
-23
lines changed

5 files changed

+76
-23
lines changed

lib/runtime/dart/_interceptors.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ dart.library('dart/_interceptors', null, /* Imports */[
448448
statics: () => ({markFixedList: [core.List, [core.List]]}),
449449
names: ['markFixedList']
450450
});
451+
JSArray[dart.metadata] = () => [dart.const(new _js_helper.JsPeerInterface({name: 'Array'}))];
451452
return JSArray;
452453
});
453454
let JSArray = JSArray$();
@@ -925,6 +926,7 @@ dart.library('dart/_interceptors', null, /* Imports */[
925926
}),
926927
names: ['_bitCount', '_shru', '_shrs', '_ors', '_spread']
927928
});
929+
JSInt[dart.metadata] = () => [dart.const(new _js_helper.JsPeerInterface({name: 'Number'}))];
928930
dart.registerExtension(dart.global.Number, JSInt);
929931
class JSDouble extends JSNumber {
930932
JSDouble() {
@@ -1436,6 +1438,7 @@ dart.library('dart/_interceptors', null, /* Imports */[
14361438
}),
14371439
names: ['_isWhitespace', '_skipLeadingWhitespace', '_skipTrailingWhitespace']
14381440
});
1441+
JSString[dart.metadata] = () => [dart.const(new _js_helper.JsPeerInterface({name: 'String'}))];
14391442
dart.registerExtension(dart.global.String, JSString);
14401443
let _string = Symbol('_string');
14411444
class _CodeUnits extends _internal.UnmodifiableListBase$(core.int) {
@@ -1481,6 +1484,7 @@ dart.library('dart/_interceptors', null, /* Imports */[
14811484
dart.setSignature(JSBool, {
14821485
constructors: () => ({JSBool: [JSBool, []]})
14831486
});
1487+
JSBool[dart.metadata] = () => [dart.const(new _js_helper.JsPeerInterface({name: 'Boolean'}))];
14841488
dart.registerExtension(dart.global.Boolean, JSBool);
14851489
class JSIndexable extends core.Object {}
14861490
class JSMutableIndexable extends JSIndexable {}

lib/runtime/dart/_native_typed_data.js

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
33
'dart/typed_data',
44
'dart/collection',
55
'dart/_internal',
6-
'dart/_js_helper',
76
'dart/math'
87
], /* Lazy imports */[
8+
'dart/_js_helper',
99
'dart/_interceptors'
10-
], function(exports, core, typed_data, collection, _internal, _js_helper, math, _interceptors) {
10+
], function(exports, core, typed_data, collection, _internal, math, _js_helper, _interceptors) {
1111
'use strict';
1212
class NativeByteBuffer extends core.Object {
1313
NativeByteBuffer() {
@@ -145,6 +145,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
145145
asByteData: [typed_data.ByteData, [], [core.int, core.int]]
146146
})
147147
});
148+
NativeByteBuffer[dart.metadata] = () => [dart.const(new _js_helper.Native("ArrayBuffer"))];
148149
let _storage = Symbol('_storage');
149150
let _invalidIndex = Symbol('_invalidIndex');
150151
let _checkIndex = Symbol('_checkIndex');
@@ -510,6 +511,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
510511
[_checkSublistArguments]: [core.int, [core.int, core.int, core.int]]
511512
})
512513
});
514+
NativeTypedData[dart.metadata] = () => [dart.const(new _js_helper.Native("ArrayBufferView"))];
513515
function _checkLength(length) {
514516
if (!(typeof length == 'number'))
515517
throw new core.ArgumentError(`Invalid length ${length}`);
@@ -701,6 +703,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
701703
}),
702704
names: ['_create1', '_create2', '_create3']
703705
});
706+
NativeByteData[dart.metadata] = () => [dart.const(new _js_helper.Native("DataView"))];
704707
let _setRangeFast = Symbol('_setRangeFast');
705708
class NativeTypedArray extends NativeTypedData {
706709
NativeTypedArray() {
@@ -832,6 +835,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
832835
names: ['_create1', '_create2', '_create3']
833836
});
834837
dart.defineExtensionMembers(NativeFloat32List, ['sublist']);
838+
NativeFloat32List[dart.metadata] = () => [dart.const(new _js_helper.Native("Float32Array"))];
835839
class NativeFloat64List extends NativeTypedArrayOfDouble {
836840
static new(length) {
837841
return NativeFloat64List._create1(_checkLength(length));
@@ -879,6 +883,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
879883
names: ['_create1', '_create2', '_create3']
880884
});
881885
dart.defineExtensionMembers(NativeFloat64List, ['sublist']);
886+
NativeFloat64List[dart.metadata] = () => [dart.const(new _js_helper.Native("Float64Array"))];
882887
class NativeInt16List extends NativeTypedArrayOfInt {
883888
static new(length) {
884889
return NativeInt16List._create1(_checkLength(length));
@@ -933,6 +938,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
933938
names: ['_create1', '_create2', '_create3']
934939
});
935940
dart.defineExtensionMembers(NativeInt16List, ['get', 'sublist']);
941+
NativeInt16List[dart.metadata] = () => [dart.const(new _js_helper.Native("Int16Array"))];
936942
class NativeInt32List extends NativeTypedArrayOfInt {
937943
static new(length) {
938944
return NativeInt32List._create1(_checkLength(length));
@@ -987,6 +993,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
987993
names: ['_create1', '_create2', '_create3']
988994
});
989995
dart.defineExtensionMembers(NativeInt32List, ['get', 'sublist']);
996+
NativeInt32List[dart.metadata] = () => [dart.const(new _js_helper.Native("Int32Array"))];
990997
class NativeInt8List extends NativeTypedArrayOfInt {
991998
static new(length) {
992999
return NativeInt8List._create1(_checkLength(length));
@@ -1041,6 +1048,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
10411048
names: ['_create1', '_create2', '_create3']
10421049
});
10431050
dart.defineExtensionMembers(NativeInt8List, ['get', 'sublist']);
1051+
NativeInt8List[dart.metadata] = () => [dart.const(new _js_helper.Native("Int8Array"))];
10441052
class NativeUint16List extends NativeTypedArrayOfInt {
10451053
static new(length) {
10461054
return NativeUint16List._create1(_checkLength(length));
@@ -1095,6 +1103,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
10951103
names: ['_create1', '_create2', '_create3']
10961104
});
10971105
dart.defineExtensionMembers(NativeUint16List, ['get', 'sublist']);
1106+
NativeUint16List[dart.metadata] = () => [dart.const(new _js_helper.Native("Uint16Array"))];
10981107
class NativeUint32List extends NativeTypedArrayOfInt {
10991108
static new(length) {
11001109
return NativeUint32List._create1(_checkLength(length));
@@ -1149,6 +1158,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
11491158
names: ['_create1', '_create2', '_create3']
11501159
});
11511160
dart.defineExtensionMembers(NativeUint32List, ['get', 'sublist']);
1161+
NativeUint32List[dart.metadata] = () => [dart.const(new _js_helper.Native("Uint32Array"))];
11521162
class NativeUint8ClampedList extends NativeTypedArrayOfInt {
11531163
static new(length) {
11541164
return NativeUint8ClampedList._create1(_checkLength(length));
@@ -1206,6 +1216,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
12061216
names: ['_create1', '_create2', '_create3']
12071217
});
12081218
dart.defineExtensionMembers(NativeUint8ClampedList, ['get', 'sublist', 'length']);
1219+
NativeUint8ClampedList[dart.metadata] = () => [dart.const(new _js_helper.Native("Uint8ClampedArray,CanvasPixelArray"))];
12091220
class NativeUint8List extends NativeTypedArrayOfInt {
12101221
static new(length) {
12111222
return NativeUint8List._create1(_checkLength(length));
@@ -1263,6 +1274,7 @@ dart.library('dart/_native_typed_data', null, /* Imports */[
12631274
names: ['_create1', '_create2', '_create3']
12641275
});
12651276
dart.defineExtensionMembers(NativeUint8List, ['get', 'sublist', 'length']);
1277+
NativeUint8List[dart.metadata] = () => [dart.const(new _js_helper.Native("Uint8Array,!nonleaf"))];
12661278
class NativeFloat32x4 extends core.Object {
12671279
static _truncate(x) {
12681280
NativeFloat32x4._list.set(0, dart.as(x, core.num));

lib/runtime/dart/async.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,6 +1791,7 @@ dart.library('dart/async', null, /* Imports */[
17911791
constructors: () => ({DeferredLibrary: [DeferredLibrary, [core.String], {uri: core.String}]}),
17921792
methods: () => ({load: [Future$(core.Null), []]})
17931793
});
1794+
DeferredLibrary[dart.metadata] = () => [dart.const(new core.Deprecated("Dart sdk v. 1.8"))];
17941795
let _s = Symbol('_s');
17951796
class DeferredLoadException extends core.Object {
17961797
DeferredLoadException(s) {

lib/runtime/dart_runtime.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -876,6 +876,7 @@ var dart, dartx;
876876
/** The Symbol for storing type arguments on a specialized generic type. */
877877
dart.mixins = Symbol('mixins');
878878
dart.implements = Symbol('implements');
879+
dart.metadata = Symbol('metadata');
879880

880881
/**
881882
* Returns a new type that mixes members from base and all mixins.

lib/src/codegen/js_codegen.dart

Lines changed: 56 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
363363
jsPeerName = getConstantField(jsPeer, 'name', types.stringType);
364364
}
365365

366-
var body = _finishClassMembers(
367-
classElem, classExpr, ctors, fields, methods, jsPeerName);
366+
var body = _finishClassMembers(classElem, classExpr, ctors, fields, methods,
367+
node.metadata, jsPeerName);
368368

369369
var result = _finishClassDef(type, body);
370370

@@ -541,13 +541,23 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
541541
[_emitMemberName('iterator', type: t)]));
542542
}
543543

544+
JS.Expression _instantiateAnnotation(Annotation node) {
545+
var element = node.element;
546+
if (element is ConstructorElement) {
547+
return _emitInstanceCreationExpression(element, element.returnType,
548+
node.constructorName, node.arguments, true);
549+
} else {
550+
return _visit(node.name);
551+
}
552+
}
553+
544554
/// Emit class members that need to come after the class declaration, such
545555
/// as static fields. See [_emitClassMethods] for things that are emitted
546556
/// inside the ES6 `class { ... }` node.
547557
JS.Statement _finishClassMembers(ClassElement classElem,
548558
JS.ClassExpression cls, List<ConstructorDeclaration> ctors,
549559
List<FieldDeclaration> fields, List<MethodDeclaration> methods,
550-
String jsPeerName) {
560+
List<Annotation> metadata, String jsPeerName) {
551561
var name = classElem.name;
552562
var body = <JS.Statement>[];
553563

@@ -627,6 +637,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
627637
}
628638
}
629639
}
640+
630641
var tCtors = [];
631642
for (ConstructorDeclaration node in ctors) {
632643
var memberName = _constructorName(node.element);
@@ -637,6 +648,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
637648
new JS.Property(memberName, new JS.ArrayInitializer(parts));
638649
tCtors.add(property);
639650
}
651+
640652
build(name, elements) {
641653
var o =
642654
new JS.ObjectInitializer(elements, multiline: elements.length > 1);
@@ -675,6 +687,14 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
675687
]));
676688
}
677689

690+
// Metadata
691+
if (metadata.isNotEmpty) {
692+
body.add(js.statement('#[dart.metadata] = () => #;', [
693+
name,
694+
new JS.ArrayInitializer(metadata.map(_instantiateAnnotation).toList())
695+
]));
696+
}
697+
678698
return _statement(body);
679699
}
680700

@@ -1743,42 +1763,56 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
17431763
_properties.clear();
17441764
}
17451765

1746-
@override
1747-
visitConstructorName(ConstructorName node) {
1748-
var typeName = _visit(node.type);
1749-
var element = node.staticElement;
1750-
if (node.name != null || element.isFactory) {
1766+
JS.Expression _emitConstructorName(
1767+
ConstructorElement element, DartType type, SimpleIdentifier name) {
1768+
var typeName = _emitTypeName(type);
1769+
if (name != null || element.isFactory) {
17511770
var namedCtor = _constructorName(element);
17521771
return new JS.PropertyAccess(typeName, namedCtor);
17531772
}
17541773
return typeName;
17551774
}
17561775

17571776
@override
1758-
visitInstanceCreationExpression(InstanceCreationExpression node) {
1777+
visitConstructorName(ConstructorName node) {
1778+
return _emitConstructorName(node.staticElement, node.type.type, node.name);
1779+
}
1780+
1781+
JS.Expression _emitInstanceCreationExpression(ConstructorElement element,
1782+
DartType type, SimpleIdentifier name, ArgumentList argumentList,
1783+
bool isConst) {
17591784
emitNew() {
17601785
JS.Expression ctor;
17611786
bool isFactory = false;
1762-
var element = node.staticElement;
1787+
// var element = node.staticElement;
17631788
if (element == null) {
17641789
// TODO(jmesserly): this only happens if we had a static error.
17651790
// Should we generate a throw instead?
1766-
ctor = _visit(node.constructorName.type);
1767-
var ctorName = node.constructorName.name;
1768-
if (ctorName != null) {
1769-
ctor = new JS.PropertyAccess(ctor, _propertyName(ctorName.name));
1791+
ctor = _emitTypeName(type);
1792+
if (name != null) {
1793+
ctor = new JS.PropertyAccess(ctor, _propertyName(name.name));
17701794
}
17711795
} else {
1772-
ctor = _visit(node.constructorName);
1796+
ctor = _emitConstructorName(element, type, name);
17731797
isFactory = element.isFactory;
17741798
}
1775-
var args = _visit(node.argumentList);
1799+
var args = _visit(argumentList);
17761800
return isFactory ? new JS.Call(ctor, args) : new JS.New(ctor, args);
17771801
}
1778-
if (node.isConst) return _emitConst(node, emitNew);
1802+
if (isConst) return _emitConst(emitNew);
17791803
return emitNew();
17801804
}
17811805

1806+
@override
1807+
visitInstanceCreationExpression(InstanceCreationExpression node) {
1808+
var element = node.staticElement;
1809+
var constructor = node.constructorName;
1810+
var name = constructor.name;
1811+
var type = constructor.type.type;
1812+
return _emitInstanceCreationExpression(
1813+
element, type, name, node.argumentList, node.isConst);
1814+
}
1815+
17821816
/// True if this type is built-in to JS, and we use the values unwrapped.
17831817
/// For these types we generate a calling convention via static
17841818
/// "extension methods". This allows types to be extended without adding
@@ -1876,6 +1910,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
18761910
var op = node.operator;
18771911
var left = node.leftOperand;
18781912
var right = node.rightOperand;
1913+
18791914
var leftType = getStaticType(left);
18801915
var rightType = getStaticType(right);
18811916

@@ -1945,7 +1980,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
19451980
return id;
19461981
}
19471982

1948-
JS.Expression _emitConst(Expression node, JS.Expression expr()) {
1983+
JS.Expression _emitConst(JS.Expression expr()) {
19491984
// TODO(jmesserly): emit the constants at top level if possible.
19501985
// This wasn't quite working, so disabled for now.
19511986
return js.call('dart.const(#)', expr());
@@ -2436,7 +2471,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
24362471
var name = js.string(node.components.join('.'), "'");
24372472
return new JS.New(_emitTypeName(types.symbolType), [name]);
24382473
}
2439-
return _emitConst(node, emitSymbol);
2474+
return _emitConst(emitSymbol);
24402475
}
24412476

24422477
@override
@@ -2450,7 +2485,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
24502485
}
24512486
return list;
24522487
}
2453-
if (node.constKeyword != null) return _emitConst(node, emitList);
2488+
if (node.constKeyword != null) return _emitConst(emitList);
24542489
return emitList();
24552490
}
24562491

@@ -2482,7 +2517,7 @@ class JSCodegenVisitor extends GeneralizingAstVisitor {
24822517
// TODO(jmesserly): add generic types args.
24832518
return js.call('dart.map(#)', [mapArguments]);
24842519
}
2485-
if (node.constKeyword != null) return _emitConst(node, emitMap);
2520+
if (node.constKeyword != null) return _emitConst(emitMap);
24862521
return emitMap();
24872522
}
24882523

0 commit comments

Comments
 (0)