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

Commit 37a95d0

Browse files
author
John Messerly
committed
fixes #158, precendence of call and access in new
[email protected] Review URL: https://codereview.chromium.org/1122283002
1 parent e2cc5c7 commit 37a95d0

File tree

8 files changed

+59
-39
lines changed

8 files changed

+59
-39
lines changed

lib/runtime/dart/_internal.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ var _internal;
372372
if (dart.is(iterable, EfficientLength)) {
373373
return new (EfficientLengthMappedIterable$(S, T))(iterable, func);
374374
}
375-
return new MappedIterable$(S, T)._(dart.as(iterable, core.Iterable$(S)), func);
375+
return new (MappedIterable$(S, T))._(dart.as(iterable, core.Iterable$(S)), func);
376376
}
377377
_(iterable, f) {
378378
this[_iterable] = iterable;
@@ -560,7 +560,7 @@ var _internal;
560560
if (dart.is(iterable, EfficientLength)) {
561561
return new (EfficientLengthTakeIterable$(E))(iterable, takeCount);
562562
}
563-
return new TakeIterable$(E)._(iterable, takeCount);
563+
return new (TakeIterable$(E))._(iterable, takeCount);
564564
}
565565
_(iterable, takeCount) {
566566
this[_iterable] = iterable;
@@ -663,7 +663,7 @@ var _internal;
663663
if (dart.is(iterable, EfficientLength)) {
664664
return new (EfficientLengthSkipIterable$(E))(iterable, count);
665665
}
666-
return new SkipIterable$(E)._(iterable, count);
666+
return new (SkipIterable$(E))._(iterable, count);
667667
}
668668
_(iterable, skipCount) {
669669
this[_iterable] = iterable;
@@ -679,7 +679,7 @@ var _internal;
679679
throw new core.ArgumentError.value(this[_skipCount], "count is not an integer");
680680
}
681681
core.RangeError.checkNotNegative(this[_skipCount], "count");
682-
return new SkipIterable$(E)._(this[_iterable], dart.notNull(this[_skipCount]) + dart.notNull(count));
682+
return new (SkipIterable$(E))._(this[_iterable], dart.notNull(this[_skipCount]) + dart.notNull(count));
683683
}
684684
get [core.$iterator]() {
685685
return new (SkipIterator$(E))(this[_iterable][core.$iterator], this[_skipCount]);

lib/runtime/dart/_isolate_helper.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ var _isolate_helper;
2424
class _Serializer extends core.Object {
2525
_Serializer(opts) {
2626
let serializeSendPorts = opts && 'serializeSendPorts' in opts ? opts.serializeSendPorts : true;
27-
this.serializedObjectIds = new core.Map$(dart.dynamic, core.int).identity();
27+
this.serializedObjectIds = new (core.Map$(dart.dynamic, core.int)).identity();
2828
this[_serializeSendPorts] = dart.as(serializeSendPorts, core.bool);
2929
}
3030
serialize(x) {
@@ -1022,7 +1022,7 @@ var _isolate_helper;
10221022
}
10231023
static _startWorker(functionName, uri, args, message, isSpawnUri, startPaused, replyPort, onError) {
10241024
if (args != null)
1025-
args = new core.List$(core.String).from(args);
1025+
args = new (core.List$(core.String)).from(args);
10261026
if (exports._globalState.isWorker) {
10271027
exports._globalState.mainManager.postMessage(_serializeMessage(dart.map({command: 'spawn-worker', functionName: functionName, args: args, msg: message, uri: uri, isSpawnUri: isSpawnUri, startPaused: startPaused, replyPort: replyPort})));
10281028
} else {
@@ -1035,7 +1035,7 @@ var _isolate_helper;
10351035
}
10361036
message = _clone(message);
10371037
if (args != null)
1038-
args = new core.List$(core.String).from(args);
1038+
args = new (core.List$(core.String)).from(args);
10391039
exports._globalState.topEventLoop.enqueue(new _IsolateContext(), () => {
10401040
let func = IsolateNatives._getJSFunctionFromName(functionName);
10411041
IsolateNatives._startIsolate(dart.as(func, core.Function), args, message, isSpawnUri, startPaused, replyPort);

lib/runtime/dart/_js_helper.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3736,8 +3736,8 @@ var _js_helper;
37363736
let hashesMap = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.DEFERRED_LIBRARY_HASHES);
37373737
let hashes = dart.as(hashesMap[loadId], core.List$(core.String));
37383738
if (uris == null)
3739-
return new async.Future$(core.Null).value(null);
3740-
let indices = new core.List$(core.int).generate(uris[core.$length], i => dart.as(i, core.int));
3739+
return new (async.Future$(core.Null)).value(null);
3740+
let indices = new (core.List$(core.int)).generate(uris[core.$length], i => dart.as(i, core.int));
37413741
let isHunkLoaded = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.IS_HUNK_LOADED);
37423742
let isHunkInitialized = _foreign_helper.JS_EMBEDDED_GLOBAL('', _js_embedded_names.IS_HUNK_INITIALIZED);
37433743
let indicesToLoad = indices[core.$where](i => !isHunkLoaded(hashes[core.$get](i)))[core.$toList]();

lib/runtime/dart/async.js

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,17 +1774,17 @@ var async;
17741774
sync(computation) {
17751775
try {
17761776
let result = computation();
1777-
return new Future$(T).value(result);
1777+
return new (Future$(T)).value(result);
17781778
} catch (error) {
17791779
let stackTrace = dart.stackTrace(error);
1780-
return new Future$(T).error(error, stackTrace);
1780+
return new (Future$(T)).error(error, stackTrace);
17811781
}
17821782

17831783
}
17841784
value(value) {
17851785
if (value === void 0)
17861786
value = null;
1787-
return new _Future$(T).immediate(value);
1787+
return new (_Future$(T)).immediate(value);
17881788
}
17891789
error(error, stackTrace) {
17901790
if (stackTrace === void 0)
@@ -1797,7 +1797,7 @@ var async;
17971797
stackTrace = replacement.stackTrace;
17981798
}
17991799
}
1800-
return new _Future$(T).immediateError(error, stackTrace);
1800+
return new (_Future$(T)).immediateError(error, stackTrace);
18011801
}
18021802
delayed(duration, computation) {
18031803
if (computation === void 0)
@@ -1870,7 +1870,7 @@ var async;
18701870
}, {onError: handleError});
18711871
}
18721872
if (remaining == 0) {
1873-
return new Future$(core.List).value(dart.const([]));
1873+
return new (Future$(core.List)).value(dart.const([]));
18741874
}
18751875
values = new core.List(remaining);
18761876
return result;
@@ -2198,7 +2198,7 @@ var async;
21982198
return dart.as(result, Future$(T));
21992199
}
22002200
asStream() {
2201-
return new Stream$(T).fromFuture(this);
2201+
return new (Stream$(T)).fromFuture(this);
22022202
}
22032203
[_markPendingCompletion]() {
22042204
if (!dart.notNull(this[_mayComplete]))
@@ -3695,7 +3695,7 @@ var async;
36953695
}
36963696
moveNext() {
36973697
if (this[_state] == _StreamIteratorImpl._STATE_DONE) {
3698-
return new _Future$(core.bool).immediate(false);
3698+
return new (_Future$(core.bool)).immediate(false);
36993699
}
37003700
if (this[_state] == _StreamIteratorImpl._STATE_MOVING) {
37013701
throw new core.StateError("Already waiting for next.");
@@ -3714,18 +3714,18 @@ var async;
37143714
this[_current] = dart.as(this[_futureOrPrefetch], T);
37153715
this[_futureOrPrefetch] = null;
37163716
this[_subscription].resume();
3717-
return new _Future$(core.bool).immediate(true);
3717+
return new (_Future$(core.bool)).immediate(true);
37183718
}
37193719
case _StreamIteratorImpl._STATE_EXTRA_ERROR:
37203720
{
37213721
let prefetch = dart.as(this[_futureOrPrefetch], AsyncError);
37223722
this[_clear]();
3723-
return new _Future$(core.bool).immediateError(prefetch.error, prefetch.stackTrace);
3723+
return new (_Future$(core.bool)).immediateError(prefetch.error, prefetch.stackTrace);
37243724
}
37253725
case _StreamIteratorImpl._STATE_EXTRA_DONE:
37263726
{
37273727
this[_clear]();
3728-
return new _Future$(core.bool).immediate(false);
3728+
return new (_Future$(core.bool)).immediate(false);
37293729
}
37303730
}
37313731
}

