// 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 analyzer.test.generated.static_type_warning_code_test;

import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/java_core.dart' show formatList;
import 'package:analyzer/src/generated/source_io.dart';
import 'package:unittest/unittest.dart';

import '../reflective_tests.dart';
import '../utils.dart';
import 'resolver_test_case.dart';

main() {
  initializeTestEnvironment();
  runReflectiveTests(StaticTypeWarningCodeTest);
  runReflectiveTests(StrongModeStaticTypeWarningCodeTest);
}

@reflectiveTest
class StaticTypeWarningCodeTest extends ResolverTestCase {
  void fail_inaccessibleSetter() {
    // TODO(rnystrom): This doesn't look right.
    assertErrorsInCode(
        r'''
''',
        [StaticTypeWarningCode.INACCESSIBLE_SETTER]);
  }

  void fail_method_lookup_mixin_of_extends() {
    // See dartbug.com/25605
    resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
    assertErrorsInUnverifiedCode(
        '''
class A { a() => null; }
class B {}
abstract class M extends A {}
class T = B with M; // Warning: B does not extend A
main() {
  new T().a(); // Warning: The method 'a' is not defined for the class 'T'
}
''',
        [
          // TODO(paulberry): when dartbug.com/25614 is fixed, add static warning
          // code for "B does not extend A".
          StaticTypeWarningCode.UNDEFINED_METHOD
        ]);
  }

  void fail_method_lookup_mixin_of_implements() {
    // See dartbug.com/25605
    resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
    assertErrorsInUnverifiedCode(
        '''
class A { a() => null; }
class B {}
abstract class M implements A {}
class T = B with M; // Warning: Missing concrete implementation of 'A.a'
main() {
  new T().a(); // Warning: The method 'a' is not defined for the class 'T'
}
''',
        [
          StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
          StaticTypeWarningCode.UNDEFINED_METHOD
        ]);
  }

