| Index: packages/analyzer/test/generated/non_error_resolver_test.dart
|
| diff --git a/packages/analyzer/test/generated/non_error_resolver_test.dart b/packages/analyzer/test/generated/non_error_resolver_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dedbb2a4523b6d8b4e898bf233d50e15913ac329
|
| --- /dev/null
|
| +++ b/packages/analyzer/test/generated/non_error_resolver_test.dart
|
| @@ -0,0 +1,5763 @@
|
| +// Copyright (c) 2014, 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.
|
| +
|
| +library engine.non_error_resolver_test;
|
| +
|
| +import 'package:analyzer/src/generated/ast.dart';
|
| +import 'package:analyzer/src/generated/element.dart';
|
| +import 'package:analyzer/src/generated/engine.dart';
|
| +import 'package:analyzer/src/generated/error.dart';
|
| +import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
|
| +import 'package:analyzer/src/generated/source_io.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +import '../reflective_tests.dart';
|
| +import '../utils.dart';
|
| +import 'resolver_test.dart';
|
| +import 'test_support.dart';
|
| +
|
| +main() {
|
| + initializeTestEnvironment();
|
| + runReflectiveTests(NonErrorResolverTest);
|
| +}
|
| +
|
| +@reflectiveTest
|
| +class NonErrorResolverTest extends ResolverTestCase {
|
| + void fail_undefinedEnumConstant() {
|
| + Source source = addSource(r'''
|
| +enum E { ONE }
|
| +E e() {
|
| + return E.TWO;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_ambiguousExport() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart';
|
| +export 'lib2.dart';''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library lib1;
|
| +class M {}''');
|
| + addNamedSource(
|
| + "/lib2.dart",
|
| + r'''
|
| +library lib2;
|
| +class N {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_ambiguousExport_combinators_hide() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart';
|
| +export 'lib2.dart' hide B;''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library L1;
|
| +class A {}
|
| +class B {}''');
|
| + addNamedSource(
|
| + "/lib2.dart",
|
| + r'''
|
| +library L2;
|
| +class B {}
|
| +class C {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_ambiguousExport_combinators_show() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart';
|
| +export 'lib2.dart' show C;''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library L1;
|
| +class A {}
|
| +class B {}''');
|
| + addNamedSource(
|
| + "/lib2.dart",
|
| + r'''
|
| +library L2;
|
| +class B {}
|
| +class C {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_ambiguousExport_sameDeclaration() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib.dart';
|
| +export 'lib.dart';''');
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +class N {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_ambiguousImport_hideCombinator() {
|
| + Source source = addSource(r'''
|
| +import 'lib1.dart';
|
| +import 'lib2.dart';
|
| +import 'lib3.dart' hide N;
|
| +main() {
|
| + new N1();
|
| + new N2();
|
| + new N3();
|
| +}''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library lib1;
|
| +class N {}
|
| +class N1 {}''');
|
| + addNamedSource(
|
| + "/lib2.dart",
|
| + r'''
|
| +library lib2;
|
| +class N {}
|
| +class N2 {}''');
|
| + addNamedSource(
|
| + "/lib3.dart",
|
| + r'''
|
| +library lib3;
|
| +class N {}
|
| +class N3 {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_ambiguousImport_showCombinator() {
|
| + Source source = addSource(r'''
|
| +import 'lib1.dart';
|
| +import 'lib2.dart' show N, N2;
|
| +main() {
|
| + new N1();
|
| + new N2();
|
| +}''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library lib1;
|
| +class N {}
|
| +class N1 {}''');
|
| + addNamedSource(
|
| + "/lib2.dart",
|
| + r'''
|
| +library lib2;
|
| +class N {}
|
| +class N2 {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_classWithCall_Function() {
|
| + Source source = addSource(r'''
|
| + caller(Function callee) {
|
| + callee();
|
| + }
|
| +
|
| + class CallMeBack {
|
| + call() => 0;
|
| + }
|
| +
|
| + main() {
|
| + caller(new CallMeBack());
|
| + }''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_fieldFormalParameterElement_member() {
|
| + Source source = addSource(r'''
|
| +class ObjectSink<T> {
|
| + void sink(T object) {
|
| + new TimestampedObject<T>(object);
|
| + }
|
| +}
|
| +class TimestampedObject<E> {
|
| + E object2;
|
| + TimestampedObject(this.object2);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_invocation_functionParameter_generic() {
|
| + Source source = addSource(r'''
|
| +class A<K> {
|
| + m(f(K k), K v) {
|
| + f(v);
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_invocation_typedef_generic() {
|
| + Source source = addSource(r'''
|
| +typedef A<T>(T p);
|
| +f(A<int> a) {
|
| + a(1);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_Object_Function() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + process(() {});
|
| +}
|
| +process(Object x) {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_typedef_local() {
|
| + Source source = addSource(r'''
|
| +typedef A(int p1, String p2);
|
| +A getA() => null;
|
| +f() {
|
| + A a = getA();
|
| + a(1, '2');
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_argumentTypeNotAssignable_typedef_parameter() {
|
| + Source source = addSource(r'''
|
| +typedef A(int p1, String p2);
|
| +f(A a) {
|
| + a(1, '2');
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_assignability_function_expr_rettype_from_typedef_cls() {
|
| + // In the code below, the type of (() => f()) has a return type which is
|
| + // a class, and that class is inferred from the return type of the typedef
|
| + // F.
|
| + Source source = addSource('''
|
| +class C {}
|
| +typedef C F();
|
| +F f;
|
| +main() {
|
| + F f2 = (() => f());
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_assignability_function_expr_rettype_from_typedef_typedef() {
|
| + // In the code below, the type of (() => f()) has a return type which is
|
| + // a typedef, and that typedef is inferred from the return type of the
|
| + // typedef F.
|
| + Source source = addSource('''
|
| +typedef G F();
|
| +typedef G();
|
| +F f;
|
| +main() {
|
| + F f2 = (() => f());
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_assignmentToFinal_prefixNegate() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + final x = 0;
|
| + -x;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_assignmentToFinalNoSetter_prefixedIdentifier() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int get x => 0;
|
| + set x(v) {}
|
| +}
|
| +main() {
|
| + A a = new A();
|
| + a.x = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_assignmentToFinalNoSetter_propertyAccess() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int get x => 0;
|
| + set x(v) {}
|
| +}
|
| +class B {
|
| + static A a;
|
| +}
|
| +main() {
|
| + B.a.x = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_assignmentToFinals_importWithPrefix() {
|
| + Source source = addSource(r'''
|
| +library lib;
|
| +import 'lib1.dart' as foo;
|
| +main() {
|
| + foo.x = true;
|
| +}''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library lib1;
|
| +bool x = false;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_dynamic_with_return() {
|
| + Source source = addSource('''
|
| +dynamic f() async {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_dynamic_with_return_value() {
|
| + Source source = addSource('''
|
| +dynamic f() async {
|
| + return 5;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_dynamic_without_return() {
|
| + Source source = addSource('''
|
| +dynamic f() async {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_expression_function_type() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +typedef Future<int> F(int i);
|
| +main() {
|
| + F f = (int i) async => i;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_flattened() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +typedef Future<int> CreatesFutureInt();
|
| +main() {
|
| + CreatesFutureInt createFutureInt = () async => f();
|
| + Future<int> futureInt = createFutureInt();
|
| + futureInt.then((int i) => print(i));
|
| +}
|
| +Future<int> f() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_dynamic_with_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<dynamic> f() async {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_dynamic_with_return_value() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<dynamic> f() async {
|
| + return 5;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_dynamic_without_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<dynamic> f() async {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_int_with_return_future_int() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<int> f() async {
|
| + return new Future<int>.value(5);
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_int_with_return_value() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<int> f() async {
|
| + return 5;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_null_with_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<Null> f() async {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_null_without_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<Null> f() async {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_object_with_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<Object> f() async {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_object_with_return_value() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<Object> f() async {
|
| + return 5;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_object_without_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<Object> f() async {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_with_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future f() async {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_with_return_value() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future f() async {
|
| + return 5;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_future_without_return() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future f() async {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_return_flattens_futures() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<int> f() async {
|
| + return g();
|
| +}
|
| +Future<Future<int>> g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_with_return() {
|
| + Source source = addSource('''
|
| +f() async {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_with_return_value() {
|
| + Source source = addSource('''
|
| +f() async {
|
| + return 5;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_async_without_return() {
|
| + Source source = addSource('''
|
| +f() async {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_asyncForInWrongContext_async() {
|
| + Source source = addSource(r'''
|
| +f(list) async {
|
| + await for (var e in list) {
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_asyncForInWrongContext_asyncStar() {
|
| + Source source = addSource(r'''
|
| +f(list) async* {
|
| + await for (var e in list) {
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_await_flattened() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<Future<int>> ffi() => null;
|
| +f() async {
|
| + int b = await ffi();
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_await_simple() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Future<int> fi() => null;
|
| +f() async {
|
| + int a = await fi();
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_awaitInWrongContext_async() {
|
| + Source source = addSource(r'''
|
| +f(x, y) async {
|
| + return await x + await y;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_awaitInWrongContext_asyncStar() {
|
| + Source source = addSource(r'''
|
| +f(x, y) async* {
|
| + yield await x + await y;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_breakWithoutLabelInSwitch() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + void m(int i) {
|
| + switch (i) {
|
| + case 0:
|
| + break;
|
| + }
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_builtInIdentifierAsType_dynamic() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + dynamic x;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_caseBlockNotTerminated() {
|
| + Source source = addSource(r'''
|
| +f(int p) {
|
| + for (int i = 0; i < 10; i++) {
|
| + switch (p) {
|
| + case 0:
|
| + break;
|
| + case 1:
|
| + continue;
|
| + case 2:
|
| + return;
|
| + case 3:
|
| + throw new Object();
|
| + case 4:
|
| + case 5:
|
| + return;
|
| + case 6:
|
| + default:
|
| + return;
|
| + }
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_caseBlockNotTerminated_lastCase() {
|
| + Source source = addSource(r'''
|
| +f(int p) {
|
| + switch (p) {
|
| + case 0:
|
| + p = p + 1;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_caseExpressionTypeImplementsEquals() {
|
| + Source source = addSource(r'''
|
| +print(p) {}
|
| +
|
| +abstract class B {
|
| + final id;
|
| + const B(this.id);
|
| + String toString() => 'C($id)';
|
| + /** Equality is identity equality, the id isn't used. */
|
| + bool operator==(Object other);
|
| + }
|
| +
|
| +class C extends B {
|
| + const C(id) : super(id);
|
| +}
|
| +
|
| +void doSwitch(c) {
|
| + switch (c) {
|
| + case const C(0): print('Switch: 0'); break;
|
| + case const C(1): print('Switch: 1'); break;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_caseExpressionTypeImplementsEquals_int() {
|
| + Source source = addSource(r'''
|
| +f(int i) {
|
| + switch(i) {
|
| + case(1) : return 1;
|
| + default: return 0;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_caseExpressionTypeImplementsEquals_Object() {
|
| + Source source = addSource(r'''
|
| +class IntWrapper {
|
| + final int value;
|
| + const IntWrapper(this.value);
|
| +}
|
| +
|
| +f(IntWrapper intWrapper) {
|
| + switch(intWrapper) {
|
| + case(const IntWrapper(1)) : return 1;
|
| + default: return 0;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_caseExpressionTypeImplementsEquals_String() {
|
| + Source source = addSource(r'''
|
| +f(String s) {
|
| + switch(s) {
|
| + case('1') : return 1;
|
| + default: return 0;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_commentReference_beforeConstructor() {
|
| + String code = r'''
|
| +abstract class A {
|
| + /// [p]
|
| + A(int p) {}
|
| +}''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "p]", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf((obj) => obj is ParameterElement,
|
| + ParameterElement, ref.staticElement);
|
| + }
|
| + }
|
| +
|
| + void test_commentReference_beforeEnum() {
|
| + String code = r'''
|
| +/// This is the [Samurai] kind.
|
| +enum Samurai {
|
| + /// Use [int].
|
| + WITH_SWORD,
|
| + /// Like [WITH_SWORD], but only without one.
|
| + WITHOUT_SWORD
|
| +}''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "Samurai]", (node) => node is SimpleIdentifier);
|
| + ClassElement refElement = ref.staticElement;
|
| + expect(refElement, isNotNull);
|
| + expect(refElement.name, 'Samurai');
|
| + }
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "int]", (node) => node is SimpleIdentifier);
|
| + ClassElement refElement = ref.staticElement;
|
| + expect(refElement, isNotNull);
|
| + expect(refElement.name, 'int');
|
| + }
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "WITH_SWORD]", (node) => node is SimpleIdentifier);
|
| + PropertyAccessorElement refElement = ref.staticElement;
|
| + expect(refElement, isNotNull);
|
| + expect(refElement.name, 'WITH_SWORD');
|
| + }
|
| + }
|
| +
|
| + void test_commentReference_beforeFunction_blockBody() {
|
| + String code = r'''
|
| +/// [p]
|
| +foo(int p) {
|
| +}''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "p]", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf(
|
| + (obj) => obj is ParameterElement, ParameterElement, ref.staticElement);
|
| + }
|
| +
|
| + void test_commentReference_beforeFunction_expressionBody() {
|
| + String code = r'''
|
| +/// [p]
|
| +foo(int p) => null;''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "p]", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf(
|
| + (obj) => obj is ParameterElement, ParameterElement, ref.staticElement);
|
| + }
|
| +
|
| + void test_commentReference_beforeMethod() {
|
| + String code = r'''
|
| +abstract class A {
|
| + /// [p1]
|
| + ma(int p1) {}
|
| + /// [p2]
|
| + mb(int p2);
|
| +}''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "p1]", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf((obj) => obj is ParameterElement,
|
| + ParameterElement, ref.staticElement);
|
| + }
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "p2]", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf((obj) => obj is ParameterElement,
|
| + ParameterElement, ref.staticElement);
|
| + }
|
| + }
|
| +
|
| + void test_commentReference_class() {
|
| + String code = r'''
|
| +/// [foo]
|
| +class A {
|
| + foo() {}
|
| +}''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "foo]", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf(
|
| + (obj) => obj is MethodElement, MethodElement, ref.staticElement);
|
| + }
|
| +
|
| + void test_commentReference_setter() {
|
| + String code = r'''
|
| +class A {
|
| + /// [x] in A
|
| + mA() {}
|
| + set x(value) {}
|
| +}
|
| +class B extends A {
|
| + /// [x] in B
|
| + mB() {}
|
| +}
|
| +''';
|
| + Source source = addSource(code);
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + CompilationUnit unit = _getResolvedLibraryUnit(source);
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "x] in A", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
|
| + PropertyAccessorElement, ref.staticElement);
|
| + }
|
| + {
|
| + SimpleIdentifier ref = EngineTestCase.findNode(
|
| + unit, code, "x] in B", (node) => node is SimpleIdentifier);
|
| + EngineTestCase.assertInstanceOf((obj) => obj is PropertyAccessorElement,
|
| + PropertyAccessorElement, ref.staticElement);
|
| + }
|
| + }
|
| +
|
| + void test_concreteClassWithAbstractMember() {
|
| + Source source = addSource(r'''
|
| +abstract class A {
|
| + m();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_concreteClassWithAbstractMember_inherited() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {}
|
| +}
|
| +class B extends A {
|
| + m();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_conflictingInstanceGetterAndSuperclassMember_instance() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + get v => 0;
|
| +}
|
| +class B extends A {
|
| + get v => 1;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_conflictingStaticGetterAndInstanceSetter_thisClass() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static get x => 0;
|
| + static set x(int p) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_conflictingStaticSetterAndInstanceMember_thisClass_method() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static x() {}
|
| + static set x(int p) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_const_constructor_with_named_generic_parameter() {
|
| + Source source = addSource('''
|
| +class C<T> {
|
| + const C({T t});
|
| +}
|
| +const c = const C(t: 1);
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_const_dynamic() {
|
| + Source source = addSource('''
|
| +const Type d = dynamic;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonConstSuper_explicit() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A();
|
| +}
|
| +class B extends A {
|
| + const B(): super();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonConstSuper_redirectingFactory() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A();
|
| +}
|
| +class B implements C {
|
| + const B();
|
| +}
|
| +class C extends A {
|
| + const factory C() = B;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonConstSuper_unresolved() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.a();
|
| +}
|
| +class B extends A {
|
| + const B(): super();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source,
|
| + [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonFinalField_finalInstanceVar() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int x = 0;
|
| + const A();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonFinalField_mixin() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + a() {}
|
| +}
|
| +class B extends Object with A {
|
| + const B();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_MIXIN]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonFinalField_static() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static int x;
|
| + const A();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constConstructorWithNonFinalField_syntheticField() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A();
|
| + set x(value) {}
|
| + get x {return 0;}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constDeferredClass_new() {
|
| + resolveWithErrors(<String>[
|
| + r'''
|
| +library lib1;
|
| +class A {
|
| + const A.b();
|
| +}''',
|
| + r'''
|
| +library root;
|
| +import 'lib1.dart' deferred as a;
|
| +main() {
|
| + new a.A.b();
|
| +}'''
|
| + ], <ErrorCode>[]);
|
| + }
|
| +
|
| + void test_constEval_functionTypeLiteral() {
|
| + Source source = addSource(r'''
|
| +typedef F();
|
| +const C = F;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constEval_propertyExtraction_fieldStatic_targetType() {
|
| + addNamedSource(
|
| + "/math.dart",
|
| + r'''
|
| +library math;
|
| +const PI = 3.14;''');
|
| + Source source = addSource(r'''
|
| +import 'math.dart' as math;
|
| +const C = math.PI;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constEval_propertyExtraction_methodStatic_targetType() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A();
|
| + static m() {}
|
| +}
|
| +const C = A.m;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constEval_symbol() {
|
| + addNamedSource(
|
| + "/math.dart",
|
| + r'''
|
| +library math;
|
| +const PI = 3.14;''');
|
| + Source source = addSource(r'''
|
| +const C = #foo;
|
| +foo() {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constEvalTypeBoolNumString_equal() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A();
|
| +}
|
| +class B {
|
| + final v;
|
| + const B.a1(bool p) : v = p == true;
|
| + const B.a2(bool p) : v = p == false;
|
| + const B.a3(bool p) : v = p == 0;
|
| + const B.a4(bool p) : v = p == 0.0;
|
| + const B.a5(bool p) : v = p == '';
|
| + const B.b1(int p) : v = p == true;
|
| + const B.b2(int p) : v = p == false;
|
| + const B.b3(int p) : v = p == 0;
|
| + const B.b4(int p) : v = p == 0.0;
|
| + const B.b5(int p) : v = p == '';
|
| + const B.c1(String p) : v = p == true;
|
| + const B.c2(String p) : v = p == false;
|
| + const B.c3(String p) : v = p == 0;
|
| + const B.c4(String p) : v = p == 0.0;
|
| + const B.c5(String p) : v = p == '';
|
| + const B.n1(num p) : v = p == null;
|
| + const B.n2(num p) : v = null == p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_constEvalTypeBoolNumString_notEqual() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A();
|
| +}
|
| +class B {
|
| + final v;
|
| + const B.a1(bool p) : v = p != true;
|
| + const B.a2(bool p) : v = p != false;
|
| + const B.a3(bool p) : v = p != 0;
|
| + const B.a4(bool p) : v = p != 0.0;
|
| + const B.a5(bool p) : v = p != '';
|
| + const B.b1(int p) : v = p != true;
|
| + const B.b2(int p) : v = p != false;
|
| + const B.b3(int p) : v = p != 0;
|
| + const B.b4(int p) : v = p != 0.0;
|
| + const B.b5(int p) : v = p != '';
|
| + const B.c1(String p) : v = p != true;
|
| + const B.c2(String p) : v = p != false;
|
| + const B.c3(String p) : v = p != 0;
|
| + const B.c4(String p) : v = p != 0.0;
|
| + const B.c5(String p) : v = p != '';
|
| + const B.n1(num p) : v = p != null;
|
| + const B.n2(num p) : v = null != p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constEvelTypeNum_String() {
|
| + Source source = addSource(r'''
|
| +const String A = 'a';
|
| +const String B = A + 'b';
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constMapKeyExpressionTypeImplementsEquals_abstract() {
|
| + Source source = addSource(r'''
|
| +abstract class B {
|
| + final id;
|
| + const B(this.id);
|
| + String toString() => 'C($id)';
|
| + /** Equality is identity equality, the id isn't used. */
|
| + bool operator==(Object other);
|
| + }
|
| +
|
| +class C extends B {
|
| + const C(id) : super(id);
|
| +}
|
| +
|
| +Map getMap() {
|
| + return const { const C(0): 'Map: 0' };
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constNotInitialized_field() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static const int x = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constNotInitialized_local() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + const int x = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constructorDeclaration_scope_signature() {
|
| + Source source = addSource(r'''
|
| +const app = 0;
|
| +class A {
|
| + A(@app int app) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constWithNonConstantArgument_literals() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A(a, b, c, d);
|
| +}
|
| +f() { return const A(true, 0, 1.0, '2'); }''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constWithTypeParameters_direct() {
|
| + Source source = addSource(r'''
|
| +class A<T> {
|
| + static const V = const A<int>();
|
| + const A();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constWithUndefinedConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A.name();
|
| +}
|
| +f() {
|
| + return const A.name();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_constWithUndefinedConstructorDefault() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A();
|
| +}
|
| +f() {
|
| + return const A();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_defaultValueInFunctionTypeAlias() {
|
| + Source source = addSource("typedef F([x]);");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_defaultValueInFunctionTypedParameter_named() {
|
| + Source source = addSource("f(g({p})) {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_defaultValueInFunctionTypedParameter_optional() {
|
| + Source source = addSource("f(g([p])) {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_deprecatedMemberUse_hide() {
|
| + Source source = addSource(r'''
|
| +library lib;
|
| +import 'lib1.dart' hide B;
|
| +A a = new A();''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library lib1;
|
| +class A {}
|
| +@deprecated
|
| +class B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_duplicateDefinition_emptyName() {
|
| + // Note: This code has two FunctionElements '() {}' with an empty name,
|
| + // this tests that the empty string is not put into the scope
|
| + // (more than once).
|
| + Source source = addSource(r'''
|
| +Map _globalMap = {
|
| + 'a' : () {},
|
| + 'b' : () {}
|
| +};''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_duplicateDefinition_getter() {
|
| + Source source = addSource("bool get a => true;");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_dynamicIdentifier() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + var v = dynamic;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_empty_generator_async() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream<int> f() async* {
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_empty_generator_sync() {
|
| + Source source = addSource('''
|
| +Iterable<int> f() sync* {
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_expectedOneListTypeArgument() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + <int> [];
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_expectedTwoMapTypeArguments() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + <int, int> {};
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_exportDuplicatedLibraryUnnamed() {
|
| + Source source = addSource(r'''
|
| +library test;
|
| +export 'lib1.dart';
|
| +export 'lib2.dart';''');
|
| + addNamedSource("/lib1.dart", "");
|
| + addNamedSource("/lib2.dart", "");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_exportOfNonLibrary_libraryDeclared() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart';''');
|
| + addNamedSource("/lib1.dart", "library lib1;");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_exportOfNonLibrary_libraryNotDeclared() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart';''');
|
| + addNamedSource("/lib1.dart", "");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_extraPositionalArguments_function() {
|
| + Source source = addSource(r'''
|
| +f(p1, p2) {}
|
| +main() {
|
| + f(1, 2);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_extraPositionalArguments_Function() {
|
| + Source source = addSource(r'''
|
| +f(Function a) {
|
| + a(1, 2);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_extraPositionalArguments_implicitConstructor() {
|
| + Source source = addSource(r'''
|
| +class A<E extends num> {
|
| + A(E x, E y);
|
| +}
|
| +class M {}
|
| +class B<E extends num> = A<E> with M;
|
| +void main() {
|
| + B<int> x = new B<int>(0,0);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_extraPositionalArguments_typedef_local() {
|
| + Source source = addSource(r'''
|
| +typedef A(p1, p2);
|
| +A getA() => null;
|
| +f() {
|
| + A a = getA();
|
| + a(1, 2);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_extraPositionalArguments_typedef_parameter() {
|
| + Source source = addSource(r'''
|
| +typedef A(p1, p2);
|
| +f(A a) {
|
| + a(1, 2);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_fieldInitializedByMultipleInitializers() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int x;
|
| + int y;
|
| + A() : x = 0, y = 0 {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_fieldInitializedInInitializerAndDeclaration_fieldNotFinal() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int x = 0;
|
| + A() : x = 1 {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_fieldInitializedInInitializerAndDeclaration_finalFieldNotSet() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int x;
|
| + A() : x = 1 {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_fieldInitializerOutsideConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int x;
|
| + A(this.x) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_fieldInitializerOutsideConstructor_defaultParameters() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int x;
|
| + A([this.x]) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_fieldInitializerRedirectingConstructor_super() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {}
|
| +}
|
| +class B extends A {
|
| + int x;
|
| + B(this.x) : super();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalInitializedInDeclarationAndConstructor_initializer() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final x;
|
| + A() : x = 1 {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalInitializedInDeclarationAndConstructor_initializingFormal() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final x;
|
| + A(this.x) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_atDeclaration() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int x = 0;
|
| + A() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_fieldFormal() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int x = 0;
|
| + A() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_functionTypedFieldFormal() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final Function x;
|
| + A(int this.x(int p)) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_hasNativeClause_hasConstructor() {
|
| + Source source = addSource(r'''
|
| +class A native 'something' {
|
| + final int x;
|
| + A() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_hasNativeClause_noConstructor() {
|
| + Source source = addSource(r'''
|
| +class A native 'something' {
|
| + final int x;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [ParserErrorCode.NATIVE_CLAUSE_IN_NON_SDK_CODE]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_initializer() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int x;
|
| + A() : x = 0 {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_finalNotInitialized_redirectingConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int x;
|
| + A(this.x);
|
| + A.named() : this (42);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionDeclaration_scope_returnType() {
|
| + Source source = addSource("int f(int) { return 0; }");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionDeclaration_scope_signature() {
|
| + Source source = addSource(r'''
|
| +const app = 0;
|
| +f(@app int app) {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionTypeAlias_scope_returnType() {
|
| + Source source = addSource("typedef int f(int);");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionTypeAlias_scope_signature() {
|
| + Source source = addSource(r'''
|
| +const app = 0;
|
| +typedef int f(@app int app);''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionWithoutCall() {
|
| + Source source = addSource(r'''
|
| +abstract class A implements Function {
|
| +}
|
| +class B implements A {
|
| + void call() {}
|
| +}
|
| +class C extends A {
|
| + void call() {}
|
| +}
|
| +class D extends C {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionWithoutCall_doesNotImplementFunction() {
|
| + Source source = addSource("class A {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionWithoutCall_staticCallMethod() {
|
| + Source source = addSource(r'''
|
| +class A { }
|
| +class B extends A {
|
| + static call() { }
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_functionWithoutCall_withNoSuchMethod() {
|
| + // 16078
|
| + Source source = addSource(r'''
|
| +class A implements Function {
|
| + noSuchMethod(inv) {
|
| + return 42;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitConstructorDependencies() {
|
| + // No warning should be generated for the code below; this requires that
|
| + // implicit constructors are generated for C1 before C2, even though C1
|
| + // follows C2 in the file. See dartbug.com/21600.
|
| + Source source = addSource(r'''
|
| +class B {
|
| + B(int i);
|
| +}
|
| +class M1 {}
|
| +class M2 {}
|
| +
|
| +class C2 = C1 with M2;
|
| +class C1 = B with M1;
|
| +
|
| +main() {
|
| + new C2(5);
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_constructorName() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.named() {}
|
| +}
|
| +class B {
|
| + var v;
|
| + B() : v = new A.named();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_importPrefix() {
|
| + Source source = addSource(r'''
|
| +import 'dart:async' as abstract;
|
| +class A {
|
| + var v = new abstract.Completer();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_prefixedIdentifier() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var f;
|
| +}
|
| +class B {
|
| + var v;
|
| + B(A a) : v = a.f;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_qualifiedMethodInvocation() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + f() {}
|
| +}
|
| +class B {
|
| + var v;
|
| + B() : v = new A().f();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_qualifiedPropertyAccess() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var f;
|
| +}
|
| +class B {
|
| + var v;
|
| + B() : v = new A().f;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_staticField_thisClass() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var v;
|
| + A() : v = f;
|
| + static var f;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_staticGetter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var v;
|
| + A() : v = f;
|
| + static get f => 42;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_staticMethod() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var v;
|
| + A() : v = f();
|
| + static f() => 42;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_topLevelField() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var v;
|
| + A() : v = f;
|
| +}
|
| +var f = 42;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_topLevelFunction() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var v;
|
| + A() : v = f();
|
| +}
|
| +f() => 42;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_topLevelGetter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var v;
|
| + A() : v = f;
|
| +}
|
| +get f => 42;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_implicitThisReferenceInInitializer_typeParameter() {
|
| + Source source = addSource(r'''
|
| +class A<T> {
|
| + var v;
|
| + A(p) : v = (p is T);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_importDuplicatedLibraryName() {
|
| + Source source = addSource(r'''
|
| +library test;
|
| +import 'lib.dart';
|
| +import 'lib.dart';''');
|
| + addNamedSource("/lib.dart", "library lib;");
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [
|
| + HintCode.UNUSED_IMPORT,
|
| + HintCode.UNUSED_IMPORT,
|
| + HintCode.DUPLICATE_IMPORT
|
| + ]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_importDuplicatedLibraryUnnamed() {
|
| + Source source = addSource(r'''
|
| +library test;
|
| +import 'lib1.dart';
|
| +import 'lib2.dart';''');
|
| + addNamedSource("/lib1.dart", "");
|
| + addNamedSource("/lib2.dart", "");
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [
|
| + // No warning on duplicate import (https://github.com/dart-lang/sdk/issues/24156)
|
| + HintCode.UNUSED_IMPORT,
|
| + HintCode.UNUSED_IMPORT
|
| + ]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_importOfNonLibrary_libraryDeclared() {
|
| + Source source = addSource(r'''
|
| +library lib;
|
| +import 'part.dart';
|
| +A a;''');
|
| + addNamedSource(
|
| + "/part.dart",
|
| + r'''
|
| +library lib1;
|
| +class A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_importOfNonLibrary_libraryNotDeclared() {
|
| + Source source = addSource(r'''
|
| +library lib;
|
| +import 'part.dart';
|
| +A a;''');
|
| + addNamedSource("/part.dart", "class A {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_importPrefixes_withFirstLetterDifference() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +import 'lib1.dart' as math;
|
| +import 'lib2.dart' as path;
|
| +main() {
|
| + math.test1();
|
| + path.test2();
|
| +}''');
|
| + addNamedSource(
|
| + "/lib1.dart",
|
| + r'''
|
| +library lib1;
|
| +test1() {}''');
|
| + addNamedSource(
|
| + "/lib2.dart",
|
| + r'''
|
| +library lib2;
|
| +test2() {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentCaseExpressionTypes() {
|
| + Source source = addSource(r'''
|
| +f(var p) {
|
| + switch (p) {
|
| + case 1:
|
| + break;
|
| + case 2:
|
| + break;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_accessors_typeParameter2() {
|
| + Source source = addSource(r'''
|
| +abstract class A<E> {
|
| + E get x {return null;}
|
| +}
|
| +class B<E> {
|
| + E get x {return null;}
|
| +}
|
| +class C<E> extends A<E> implements B<E> {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_accessors_typeParameters1() {
|
| + Source source = addSource(r'''
|
| +abstract class A<E> {
|
| + E get x;
|
| +}
|
| +abstract class B<E> {
|
| + E get x;
|
| +}
|
| +class C<E> implements A<E>, B<E> {
|
| + E get x => null;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_accessors_typeParameters_diamond() {
|
| + Source source = addSource(r'''
|
| +abstract class F<E> extends B<E> {}
|
| +class D<E> extends F<E> {
|
| + external E get g;
|
| +}
|
| +abstract class C<E> {
|
| + E get g;
|
| +}
|
| +abstract class B<E> implements C<E> {
|
| + E get g { return null; }
|
| +}
|
| +class A<E> extends B<E> implements D<E> {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_methods_typeParameter2() {
|
| + Source source = addSource(r'''
|
| +class A<E> {
|
| + x(E e) {}
|
| +}
|
| +class B<E> {
|
| + x(E e) {}
|
| +}
|
| +class C<E> extends A<E> implements B<E> {
|
| + x(E e) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_methods_typeParameters1() {
|
| + Source source = addSource(r'''
|
| +class A<E> {
|
| + x(E e) {}
|
| +}
|
| +class B<E> {
|
| + x(E e) {}
|
| +}
|
| +class C<E> implements A<E>, B<E> {
|
| + x(E e) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_overrideTrumpsInherits_getter() {
|
| + // 16134
|
| + Source source = addSource(r'''
|
| +class B<S> {
|
| + S get g => null;
|
| +}
|
| +abstract class I<U> {
|
| + U get g => null;
|
| +}
|
| +class C extends B<double> implements I<int> {
|
| + num get g => null;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_overrideTrumpsInherits_method() {
|
| + // 16134
|
| + Source source = addSource(r'''
|
| +class B<S> {
|
| + m(S s) => null;
|
| +}
|
| +abstract class I<U> {
|
| + m(U u) => null;
|
| +}
|
| +class C extends B<double> implements I<int> {
|
| + m(num n) => null;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_overrideTrumpsInherits_setter() {
|
| + // 16134
|
| + Source source = addSource(r'''
|
| +class B<S> {
|
| + set t(S s) {}
|
| +}
|
| +abstract class I<U> {
|
| + set t(U u) {}
|
| +}
|
| +class C extends B<double> implements I<int> {
|
| + set t(num n) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_inconsistentMethodInheritance_simple() {
|
| + Source source = addSource(r'''
|
| +abstract class A {
|
| + x();
|
| +}
|
| +abstract class B {
|
| + x();
|
| +}
|
| +class C implements A, B {
|
| + x() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_initializingFormalForNonExistentField() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int x;
|
| + A(this.x) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_instance_creation_inside_annotation() {
|
| + Source source = addSource('''
|
| +class C {
|
| + const C();
|
| +}
|
| +class D {
|
| + final C c;
|
| + const D(this.c);
|
| +}
|
| +@D(const C())
|
| +f() {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_instanceAccessToStaticMember_fromComment() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static m() {}
|
| +}
|
| +/// [A.m]
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_instanceAccessToStaticMember_topLevel() {
|
| + Source source = addSource(r'''
|
| +m() {}
|
| +main() {
|
| + m();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_instanceMemberAccessFromStatic_fromComment() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {}
|
| + /// [m]
|
| + static foo() {
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_instanceMethodNameCollidesWithSuperclassStatic_field() {
|
| + Source source = addSource(r'''
|
| +import 'lib.dart';
|
| +class B extends A {
|
| + _m() {}
|
| +}''');
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library L;
|
| +class A {
|
| + static var _m;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_instanceMethodNameCollidesWithSuperclassStatic_method() {
|
| + Source source = addSource(r'''
|
| +import 'lib.dart';
|
| +class B extends A {
|
| + _m() {}
|
| +}''');
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library L;
|
| +class A {
|
| + static _m() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAnnotation_constantVariable_field() {
|
| + Source source = addSource(r'''
|
| +@A.C
|
| +class A {
|
| + static const C = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAnnotation_constantVariable_field_importWithPrefix() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +class A {
|
| + static const C = 0;
|
| +}''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +@p.A.C
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAnnotation_constantVariable_topLevel() {
|
| + Source source = addSource(r'''
|
| +const C = 0;
|
| +@C
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAnnotation_constantVariable_topLevel_importWithPrefix() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +const C = 0;''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +@p.C
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAnnotation_constConstructor_importWithPrefix() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +class A {
|
| + const A(int p);
|
| +}''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +@p.A(42)
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAnnotation_constConstructor_named_importWithPrefix() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +class A {
|
| + const A.named(int p);
|
| +}''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +@p.A.named(42)
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + var x;
|
| + var y;
|
| + x = y;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_compoundAssignment() {
|
| + Source source = addSource(r'''
|
| +class byte {
|
| + int _value;
|
| + byte(this._value);
|
| + byte operator +(int val) { return this; }
|
| +}
|
| +
|
| +void main() {
|
| + byte b = new byte(52);
|
| + b += 3;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_defaultValue_named() {
|
| + Source source = addSource(r'''
|
| +f({String x: '0'}) {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_defaultValue_optional() {
|
| + Source source = addSource(r'''
|
| +f([String x = '0']) {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_ifNullAssignment_compatibleType() {
|
| + Source source = addSource('''
|
| +void f(int i) {
|
| + num n;
|
| + n ??= i;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_ifNullAssignment_sameType() {
|
| + Source source = addSource('''
|
| +void f(int i) {
|
| + int j;
|
| + j ??= i;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_implicitlyImplementFunctionViaCall_1() {
|
| + // 18341
|
| + //
|
| + // This test and
|
| + // 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()'
|
| + // are closely related: here we see that 'I' checks as a subtype of
|
| + // 'IntToInt'.
|
| + Source source = addSource(r'''
|
| +class I {
|
| + int call(int x) => 0;
|
| +}
|
| +class C implements I {
|
| + noSuchMethod(_) => null;
|
| +}
|
| +typedef int IntToInt(int x);
|
| +IntToInt f = new I();''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_implicitlyImplementFunctionViaCall_2() {
|
| + // 18341
|
| + //
|
| + // Here 'C' checks as a subtype of 'I', but 'C' does not
|
| + // check as a subtype of 'IntToInt'. Together with
|
| + // 'test_invalidAssignment_implicitlyImplementFunctionViaCall_1()' we see
|
| + // that subtyping is not transitive here.
|
| + Source source = addSource(r'''
|
| +class I {
|
| + int call(int x) => 0;
|
| +}
|
| +class C implements I {
|
| + noSuchMethod(_) => null;
|
| +}
|
| +typedef int IntToInt(int x);
|
| +IntToInt f = new C();''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_implicitlyImplementFunctionViaCall_3() {
|
| + // 18341
|
| + //
|
| + // Like 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()',
|
| + // but uses type 'Function' instead of more precise type 'IntToInt' for 'f'.
|
| + Source source = addSource(r'''
|
| +class I {
|
| + int call(int x) => 0;
|
| +}
|
| +class C implements I {
|
| + noSuchMethod(_) => null;
|
| +}
|
| +typedef int IntToInt(int x);
|
| +Function f = new C();''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_implicitlyImplementFunctionViaCall_4() {
|
| + // 18341
|
| + //
|
| + // Like 'test_invalidAssignment_implicitlyImplementFunctionViaCall_2()',
|
| + // but uses type 'VoidToInt' instead of more precise type 'IntToInt' for
|
| + // 'f'.
|
| + //
|
| + // Here 'C <: IntToInt <: VoidToInt', but the spec gives no transitivity
|
| + // rule for '<:'. However, many of the :/tools/test.py tests assume this
|
| + // transitivity for 'JsBuilder' objects, assigning them to
|
| + // '(String) -> dynamic'. The declared type of 'JsBuilder.call' is
|
| + // '(String, [dynamic]) -> Expression'.
|
| + Source source = addSource(r'''
|
| +class I {
|
| + int call([int x]) => 0;
|
| +}
|
| +class C implements I {
|
| + noSuchMethod(_) => null;
|
| +}
|
| +typedef int VoidToInt();
|
| +VoidToInt f = new C();''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidAssignment_toDynamic() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + var g;
|
| + g = () => 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidFactoryNameNotAClass() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + factory A() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidIdentifierInAsync() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {
|
| + int async;
|
| + int await;
|
| + int yield;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidMethodOverrideNamedParamType() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m({int a}) {}
|
| +}
|
| +class B implements A {
|
| + m({int a, int b}) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideDifferentDefaultValues_named() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m({int p : 0}) {}
|
| +}
|
| +class B extends A {
|
| + m({int p : 0}) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideDifferentDefaultValues_named_function() {
|
| + Source source = addSource(r'''
|
| +nothing() => 'nothing';
|
| +class A {
|
| + thing(String a, {orElse : nothing}) {}
|
| +}
|
| +class B extends A {
|
| + thing(String a, {orElse : nothing}) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideDifferentDefaultValues_positional() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m([int p = 0]) {}
|
| +}
|
| +class B extends A {
|
| + m([int p = 0]) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideDifferentDefaultValues_positional_changedOrder() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m([int a = 0, String b = '0']) {}
|
| +}
|
| +class B extends A {
|
| + m([int b = 0, String a = '0']) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideDifferentDefaultValues_positional_function() {
|
| + Source source = addSource(r'''
|
| +nothing() => 'nothing';
|
| +class A {
|
| + thing(String a, [orElse = nothing]) {}
|
| +}
|
| +class B extends A {
|
| + thing(String a, [orElse = nothing]) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideNamed_unorderedNamedParameter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m({a, b}) {}
|
| +}
|
| +class B extends A {
|
| + m({b, a}) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideRequired_less() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m(a, b) {}
|
| +}
|
| +class B extends A {
|
| + m(a, [b]) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideRequired_same() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m(a) {}
|
| +}
|
| +class B extends A {
|
| + m(a) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_interface() {
|
| + Source source = addNamedSource(
|
| + "/test.dart",
|
| + r'''
|
| +abstract class A {
|
| + num m();
|
| +}
|
| +class B implements A {
|
| + int m() { return 1; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_interface2() {
|
| + Source source = addNamedSource(
|
| + "/test.dart",
|
| + r'''
|
| +abstract class A {
|
| + num m();
|
| +}
|
| +abstract class B implements A {
|
| +}
|
| +class C implements B {
|
| + int m() { return 1; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_mixin() {
|
| + Source source = addNamedSource(
|
| + "/test.dart",
|
| + r'''
|
| +class A {
|
| + num m() { return 0; }
|
| +}
|
| +class B extends Object with A {
|
| + int m() { return 1; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_parameterizedTypes() {
|
| + Source source = addSource(r'''
|
| +abstract class A<E> {
|
| + List<E> m();
|
| +}
|
| +class B extends A<dynamic> {
|
| + List<dynamic> m() { return new List<dynamic>(); }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_sameType() {
|
| + Source source = addNamedSource(
|
| + "/test.dart",
|
| + r'''
|
| +class A {
|
| + int m() { return 0; }
|
| +}
|
| +class B extends A {
|
| + int m() { return 1; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_superclass() {
|
| + Source source = addNamedSource(
|
| + "/test.dart",
|
| + r'''
|
| +class A {
|
| + num m() { return 0; }
|
| +}
|
| +class B extends A {
|
| + int m() { return 1; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_superclass2() {
|
| + Source source = addNamedSource(
|
| + "/test.dart",
|
| + r'''
|
| +class A {
|
| + num m() { return 0; }
|
| +}
|
| +class B extends A {
|
| +}
|
| +class C extends B {
|
| + int m() { return 1; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidOverrideReturnType_returnType_void() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + void m() {}
|
| +}
|
| +class B extends A {
|
| + int m() { return 0; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidReferenceToThis_constructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {
|
| + var v = this;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidReferenceToThis_instanceMethod() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {
|
| + var v = this;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidTypeArgumentForKey() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {
|
| + return const <int, int>{};
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidTypeArgumentInConstList() {
|
| + Source source = addSource(r'''
|
| +class A<E> {
|
| + m() {
|
| + return <E>[];
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invalidTypeArgumentInConstMap() {
|
| + Source source = addSource(r'''
|
| +class A<E> {
|
| + m() {
|
| + return <String, E>{};
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_dynamic() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var f;
|
| +}
|
| +class B extends A {
|
| + g() {
|
| + f();
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_getter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var g;
|
| +}
|
| +f() {
|
| + A a;
|
| + a.g();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_localVariable() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + var g;
|
| + g();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_localVariable_dynamic() {
|
| + Source source = addSource(r'''
|
| +f() {}
|
| +main() {
|
| + var v = f;
|
| + v();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_localVariable_dynamic2() {
|
| + Source source = addSource(r'''
|
| +f() {}
|
| +main() {
|
| + var v = f;
|
| + v = 1;
|
| + v();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_Object() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + Object v = null;
|
| + v();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_invocationOfNonFunction_proxyOnFunctionClass() {
|
| + // 16078
|
| + Source source = addSource(r'''
|
| +@proxy
|
| +class Functor implements Function {
|
| + noSuchMethod(inv) {
|
| + return 42;
|
| + }
|
| +}
|
| +main() {
|
| + Functor f = new Functor();
|
| + f();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_issue_24191() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +
|
| +class S extends Stream {}
|
| +f(S s) async {
|
| + await for (var v in s) {
|
| + print(v);
|
| + }
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_listElementTypeNotAssignable() {
|
| + Source source = addSource(r'''
|
| +var v1 = <int> [42];
|
| +var v2 = const <int> [42];''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_loadLibraryDefined() {
|
| + resolveWithErrors(<String>[
|
| + r'''
|
| +library lib1;
|
| +foo() => 22;''',
|
| + r'''
|
| +import 'lib1.dart' deferred as other;
|
| +main() {
|
| + other.loadLibrary().then((_) => other.foo());
|
| +}'''
|
| + ], <ErrorCode>[]);
|
| + }
|
| +
|
| + void test_local_generator_async() {
|
| + Source source = addSource('''
|
| +f() {
|
| + return () async* { yield 0; };
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_local_generator_sync() {
|
| + Source source = addSource('''
|
| +f() {
|
| + return () sync* { yield 0; };
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mapKeyTypeNotAssignable() {
|
| + Source source = addSource("var v = <String, int > {'a' : 1};");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_memberWithClassName_setter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + set A(v) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_methodDeclaration_scope_signature() {
|
| + Source source = addSource(r'''
|
| +const app = 0;
|
| +class A {
|
| + foo(@app int app) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_misMatchedGetterAndSetterTypes_instance_sameTypes() {
|
| + Source source = addSource(r'''
|
| +class C {
|
| + int get x => 0;
|
| + set x(int v) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_misMatchedGetterAndSetterTypes_instance_unspecifiedGetter() {
|
| + Source source = addSource(r'''
|
| +class C {
|
| + get x => 0;
|
| + set x(String v) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_misMatchedGetterAndSetterTypes_instance_unspecifiedSetter() {
|
| + Source source = addSource(r'''
|
| +class C {
|
| + int get x => 0;
|
| + set x(v) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_misMatchedGetterAndSetterTypes_topLevel_sameTypes() {
|
| + Source source = addSource(r'''
|
| +int get x => 0;
|
| +set x(int v) {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedGetter() {
|
| + Source source = addSource(r'''
|
| +get x => 0;
|
| +set x(String v) {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_misMatchedGetterAndSetterTypes_topLevel_unspecifiedSetter() {
|
| + Source source = addSource(r'''
|
| +int get x => 0;
|
| +set x(v) {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_missingEnumConstantInSwitch_all() {
|
| + Source source = addSource(r'''
|
| +enum E { A, B, C }
|
| +
|
| +f(E e) {
|
| + switch (e) {
|
| + case E.A: break;
|
| + case E.B: break;
|
| + case E.C: break;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_missingEnumConstantInSwitch_default() {
|
| + Source source = addSource(r'''
|
| +enum E { A, B, C }
|
| +
|
| +f(E e) {
|
| + switch (e) {
|
| + case E.B: break;
|
| + default: break;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixedReturnTypes_differentScopes() {
|
| + Source source = addSource(r'''
|
| +class C {
|
| + m(int x) {
|
| + f(int y) {
|
| + return;
|
| + }
|
| + f(x);
|
| + return 0;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixedReturnTypes_ignoreImplicit() {
|
| + Source source = addSource(r'''
|
| +f(bool p) {
|
| + if (p) return 42;
|
| + // implicit 'return;' is ignored
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixedReturnTypes_ignoreImplicit2() {
|
| + Source source = addSource(r'''
|
| +f(bool p) {
|
| + if (p) {
|
| + return 42;
|
| + } else {
|
| + return 42;
|
| + }
|
| + // implicit 'return;' is ignored
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixedReturnTypes_sameKind() {
|
| + Source source = addSource(r'''
|
| +class C {
|
| + m(int x) {
|
| + if (x < 0) {
|
| + return 1;
|
| + }
|
| + return 0;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinDeclaresConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {}
|
| +}
|
| +class B extends Object with A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinDeclaresConstructor_factory() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + factory A() {}
|
| +}
|
| +class B extends Object with A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinInheritsFromNotObject_classDeclaration_extends() {
|
| + AnalysisOptionsImpl options = new AnalysisOptionsImpl();
|
| + options.enableSuperMixins = true;
|
| + resetWithOptions(options);
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +class C extends Object with B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinInheritsFromNotObject_classDeclaration_mixTypeAlias() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B = Object with A;
|
| +class C extends Object with B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinInheritsFromNotObject_classDeclaration_with() {
|
| + AnalysisOptionsImpl options = new AnalysisOptionsImpl();
|
| + options.enableSuperMixins = true;
|
| + resetWithOptions(options);
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends Object with A {}
|
| +class C extends Object with B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinInheritsFromNotObject_typeAlias_extends() {
|
| + AnalysisOptionsImpl options = new AnalysisOptionsImpl();
|
| + options.enableSuperMixins = true;
|
| + resetWithOptions(options);
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +class C = Object with B;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinInheritsFromNotObject_typeAlias_with() {
|
| + AnalysisOptionsImpl options = new AnalysisOptionsImpl();
|
| + options.enableSuperMixins = true;
|
| + resetWithOptions(options);
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends Object with A {}
|
| +class C = Object with B;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinInheritsFromNotObject_typedef_mixTypeAlias() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B = Object with A;
|
| +class C = Object with B;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_mixinReferencesSuper() {
|
| + AnalysisOptionsImpl options = new AnalysisOptionsImpl();
|
| + options.enableSuperMixins = true;
|
| + resetWithOptions(options);
|
| + Source source = addSource(r'''
|
| +class A {
|
| + toString() => super.toString();
|
| +}
|
| +class B extends Object with A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_multipleSuperInitializers_no() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {
|
| + B() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_multipleSuperInitializers_single() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {
|
| + B() : super() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nativeFunctionBodyInNonSDKCode_function() {
|
| + Source source = addSource(r'''
|
| +import 'dart-ext:x';
|
| +int m(a) native 'string';''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + // Cannot verify the AST because the import's URI cannot be resolved.
|
| + }
|
| +
|
| + void test_newWithAbstractClass_factory() {
|
| + Source source = addSource(r'''
|
| +abstract class A {
|
| + factory A() { return new B(); }
|
| +}
|
| +class B implements A {
|
| + B() {}
|
| +}
|
| +A f() {
|
| + return new A();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_newWithUndefinedConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.name() {}
|
| +}
|
| +f() {
|
| + new A.name();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_newWithUndefinedConstructorDefault() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {}
|
| +}
|
| +f() {
|
| + new A();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_getter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + int get g => 0;
|
| +}
|
| +abstract class B extends A {
|
| + int get g;
|
| +}
|
| +class C extends B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_method() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m(p) {}
|
| +}
|
| +abstract class B extends A {
|
| + m(p);
|
| +}
|
| +class C extends B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_abstractsDontOverrideConcretes_setter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + set s(v) {}
|
| +}
|
| +abstract class B extends A {
|
| + set s(v);
|
| +}
|
| +class C extends B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() {
|
| + // 15979
|
| + Source source = addSource(r'''
|
| +abstract class M {}
|
| +abstract class A {}
|
| +abstract class I {
|
| + m();
|
| +}
|
| +abstract class B = A with M implements I;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin() {
|
| + // 15979
|
| + Source source = addSource(r'''
|
| +abstract class M {
|
| + m();
|
| +}
|
| +abstract class A {}
|
| +abstract class B = A with M;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() {
|
| + // 15979
|
| + Source source = addSource(r'''
|
| +class M {}
|
| +abstract class A {
|
| + m();
|
| +}
|
| +abstract class B = A with M;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_mixin_getter() {
|
| + // 17034
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var a;
|
| +}
|
| +abstract class M {
|
| + get a;
|
| +}
|
| +class B extends A with M {}
|
| +class C extends B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_mixin_method() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {}
|
| +}
|
| +abstract class M {
|
| + m();
|
| +}
|
| +class B extends A with M {}
|
| +class C extends B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_mixin_setter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var a;
|
| +}
|
| +abstract class M {
|
| + set a(dynamic v);
|
| +}
|
| +class B extends A with M {}
|
| +class C extends B {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_accessor() {
|
| + Source source = addSource(r'''
|
| +abstract class A {
|
| + int get g;
|
| +}
|
| +class B extends A {
|
| + noSuchMethod(v) => '';
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_method() {
|
| + Source source = addSource(r'''
|
| +abstract class A {
|
| + m(p);
|
| +}
|
| +class B extends A {
|
| + noSuchMethod(v) => '';
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonAbstractClassInheritsAbstractMemberOne_overridesMethodInObject() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + String toString([String prefix = '']) => '${prefix}Hello';
|
| +}
|
| +class C {}
|
| +class B extends A with C {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolExpression_functionType() {
|
| + Source source = addSource(r'''
|
| +bool makeAssertion() => true;
|
| +f() {
|
| + assert(makeAssertion);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolExpression_interfaceType() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + assert(true);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolNegationExpression() {
|
| + Source source = addSource(r'''
|
| +f(bool pb, pd) {
|
| + !true;
|
| + !false;
|
| + !pb;
|
| + !pd;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolOperand_and_bool() {
|
| + Source source = addSource(r'''
|
| +bool f(bool left, bool right) {
|
| + return left && right;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolOperand_and_dynamic() {
|
| + Source source = addSource(r'''
|
| +bool f(left, dynamic right) {
|
| + return left && right;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolOperand_or_bool() {
|
| + Source source = addSource(r'''
|
| +bool f(bool left, bool right) {
|
| + return left || right;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonBoolOperand_or_dynamic() {
|
| + Source source = addSource(r'''
|
| +bool f(dynamic left, right) {
|
| + return left || right;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantDefaultValue_function_named() {
|
| + Source source = addSource("f({x : 2 + 3}) {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantDefaultValue_function_positional() {
|
| + Source source = addSource("f([x = 2 + 3]) {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantDefaultValue_inConstructor_named() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A({x : 2 + 3}) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantDefaultValue_inConstructor_positional() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A([x = 2 + 3]) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantDefaultValue_method_named() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m({x : 2 + 3}) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantDefaultValue_method_positional() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m([x = 2 + 3]) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstantValueInInitializer_namedArgument() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final a;
|
| + const A({this.a});
|
| +}
|
| +class B extends A {
|
| + const B({b}) : super(a: b);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstCaseExpression() {
|
| + Source source = addSource(r'''
|
| +f(Type t) {
|
| + switch (t) {
|
| + case bool:
|
| + case int:
|
| + return true;
|
| + default:
|
| + return false;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstMapAsExpressionStatement_const() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + const {'a' : 0, 'b' : 1};
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstMapAsExpressionStatement_notExpressionStatement() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + var m = {'a' : 0, 'b' : 1};
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstMapAsExpressionStatement_typeArguments() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + <String, int> {'a' : 0, 'b' : 1};
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_binary_bool() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final v;
|
| + const A.a1(bool p) : v = p && true;
|
| + const A.a2(bool p) : v = true && p;
|
| + const A.b1(bool p) : v = p || true;
|
| + const A.b2(bool p) : v = true || p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [HintCode.DEAD_CODE]);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_binary_dynamic() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final v;
|
| + const A.a1(p) : v = p + 5;
|
| + const A.a2(p) : v = 5 + p;
|
| + const A.b1(p) : v = p - 5;
|
| + const A.b2(p) : v = 5 - p;
|
| + const A.c1(p) : v = p * 5;
|
| + const A.c2(p) : v = 5 * p;
|
| + const A.d1(p) : v = p / 5;
|
| + const A.d2(p) : v = 5 / p;
|
| + const A.e1(p) : v = p ~/ 5;
|
| + const A.e2(p) : v = 5 ~/ p;
|
| + const A.f1(p) : v = p > 5;
|
| + const A.f2(p) : v = 5 > p;
|
| + const A.g1(p) : v = p < 5;
|
| + const A.g2(p) : v = 5 < p;
|
| + const A.h1(p) : v = p >= 5;
|
| + const A.h2(p) : v = 5 >= p;
|
| + const A.i1(p) : v = p <= 5;
|
| + const A.i2(p) : v = 5 <= p;
|
| + const A.j1(p) : v = p % 5;
|
| + const A.j2(p) : v = 5 % p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + // operations on "p" are not resolved
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_binary_int() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final v;
|
| + const A.a1(int p) : v = p ^ 5;
|
| + const A.a2(int p) : v = 5 ^ p;
|
| + const A.b1(int p) : v = p & 5;
|
| + const A.b2(int p) : v = 5 & p;
|
| + const A.c1(int p) : v = p | 5;
|
| + const A.c2(int p) : v = 5 | p;
|
| + const A.d1(int p) : v = p >> 5;
|
| + const A.d2(int p) : v = 5 >> p;
|
| + const A.e1(int p) : v = p << 5;
|
| + const A.e2(int p) : v = 5 << p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_binary_num() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final v;
|
| + const A.a1(num p) : v = p + 5;
|
| + const A.a2(num p) : v = 5 + p;
|
| + const A.b1(num p) : v = p - 5;
|
| + const A.b2(num p) : v = 5 - p;
|
| + const A.c1(num p) : v = p * 5;
|
| + const A.c2(num p) : v = 5 * p;
|
| + const A.d1(num p) : v = p / 5;
|
| + const A.d2(num p) : v = 5 / p;
|
| + const A.e1(num p) : v = p ~/ 5;
|
| + const A.e2(num p) : v = 5 ~/ p;
|
| + const A.f1(num p) : v = p > 5;
|
| + const A.f2(num p) : v = 5 > p;
|
| + const A.g1(num p) : v = p < 5;
|
| + const A.g2(num p) : v = 5 < p;
|
| + const A.h1(num p) : v = p >= 5;
|
| + const A.h2(num p) : v = 5 >= p;
|
| + const A.i1(num p) : v = p <= 5;
|
| + const A.i2(num p) : v = 5 <= p;
|
| + const A.j1(num p) : v = p % 5;
|
| + const A.j2(num p) : v = 5 % p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_field() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final int a;
|
| + const A() : a = 5;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_redirecting() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A.named(p);
|
| + const A() : this.named(42);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_super() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A(p);
|
| +}
|
| +class B extends A {
|
| + const B() : super(42);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonConstValueInInitializer_unary() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + final v;
|
| + const A.a(bool p) : v = !p;
|
| + const A.b(int p) : v = ~p;
|
| + const A.c(num p) : v = -p;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonGenerativeConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.named() {}
|
| + factory A() {}
|
| +}
|
| +class B extends A {
|
| + B() : super.named();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonTypeInCatchClause_isClass() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + try {
|
| + } on String catch (e) {
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonTypeInCatchClause_isFunctionTypeAlias() {
|
| + Source source = addSource(r'''
|
| +typedef F();
|
| +f() {
|
| + try {
|
| + } on F catch (e) {
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonTypeInCatchClause_isTypeParameter() {
|
| + Source source = addSource(r'''
|
| +class A<T> {
|
| + f() {
|
| + try {
|
| + } on T catch (e) {
|
| + }
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonTypeInCatchClause_noType() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + try {
|
| + } catch (e) {
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonVoidReturnForOperator_no() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + operator []=(a, b) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonVoidReturnForOperator_void() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + void operator []=(a, b) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonVoidReturnForSetter_function_no() {
|
| + Source source = addSource("set x(v) {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonVoidReturnForSetter_function_void() {
|
| + Source source = addSource("void set x(v) {}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonVoidReturnForSetter_method_no() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + set x(v) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_nonVoidReturnForSetter_method_void() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + void set x(v) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_null_callMethod() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + null.m();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_null_callOperator() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + null + 5;
|
| + null == 5;
|
| + null[0];
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_optionalParameterInOperator_required() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + operator +(p) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_parameterDefaultDoesNotReferToParameterName() {
|
| + // The final "f" should refer to the toplevel function "f", not to the
|
| + // parameter called "f". See dartbug.com/13179.
|
| + Source source = addSource('void f([void f([x]) = f]) {}');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_parameterScope_local() {
|
| + // Parameter names shouldn't conflict with the name of the function they
|
| + // are enclosed in.
|
| + Source source = addSource(r'''
|
| +f() {
|
| + g(g) {
|
| + h(g);
|
| + }
|
| +}
|
| +h(x) {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_parameterScope_method() {
|
| + // Parameter names shouldn't conflict with the name of the function they
|
| + // are enclosed in.
|
| + Source source = addSource(r'''
|
| +class C {
|
| + g(g) {
|
| + h(g);
|
| + }
|
| +}
|
| +h(x) {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_parameterScope_toplevel() {
|
| + // Parameter names shouldn't conflict with the name of the function they
|
| + // are enclosed in.
|
| + Source source = addSource(r'''
|
| +g(g) {
|
| + h(g);
|
| +}
|
| +h(x) {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_prefixCollidesWithTopLevelMembers() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +class A {}''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +typedef P();
|
| +p2() {}
|
| +var p3;
|
| +class p4 {}
|
| +p.A a;''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_propagateTypeArgs_intoBounds() {
|
| + Source source = addSource(r'''
|
| +abstract class A<E> {}
|
| +abstract class B<F> implements A<F>{}
|
| +abstract class C<G, H extends A<G>> {}
|
| +class D<I> extends C<I, B<I>> {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_propagateTypeArgs_intoSupertype() {
|
| + Source source = addSource(r'''
|
| +class A<T> {
|
| + A(T p);
|
| + A.named(T p);
|
| +}
|
| +class B<S> extends A<S> {
|
| + B(S p) : super(p);
|
| + B.named(S p) : super.named(p);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_proxy_annotation_prefixed() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +@proxy
|
| +class A {}
|
| +f(A a) {
|
| + a.m();
|
| + var x = a.g;
|
| + a.s = 1;
|
| + var y = a + a;
|
| + a++;
|
| + ++a;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_prefixed2() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +@proxy
|
| +class A {}
|
| +class B {
|
| + f(A a) {
|
| + a.m();
|
| + var x = a.g;
|
| + a.s = 1;
|
| + var y = a + a;
|
| + a++;
|
| + ++a;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_prefixed3() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +class B {
|
| + f(A a) {
|
| + a.m();
|
| + var x = a.g;
|
| + a.s = 1;
|
| + var y = a + a;
|
| + a++;
|
| + ++a;
|
| + }
|
| +}
|
| +@proxy
|
| +class A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_proxyHasPrefixedIdentifier() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +import 'dart:core' as core;
|
| +@core.proxy class PrefixProxy {}
|
| +main() {
|
| + new PrefixProxy().foo;
|
| + new PrefixProxy().foo();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_simple() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +@proxy
|
| +class B {
|
| + m() {
|
| + n();
|
| + var x = g;
|
| + s = 1;
|
| + var y = this + this;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_superclass() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +class B extends A {
|
| + m() {
|
| + n();
|
| + var x = g;
|
| + s = 1;
|
| + var y = this + this;
|
| + }
|
| +}
|
| +@proxy
|
| +class A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_superclass_mixin() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +class B extends Object with A {
|
| + m() {
|
| + n();
|
| + var x = g;
|
| + s = 1;
|
| + var y = this + this;
|
| + }
|
| +}
|
| +@proxy
|
| +class A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_superinterface() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +class B implements A {
|
| + m() {
|
| + n();
|
| + var x = g;
|
| + s = 1;
|
| + var y = this + this;
|
| + }
|
| +}
|
| +@proxy
|
| +class A {}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_proxy_annotation_superinterface_infiniteLoop() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +class C implements A {
|
| + m() {
|
| + n();
|
| + var x = g;
|
| + s = 1;
|
| + var y = this + this;
|
| + }
|
| +}
|
| +class B implements A{}
|
| +class A implements B{}''');
|
| + computeLibrarySourceErrors(source);
|
| + // Test is that a stack overflow isn't reached in resolution
|
| + // (previous line), no need to assert error set.
|
| + }
|
| +
|
| + void test_recursiveConstructorRedirect() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.a() : this.b();
|
| + A.b() : this.c();
|
| + A.c() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_recursiveFactoryRedirect() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + factory A() = B;
|
| +}
|
| +class B implements A {
|
| + factory B() = C;
|
| +}
|
| +class C implements B {
|
| + factory C() {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_redirectToInvalidFunctionType() {
|
| + Source source = addSource(r'''
|
| +class A implements B {
|
| + A(int p) {}
|
| +}
|
| +class B {
|
| + factory B(int p) = A;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_redirectToInvalidReturnType() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {}
|
| +}
|
| +class B extends A {
|
| + factory B() = A;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_redirectToNonConstConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A.a();
|
| + const factory A.b() = A.a;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_referencedBeforeDeclaration_cascade() {
|
| + Source source = addSource(r'''
|
| +testRequestHandler() {}
|
| +
|
| +main() {
|
| + var s1 = null;
|
| + testRequestHandler()
|
| + ..stream(s1);
|
| + var stream = 123;
|
| + print(stream);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_referenceToDeclaredVariableInInitializer_constructorName() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.x() {}
|
| +}
|
| +f() {
|
| + var x = new A.x();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_referenceToDeclaredVariableInInitializer_methodName() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + x() {}
|
| +}
|
| +f(A a) {
|
| + var x = a.x();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_referenceToDeclaredVariableInInitializer_propertyName() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var x;
|
| +}
|
| +f(A a) {
|
| + var x = a.x;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_rethrowOutsideCatch() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + void m() {
|
| + try {} catch (e) {rethrow;}
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_return_in_generator_async() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream<int> f() async* {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_return_in_generator_sync() {
|
| + Source source = addSource('''
|
| +Iterable<int> f() sync* {
|
| + return;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnInGenerativeConstructor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() { return; }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnInGenerator_async() {
|
| + Source source = addSource(r'''
|
| +f() async {
|
| + return 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnInGenerator_sync() {
|
| + Source source = addSource(r'''
|
| +f() {
|
| + return 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_async() {
|
| + Source source = addSource(r'''
|
| +import 'dart:async';
|
| +class A {
|
| + Future<int> m() async {
|
| + return 0;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_dynamic() {
|
| + Source source = addSource(r'''
|
| +class TypeError {}
|
| +class A {
|
| + static void testLogicalOp() {
|
| + testOr(a, b, onTypeError) {
|
| + try {
|
| + return a || b;
|
| + } on TypeError catch (t) {
|
| + return onTypeError;
|
| + }
|
| + }
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_dynamicAsTypeArgument() {
|
| + Source source = addSource(r'''
|
| +class I<T> {
|
| + factory I() => new A<T>();
|
| +}
|
| +class A<T> implements I {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_subtype() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +A f(B b) { return b; }''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_supertype() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +B f(A a) { return a; }''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_typeParameter_18468() {
|
| + // https://code.google.com/p/dart/issues/detail?id=18468
|
| + //
|
| + // This test verifies that the type of T is more specific than Type,
|
| + // where T is a type parameter and Type is the type Type from
|
| + // core, this particular test case comes from issue 18468.
|
| + //
|
| + // A test cannot be added to TypeParameterTypeImplTest since the types
|
| + // returned out of the TestTypeProvider don't have a mock 'dart.core'
|
| + // enclosing library element.
|
| + // See TypeParameterTypeImpl.isMoreSpecificThan().
|
| + Source source = addSource(r'''
|
| +class Foo<T> {
|
| + Type get t => T;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnOfInvalidType_void() {
|
| + Source source = addSource(r'''
|
| +void f1() {}
|
| +void f2() { return; }
|
| +void f3() { return null; }
|
| +void f4() { return g1(); }
|
| +void f5() { return g2(); }
|
| +g1() {}
|
| +void g2() {}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnWithoutValue_noReturnType() {
|
| + Source source = addSource("f() { return; }");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_returnWithoutValue_void() {
|
| + Source source = addSource("void f() { return; }");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_reversedTypeArguments() {
|
| + Source source = addSource(r'''
|
| +class Codec<S1, T1> {
|
| + Codec<T1, S1> get inverted => new _InvertedCodec<T1, S1>(this);
|
| +}
|
| +class _InvertedCodec<T2, S2> extends Codec<T2, S2> {
|
| + _InvertedCodec(Codec<S2, T2> codec);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_sharedDeferredPrefix() {
|
| + resolveWithErrors(<String>[
|
| + r'''
|
| +library lib1;
|
| +f1() {}''',
|
| + r'''
|
| +library lib2;
|
| +f2() {}''',
|
| + r'''
|
| +library lib3;
|
| +f3() {}''',
|
| + r'''
|
| +library root;
|
| +import 'lib1.dart' deferred as lib1;
|
| +import 'lib2.dart' as lib;
|
| +import 'lib3.dart' as lib;
|
| +main() { lib1.f1(); lib.f2(); lib.f3(); }'''
|
| + ], <ErrorCode>[]);
|
| + }
|
| +
|
| + void test_staticAccessToInstanceMember_annotation() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + const A.name();
|
| +}
|
| +@A.name()
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_staticAccessToInstanceMember_method() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static m() {}
|
| +}
|
| +main() {
|
| + A.m;
|
| + A.m();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_staticAccessToInstanceMember_propertyAccess_field() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static var f;
|
| +}
|
| +main() {
|
| + A.f;
|
| + A.f = 1;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_staticAccessToInstanceMember_propertyAccess_propertyAccessor() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + static get f => 42;
|
| + static set f(x) {}
|
| +}
|
| +main() {
|
| + A.f;
|
| + A.f = 1;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_superInInvalidContext() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {}
|
| +}
|
| +class B extends A {
|
| + B() {
|
| + var v = super.m();
|
| + }
|
| + n() {
|
| + var v = super.m();
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeAliasCannotReferenceItself_returnClass_withTypeAlias() {
|
| + Source source = addSource(r'''
|
| +typedef B A();
|
| +class B {
|
| + A a;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeArgumentNotMatchingBounds_const() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +class G<E extends A> {
|
| + const G();
|
| +}
|
| +f() { return const G<B>(); }''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeArgumentNotMatchingBounds_new() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +class G<E extends A> {}
|
| +f() { return new G<B>(); }''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeArgumentNotMatchingBounds_typeArgumentList_0() {
|
| + Source source = addSource("abstract class A<T extends A>{}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeArgumentNotMatchingBounds_typeArgumentList_1() {
|
| + Source source = addSource("abstract class A<T extends A<A>>{}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeArgumentNotMatchingBounds_typeArgumentList_20() {
|
| + Source source = addSource(
|
| + "abstract class A<T extends A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A<A>>>>>>>>>>>>>>>>>>>>>{}");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_booleanAnd_useInRight() {
|
| + Source source = addSource(r'''
|
| +main(Object p) {
|
| + p is String && p.length != 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_noAssignment() {
|
| + Source source = addSource(r'''
|
| +callMe(f()) { f(); }
|
| +main(Object p) {
|
| + (p is String) && callMe(() { p.length; });
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_conditional_issue14655() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +class B extends A {}
|
| +class C extends B {
|
| + mc() {}
|
| +}
|
| +print(_) {}
|
| +main(A p) {
|
| + (p is C) && (print(() => p) && (p is B)) ? p.mc() : p = null;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_conditional_useInThen() {
|
| + Source source = addSource(r'''
|
| +main(Object p) {
|
| + p is String ? p.length : 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_conditional_useInThen_accessedInClosure_noAssignment() {
|
| + Source source = addSource(r'''
|
| +callMe(f()) { f(); }
|
| +main(Object p) {
|
| + p is String ? callMe(() { p.length; }) : 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_functionType_arg_ignoreIfNotMoreSpecific() {
|
| + Source source = addSource(r'''
|
| +typedef FuncB(B b);
|
| +typedef FuncA(A a);
|
| +class A {}
|
| +class B {}
|
| +main(FuncA f) {
|
| + if (f is FuncB) {
|
| + f(new A());
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_functionType_return_ignoreIfNotMoreSpecific() {
|
| + Source source = addSource(r'''
|
| +class A {}
|
| +typedef FuncAtoDyn(A a);
|
| +typedef FuncDynToDyn(x);
|
| +main(FuncAtoDyn f) {
|
| + if (f is FuncDynToDyn) {
|
| + A a = f(new A());
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_functionType_return_voidToDynamic() {
|
| + Source source = addSource(r'''
|
| +typedef FuncDynToDyn(x);
|
| +typedef void FuncDynToVoid(x);
|
| +class A {}
|
| +main(FuncDynToVoid f) {
|
| + if (f is FuncDynToDyn) {
|
| + A a = f(null);
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_accessedInClosure_noAssignment() {
|
| + Source source = addSource(r'''
|
| +callMe(f()) { f(); }
|
| +main(Object p) {
|
| + if (p is String) {
|
| + callMe(() {
|
| + p.length;
|
| + });
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_extends_moreSpecific() {
|
| + Source source = addSource(r'''
|
| +class V {}
|
| +class VP extends V {}
|
| +class A<T> {}
|
| +class B<S> extends A<S> {
|
| + var b;
|
| +}
|
| +
|
| +main(A<V> p) {
|
| + if (p is B<VP>) {
|
| + p.b;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_hasAssignment_outsideAfter() {
|
| + Source source = addSource(r'''
|
| +main(Object p) {
|
| + if (p is String) {
|
| + p.length;
|
| + }
|
| + p = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_hasAssignment_outsideBefore() {
|
| + Source source = addSource(r'''
|
| +main(Object p, Object p2) {
|
| + p = p2;
|
| + if (p is String) {
|
| + p.length;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_implements_moreSpecific() {
|
| + Source source = addSource(r'''
|
| +class V {}
|
| +class VP extends V {}
|
| +class A<T> {}
|
| +class B<S> implements A<S> {
|
| + var b;
|
| +}
|
| +
|
| +main(A<V> p) {
|
| + if (p is B<VP>) {
|
| + p.b;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_inClosure_assignedAfter_inSameFunction() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + f(Object p) {
|
| + if (p is String) {
|
| + p.length;
|
| + }
|
| + p = 0;
|
| + };
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_is_and_left() {
|
| + Source source = addSource(r'''
|
| +bool tt() => true;
|
| +main(Object p) {
|
| + if (p is String && tt()) {
|
| + p.length;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_is_and_right() {
|
| + Source source = addSource(r'''
|
| +bool tt() => true;
|
| +main(Object p) {
|
| + if (tt() && p is String) {
|
| + p.length;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_is_and_subThenSuper() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var a;
|
| +}
|
| +class B extends A {
|
| + var b;
|
| +}
|
| +main(Object p) {
|
| + if (p is B && p is A) {
|
| + p.a;
|
| + p.b;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_is_parenthesized() {
|
| + Source source = addSource(r'''
|
| +main(Object p) {
|
| + if ((p is String)) {
|
| + p.length;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_if_is_single() {
|
| + Source source = addSource(r'''
|
| +main(Object p) {
|
| + if (p is String) {
|
| + p.length;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typePromotion_parentheses() {
|
| + Source source = addSource(r'''
|
| +main(Object p) {
|
| + (p is String) ? p.length : 0;
|
| + (p) is String ? p.length : 0;
|
| + ((p)) is String ? p.length : 0;
|
| + ((p) is String) ? p.length : 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeType_class() {
|
| + Source source = addSource(r'''
|
| +class C {}
|
| +f(Type t) {}
|
| +main() {
|
| + f(C);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeType_class_prefixed() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +class C {}''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +f(Type t) {}
|
| +main() {
|
| + f(p.C);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeType_functionTypeAlias() {
|
| + Source source = addSource(r'''
|
| +typedef F();
|
| +f(Type t) {}
|
| +main() {
|
| + f(F);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_typeType_functionTypeAlias_prefixed() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +typedef F();''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as p;
|
| +f(Type t) {}
|
| +main() {
|
| + f(p.F);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedConstructorInInitializer_explicit_named() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A.named() {}
|
| +}
|
| +class B extends A {
|
| + B() : super.named();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedConstructorInInitializer_explicit_unnamed() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {}
|
| +}
|
| +class B extends A {
|
| + B() : super();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedConstructorInInitializer_hasOptionalParameters() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A([p]) {}
|
| +}
|
| +class B extends A {
|
| + B();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedConstructorInInitializer_implicit() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {}
|
| +}
|
| +class B extends A {
|
| + B();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedConstructorInInitializer_implicit_typeAlias() {
|
| + Source source = addSource(r'''
|
| +class M {}
|
| +class A = Object with M;
|
| +class B extends A {
|
| + B();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedConstructorInInitializer_redirecting() {
|
| + Source source = addSource(r'''
|
| +class Foo {
|
| + Foo.ctor();
|
| +}
|
| +class Bar extends Foo {
|
| + Bar() : this.ctor();
|
| + Bar.ctor() : super.ctor();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedGetter_static_conditionalAccess() {
|
| + // The conditional access operator '?.' can be used to access static
|
| + // fields.
|
| + Source source = addSource('''
|
| +class A {
|
| + static var x;
|
| +}
|
| +var a = A?.x;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedGetter_typeSubstitution() {
|
| + Source source = addSource(r'''
|
| +class A<E> {
|
| + E element;
|
| +}
|
| +class B extends A<List> {
|
| + m() {
|
| + element.last;
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedIdentifier_hide() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart' hide a;''');
|
| + addNamedSource("/lib1.dart", "library lib1;");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedIdentifier_show() {
|
| + Source source = addSource(r'''
|
| +library L;
|
| +export 'lib1.dart' show a;''');
|
| + addNamedSource("/lib1.dart", "library lib1;");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedIdentifier_synthetic_whenExpression() {
|
| + Source source = addSource(r'''
|
| +print(x) {}
|
| +main() {
|
| + print(is String);
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [ParserErrorCode.MISSING_IDENTIFIER]);
|
| + }
|
| +
|
| + void test_undefinedIdentifier_synthetic_whenMethodName() {
|
| + Source source = addSource(r'''
|
| +print(x) {}
|
| +main(int p) {
|
| + p.();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertErrors(source, [ParserErrorCode.MISSING_IDENTIFIER]);
|
| + }
|
| +
|
| + void test_undefinedMethod_functionExpression_callMethod() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + (() => null).call();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + // A call to verify(source) fails as '.call()' isn't resolved.
|
| + }
|
| +
|
| + void test_undefinedMethod_functionExpression_directCall() {
|
| + Source source = addSource(r'''
|
| +main() {
|
| + (() => null)();
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + // A call to verify(source) fails as '(() => null)()' isn't resolved.
|
| + }
|
| +
|
| + void test_undefinedMethod_static_conditionalAccess() {
|
| + // The conditional access operator '?.' can be used to access static
|
| + // methods.
|
| + Source source = addSource('''
|
| +class A {
|
| + static void m() {}
|
| +}
|
| +f() { A?.m(); }
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedOperator_index() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + operator [](a) {}
|
| + operator []=(a, b) {}
|
| +}
|
| +f(A a) {
|
| + a[0];
|
| + a[0] = 1;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedOperator_tilde() {
|
| + Source source = addSource(r'''
|
| +const A = 3;
|
| +const B = ~((1 << A) - 1);''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedSetter_importWithPrefix() {
|
| + addNamedSource(
|
| + "/lib.dart",
|
| + r'''
|
| +library lib;
|
| +set y(int value) {}''');
|
| + Source source = addSource(r'''
|
| +import 'lib.dart' as x;
|
| +main() {
|
| + x.y = 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedSetter_static_conditionalAccess() {
|
| + // The conditional access operator '?.' can be used to access static
|
| + // fields.
|
| + Source source = addSource('''
|
| +class A {
|
| + static var x;
|
| +}
|
| +f() { A?.x = 1; }
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedSuperMethod_field() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + var m;
|
| +}
|
| +class B extends A {
|
| + f() {
|
| + super.m();
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_undefinedSuperMethod_method() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + m() {}
|
| +}
|
| +class B extends A {
|
| + f() {
|
| + super.m();
|
| + }
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_unqualifiedReferenceToNonLocalStaticMember_fromComment_new() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + A() {}
|
| + A.named() {}
|
| +}
|
| +/// [new A] or [new A.named]
|
| +main() {
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_uriDoesNotExist_dll() {
|
| + addNamedSource("/lib.dll", "");
|
| + Source source = addSource("import 'dart-ext:lib';");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_uriDoesNotExist_dylib() {
|
| + addNamedSource("/lib.dylib", "");
|
| + Source source = addSource("import 'dart-ext:lib';");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_uriDoesNotExist_so() {
|
| + addNamedSource("/lib.so", "");
|
| + Source source = addSource("import 'dart-ext:lib';");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + }
|
| +
|
| + void test_wrongNumberOfParametersForOperator1() {
|
| + _check_wrongNumberOfParametersForOperator1("<");
|
| + _check_wrongNumberOfParametersForOperator1(">");
|
| + _check_wrongNumberOfParametersForOperator1("<=");
|
| + _check_wrongNumberOfParametersForOperator1(">=");
|
| + _check_wrongNumberOfParametersForOperator1("+");
|
| + _check_wrongNumberOfParametersForOperator1("/");
|
| + _check_wrongNumberOfParametersForOperator1("~/");
|
| + _check_wrongNumberOfParametersForOperator1("*");
|
| + _check_wrongNumberOfParametersForOperator1("%");
|
| + _check_wrongNumberOfParametersForOperator1("|");
|
| + _check_wrongNumberOfParametersForOperator1("^");
|
| + _check_wrongNumberOfParametersForOperator1("&");
|
| + _check_wrongNumberOfParametersForOperator1("<<");
|
| + _check_wrongNumberOfParametersForOperator1(">>");
|
| + _check_wrongNumberOfParametersForOperator1("[]");
|
| + }
|
| +
|
| + void test_wrongNumberOfParametersForOperator_index() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + operator []=(a, b) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_wrongNumberOfParametersForOperator_minus() {
|
| + _check_wrongNumberOfParametersForOperator("-", "");
|
| + _check_wrongNumberOfParametersForOperator("-", "a");
|
| + }
|
| +
|
| + void test_wrongNumberOfParametersForSetter() {
|
| + Source source = addSource(r'''
|
| +class A {
|
| + set x(a) {}
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_async_to_dynamic_type() {
|
| + Source source = addSource('''
|
| +dynamic f() async* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_async_to_generic_type() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream f() async* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_async_to_parameterized_type() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream<int> f() async* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_async_to_untyped() {
|
| + Source source = addSource('''
|
| +f() async* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_async_dynamic_to_dynamic() {
|
| + Source source = addSource('''
|
| +f() async* {
|
| + yield* g();
|
| +}
|
| +g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_async_dynamic_to_stream() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream f() async* {
|
| + yield* g();
|
| +}
|
| +g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_async_dynamic_to_typed_stream() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream<int> f() async* {
|
| + yield* g();
|
| +}
|
| +g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_async_stream_to_dynamic() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +f() async* {
|
| + yield* g();
|
| +}
|
| +Stream g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_async_typed_stream_to_dynamic() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +f() async* {
|
| + yield* g();
|
| +}
|
| +Stream<int> g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_async_typed_stream_to_typed_stream() {
|
| + Source source = addSource('''
|
| +import 'dart:async';
|
| +Stream<int> f() async* {
|
| + yield* g();
|
| +}
|
| +Stream<int> g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_sync_dynamic_to_dynamic() {
|
| + Source source = addSource('''
|
| +f() sync* {
|
| + yield* g();
|
| +}
|
| +g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_sync_dynamic_to_iterable() {
|
| + Source source = addSource('''
|
| +Iterable f() sync* {
|
| + yield* g();
|
| +}
|
| +g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_sync_dynamic_to_typed_iterable() {
|
| + Source source = addSource('''
|
| +Iterable<int> f() sync* {
|
| + yield* g();
|
| +}
|
| +g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_sync_iterable_to_dynamic() {
|
| + Source source = addSource('''
|
| +f() sync* {
|
| + yield* g();
|
| +}
|
| +Iterable g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_sync_typed_iterable_to_dynamic() {
|
| + Source source = addSource('''
|
| +f() sync* {
|
| + yield* g();
|
| +}
|
| +Iterable<int> g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_each_sync_typed_iterable_to_typed_iterable() {
|
| + Source source = addSource('''
|
| +Iterable<int> f() sync* {
|
| + yield* g();
|
| +}
|
| +Iterable<int> g() => null;
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_sync_to_dynamic_type() {
|
| + Source source = addSource('''
|
| +dynamic f() sync* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_sync_to_generic_type() {
|
| + Source source = addSource('''
|
| +Iterable f() sync* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_sync_to_parameterized_type() {
|
| + Source source = addSource('''
|
| +Iterable<int> f() sync* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yield_sync_to_untyped() {
|
| + Source source = addSource('''
|
| +f() sync* {
|
| + yield 3;
|
| +}
|
| +''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yieldInNonGenerator_asyncStar() {
|
| + Source source = addSource(r'''
|
| +f() async* {
|
| + yield 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void test_yieldInNonGenerator_syncStar() {
|
| + Source source = addSource(r'''
|
| +f() sync* {
|
| + yield 0;
|
| +}''');
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + }
|
| +
|
| + void _check_wrongNumberOfParametersForOperator(
|
| + String name, String parameters) {
|
| + Source source = addSource("""
|
| +class A {
|
| + operator $name($parameters) {}
|
| +}""");
|
| + computeLibrarySourceErrors(source);
|
| + assertNoErrors(source);
|
| + verify([source]);
|
| + reset();
|
| + }
|
| +
|
| + void _check_wrongNumberOfParametersForOperator1(String name) {
|
| + _check_wrongNumberOfParametersForOperator(name, "a");
|
| + }
|
| +
|
| + CompilationUnit _getResolvedLibraryUnit(Source source) =>
|
| + analysisContext.getResolvedCompilationUnit2(source, source);
|
| +}
|
|
|