lib/runtime/dart/collection.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -560,10 +560,10 @@ var collection;
560560
}
561561
[core.$toList](opts) {
562562
let growable = opts && 'growable' in opts ? opts.growable : true;
563-
return new core.List$(E).from(this, {growable: growable});
563+
return new (core.List$(E)).from(this, {growable: growable});
564564
}
565565
[core.$toSet]() {
566-
return new core.Set$(E).from(this);
566+
return new (core.Set$(E)).from(this);
567567
}
568568
get [core.$length]() {
569569
dart.assert(!dart.is(this, _internal.EfficientLength));
@@ -776,10 +776,10 @@ var collection;
776776
}
777777
[core.$toList](opts) {
778778
let growable = opts && 'growable' in opts ? opts.growable : true;
779-
return new core.List$(E).from(this, {growable: growable});
779+
return new (core.List$(E)).from(this, {growable: growable});
780780
}
781781
[core.$toSet]() {
782-
return new core.Set$(E).from(this);
782+
return new (core.Set$(E)).from(this);
783783
}
784784
get [core.$length]() {
785785
dart.assert(!dart.is(this, _internal.EfficientLength));
@@ -2219,7 +2219,7 @@ var collection;
22192219
return new (ListQueue$(E))();
22202220
}
22212221
from(elements) {
2222-
return new ListQueue$(E).from(elements);
2222+
return new (ListQueue$(E)).from(elements);
22232223
}
22242224
[Symbol.iterator]() {
22252225
return new dart.JsIterator(this[core.$iterator]);

lib/runtime/dart/core.js

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1150,7 +1150,7 @@ var core;
11501150
let newStart = dart.notNull(this[_start]) + dart.notNull(count);
11511151
if (dart.notNull(newStart) >= dart.notNull(this[_end]))
11521152
return new (_internal.EmptyIterable$(E))();
1153-
return new exports._GeneratorIterable$(E).slice(newStart, this[_end], this[_generator]);
1153+
return new (exports._GeneratorIterable$(E)).slice(newStart, this[_end], this[_generator]);
11541154
}
11551155
[$take](count) {
11561156
RangeError.checkNotNegative(count, "count");
@@ -1159,7 +1159,7 @@ var core;
11591159
let newEnd = dart.notNull(this[_start]) + dart.notNull(count);
11601160
if (dart.notNull(newEnd) >= dart.notNull(this[_end]))
11611161
return this;
1162-
return new exports._GeneratorIterable$(E).slice(this[_start], newEnd, this[_generator]);
1162+
return new (exports._GeneratorIterable$(E)).slice(this[_start], newEnd, this[_generator]);
11631163
}
11641164
static _id(n) {
11651165
return n;
@@ -1428,13 +1428,13 @@ var core;
14281428
[$toList](opts) {
14291429
let growable = opts && 'growable' in opts ? opts.growable : true;
14301430
if (growable) {
1431-
return new _interceptors.JSArray$(E).markGrowable(this.slice());
1431+
return new (_interceptors.JSArray$(E)).markGrowable(this.slice());
14321432
} else {
1433-
return new _interceptors.JSArray$(E).markFixed(this.slice());
1433+
return new (_interceptors.JSArray$(E)).markFixed(this.slice());
14341434
}
14351435
}
14361436
[$toSet]() {
1437-
return new exports.Set$(E).from(this);
1437+
return new (exports.Set$(E)).from(this);
14381438
}
14391439
get [$iterator]() {
14401440
return new (_internal.ListIterator$(E))(this);
@@ -1583,7 +1583,7 @@ var core;
15831583
}
15841584
if (start == end)
15851585
return dart.setType([], List$(E));
1586-
return new _interceptors.JSArray$(E).markGrowable(this.slice(start, end));
1586+
return new (_interceptors.JSArray$(E)).markGrowable(this.slice(start, end));
15871587
}
15881588
[$getRange](start, end) {
15891589
return new (_internal.IterableMixinWorkaround$(E))().getRangeList(this, start, end);
@@ -1638,16 +1638,16 @@ var core;
16381638
return new (collection.LinkedHashMap$(K, V))();
16391639
}
16401640
from(other) {
1641-
return new collection.LinkedHashMap$(K, V).from(other);
1641+
return new (collection.LinkedHashMap$(K, V)).from(other);
16421642
}
16431643
identity() {
1644-
return new collection.LinkedHashMap$(K, V).identity();
1644+
return new (collection.LinkedHashMap$(K, V)).identity();
16451645
}
16461646
fromIterable(iterable, opts) {
1647-
return new collection.LinkedHashMap$(K, V).fromIterable(iterable, opts);
1647+
return new (collection.LinkedHashMap$(K, V)).fromIterable(iterable, opts);
16481648
}
16491649
fromIterables(keys, values) {
1650-
return new collection.LinkedHashMap$(K, V).fromIterables(keys, values);
1650+
return new (collection.LinkedHashMap$(K, V)).fromIterables(keys, values);
16511651
}
16521652
}
16531653
dart.defineNamedConstructor(Map, 'from');
@@ -1691,10 +1691,10 @@ var core;
16911691
return new (collection.LinkedHashSet$(E))();
16921692
}
16931693
identity() {
1694-
return new collection.LinkedHashSet$(E).identity();
1694+
return new (collection.LinkedHashSet$(E)).identity();
16951695
}
16961696
from(elements) {
1697-
return new collection.LinkedHashSet$(E).from(elements);
1697+
return new (collection.LinkedHashSet$(E)).from(elements);
16981698
}
16991699
}
17001700
Set[dart.implements] = () => [_internal.EfficientLength];

