blob: 1d11f2d2ae33c3eb29846b5f40ee2d6c8f1507aa [file] [log] [blame]
// 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.
class Class1 {
Class1? get property => null;
void set property(Class1? value) {}
Class1 get property1 => new Class1();
Class2 get property2 => new Class2();
}
extension Extension1 on Class1 {
Class1? get nullable1 => property1;
void set nullable1(Class1? value) {
property = value;
}
Class1 nonNullable1Method() => nonNullable1;
Class1? operator [](Class1? key) => nullable1;
void operator []=(Class1? key, Class1? value) {
property = value;
}
Class1? operator +(int value) => nullable1;
Class1? operator -() => nullable1;
Class1 get nonNullable1 => property1;
Class2 get nonNullable2 => property2;
}
class Class2 {
Class2 get property => this;
void set property(Class2 value) {}
}
extension Extension2 on Class2 {
Class2 nonNullable2Method() => nonNullable2;
Class2 operator [](Class2? key) => property;
void operator []=(Class2? key, Class2? value) => property;
Class2 operator +(int value) => property;
Class2 operator -() => property;
Class2 get nonNullable2 => property;
void set nonNullable2(Class2 value) {
property = value;
}
}
class Class3 {
Class2? get property => null;
}
extension Extension3 on Class3 {
Class2? operator [](Class3? key) => property;
}
main() {
propertyAccess(null);
indexAccess(null, null, null);
operatorAccess(null, null);
ifNull(null);
}
void propertyAccess(Class1? n1) {
Class1? nullable1 = n1;
n1?.nullable1;
n1?.nullable1 = new Class1();
nullable1 = n1?.nullable1 = new Class1();
n1?.nonNullable1Method();
n1?.nonNullable1.nullable1;
n1?.nullable1?.nullable1;
n1?.nonNullable1.nullable1?.nullable1;
n1?.nonNullable1.nullable1 = new Class1();
n1?.nullable1?.nullable1 = new Class1();
n1?.nonNullable1.nullable1?.nullable1 = new Class1();
(n1?.nullable1)?.nullable1;
throws(() => (n1?.nullable1 = new Class1()).nullable1);
throws(() => (n1?.nonNullable1Method()).nullable1);
nullable1 = n1?.nonNullable1.nullable1 = new Class1();
nullable1 = n1?.nullable1?.nullable1 = new Class1();
nullable1 = n1?.nonNullable1.nullable1?.nullable1 = new Class1();
n1?.nullable1?.nonNullable1Method();
n1?.nullable1 = new Class1().nullable1;
nullable1 = n1?.nullable1 = new Class1().nullable1;
n1?.nullable1 = new Class1().nullable1 = new Class1();
nullable1 = n1?.nullable1 = new Class1().nullable1 = new Class1();
n1?.nullable1 = new Class1().nonNullable1Method();
nullable1 = n1?.nullable1 = new Class1().nonNullable1Method();
n1?.nonNullable1Method().nullable1;
n1?.nonNullable1Method().nullable1 = new Class1();
n1?.nonNullable1Method().nonNullable1Method();
n1?.nonNullable1.nonNullable1.nullable1;
n1?.nonNullable1.nonNullable1.nullable1 = new Class1();
nullable1 = n1?.nonNullable1.nonNullable1.nullable1 = new Class1();
n1?.nonNullable1.nullable1?.nonNullable1Method();
n1?.nullable1 = new Class1().nonNullable1.nullable1;
nullable1 = n1?.nullable1 = new Class1().nonNullable1.nullable1;
n1?.nullable1 = new Class1().nonNullable1.nullable1 = new Class1();
nullable1 =
n1?.nullable1 = new Class1().nonNullable1.nullable1 = new Class1();
n1?.nullable1 = new Class1().nonNullable1.nonNullable1Method();
nullable1 = n1?.nullable1 = new Class1().nonNullable1.nonNullable1Method();
n1?.nonNullable1Method().nonNullable1.nullable1;
n1?.nonNullable1Method().nonNullable1.nullable1 = new Class1();
n1?.nonNullable1Method().nonNullable1.nonNullable1Method();
n1?.nonNullable1.nullable1 = new Class1().nullable1;
nullable1 = n1?.nonNullable1.nullable1 = new Class1().nullable1;
n1?.nonNullable1.nullable1 = new Class1().nullable1 = new Class1();
nullable1 =
n1?.nonNullable1.nullable1 = new Class1().nullable1 = new Class1();
n1?.nonNullable1.nullable1 = new Class1().nonNullable1Method();
nullable1 = n1?.nonNullable1.nullable1 = new Class1().nonNullable1Method();
n1?.nullable1 = new Class1().nullable1 = new Class1().nullable1;
nullable1 = n1?.nullable1 = new Class1().nullable1 = new Class1().nullable1;
n1?.nullable1 =
new Class1().nullable1 = new Class1().nullable1 = new Class1();
nullable1 = n1?.nullable1 =
new Class1().nullable1 = new Class1().nullable1 = new Class1();
n1?.nullable1 = new Class1().nullable1 = new Class1().nonNullable1Method();
nullable1 = n1?.nullable1 =
new Class1().nullable1 = new Class1().nonNullable1Method();
n1?.nonNullable1Method().nullable1 = new Class1().nullable1;
nullable1 = n1?.nonNullable1Method().nullable1 = new Class1().nullable1;
n1?.nonNullable1Method().nullable1 = new Class1().nullable1 = new Class1();
nullable1 = n1?.nonNullable1Method().nullable1 =
new Class1().nullable1 = new Class1();
n1?.nonNullable1Method().nullable1 = new Class1().nonNullable1Method();
nullable1 =
n1?.nonNullable1Method().nullable1 = new Class1().nonNullable1Method();
n1?.nonNullable1.nonNullable1Method().nullable1;
n1?.nonNullable1.nonNullable1Method().nullable1 = new Class1();
nullable1 = n1?.nonNullable1.nonNullable1Method().nullable1 = new Class1();
n1?.nonNullable1.nonNullable1Method().nonNullable1Method();
n1?.nullable1 = new Class1().nonNullable1Method().nullable1;
nullable1 = n1?.nullable1 = new Class1().nonNullable1Method().nullable1;
n1?.nullable1 = new Class1().nonNullable1Method().nullable1 = new Class1();
nullable1 = n1?.nullable1 =
new Class1().nonNullable1Method().nullable1 = new Class1();
n1?.nullable1 = new Class1().nonNullable1Method().nonNullable1Method();
nullable1 =
n1?.nullable1 = new Class1().nonNullable1Method().nonNullable1Method();
n1?.nonNullable1Method().nonNullable1Method().nullable1;
n1?.nonNullable1Method().nonNullable1Method().nullable1 = new Class1();
n1?.nonNullable1Method().nonNullable1Method().nonNullable1Method();
n1?.nonNullable1Method()?.nonNullable1Method();
}
void indexAccess(Class1? n1, Class2? n2, Class3? n3) {
Class1? nullable1 = n1;
Class2? nullable2 = n2;
Class3? nullable3 = n3;
n1?[nullable1];
n1?[nullable1] = new Class1();
n1?[nullable1]?.nonNullable1Method();
n1?.nonNullable1[nullable1];
n1?.nonNullable1[nullable1] = new Class1();
nullable1 = n1?.nonNullable1[nullable1] = new Class1();
n1?.nonNullable1[nullable1]?.nonNullable1Method();
n1?.nonNullable2[nullable2] += 0;
nullable2 = n1?.nonNullable2[nullable2] += 0;
n1?[nullable1] ??= nullable1;
nullable1 = n1?[nullable1] ??= nullable1;
n2?[nullable2] += 0;
nullable2 = n2?[nullable2] += 0;
n2?[nullable2] += 0;
nullable2 = n2?[nullable2] += 0;
n2?[nullable2]++;
nullable2 = n2?[nullable2]++;
++n2?[nullable2];
nullable2 = ++n2?[nullable2];
n1?.nonNullable2[nullable2]++;
nullable2 = n1?.nonNullable2[nullable2]++;
++n1?.nonNullable2[nullable2];
nullable2 = ++n1?.nonNullable2[nullable2];
n1?.nonNullable2[nullable2][nullable2];
n1?.nonNullable2[nullable2][nullable2] = new Class2();
nullable2 = n1?.nonNullable2[nullable2][nullable2] = new Class2();
n1?.nonNullable2[nullable2][nullable2]?.nonNullable2Method();
n1?.nonNullable2[nullable2][nullable2] += 0;
nullable2 = n1?.nonNullable2[nullable2][nullable2] += 0;
n1?.nonNullable2[nullable2][nullable2]++;
nullable2 = n1?.nonNullable2[nullable2][nullable2]++;
++n1?.nonNullable2[nullable2][nullable2];
nullable2 = ++n1?.nonNullable2[nullable2][nullable2];
n1?[nullable1]?[nullable1];
n1?[nullable1]?[nullable1] = new Class1();
nullable1 = n1?[nullable1]?[nullable1] = new Class1();
n1?[nullable1]?[nullable1]?.nonNullable1Method();
nullable1 = n1?[nullable1]?[nullable1]?.nonNullable1Method();
n1?[nullable1]?[nullable1] ??= nullable1;
nullable1 = n1?[nullable1]?[nullable1] ??= nullable1;
n3?[nullable3]?[nullable2] += 0;
nullable2 = n3?[nullable3]?[nullable2] += 0;
n3?[nullable3]?[nullable2]++;
nullable2 = n3?[nullable3]?[nullable2]++;
++n3?[nullable3]?[nullable2];
nullable2 = ++n3?[nullable3]?[nullable2];
}
void operatorAccess(Class1? n1, Class2? n2) {
Class2? nullable2 = n2;
throws(() => n1?.nonNullable1 + 0);
throws(() => -n1?.nonNullable1);
n2?.nonNullable2 += 0;
nullable2 = n2?.nonNullable2 += 0;
n2?.nonNullable2.nonNullable2 += 0;
nullable2 = n2?.nonNullable2.nonNullable2 += 0;
n2?.nonNullable2++;
nullable2 = n2?.nonNullable2++;
++n2?.nonNullable2;
nullable2 = ++n2?.nonNullable2;
}
void ifNull(Class1? n1) {
Class1? nullable1 = n1;
n1?.nullable1 ??= n1;
n1 = n1?.nullable1 ??= n1;
n1?.nonNullable1.nullable1 ??= n1;
n1 = n1?.nonNullable1.nullable1 ??= n1;
n1?.nonNullable1[n1] ??= n1;
n1 = n1?.nonNullable1[n1] ??= n1;
}
void throws(void Function() f) {
try {
f();
} catch (_) {
return;
}
throw 'Expected exception.';
}