| Index: pkg/analyzer/test/generated/non_hint_code_test.dart
 | 
| diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
 | 
| new file mode 100644
 | 
| index 0000000000000000000000000000000000000000..fff8a6a6b86155e061d59dc644a40ca372988a21
 | 
| --- /dev/null
 | 
| +++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
 | 
| @@ -0,0 +1,1156 @@
 | 
| +// Copyright (c) 2016, 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.non_hint_code_test;
 | 
| +
 | 
| +import 'package:analyzer/src/generated/error.dart';
 | 
| +import 'package:analyzer/src/generated/source_io.dart';
 | 
| +
 | 
| +import '../reflective_tests.dart';
 | 
| +import '../utils.dart';
 | 
| +import 'resolver_test_case.dart';
 | 
| +
 | 
| +main() {
 | 
| +  initializeTestEnvironment();
 | 
| +  runReflectiveTests(NonHintCodeTest);
 | 
| +}
 | 
| +
 | 
| +@reflectiveTest
 | 
| +class NonHintCodeTest extends ResolverTestCase {
 | 
| +  void test_deadCode_deadBlock_conditionalElse_debugConst() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = true;
 | 
| +f() {
 | 
| +  DEBUG ? 1 : 2;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_conditionalIf_debugConst() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = false;
 | 
| +f() {
 | 
| +  DEBUG ? 1 : 2;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_else() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = true;
 | 
| +f() {
 | 
| +  if(DEBUG) {} else {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  static const bool DEBUG = false;
 | 
| +}
 | 
| +f() {
 | 
| +  if(A.DEBUG) {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib2.dart';
 | 
| +f() {
 | 
| +  if(A.DEBUG) {}
 | 
| +}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib2.dart",
 | 
| +        r'''
 | 
| +library lib2;
 | 
| +class A {
 | 
| +  static const bool DEBUG = false;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_if_debugConst_propertyAccessor() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib2.dart' as LIB;
 | 
| +f() {
 | 
| +  if(LIB.A.DEBUG) {}
 | 
| +}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib2.dart",
 | 
| +        r'''
 | 
| +library lib2;
 | 
| +class A {
 | 
| +  static const bool DEBUG = false;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = false;
 | 
| +f() {
 | 
| +  if(DEBUG) {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadBlock_while_debugConst() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = false;
 | 
| +f() {
 | 
| +  while(DEBUG) {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadCatch_onCatchSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {}
 | 
| +f() {
 | 
| +  try {} on B catch (e) {} on A catch (e) {} catch (e) {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadOperandLHS_and_debugConst() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = false;
 | 
| +f() {
 | 
| +  bool b = DEBUG && false;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deadCode_deadOperandLHS_or_debugConst() {
 | 
| +    Source source = addSource(r'''
 | 
| +const bool DEBUG = true;
 | 
| +f() {
 | 
| +  bool b = DEBUG || true;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_deprecatedAnnotationUse_classWithConstructor() {
 | 
| +    Source source = addSource(r'''
 | 
| +@deprecated
 | 
| +class C {
 | 
| +  C();
 | 
| +}
 | 
| +''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_divisionOptimization() {
 | 
| +    Source source = addSource(r'''
 | 
| +f(int x, int y) {
 | 
| +  var v = x / y.toInt();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_divisionOptimization_supressIfDivisionNotDefinedInCore() {
 | 
| +    Source source = addSource(r'''
 | 
| +f(x, y) {
 | 
| +  var v = (x / y).toInt();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_divisionOptimization_supressIfDivisionOverridden() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  num operator /(x) { return x; }
 | 
| +}
 | 
| +f(A x, A y) {
 | 
| +  var v = (x / y).toInt();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_duplicateImport_as() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart';
 | 
| +import 'lib1.dart' as one;
 | 
| +A a;
 | 
| +one.A a2;''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +class A {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_duplicateImport_hide() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart';
 | 
| +import 'lib1.dart' hide A;
 | 
| +A a;
 | 
| +B b;''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +class A {}
 | 
| +class B {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_duplicateImport_show() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart';
 | 
| +import 'lib1.dart' show A;
 | 
| +A a;
 | 
| +B b;''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +class A {}
 | 
| +class B {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_importDeferredLibraryWithLoadFunction() {
 | 
| +    resolveWithErrors(<String>[
 | 
| +      r'''
 | 
| +library lib1;
 | 
| +f() {}''',
 | 
| +      r'''
 | 
| +library root;
 | 
| +import 'lib1.dart' deferred as lib1;
 | 
| +main() { lib1.f(); }'''
 | 
| +    ], ErrorCode.EMPTY_LIST);
 | 
| +  }
 | 
| +
 | 
| +  void test_issue20904BuggyTypePromotionAtIfJoin_1() {
 | 
| +    // https://code.google.com/p/dart/issues/detail?id=20904
 | 
| +    Source source = addSource(r'''
 | 
| +f(var message, var dynamic_) {
 | 
| +  if (message is Function) {
 | 
| +    message = dynamic_;
 | 
| +  }
 | 
| +  int s = message;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_issue20904BuggyTypePromotionAtIfJoin_3() {
 | 
| +    // https://code.google.com/p/dart/issues/detail?id=20904
 | 
| +    Source source = addSource(r'''
 | 
| +f(var message) {
 | 
| +  var dynamic_;
 | 
| +  if (message is Function) {
 | 
| +    message = dynamic_;
 | 
| +  } else {
 | 
| +    return;
 | 
| +  }
 | 
| +  int s = message;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_issue20904BuggyTypePromotionAtIfJoin_4() {
 | 
| +    // https://code.google.com/p/dart/issues/detail?id=20904
 | 
| +    Source source = addSource(r'''
 | 
| +f(var message) {
 | 
| +  if (message is Function) {
 | 
| +    message = '';
 | 
| +  } else {
 | 
| +    return;
 | 
| +  }
 | 
| +  String s = message;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_missingReturn_emptyFunctionBody() {
 | 
| +    Source source = addSource(r'''
 | 
| +abstract class A {
 | 
| +  int m();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_missingReturn_expressionFunctionBody() {
 | 
| +    Source source = addSource("int f() => 0;");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_missingReturn_noReturnType() {
 | 
| +    Source source = addSource("f() {}");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_missingReturn_voidReturnType() {
 | 
| +    Source source = addSource("void f() {}");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_nullAwareInCondition_for_noCondition() {
 | 
| +    Source source = addSource(r'''
 | 
| +m(x) {
 | 
| +  for (var v = x; ; v++) {}
 | 
| +}
 | 
| +''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_nullAwareInCondition_if_notTopLevel() {
 | 
| +    Source source = addSource(r'''
 | 
| +m(x) {
 | 
| +  if (x?.y == null) {}
 | 
| +}
 | 
| +''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideEqualsButNotHashCode() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  bool operator ==(x) { return x; }
 | 
| +  get hashCode => 0;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideOnNonOverridingGetter_inInterface() {
 | 
| +    Source source = addSource(r'''
 | 
| +library dart.core;
 | 
| +const override = null;
 | 
| +class A {
 | 
| +  int get m => 0;
 | 
| +}
 | 
| +class B implements A {
 | 
| +  @override
 | 
| +  int get m => 1;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideOnNonOverridingGetter_inSuperclass() {
 | 
| +    Source source = addSource(r'''
 | 
| +library dart.core;
 | 
| +const override = null;
 | 
| +class A {
 | 
| +  int get m => 0;
 | 
| +}
 | 
| +class B extends A {
 | 
| +  @override
 | 
| +  int get m => 1;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideOnNonOverridingMethod_inInterface() {
 | 
| +    Source source = addSource(r'''
 | 
| +library dart.core;
 | 
| +const override = null;
 | 
| +class A {
 | 
| +  int m() => 0;
 | 
| +}
 | 
| +class B implements A {
 | 
| +  @override
 | 
| +  int m() => 1;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideOnNonOverridingMethod_inSuperclass() {
 | 
| +    Source source = addSource(r'''
 | 
| +library dart.core;
 | 
| +const override = null;
 | 
| +class A {
 | 
| +  int m() => 0;
 | 
| +}
 | 
| +class B extends A {
 | 
| +  @override
 | 
| +  int m() => 1;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideOnNonOverridingSetter_inInterface() {
 | 
| +    Source source = addSource(r'''
 | 
| +library dart.core;
 | 
| +const override = null;
 | 
| +class A {
 | 
| +  set m(int x) {}
 | 
| +}
 | 
| +class B implements A {
 | 
| +  @override
 | 
| +  set m(int x) {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_overrideOnNonOverridingSetter_inSuperclass() {
 | 
| +    Source source = addSource(r'''
 | 
| +library dart.core;
 | 
| +const override = null;
 | 
| +class A {
 | 
| +  set m(int x) {}
 | 
| +}
 | 
| +class B extends A {
 | 
| +  @override
 | 
| +  set m(int x) {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_propagatedFieldType() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A { }
 | 
| +class X<T> {
 | 
| +  final x = new List<T>();
 | 
| +}
 | 
| +class Z {
 | 
| +  final X<A> y = new X<A>();
 | 
| +  foo() {
 | 
| +    y.x.add(new A());
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_proxy_annotation_prefixed() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +@proxy
 | 
| +class A {}
 | 
| +f(var a) {
 | 
| +  a = new 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(var a) {
 | 
| +    a = new 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(var a) {
 | 
| +    a = new 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_undefinedGetter_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  get b => 0;
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    return a.b;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedMethod_assignmentExpression_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator +(B b) {return new B();}
 | 
| +}
 | 
| +f(var a, var a2) {
 | 
| +  a = new A();
 | 
| +  a2 = new A();
 | 
| +  a += a2;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedMethod_dynamic() {
 | 
| +    Source source = addSource(r'''
 | 
| +class D<T extends dynamic> {
 | 
| +  fieldAccess(T t) => t.abc;
 | 
| +  methodAccess(T t) => t.xyz(1, 2, 'three');
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedMethod_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  b() {}
 | 
| +}
 | 
| +f() {
 | 
| +  var a = new A();
 | 
| +  a.b();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedMethod_unionType_all() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  int m(int x) => 0;
 | 
| +}
 | 
| +class B {
 | 
| +  String m() => '0';
 | 
| +}
 | 
| +f(A a, B b) {
 | 
| +  var ab;
 | 
| +  if (0 < 1) {
 | 
| +    ab = a;
 | 
| +  } else {
 | 
| +    ab = b;
 | 
| +  }
 | 
| +  ab.m();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedMethod_unionType_some() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  int m(int x) => 0;
 | 
| +}
 | 
| +class B {}
 | 
| +f(A a, B b) {
 | 
| +  var ab;
 | 
| +  if (0 < 1) {
 | 
| +    ab = a;
 | 
| +  } else {
 | 
| +    ab = b;
 | 
| +  }
 | 
| +  ab.m(0);
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedOperator_binaryExpression_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator +(B b) {}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    a + 1;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedOperator_indexBoth_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator [](int index) {}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    a[0]++;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedOperator_indexGetter_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator [](int index) {}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    a[0];
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedOperator_indexSetter_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator []=(i, v) {}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    a[0] = 1;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedOperator_postfixExpression() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator +(B b) {return new B();}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    a++;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedOperator_prefixExpression() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  operator +(B b) {return new B();}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    ++a;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_undefinedSetter_inSubtype() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {}
 | 
| +class B extends A {
 | 
| +  set b(x) {}
 | 
| +}
 | 
| +f(var a) {
 | 
| +  if(a is A) {
 | 
| +    a.b = 0;
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryCast_13855_parameter_A() {
 | 
| +    // dartbug.com/13855, dartbug.com/13732
 | 
| +    Source source = addSource(r'''
 | 
| +class A{
 | 
| +  a() {}
 | 
| +}
 | 
| +class B<E> {
 | 
| +  E e;
 | 
| +  m() {
 | 
| +    (e as A).a();
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryCast_conditionalExpression() {
 | 
| +    Source source = addSource(r'''
 | 
| +abstract class I {}
 | 
| +class A implements I {}
 | 
| +class B implements I {}
 | 
| +I m(A a, B b) {
 | 
| +  return a == null ? b as I : a as I;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryCast_dynamic_type() {
 | 
| +    Source source = addSource(r'''
 | 
| +m(v) {
 | 
| +  var b = v as Object;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryCast_generics() {
 | 
| +    // dartbug.com/18953
 | 
| +    Source source = addSource(r'''
 | 
| +import 'dart:async';
 | 
| +Future<int> f() => new Future.value(0);
 | 
| +void g(bool c) {
 | 
| +  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryCast_type_dynamic() {
 | 
| +    Source source = addSource(r'''
 | 
| +m(v) {
 | 
| +  var b = Object as dynamic;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryNoSuchMethod_blockBody_notReturnStatement() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  noSuchMethod(x) => super.noSuchMethod(x);
 | 
| +}
 | 
| +class B extends A {
 | 
| +  mmm();
 | 
| +  noSuchMethod(y) {
 | 
| +    print(y);
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryNoSuchMethod_blockBody_notSingleStatement() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  noSuchMethod(x) => super.noSuchMethod(x);
 | 
| +}
 | 
| +class B extends A {
 | 
| +  mmm();
 | 
| +  noSuchMethod(y) {
 | 
| +    print(y);
 | 
| +    return super.noSuchMethod(y);
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryNoSuchMethod_expressionBody_notNoSuchMethod() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  noSuchMethod(x) => super.noSuchMethod(x);
 | 
| +}
 | 
| +class B extends A {
 | 
| +  mmm();
 | 
| +  noSuchMethod(y) => super.hashCode;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unnecessaryNoSuchMethod_expressionBody_notSuper() {
 | 
| +    Source source = addSource(r'''
 | 
| +class A {
 | 
| +  noSuchMethod(x) => super.noSuchMethod(x);
 | 
| +}
 | 
| +class B extends A {
 | 
| +  mmm();
 | 
| +  noSuchMethod(y) => 42;
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_annotationOnDirective() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +@A()
 | 
| +import 'lib1.dart';''');
 | 
| +    Source source2 = addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +class A {
 | 
| +  const A() {}
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(source);
 | 
| +    verify([source, source2]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_as_equalPrefixes() {
 | 
| +    // 18818
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart' as one;
 | 
| +import 'lib2.dart' as one;
 | 
| +one.A a;
 | 
| +one.B b;''');
 | 
| +    Source source2 = addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +class A {}''');
 | 
| +    Source source3 = addNamedSource(
 | 
| +        "/lib2.dart",
 | 
| +        r'''
 | 
| +library lib2;
 | 
| +class B {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(source);
 | 
| +    assertNoErrors(source2);
 | 
| +    assertNoErrors(source3);
 | 
| +    verify([source, source2, source3]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_core_library() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'dart:core';''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_export() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart';
 | 
| +Two two;''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +export 'lib2.dart';
 | 
| +class One {}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib2.dart",
 | 
| +        r'''
 | 
| +library lib2;
 | 
| +class Two {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_export2() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart';
 | 
| +Three three;''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +export 'lib2.dart';
 | 
| +class One {}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib2.dart",
 | 
| +        r'''
 | 
| +library lib2;
 | 
| +export 'lib3.dart';
 | 
| +class Two {}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib3.dart",
 | 
| +        r'''
 | 
| +library lib3;
 | 
| +class Three {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_export_infiniteLoop() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart';
 | 
| +Two two;''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +export 'lib2.dart';
 | 
| +class One {}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib2.dart",
 | 
| +        r'''
 | 
| +library lib2;
 | 
| +export 'lib3.dart';
 | 
| +class Two {}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib3.dart",
 | 
| +        r'''
 | 
| +library lib3;
 | 
| +export 'lib2.dart';
 | 
| +class Three {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_metadata() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +@A(x)
 | 
| +import 'lib1.dart';
 | 
| +class A {
 | 
| +  final int value;
 | 
| +  const A(this.value);
 | 
| +}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +const x = 0;''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_unusedImport_prefix_topLevelFunction() {
 | 
| +    Source source = addSource(r'''
 | 
| +library L;
 | 
| +import 'lib1.dart' hide topLevelFunction;
 | 
| +import 'lib1.dart' as one show topLevelFunction;
 | 
| +class A {
 | 
| +  static void x() {
 | 
| +    One o;
 | 
| +    one.topLevelFunction();
 | 
| +  }
 | 
| +}''');
 | 
| +    addNamedSource(
 | 
| +        "/lib1.dart",
 | 
| +        r'''
 | 
| +library lib1;
 | 
| +class One {}
 | 
| +topLevelFunction() {}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_useOfVoidResult_implicitReturnValue() {
 | 
| +    Source source = addSource(r'''
 | 
| +f() {}
 | 
| +class A {
 | 
| +  n() {
 | 
| +    var a = f();
 | 
| +  }
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +
 | 
| +  void test_useOfVoidResult_nonVoidReturnValue() {
 | 
| +    Source source = addSource(r'''
 | 
| +int f() => 1;
 | 
| +g() {
 | 
| +  var a = f();
 | 
| +}''');
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +    verify([source]);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +class PubSuggestionCodeTest extends ResolverTestCase {
 | 
| +  void test_import_package() {
 | 
| +    Source source = addSource("import 'package:somepackage/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(source, [CompileTimeErrorCode.URI_DOES_NOT_EXIST]);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_packageWithDotDot() {
 | 
| +    Source source = addSource("import 'package:somepackage/../other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(source, [
 | 
| +      CompileTimeErrorCode.URI_DOES_NOT_EXIST,
 | 
| +      HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
 | 
| +    ]);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_packageWithLeadingDotDot() {
 | 
| +    Source source = addSource("import 'package:../other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(source, [
 | 
| +      CompileTimeErrorCode.URI_DOES_NOT_EXIST,
 | 
| +      HintCode.PACKAGE_IMPORT_CONTAINS_DOT_DOT
 | 
| +    ]);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_referenceIntoLibDirectory() {
 | 
| +    cacheSource("/myproj/pubspec.yaml", "");
 | 
| +    cacheSource("/myproj/lib/other.dart", "");
 | 
| +    Source source =
 | 
| +    addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(
 | 
| +        source, [HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE]);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_referenceIntoLibDirectory_no_pubspec() {
 | 
| +    cacheSource("/myproj/lib/other.dart", "");
 | 
| +    Source source =
 | 
| +    addNamedSource("/myproj/web/test.dart", "import '../lib/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_referenceOutOfLibDirectory() {
 | 
| +    cacheSource("/myproj/pubspec.yaml", "");
 | 
| +    cacheSource("/myproj/web/other.dart", "");
 | 
| +    Source source =
 | 
| +    addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertErrors(
 | 
| +        source, [HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE]);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_referenceOutOfLibDirectory_no_pubspec() {
 | 
| +    cacheSource("/myproj/web/other.dart", "");
 | 
| +    Source source =
 | 
| +    addNamedSource("/myproj/lib/test.dart", "import '../web/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_valid_inside_lib1() {
 | 
| +    cacheSource("/myproj/pubspec.yaml", "");
 | 
| +    cacheSource("/myproj/lib/other.dart", "");
 | 
| +    Source source =
 | 
| +    addNamedSource("/myproj/lib/test.dart", "import 'other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_valid_inside_lib2() {
 | 
| +    cacheSource("/myproj/pubspec.yaml", "");
 | 
| +    cacheSource("/myproj/lib/bar/other.dart", "");
 | 
| +    Source source = addNamedSource(
 | 
| +        "/myproj/lib/foo/test.dart", "import '../bar/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +
 | 
| +  void test_import_valid_outside_lib() {
 | 
| +    cacheSource("/myproj/pubspec.yaml", "");
 | 
| +    cacheSource("/myproj/web/other.dart", "");
 | 
| +    Source source =
 | 
| +    addNamedSource("/myproj/lib2/test.dart", "import '../web/other.dart';");
 | 
| +    computeLibrarySourceErrors(source);
 | 
| +    assertNoErrors(source);
 | 
| +  }
 | 
| +}
 | 
| 
 |