lib/runtime/dart/isolate.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ var isolate;
3333
return dart.as(_isolate_helper.IsolateNatives.spawnFunction(entryPoint, message, paused).then(msg => new Isolate(dart.as(dart.dindex(msg, 1), SendPort), {pauseCapability: dart.as(dart.dindex(msg, 2), Capability), terminateCapability: dart.as(dart.dindex(msg, 3), Capability)})), async.Future$(Isolate));
3434
} catch (e) {
3535
let st = dart.stackTrace(e);
36-
return new async.Future$(Isolate).error(e, st);
36+
return new (async.Future$(Isolate)).error(e, st);
3737
}
3838

3939
}
@@ -55,7 +55,7 @@ var isolate;
5555
return dart.as(_isolate_helper.IsolateNatives.spawnUri(uri, args, message, paused).then(msg => new Isolate(dart.as(dart.dindex(msg, 1), SendPort), {pauseCapability: dart.as(dart.dindex(msg, 2), Capability), terminateCapability: dart.as(dart.dindex(msg, 3), Capability)})), async.Future$(Isolate));
5656
} catch (e) {
5757
let st = dart.stackTrace(e);
58-
return new async.Future$(Isolate).error(e, st);
58+
return new (async.Future$(Isolate)).error(e, st);
5959
}
6060

