| // 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; |
| |
| Extension1(n1)?.nullable1; |
| Extension1(n1)?.nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1Method(); |
| |
| Extension1(n1)?.nonNullable1.nullable1; |
| Extension1(n1)?.nullable1?.nullable1; |
| Extension1(n1)?.nonNullable1.nullable1?.nullable1; |
| Extension1(n1)?.nonNullable1.nullable1 = new Class1(); |
| Extension1(n1)?.nullable1?.nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1.nullable1?.nullable1 = new Class1(); |
| (Extension1(n1)?.nullable1)?.nullable1; |
| throws(() => (Extension1(n1)?.nullable1 = new Class1()).nullable1); |
| throws(() => (Extension1(n1)?.nonNullable1Method()).nullable1); |
| nullable1 = Extension1(n1)?.nonNullable1.nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nullable1?.nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nonNullable1.nullable1?.nullable1 = new Class1(); |
| Extension1(n1)?.nullable1?.nonNullable1Method(); |
| Extension1(n1)?.nullable1 = new Class1().nullable1; |
| nullable1 = Extension1(n1)?.nullable1 = new Class1().nullable1; |
| Extension1(n1)?.nullable1 = new Class1().nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nullable1 = new Class1().nullable1 = new Class1(); |
| Extension1(n1)?.nullable1 = new Class1().nonNullable1Method(); |
| nullable1 = Extension1(n1)?.nullable1 = new Class1().nonNullable1Method(); |
| Extension1(n1)?.nonNullable1Method().nullable1; |
| Extension1(n1)?.nonNullable1Method().nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1Method().nonNullable1Method(); |
| |
| Extension1(n1)?.nonNullable1.nonNullable1.nullable1; |
| Extension1(n1)?.nonNullable1.nonNullable1.nullable1 = new Class1(); |
| nullable1 = |
| Extension1(n1)?.nonNullable1.nonNullable1.nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1.nullable1?.nonNullable1Method(); |
| Extension1(n1)?.nullable1 = new Class1().nonNullable1.nullable1; |
| nullable1 = Extension1(n1)?.nullable1 = new Class1().nonNullable1.nullable1; |
| Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1.nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1.nullable1 = new Class1(); |
| Extension1(n1)?.nullable1 = new Class1().nonNullable1.nonNullable1Method(); |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1.nonNullable1Method(); |
| Extension1(n1)?.nonNullable1Method().nonNullable1.nullable1; |
| Extension1(n1)?.nonNullable1Method().nonNullable1.nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1Method().nonNullable1.nonNullable1Method(); |
| |
| Extension1(n1)?.nonNullable1.nullable1 = new Class1().nullable1; |
| nullable1 = Extension1(n1)?.nonNullable1.nullable1 = new Class1().nullable1; |
| Extension1(n1)?.nonNullable1.nullable1 = |
| new Class1().nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nonNullable1.nullable1 = |
| new Class1().nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1.nullable1 = new Class1().nonNullable1Method(); |
| nullable1 = Extension1(n1)?.nonNullable1.nullable1 = |
| new Class1().nonNullable1Method(); |
| Extension1(n1)?.nullable1 = new Class1().nullable1 = new Class1().nullable1; |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nullable1 = new Class1().nullable1; |
| Extension1(n1)?.nullable1 = |
| new Class1().nullable1 = new Class1().nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nullable1 = new Class1().nullable1 = new Class1(); |
| Extension1(n1)?.nullable1 = |
| new Class1().nullable1 = new Class1().nonNullable1Method(); |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nullable1 = new Class1().nonNullable1Method(); |
| Extension1(n1)?.nonNullable1Method().nullable1 = new Class1().nullable1; |
| nullable1 = |
| Extension1(n1)?.nonNullable1Method().nullable1 = new Class1().nullable1; |
| Extension1(n1)?.nonNullable1Method().nullable1 = |
| new Class1().nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nonNullable1Method().nullable1 = |
| new Class1().nullable1 = new Class1(); |
| Extension1(n1)?.nonNullable1Method().nullable1 = |
| new Class1().nonNullable1Method(); |
| nullable1 = Extension1(n1)?.nonNullable1Method().nullable1 = |
| new Class1().nonNullable1Method(); |
| |
| Extension1(n1)?.nonNullable1.nonNullable1Method().nullable1; |
| Extension1(n1)?.nonNullable1.nonNullable1Method().nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nonNullable1.nonNullable1Method().nullable1 = |
| new Class1(); |
| Extension1(n1)?.nonNullable1.nonNullable1Method().nonNullable1Method(); |
| Extension1(n1)?.nullable1 = new Class1().nonNullable1Method().nullable1; |
| nullable1 = |
| Extension1(n1)?.nullable1 = new Class1().nonNullable1Method().nullable1; |
| Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1Method().nullable1 = new Class1(); |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1Method().nullable1 = new Class1(); |
| Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1Method().nonNullable1Method(); |
| nullable1 = Extension1(n1)?.nullable1 = |
| new Class1().nonNullable1Method().nonNullable1Method(); |
| Extension1(n1)?.nonNullable1Method().nonNullable1Method().nullable1; |
| Extension1(n1)?.nonNullable1Method().nonNullable1Method().nullable1 = |
| new Class1(); |
| Extension1(n1) |
| ?.nonNullable1Method() |
| .nonNullable1Method() |
| .nonNullable1Method(); |
| |
| Extension1(n1)?.nonNullable1Method()?.nonNullable1Method(); |
| } |
| |
| void indexAccess(Class1? n1, Class2? n2, Class3? n3) { |
| Class1? nullable1 = n1; |
| Class2? nullable2 = n2; |
| Class3? nullable3 = n3; |
| |
| Extension1(n1)?[nullable1]; |
| Extension1(n1)?[nullable1] = new Class1(); |
| Extension1(n1)?[nullable1]?.nonNullable1Method(); |
| Extension1(n1)?.nonNullable1[nullable1]; |
| Extension1(n1)?.nonNullable1[nullable1] = new Class1(); |
| nullable1 = Extension1(n1)?.nonNullable1[nullable1] = new Class1(); |
| Extension1(n1)?.nonNullable1[nullable1]?.nonNullable1Method(); |
| Extension1(n1)?.nonNullable2[nullable2] += 0; |
| nullable2 = Extension1(n1)?.nonNullable2[nullable2] += 0; |
| Extension1(n1)?[nullable1] ??= nullable1; |
| nullable1 = Extension1(n1)?[nullable1] ??= nullable1; |
| Extension2(n2)?[nullable2] += 0; |
| nullable2 = Extension2(n2)?[nullable2] += 0; |
| Extension2(n2)?[nullable2] += 0; |
| nullable2 = Extension2(n2)?[nullable2] += 0; |
| Extension2(n2)?[nullable2]++; |
| nullable2 = Extension2(n2)?[nullable2]++; |
| ++Extension2(n2)?[nullable2]; |
| nullable2 = ++Extension2(n2)?[nullable2]; |
| Extension1(n1)?.nonNullable2[nullable2]++; |
| nullable2 = Extension1(n1)?.nonNullable2[nullable2]++; |
| ++Extension1(n1)?.nonNullable2[nullable2]; |
| nullable2 = ++Extension1(n1)?.nonNullable2[nullable2]; |
| |
| Extension1(n1)?.nonNullable2[nullable2][nullable2]; |
| Extension1(n1)?.nonNullable2[nullable2][nullable2] = new Class2(); |
| nullable2 = Extension1(n1)?.nonNullable2[nullable2][nullable2] = new Class2(); |
| Extension1(n1)?.nonNullable2[nullable2][nullable2]?.nonNullable2Method(); |
| Extension1(n1)?.nonNullable2[nullable2][nullable2] += 0; |
| nullable2 = Extension1(n1)?.nonNullable2[nullable2][nullable2] += 0; |
| Extension1(n1)?.nonNullable2[nullable2][nullable2]++; |
| nullable2 = Extension1(n1)?.nonNullable2[nullable2][nullable2]++; |
| ++Extension1(n1)?.nonNullable2[nullable2][nullable2]; |
| nullable2 = ++Extension1(n1)?.nonNullable2[nullable2][nullable2]; |
| |
| Extension1(n1)?[nullable1]?[nullable1]; |
| Extension1(n1)?[nullable1]?[nullable1] = new Class1(); |
| nullable1 = Extension1(n1)?[nullable1]?[nullable1] = new Class1(); |
| Extension1(n1)?[nullable1]?[nullable1]?.nonNullable1Method(); |
| nullable1 = Extension1(n1)?[nullable1]?[nullable1]?.nonNullable1Method(); |
| Extension1(n1)?[nullable1]?[nullable1] ??= nullable1; |
| nullable1 = Extension1(n1)?[nullable1]?[nullable1] ??= nullable1; |
| Extension3(n3)?[nullable3]?[nullable2] += 0; |
| nullable2 = Extension3(n3)?[nullable3]?[nullable2] += 0; |
| Extension3(n3)?[nullable3]?[nullable2]++; |
| nullable2 = Extension3(n3)?[nullable3]?[nullable2]++; |
| ++Extension3(n3)?[nullable3]?[nullable2]; |
| nullable2 = ++Extension3(n3)?[nullable3]?[nullable2]; |
| } |
| |
| void operatorAccess(Class1? n1, Class2? n2) { |
| Class2? nullable2 = n2; |
| |
| throws(() => Extension1(n1)?.nonNullable1 + 0); |
| throws(() => -Extension1(n1)?.nonNullable1); |
| Extension2(n2)?.nonNullable2 += 0; |
| nullable2 = Extension2(n2)?.nonNullable2 += 0; |
| Extension2(n2)?.nonNullable2.nonNullable2 += 0; |
| nullable2 = Extension2(n2)?.nonNullable2.nonNullable2 += 0; |
| Extension2(n2)?.nonNullable2++; |
| nullable2 = Extension2(n2)?.nonNullable2++; |
| ++Extension2(n2)?.nonNullable2; |
| nullable2 = ++Extension2(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.'; |
| } |