6cc9efe290
Change-Id: I94dfcea40566190c6bf153c108b0d0d5dbf27a4d Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/400148 Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: Lasse Nielsen <lrn@google.com> Auto-Submit: Bob Nystrom <rnystrom@google.com>
219 lines
5.3 KiB
Dart
219 lines
5.3 KiB
Dart
// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
/// Tests for how variables and scoping work with for elements.
|
|
import 'package:expect/expect.dart';
|
|
|
|
import 'utils.dart';
|
|
|
|
String global = "global";
|
|
|
|
void main() {
|
|
testClosure();
|
|
Test().shadowing();
|
|
Test().reuseVariable();
|
|
}
|
|
|
|
void testClosure() {
|
|
var closures = [];
|
|
capture(callback) {
|
|
closures.add(callback);
|
|
return callback();
|
|
}
|
|
|
|
reset() {
|
|
closures.clear();
|
|
}
|
|
|
|
// Close over for-in loop variable in element.
|
|
var list = [
|
|
for (var i in [0, 1]) () => i,
|
|
];
|
|
Expect.equals(0, list[0]());
|
|
Expect.equals(1, list[1]());
|
|
|
|
// Close over loop variable in element.
|
|
list = [for (var i = 0; i < 2; i++) () => i];
|
|
Expect.equals(0, list[0]());
|
|
Expect.equals(1, list[1]());
|
|
|
|
// Close over variable in condition expression.
|
|
var list2 = [for (var i = 0; capture(() => i++) < 2;) i];
|
|
Expect.equals(1, closures[0]());
|
|
Expect.equals(2, closures[1]());
|
|
Expect.listEquals([1, 2], list2);
|
|
reset();
|
|
|
|
// Close over variable in increment expression.
|
|
var list3 = [for (var i = 0; i < 2; capture(() => i++)) i];
|
|
Expect.equals(1, closures[0]());
|
|
Expect.equals(2, closures[1]());
|
|
Expect.listEquals([0, 1], list3);
|
|
reset();
|
|
}
|
|
|
|
class TestBase {
|
|
String inherited = "inherited";
|
|
}
|
|
|
|
class Test extends TestBase {
|
|
static String staticField = "static field";
|
|
|
|
String field = "field";
|
|
|
|
void shadowing() {
|
|
var local = "local";
|
|
|
|
// C-style for.
|
|
var list = [
|
|
for (String? global = "for"; global != null; global = null) global,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (String? staticField = "for"; staticField != null; staticField = null)
|
|
staticField,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [for (String? field = "for"; field != null; field = null) field];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (String? inherited = "for"; inherited != null; inherited = null)
|
|
inherited,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [for (String? local = "for"; local != null; local = null) local];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (String? outer = "outer"; outer != null; outer = null)
|
|
for (String? outer = "for"; outer != null; outer = null) outer,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
// For-in.
|
|
list = [
|
|
for (var global in ["for"]) global,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (var staticField in ["for"]) staticField,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (var field in ["for"]) field,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (var inherited in ["for"]) inherited,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (var local in ["for"]) local,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
|
|
list = [
|
|
for (var outer in ["outer"])
|
|
for (var outer in ["for"]) outer,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
}
|
|
|
|
void reuseVariable() {
|
|
var local = "local";
|
|
|
|
// C-style for.
|
|
var list = [for (global = "for"; global == "for"; global = "after") global];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("after", global);
|
|
global = "global";
|
|
|
|
list = [
|
|
for (staticField = "for"; staticField == "for"; staticField = "after")
|
|
staticField,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("after", staticField);
|
|
staticField = "staticField";
|
|
|
|
list = [for (field = "for"; field == "for"; field = "after") field];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("after", field);
|
|
field = "field";
|
|
|
|
list = [
|
|
for (inherited = "for"; inherited == "for"; inherited = "after")
|
|
inherited,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("after", inherited);
|
|
inherited = "inherited";
|
|
|
|
list = [for (local = "for"; local == "for"; local = "after") local];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("after", local);
|
|
local = "local";
|
|
|
|
list = [
|
|
for (var outer = "outer"; outer == "outer"; outer = "outer after") ...[
|
|
for (outer = "for"; outer == "for"; outer = "after") outer,
|
|
outer,
|
|
],
|
|
];
|
|
Expect.listEquals(["for", "after"], list);
|
|
|
|
// For-in.
|
|
list = [
|
|
for (global in ["for"]) global,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("for", global);
|
|
global = "global";
|
|
|
|
list = [
|
|
for (staticField in ["for"]) staticField,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("for", staticField);
|
|
staticField = "staticField";
|
|
|
|
list = [
|
|
for (field in ["for"]) field,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("for", field);
|
|
field = "field";
|
|
|
|
list = [
|
|
for (inherited in ["for"]) inherited,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("for", inherited);
|
|
inherited = "inherited";
|
|
|
|
list = [
|
|
for (local in ["for"]) local,
|
|
];
|
|
Expect.listEquals(["for"], list);
|
|
Expect.equals("for", local);
|
|
local = "local";
|
|
|
|
list = [
|
|
for (var outer in ["outer"]) ...[
|
|
for (outer in ["for"]) outer,
|
|
outer,
|
|
],
|
|
];
|
|
Expect.listEquals(["for", "for"], list);
|
|
}
|
|
}
|