  void fail_method_lookup_mixin_of_mixin() {
    // See dartbug.com/25605
    resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
    assertErrorsInUnverifiedCode(
        '''
class A {}
class B { b() => null; }
class C {}
class M extends A with B {}
class T = C with M;
main() {
  new T().b();
}
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void fail_method_lookup_mixin_of_mixin_application() {
    // See dartbug.com/25605
    resetWithOptions(new AnalysisOptionsImpl()..enableSuperMixins = true);
    assertErrorsInUnverifiedCode(
        '''
class A { a() => null; }
class B {}
class C {}
class M = A with B;
class T = C with M;
main() {
  new T().a();
}
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void fail_undefinedEnumConstant() {
    // We need a way to set the parseEnum flag in the parser to true.
    assertErrorsInCode(
        r'''
enum E { ONE }
E e() {
  return E.TWO;
}''',
        [StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT]);
  }

  void test_ambiguousImport_function() {
    Source source = addSource(r'''
import 'lib1.dart';
import 'lib2.dart';
g() { return f(); }''');
    addNamedSource(
        "/lib1.dart",
        r'''
library lib1;
f() {}''');
    addNamedSource(
        "/lib2.dart",
        r'''
library lib2;
f() {}''');
    computeLibrarySourceErrors(source);
    assertErrors(source, [StaticWarningCode.AMBIGUOUS_IMPORT]);
  }

  void test_assert_message_suppresses_type_promotion() {
    // If a variable is assigned to inside the expression for an assert
    // message, type promotion should be suppressed, just as it would be if the
    // assignment occurred outside an assert statement.  (Note that it is a
    // dubious practice for the computation of an assert message to have side
    // effects, since it is only evaluated if the assert fails).
    resetWithOptions(new AnalysisOptionsImpl()..enableAssertMessage = true);
    assertErrorsInCode(
        '''
class C {
  void foo() {}
}

f(Object x) {
  if (x is C) {
    x.foo();
    assert(true, () { x = new C(); return 'msg'; }());
  }
}
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
    // Do not verify since `x.foo()` fails to resolve.
  }

  void test_await_flattened() {
    assertErrorsInCode(
        '''
import 'dart:async';
Future<Future<int>> ffi() => null;
f() async {
  Future<int> b = await ffi(); // Warning: int not assignable to Future<int>
}
''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_await_simple() {
    assertErrorsInCode(
        '''
import 'dart:async';
Future<int> fi() => null;
f() async {
  String a = await fi(); // Warning: int not assignable to String
}
''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_awaitForIn_declaredVariableRightType() {
    assertNoErrorsInCode('''
import 'dart:async';
f() async {
  Stream<int> stream;
  await for (int i in stream) {}
}
''');
  }

  void test_awaitForIn_declaredVariableWrongType() {
    assertErrorsInCode(
        '''
import 'dart:async';
f() async {
  Stream<String> stream;
  await for (int i in stream) {}
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
  }

  void test_awaitForIn_downcast() {
    assertNoErrorsInCode('''
import 'dart:async';
f() async {
  Stream<num> stream;
  await for (int i in stream) {}
}
''');
  }

  void test_awaitForIn_dynamicStream() {
    assertNoErrorsInCode('''
f() async {
  dynamic stream;
  await for (int i in stream) {}
}
''');
  }

  void test_awaitForIn_dynamicVariable() {
    assertNoErrorsInCode('''
import 'dart:async';
f() async {
  Stream<int> stream;
  await for (var i in stream) {}
}
''');
  }

  void test_awaitForIn_existingVariableRightType() {
    assertNoErrorsInCode('''
import 'dart:async';
f() async {
  Stream<int> stream;
  int i;
  await for (i in stream) {}
}
''');
  }

  void test_awaitForIn_existingVariableWrongType() {
    assertErrorsInCode(
        '''
import 'dart:async';
f() async {
  Stream<String> stream;
  int i;
  await for (i in stream) {}
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
  }

  void test_awaitForIn_notStream() {
    assertErrorsInCode(
        '''
f() async {
  await for (var i in true) {}
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
  }

  void test_awaitForIn_streamOfDynamic() {
    assertNoErrorsInCode('''
import 'dart:async';
f() async {
  Stream stream;
  await for (int i in stream) {}
}
''');
  }

  void test_awaitForIn_upcast() {
    assertNoErrorsInCode('''
import 'dart:async';
f() async {
  Stream<int> stream;
  await for (num i in stream) {}
}
''');
  }

  void test_bug21912() {
    assertErrorsInCode(
        '''
class A {}
class B extends A {}

typedef T Function2<S, T>(S z);
typedef B AToB(A x);
typedef A BToA(B x);

void main() {
  {
    Function2<Function2<A, B>, Function2<B, A>> t1;
    Function2<AToB, BToA> t2;

    Function2<Function2<int, double>, Function2<int, double>> left;

    left = t1;
    left = t2;
  }
}
''',
        [
          StaticTypeWarningCode.INVALID_ASSIGNMENT,
          StaticTypeWarningCode.INVALID_ASSIGNMENT
        ]);
  }

  void test_expectedOneListTypeArgument() {
    assertErrorsInCode(
        r'''
main() {
  <int, int> [];
}''',
        [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]);
  }

  void test_expectedTwoMapTypeArguments_one() {
    assertErrorsInCode(
        r'''
main() {
  <int> {};
}''',
        [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
  }

  void test_expectedTwoMapTypeArguments_three() {
    assertErrorsInCode(
        r'''
main() {
  <int, int, int> {};
}''',
        [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]);
  }

  void test_forIn_declaredVariableRightType() {
    assertNoErrorsInCode('''
f() {
  for (int i in <int>[]) {}
}
''');
  }

  void test_forIn_declaredVariableWrongType() {
    assertErrorsInCode(
        '''
f() {
  for (int i in <String>[]) {}
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
  }

  void test_forIn_downcast() {
    assertNoErrorsInCode('''
f() {
  for (int i in <num>[]) {}
}
''');
  }

  void test_forIn_dynamic() {
    assertNoErrorsInCode('''
f() {
  dynamic d; // Could be [].
  for (var i in d) {}
}
''');
  }

  void test_forIn_dynamicIterable() {
    assertNoErrorsInCode('''
f() {
  dynamic iterable;
  for (int i in iterable) {}
}
''');
  }

  void test_forIn_dynamicVariable() {
    assertNoErrorsInCode('''
f() {
  for (var i in <int>[]) {}
}
''');
  }

  void test_forIn_existingVariableRightType() {
    assertNoErrorsInCode('''
f() {
  int i;
  for (i in <int>[]) {}
}
''');
  }

  void test_forIn_existingVariableWrongType() {
    assertErrorsInCode(
        '''
f() {
  int i;
  for (i in <String>[]) {}
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
  }

  void test_forIn_iterableOfDynamic() {
    assertNoErrorsInCode('''
f() {
  for (int i in []) {}
}
''');
  }

  void test_forIn_notIterable() {
    assertErrorsInCode(
        '''
f() {
  for (var i in true) {}
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE]);
  }

  void test_forIn_object() {
    assertNoErrorsInCode('''
f() {
  Object o; // Could be [].
  for (var i in o) {}
}
''');
  }

  void test_forIn_typeBoundBad() {
    assertErrorsInCode(
        '''
class Foo<T extends Iterable<int>> {
  void method(T iterable) {
    for (String i in iterable) {}
  }
}
''',
        [StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE]);
  }

  void test_forIn_typeBoundGood() {
    assertNoErrorsInCode('''
class Foo<T extends Iterable<int>> {
  void method(T iterable) {
    for (var i in iterable) {}
  }
}
''');
  }

  void test_forIn_upcast() {
    assertNoErrorsInCode('''
f() {
  for (num i in <int>[]) {}
}
''');
  }

  void test_illegalAsyncGeneratorReturnType_function_nonStream() {
    assertErrorsInCode(
        '''
int f() async* {}
''',
        [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalAsyncGeneratorReturnType_function_subtypeOfStream() {
    resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
    assertErrorsInCode(
        '''
import 'dart:async';
abstract class SubStream<T> implements Stream<T> {}
SubStream<int> f() async* {}
''',
        [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalAsyncGeneratorReturnType_method_nonStream() {
    assertErrorsInCode(
        '''
class C {
  int f() async* {}
}
''',
        [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalAsyncGeneratorReturnType_method_subtypeOfStream() {
    resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
    assertErrorsInCode(
        '''
import 'dart:async';
abstract class SubStream<T> implements Stream<T> {}
class C {
  SubStream<int> f() async* {}
}
''',
        [StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalAsyncReturnType_function_nonFuture() {
    assertErrorsInCode(
        '''
int f() async {}
''',
        [
          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
          HintCode.MISSING_RETURN
        ]);
  }

  void test_illegalAsyncReturnType_function_subtypeOfFuture() {
    resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
    assertErrorsInCode(
        '''
import 'dart:async';
abstract class SubFuture<T> implements Future<T> {}
SubFuture<int> f() async {
  return 0;
}
''',
        [StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE]);
  }

  void test_illegalAsyncReturnType_method_nonFuture() {
    assertErrorsInCode(
        '''
class C {
  int m() async {}
}
''',
        [
          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE,
          HintCode.MISSING_RETURN
        ]);
  }

  void test_illegalAsyncReturnType_method_subtypeOfFuture() {
    resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
    assertErrorsInCode(
        '''
import 'dart:async';
abstract class SubFuture<T> implements Future<T> {}
class C {
  SubFuture<int> m() async {
    return 0;
  }
}
''',
        [StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE]);
  }

  void test_illegalSyncGeneratorReturnType_function_nonIterator() {
    assertErrorsInCode(
        '''
int f() sync* {}
''',
        [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalSyncGeneratorReturnType_function_subclassOfIterator() {
    resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
    assertErrorsInCode(
        '''
abstract class SubIterator<T> implements Iterator<T> {}
SubIterator<int> f() sync* {}
''',
        [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalSyncGeneratorReturnType_method_nonIterator() {
    assertErrorsInCode(
        '''
class C {
  int f() sync* {}
}
''',
        [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_illegalSyncGeneratorReturnType_method_subclassOfIterator() {
    resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
    assertErrorsInCode(
        '''
abstract class SubIterator<T> implements Iterator<T> {}
class C {
  SubIterator<int> f() sync* {}
}
''',
        [StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE]);
  }

  void test_inconsistentMethodInheritance_paramCount() {
    assertErrorsInCode(
        r'''
abstract class A {
  int x();
}
abstract class B {
  int x(int y);
}
class C implements A, B {
}''',
        [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
  }

  void test_inconsistentMethodInheritance_paramType() {
    assertErrorsInCode(
        r'''
abstract class A {
  x(int i);
}
abstract class B {
  x(String s);
}
abstract class C implements A, B {}
''',
        [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
  }

  void test_inconsistentMethodInheritance_returnType() {
    assertErrorsInCode(
        r'''
abstract class A {
  int x();
}
abstract class B {
  String x();
}
abstract class C implements A, B {}
''',
        [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]);
  }

  void test_instanceAccessToStaticMember_method_invocation() {
    assertErrorsInCode(
        r'''
class A {
  static m() {}
}
main(A a) {
  a.m();
}''',
        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
  }

  void test_instanceAccessToStaticMember_method_reference() {
    assertErrorsInCode(
        r'''
class A {
  static m() {}
}
main(A a) {
  a.m;
}''',
        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
  }

  void test_instanceAccessToStaticMember_propertyAccess_field() {
    assertErrorsInCode(
        r'''
class A {
  static var f;
}
main(A a) {
  a.f;
}''',
        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
  }

  void test_instanceAccessToStaticMember_propertyAccess_getter() {
    assertErrorsInCode(
        r'''
class A {
  static get f => 42;
}
main(A a) {
  a.f;
}''',
        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
  }

  void test_instanceAccessToStaticMember_propertyAccess_setter() {
    assertErrorsInCode(
        r'''
class A {
  static set f(x) {}
}
main(A a) {
  a.f = 42;
}''',
        [StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER]);
  }

  void test_invalidAssignment_compoundAssignment() {
    assertErrorsInCode(
        r'''
class byte {
  int _value;
  byte(this._value);
  int operator +(int val) { return 0; }
}

void main() {
  byte b = new byte(52);
  b += 3;
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_defaultValue_named() {
    assertErrorsInCode(
        r'''
f({String x: 0}) {
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_defaultValue_optional() {
    assertErrorsInCode(
        r'''
f([String x = 0]) {
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_dynamic() {
    assertErrorsInCode(
        r'''
main() {
  dynamic = 1;
}
''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_functionExpressionInvocation() {
    assertErrorsInCode(
        '''
main() {
  String x = (() => 5)();
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_ifNullAssignment() {
    assertErrorsInCode(
        '''
void f(int i) {
  double d;
  d ??= i;
}
''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_instanceVariable() {
    assertErrorsInCode(
        r'''
class A {
  int x;
}
f() {
  A a;
  a.x = '0';
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_localVariable() {
    assertErrorsInCode(
        r'''
f() {
  int x;
  x = '0';
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_regressionInIssue18468Fix() {
    // https://code.google.com/p/dart/issues/detail?id=18628
    assertErrorsInCode(
        r'''
class C<T> {
  T t = int;
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_staticVariable() {
    assertErrorsInCode(
        r'''
class A {
  static int x;
}
f() {
  A.x = '0';
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_topLevelVariableDeclaration() {
    assertErrorsInCode(
        "int x = 'string';", [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_typeParameter() {
    // 14221
    assertErrorsInCode(
        r'''
class B<T> {
  T value;
  void test(num n) {
    value = n;
  }
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invalidAssignment_variableDeclaration() {
    assertErrorsInCode(
        r'''
class A {
  int x = 'string';
}''',
        [StaticTypeWarningCode.INVALID_ASSIGNMENT]);
  }

  void test_invocationOfNonFunction_class() {
    assertErrorsInCode(
        r'''
class A {
  void m() {
    A();
  }
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
  }

  void test_invocationOfNonFunction_localGenericFunction() {
    // Objects having a specific function type may be invoked, but objects
    // having type Function may not, because type Function lacks a call method
    // (this is because it is impossible to know what signature the call should
    // have).
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.enableStrictCallChecks = true;
    resetWithOptions(options);
    assertErrorsInCode(
        '''
f(Function f) {
  return f();
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
  }

  void test_invocationOfNonFunction_localObject() {
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.enableStrictCallChecks = true;
    resetWithOptions(options);
    assertErrorsInCode(
        '''
f(Object o) {
  return o();
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
  }

  void test_invocationOfNonFunction_localVariable() {
    assertErrorsInCode(
        r'''
f() {
  int x;
  return x();
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
  }

  void test_invocationOfNonFunction_ordinaryInvocation() {
    assertErrorsInCode(
        r'''
class A {
  static int x;
}
class B {
  m() {
    A.x();
  }
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
    // A call to verify(source) fails as A.x() cannot be resolved.
  }

  void test_invocationOfNonFunction_staticInvocation() {
    assertErrorsInCode(
        r'''
class A {
  static int get g => 0;
  f() {
    A.g();
  }
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
    // A call to verify(source) fails as g() cannot be resolved.
  }

  void test_invocationOfNonFunction_superExpression() {
    assertErrorsInCode(
        r'''
class A {
  int get g => 0;
}
class B extends A {
  m() {
    var v = super.g();
  }
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION]);
  }

  void test_invocationOfNonFunctionExpression_literal() {
    assertErrorsInCode(
        r'''
f() {
  3(5);
}''',
        [StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION]);
  }

  void test_nonBoolCondition_conditional() {
    assertErrorsInCode("f() { return 3 ? 2 : 1; }",
        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
  }

  void test_nonBoolCondition_do() {
    assertErrorsInCode(
        r'''
f() {
  do {} while (3);
}''',
        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
  }

  // https://github.com/dart-lang/sdk/issues/24713
  void test_nonBoolCondition_for() {
    assertErrorsInCode(
        r'''
f() {
  for (;3;) {}
}''',
        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
  }

  void test_nonBoolCondition_if() {
    assertErrorsInCode(
        r'''
f() {
  if (3) return 2; else return 1;
}''',
        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
  }

  void test_nonBoolCondition_while() {
    assertErrorsInCode(
        r'''
f() {
  while (3) {}
}''',
        [StaticTypeWarningCode.NON_BOOL_CONDITION]);
  }

  void test_nonBoolExpression_functionType() {
    assertErrorsInCode(
        r'''
int makeAssertion() => 1;
f() {
  assert(makeAssertion);
}''',
        [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
  }

  void test_nonBoolExpression_interfaceType() {
    assertErrorsInCode(
        r'''
f() {
  assert(0);
}''',
        [StaticTypeWarningCode.NON_BOOL_EXPRESSION]);
  }

  void test_nonBoolNegationExpression() {
    assertErrorsInCode(
        r'''
f() {
  !42;
}''',
        [StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION]);
  }

  void test_nonBoolOperand_and_left() {
    assertErrorsInCode(
        r'''
bool f(int left, bool right) {
  return left && right;
}''',
        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
  }

  void test_nonBoolOperand_and_right() {
    assertErrorsInCode(
        r'''
bool f(bool left, String right) {
  return left && right;
}''',
        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
  }

  void test_nonBoolOperand_or_left() {
    assertErrorsInCode(
        r'''
bool f(List<int> left, bool right) {
  return left || right;
}''',
        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
  }

  void test_nonBoolOperand_or_right() {
    assertErrorsInCode(
        r'''
bool f(bool left, double right) {
  return left || right;
}''',
        [StaticTypeWarningCode.NON_BOOL_OPERAND]);
  }

  void test_nonTypeAsTypeArgument_notAType() {
    assertErrorsInCode(
        r'''
int A;
class B<E> {}
f(B<A> b) {}''',
        [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
  }

  void test_nonTypeAsTypeArgument_undefinedIdentifier() {
    assertErrorsInCode(
        r'''
class B<E> {}
f(B<A> b) {}''',
        [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
  }

  void test_returnOfInvalidType_async_future_int_mismatches_future_null() {
    assertErrorsInCode(
        '''
import 'dart:async';
Future<Null> f() async {
  return 5;
}
''',
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_async_future_int_mismatches_future_string() {
    assertErrorsInCode(
        '''
import 'dart:async';
Future<String> f() async {
  return 5;
}
''',
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_async_future_int_mismatches_int() {
    assertErrorsInCode(
        '''
int f() async {
  return 5;
}
''',
        [
          StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
          StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE
        ]);
  }

  void test_returnOfInvalidType_expressionFunctionBody_function() {
    assertErrorsInCode(
        "int f() => '0';", [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_expressionFunctionBody_getter() {
    assertErrorsInCode(
        "int get g => '0';", [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_expressionFunctionBody_localFunction() {
    assertErrorsInCode(
        r'''
class A {
  String m() {
    int f() => '0';
    return '0';
  }
}''',
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_expressionFunctionBody_method() {
    assertErrorsInCode(
        r'''
class A {
  int f() => '0';
}''',
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_expressionFunctionBody_void() {
    assertErrorsInCode(
        "void f() => 42;", [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_function() {
    assertErrorsInCode("int f() { return '0'; }",
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_getter() {
    assertErrorsInCode("int get g { return '0'; }",
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_localFunction() {
    assertErrorsInCode(
        r'''
class A {
  String m() {
    int f() { return '0'; }
    return '0';
  }
}''',
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_method() {
    assertErrorsInCode(
        r'''
class A {
  int f() { return '0'; }
}''',
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_returnOfInvalidType_not_issued_for_valid_generic_return() {
    assertNoErrorsInCode(r'''
abstract class F<T, U>  {
  U get value;
}

abstract class G<T> {
  T test(F<int, T> arg) => arg.value;
}

abstract class H<S> {
  S test(F<int, S> arg) => arg.value;
}

void main() { }''');
  }

  void test_returnOfInvalidType_void() {
    assertErrorsInCode("void f() { return 42; }",
        [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]);
  }

  void test_typeArgumentNotMatchingBounds_classTypeAlias() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class C {}
class G<E extends A> {}
class D = G<B> with C;
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_extends() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
class C extends G<B>{}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix() {
    // https://code.google.com/p/dart/issues/detail?id=18628
    assertErrorsInCode(
        r'''
class X<T extends Type> {}
class Y<U> extends X<U> {}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_fieldFormalParameter() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
class C {
  var f;
  C(G<B> this.f) {}
}''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_functionReturnType() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
G<B> f() { return null; }
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_functionTypeAlias() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
typedef G<B> f();
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
f(G<B> h()) {}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_implements() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
class C implements G<B>{}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_is() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
var b = 1 is G<B>;
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_methodReturnType() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
class C {
  G<B> m() { return null; }
}''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_new() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
f() { return new G<B>(); }
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() {
    assertErrorsInCode(
        r'''
class A {}
class B extends A {}
class C extends B {}
class G<E extends B> {}
f() { return new G<A>(); }
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_parameter() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
f(G<B> g) {}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_redirectingConstructor() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class X<T extends A> {
  X(int x, int y) {}
  factory X.name(int x, int y) = X<B>;
}''',
        [
          StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
          StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE
        ]);
  }

  void test_typeArgumentNotMatchingBounds_typeArgumentList() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class C<E> {}
class D<E extends A> {}
C<D<B>> Var;
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_typeParameter() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class C {}
class G<E extends A> {}
class D<F extends G<B>> {}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_variableDeclaration() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
G<B> g;
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeArgumentNotMatchingBounds_with() {
    assertErrorsInCode(
        r'''
class A {}
class B {}
class G<E extends A> {}
class C extends Object with G<B>{}
''',
        [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]);
  }

  void test_typeParameterSupertypeOfItsBound() {
    assertErrorsInCode(
        r'''
class A<T extends T> {
}
''',
        [StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND]);
  }

  void
      test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated() {
    assertErrorsInUnverifiedCode(
        r'''
callMe(f()) { f(); }
main(Object p) {
  (p is String) && callMe(() { p.length; });
  p = 0;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_booleanAnd_useInRight_mutatedInLeft() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  ((p is String) && ((p = 42) == 42)) && p.length != 0;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_booleanAnd_useInRight_mutatedInRight() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  (p is String) && (((p = 42) == 42) && p.length != 0);
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void
      test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after() {
    assertErrorsInUnverifiedCode(
        r'''
callMe(f()) { f(); }
main(Object p) {
  p is String ? callMe(() { p.length; }) : 0;
  p = 42;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void
      test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before() {
    assertErrorsInUnverifiedCode(
        r'''
callMe(f()) { f(); }
main(Object p) {
  p = 42;
  p is String ? callMe(() { p.length; }) : 0;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_conditional_useInThen_hasAssignment() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  p is String ? (p.length + (p = 42)) : 0;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_accessedInClosure_hasAssignment() {
    assertErrorsInUnverifiedCode(
        r'''
callMe(f()) { f(); }
main(Object p) {
  if (p is String) {
    callMe(() {
      p.length;
    });
  }
  p = 0;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_and_right_hasAssignment() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  if (p is String && (p = null) == null) {
    p.length;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_extends_notMoreSpecific_dynamic() {
    assertErrorsInUnverifiedCode(
        r'''
class V {}
class A<T> {}
class B<S> extends A<S> {
  var b;
}

main(A<V> p) {
  if (p is B) {
    p.b;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg() {
    assertErrorsInUnverifiedCode(
        r'''
class V {}
class A<T> {}
class B<S> extends A<S> {
  var b;
}

main(A<V> p) {
  if (p is B<int>) {
    p.b;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_hasAssignment_after() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  if (p is String) {
    p.length;
    p = 0;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_hasAssignment_before() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  if (p is String) {
    p = 0;
    p.length;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  if (p is String) {
    p.length;
  }
  () {p = 0;};
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  () {p = 0;};
  if (p is String) {
    p.length;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_hasAssignment_inClosure_function_after() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  if (p is String) {
    p.length;
  }
  f() {p = 0;};
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_hasAssignment_inClosure_function_before() {
    assertErrorsInUnverifiedCode(
        r'''
main(Object p) {
  f() {p = 0;};
  if (p is String) {
    p.length;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_implements_notMoreSpecific_dynamic() {
    assertErrorsInUnverifiedCode(
        r'''
class V {}
class A<T> {}
class B<S> implements A<S> {
  var b;
}

main(A<V> p) {
  if (p is B) {
    p.b;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_typePromotion_if_with_notMoreSpecific_dynamic() {
    assertErrorsInUnverifiedCode(
        r'''
class V {}
class A<T> {}
class B<S> extends Object with A<S> {
  var b;
}

main(A<V> p) {
  if (p is B) {
    p.b;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedFunction() {
    assertErrorsInCode(
        r'''
void f() {
  g();
}''',
        [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
  }

  void test_undefinedFunction_inCatch() {
    assertErrorsInCode(
        r'''
void f() {
  try {
  } on Object {
    g();
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
  }

  void test_undefinedFunction_inImportedLib() {
    Source source = addSource(r'''
import 'lib.dart' as f;
main() { return f.g(); }''');
    addNamedSource(
        "/lib.dart",
        r'''
library lib;
h() {}''');
    computeLibrarySourceErrors(source);
    assertErrors(source, [StaticTypeWarningCode.UNDEFINED_FUNCTION]);
  }

  void test_undefinedGetter() {
    assertErrorsInUnverifiedCode(
        r'''
class T {}
f(T e) { return e.m; }''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_generic_function_call() {
    // Objects having a specific function type have a call() method, but
    // objects having type Function do not (this is because it is impossible to
    // know what signature the call should have).
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.enableStrictCallChecks = true;
    resetWithOptions(options);
    assertErrorsInUnverifiedCode(
        '''
f(Function f) {
  return f.call;
}
''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_object_call() {
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.enableStrictCallChecks = true;
    resetWithOptions(options);
    assertErrorsInUnverifiedCode(
        '''
f(Object o) {
  return o.call;
}
''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_proxy_annotation_fakeProxy() {
    assertErrorsInCode(
        r'''
library L;
class Fake {
  const Fake();
}
const proxy = const Fake();
@proxy class PrefixProxy {}
main() {
  new PrefixProxy().foo;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_static() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
var a = A.B;''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_typeLiteral_cascadeTarget() {
    assertErrorsInCode(
        r'''
class T {
  static int get foo => 42;
}
main() {
  T..foo;
}''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_typeLiteral_conditionalAccess() {
    // When applied to a type literal, the conditional access operator '?.'
    // cannot be used to access instance getters of Type.
    assertErrorsInCode(
        '''
class A {}
f() => A?.hashCode;
''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_void() {
    assertErrorsInCode(
        r'''
class T {
  void m() {}
}
f(T e) { return e.m().f; }''',
        [StaticTypeWarningCode.UNDEFINED_GETTER]);
  }

  void test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() {
    assertErrorsInCode(
        r'''
class A<K, V> {
  K element;
}
main(A<int> a) {
  a.element.anyGetterExistsInDynamic;
}''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() {
    assertErrorsInCode(
        r'''
class A<E> {
  E element;
}
main(A<int,int> a) {
  a.element.anyGetterExistsInDynamic;
}''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_undefinedGetter_wrongOfTypeArgument() {
    assertErrorsInCode(
        r'''
class A<E> {
  E element;
}
main(A<NoSuchType> a) {
  a.element.anyGetterExistsInDynamic;
}''',
        [StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT]);
  }

  void test_undefinedMethod() {
    assertErrorsInCode(
        r'''
class A {
  void m() {
    n();
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_assignmentExpression() {
    assertErrorsInCode(
        r'''
class A {}
class B {
  f(A a) {
    A a2 = new A();
    a += a2;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_generic_function_call() {
    // Objects having a specific function type have a call() method, but
    // objects having type Function do not (this is because it is impossible to
    // know what signature the call should have).
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.enableStrictCallChecks = true;
    resetWithOptions(options);
    assertErrorsInCode(
        '''
f(Function f) {
  f.call();
}
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_ignoreTypePropagation() {
    assertErrorsInCode(
        r'''
class A {}
class B extends A {
  m() {}
}
class C {
  f() {
    A a = new B();
    a.m();
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_leastUpperBoundWithNull() {
    assertErrorsInCode('f(bool b, int i) => (b ? null : i).foo();',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_object_call() {
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.enableStrictCallChecks = true;
    resetWithOptions(options);
    assertErrorsInCode(
        '''
f(Object o) {
  o.call();
}
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_private() {
    addNamedSource(
        "/lib.dart",
        r'''
library lib;
class A {
  _foo() {}
}''');
    assertErrorsInCode(
        r'''
import 'lib.dart';
class B extends A {
  test() {
    _foo();
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_proxy_annotation_fakeProxy() {
    assertErrorsInCode(
        r'''
library L;
class Fake {
  const Fake();
}
const proxy = const Fake();
@proxy class PrefixProxy {}
main() {
  new PrefixProxy().foo();
}''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_typeLiteral_cascadeTarget() {
    assertErrorsInCode(
        '''
class T {
  static void foo() {}
}
main() {
  T..foo();
}
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethod_typeLiteral_conditionalAccess() {
    // When applied to a type literal, the conditional access operator '?.'
    // cannot be used to access instance methods of Type.
    assertErrorsInCode(
        '''
class A {}
f() => A?.toString();
''',
        [StaticTypeWarningCode.UNDEFINED_METHOD]);
  }

  void test_undefinedMethodWithConstructor() {
    assertErrorsInCode(
        r'''
class C {
  C.m();
}
f() {
  C c = C.m();
}''',
        [StaticTypeWarningCode.UNDEFINED_METHOD_WITH_CONSTRUCTOR]);
  }

  void test_undefinedOperator_indexBoth() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
f(A a) {
  a[0]++;
}''',
        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
  }

  void test_undefinedOperator_indexGetter() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
f(A a) {
  a[0];
}''',
        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
  }

  void test_undefinedOperator_indexSetter() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
f(A a) {
  a[0] = 1;
}''',
        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
  }

  void test_undefinedOperator_plus() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
f(A a) {
  a + 1;
}''',
        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
  }

  void test_undefinedOperator_postfixExpression() {
    assertErrorsInCode(
        r'''
class A {}
f(A a) {
  a++;
}''',
        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
  }

  void test_undefinedOperator_prefixExpression() {
    assertErrorsInCode(
        r'''
class A {}
f(A a) {
  ++a;
}''',
        [StaticTypeWarningCode.UNDEFINED_OPERATOR]);
  }

  void test_undefinedSetter() {
    assertErrorsInUnverifiedCode(
        r'''
class T {}
f(T e1) { e1.m = 0; }''',
        [StaticTypeWarningCode.UNDEFINED_SETTER]);
  }

  void test_undefinedSetter_static() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
f() { A.B = 0;}''',
        [StaticTypeWarningCode.UNDEFINED_SETTER]);
  }

  void test_undefinedSetter_typeLiteral_cascadeTarget() {
    assertErrorsInCode(
        r'''
class T {
  static void set foo(_) {}
}
main() {
  T..foo = 42;
}''',
        [StaticTypeWarningCode.UNDEFINED_SETTER]);
  }

  void test_undefinedSetter_void() {
    assertErrorsInCode(
        r'''
class T {
  void m() {}
}
f(T e) { e.m().f = 0; }''',
        [StaticTypeWarningCode.UNDEFINED_SETTER]);
  }

  void test_undefinedSuperGetter() {
    assertErrorsInCode(
        r'''
class A {}
class B extends A {
  get g {
    return super.g;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_GETTER]);
  }

  void test_undefinedSuperMethod() {
    assertErrorsInCode(
        r'''
class A {}
class B extends A {
  m() { return super.m(); }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_METHOD]);
  }

  void test_undefinedSuperOperator_binaryExpression() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
class B extends A {
  operator +(value) {
    return super + value;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
  }

  void test_undefinedSuperOperator_indexBoth() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
class B extends A {
  operator [](index) {
    return super[index]++;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
  }

  void test_undefinedSuperOperator_indexGetter() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
class B extends A {
  operator [](index) {
    return super[index + 1];
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
  }

  void test_undefinedSuperOperator_indexSetter() {
    assertErrorsInUnverifiedCode(
        r'''
class A {}
class B extends A {
  operator []=(index, value) {
    return super[index] = 0;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR]);
  }

  void test_undefinedSuperSetter() {
    assertErrorsInCode(
        r'''
class A {}
class B extends A {
  f() {
    super.m = 0;
  }
}''',
        [StaticTypeWarningCode.UNDEFINED_SUPER_SETTER]);
  }

  void test_unqualifiedReferenceToNonLocalStaticMember_getter() {
    assertErrorsInCode(
        r'''
class A {
  static int get a => 0;
}
class B extends A {
  int b() {
    return a;
  }
}''',
        [
          StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
        ]);
  }

  void test_unqualifiedReferenceToNonLocalStaticMember_method() {
    assertErrorsInCode(
        r'''
class A {
  static void a() {}
}
class B extends A {
  void b() {
    a();
  }
}''',
        [
          StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
        ]);
  }

  void test_unqualifiedReferenceToNonLocalStaticMember_setter() {
    assertErrorsInCode(
        r'''
class A {
  static set a(x) {}
}
class B extends A {
  b(y) {
    a = y;
  }
}''',
        [
          StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER
        ]);
  }

  void test_wrongNumberOfTypeArguments_classAlias() {
    assertErrorsInCode(
        r'''
class A {}
class M {}
class B<F extends num> = A<F> with M;''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_wrongNumberOfTypeArguments_tooFew() {
    assertErrorsInCode(
        r'''
class A<E, F> {}
A<A> a = null;''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_wrongNumberOfTypeArguments_tooMany() {
    assertErrorsInCode(
        r'''
class A<E> {}
A<A, A> a = null;''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_wrongNumberOfTypeArguments_typeTest_tooFew() {
    assertErrorsInCode(
        r'''
class A {}
class C<K, V> {}
f(p) {
  return p is C<A>;
}''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_wrongNumberOfTypeArguments_typeTest_tooMany() {
    assertErrorsInCode(
        r'''
class A {}
class C<E> {}
f(p) {
  return p is C<A, A>;
}''',
        [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
  }

  void test_yield_async_to_basic_type() {
    assertErrorsInCode(
        '''
int f() async* {
  yield 3;
}
''',
        [
          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
          StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
        ]);
  }

  void test_yield_async_to_iterable() {
    assertErrorsInCode(
        '''
Iterable<int> f() async* {
  yield 3;
}
''',
        [
          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
          StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE
        ]);
  }

  void test_yield_async_to_mistyped_stream() {
    assertErrorsInCode(
        '''
import 'dart:async';
Stream<int> f() async* {
  yield "foo";
}
''',
        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
  }

  void test_yield_each_async_non_stream() {
    assertErrorsInCode(
        '''
f() async* {
  yield* 0;
}
''',
        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
  }

  void test_yield_each_async_to_mistyped_stream() {
    assertErrorsInCode(
        '''
import 'dart:async';
Stream<int> f() async* {
  yield* g();
}
Stream<String> g() => null;
''',
        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
  }

  void test_yield_each_sync_non_iterable() {
    assertErrorsInCode(
        '''
f() sync* {
  yield* 0;
}
''',
        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
  }

  void test_yield_each_sync_to_mistyped_iterable() {
    assertErrorsInCode(
        '''
Iterable<int> f() sync* {
  yield* g();
}
Iterable<String> g() => null;
''',
        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
  }

  void test_yield_sync_to_basic_type() {
    assertErrorsInCode(
        '''
int f() sync* {
  yield 3;
}
''',
        [
          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
          StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
        ]);
  }

  void test_yield_sync_to_mistyped_iterable() {
    assertErrorsInCode(
        '''
Iterable<int> f() sync* {
  yield "foo";
}
''',
        [StaticTypeWarningCode.YIELD_OF_INVALID_TYPE]);
  }

  void test_yield_sync_to_stream() {
    assertErrorsInCode(
        '''
import 'dart:async';
Stream<int> f() sync* {
  yield 3;
}
''',
        [
          StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
          StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE
        ]);
  }
}

@reflectiveTest
class StrongModeStaticTypeWarningCodeTest extends ResolverTestCase {
  void setUp() {
    super.setUp();
    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
    options.strongMode = true;
    resetWithOptions(options);
  }

  void test_genericMethodWrongNumberOfTypeArguments() {
    Source source = addSource('''
f() {}
main() {
  f/*<int>*/();
}
''');
    computeLibrarySourceErrors(source);
    assertErrors(
        source, [StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS]);
    for (AnalysisError error in analysisContext2.computeErrors(source)) {
      if (error.errorCode ==
          StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS) {
        expect(error.message,
            formatList(error.errorCode.message, ['() → dynamic', 0, 1]));
      }
    }
    verify([source]);
  }
}
