Skip to content

Commit bbe6801

Browse files
author
John Messerly
committed
fixes #145, optional params+initializing formals+private fields
[email protected] Review URL: https://codereview.chromium.org/1082333004
1 parent b5e4a91 commit bbe6801

File tree

3 files changed

+33
-7
lines changed

3 files changed

+33
-7
lines changed

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

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -885,23 +885,25 @@ class JSCodegenVisitor extends GeneralizingAstVisitor with ConversionVisitor {
885885

886886
var body = [];
887887
for (var param in parameters.parameters) {
888-
// TODO(justinfagnani): rename identifier if necessary
889-
var name = param.identifier.name;
888+
var jsParam = _visit(param.identifier);
890889

891890
if (param.kind == ParameterKind.NAMED) {
891+
// Parameters will be passed using their real names, not the (possibly
892+
// renamed) local variable.
893+
var paramName = js.string(param.identifier.name, "'");
892894
body.add(js.statement('let # = # && # in # ? #.# : #;', [
893-
name,
895+
jsParam,
894896
_namedArgTemp,
895-
js.string(name, "'"),
897+
paramName,
896898
_namedArgTemp,
897899
_namedArgTemp,
898-
name,
900+
paramName,
899901
_defaultParamValue(param),
900902
]));
901903
} else if (param.kind == ParameterKind.POSITIONAL) {
902904
body.add(js.statement('if (# === void 0) # = #;', [
903-
name,
904-
name,
905+
jsParam,
906+
jsParam,
905907
_defaultParamValue(param)
906908
]));
907909
}

pkg/dev_compiler/test/codegen/expect/temps.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,27 @@ var temps;
1111
this[_function] = func;
1212
}
1313
}
14+
let _opt = Symbol('_opt');
15+
class OptionalArg extends core.Object {
16+
OptionalArg(opt) {
17+
if (opt === void 0)
18+
opt = 123;
19+
this[_opt] = opt;
20+
}
21+
named(opts) {
22+
let opt = opts && '_opt' in opts ? opts._opt : 456;
23+
this[_opt] = opt;
24+
}
25+
}
26+
dart.defineNamedConstructor(OptionalArg, 'named');
1427
// Function main: () → dynamic
1528
function main() {
1629
core.print(new FormalCollision(1, 2, x => x));
30+
core.print(new OptionalArg()[_opt]);
31+
core.print(new OptionalArg.named()[_opt]);
1732
}
1833
// Exports:
1934
exports.FormalCollision = FormalCollision;
35+
exports.OptionalArg = OptionalArg;
2036
exports.main = main;
2137
})(temps || (temps = {}));

pkg/dev_compiler/test/codegen/temps.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,14 @@ class FormalCollision {
1010
FormalCollision(this._x, this.__x, this._function);
1111
}
1212

13+
class OptionalArg {
14+
int _opt;
15+
OptionalArg([this._opt = 123]);
16+
OptionalArg.named({this._opt: 456});
17+
}
18+
1319
main() {
1420
print(new FormalCollision(1, 2, (x) => x));
21+
print(new OptionalArg()._opt);
22+
print(new OptionalArg.named()._opt);
1523
}

0 commit comments

Comments
 (0)