6161
}

lib/src/js/printer.dart

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ class Printer implements NodeVisitor {
6060

6161
bool inForInit = false;
6262
bool atStatementBegin = false;
63+
bool inNewTarget = false;
6364
bool pendingSemicolon = false;
6465
bool pendingSpace = false;
6566

@@ -560,6 +561,7 @@ class Printer implements NodeVisitor {
560561
if (needsParentheses) {
561562
inForInit = false;
562563
atStatementBegin = false;
564+
inNewTarget = false;
563565
out("(");
564566
visit(node);
565567
out(")");
@@ -616,8 +618,10 @@ class Printer implements NodeVisitor {
616618

617619
visitNew(New node) {
618620
out("new ");
621+
inNewTarget = true;
619622
visitNestedExpression(node.target, ACCESS,
620623
newInForInit: inForInit, newAtStatementBegin: false);
624+
inNewTarget = false;
621625
out("(");
622626
visitCommaSeparated(node.arguments, ASSIGNMENT,
623627
newInForInit: false, newAtStatementBegin: false);
@@ -809,7 +813,23 @@ class Printer implements NodeVisitor {
809813
}
810814

811815
visitAccess(PropertyAccess access) {
812-
visitNestedExpression(access.receiver, CALL,
816+
// Normally we can omit parens on the receiver if it is a Call, even though
817+
// Call expressions have lower precedence. However this optimization doesn't
818+
// work inside New expressions:
819+
//
820+
// new obj.foo().bar()
821+
//
822+
// This will be parsed as:
823+
//
824+
// (new obj.foo()).bar()
825+
//
826+
// Which is incorrect. So we must have parenthesis in this case:
827+
//
828+
// new (obj.foo()).bar()
829+
//
830+
int precedence = inNewTarget ? ACCESS : CALL;
831+
832+
visitNestedExpression(access.receiver, precedence,
813833
newInForInit: inForInit,
814834
newAtStatementBegin: atStatementBegin);
815835
propertyNameOut(access.selector, inAccess: true);

0 commit comments

Comments
 (0)