/*
* Copyright (c) 2013, the Dart project authors.
*
* Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.eclipse.org/legal/epl-v10.html
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.dart.engine.resolver;
import com.google.dart.engine.error.ErrorCode;
import com.google.dart.engine.source.Source;
public class NonHintCodeTest extends ResolverTestCase {
public void test_deadCode_deadBlock_conditionalElse_debugConst() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = true;",
"f() {",
" DEBUG ? 1 : 2;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_conditionalIf_debugConst() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = false;",
"f() {",
" DEBUG ? 1 : 2;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_else() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = true;",
"f() {",
" if(DEBUG) {} else {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static const bool DEBUG = false;",
"}",
"f() {",
" if(A.DEBUG) {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_if_debugConst_prefixedIdentifier2() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib2.dart';",
"f() {",
" if(A.DEBUG) {}",
"}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class A {",
" static const bool DEBUG = false;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_if_debugConst_propertyAccessor() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib2.dart' as LIB;",
"f() {",
" if(LIB.A.DEBUG) {}",
"}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class A {",
" static const bool DEBUG = false;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_if_debugConst_simpleIdentifier() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = false;",
"f() {",
" if(DEBUG) {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadBlock_while_debugConst() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = false;",
"f() {",
" while(DEBUG) {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadCatch_onCatchSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {}",
"f() {",
" try {} on B catch (e) {} on A catch (e) {} catch (e) {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadOperandLHS_and_debugConst() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = false;",
"f() {",
" bool b = DEBUG && false;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_deadCode_deadOperandLHS_or_debugConst() throws Exception {
Source source = addSource(createSource(//
"const bool DEBUG = true;",
"f() {",
" bool b = DEBUG || true;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_divisionOptimization() throws Exception {
Source source = addSource(createSource(//
"f(int x, int y) {",
" var v = x / y.toInt();",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_divisionOptimization_supressIfDivisionNotDefinedInCore() throws Exception {
Source source = addSource(createSource(//
"f(x, y) {",
" var v = (x / y).toInt();",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_divisionOptimization_supressIfDivisionOverridden() throws Exception {
Source source = addSource(createSource(//
"class A {",
" num operator /(x) { return x; }",
"}",
"f(A x, A y) {",
" var v = (x / y).toInt();",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_duplicateImport_as() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"import 'lib1.dart' as one;",
"A a;",
"one.A a2;"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class A {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_duplicateImport_hide() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"import 'lib1.dart' hide A;",
"A a;",
"B b;"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class A {}",
"class B {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_duplicateImport_show() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"import 'lib1.dart' show A;",
"A a;",
"B b;"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class A {}",
"class B {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_importDeferredLibraryWithLoadFunction() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"f() {}"), //
createSource(//
"library root;",
"import 'lib1.dart' deferred as lib1;",
"main() { lib1.f(); }")}, new ErrorCode[] {});
}
public void test_issue20904BuggyTypePromotionAtIfJoin_1() throws Exception {
// https://code.google.com/p/dart/issues/detail?id=20904
Source source = addSource(createSource(//
"f(var message, var dynamic_) {",
" if (message is Function) {",
" message = dynamic_;",
" }",
" int s = message;", // Here [message] could have any type.
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_issue20904BuggyTypePromotionAtIfJoin_2() throws Exception {
// https://code.google.com/p/dart/issues/detail?id=20904
enableUnionTypes(false);
Source source = addSource(createSource(//
"f(var message) {",
" if (message is Function) {",
" message = '';",
" }",
" int s = message;", // Here [message] could have any type.
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_issue20904BuggyTypePromotionAtIfJoin_3() throws Exception {
// https://code.google.com/p/dart/issues/detail?id=20904
Source source = addSource(createSource(//
"f(var message) {",
" var dynamic_;",
" if (message is Function) {",
" message = dynamic_;",
" } else {",
" return;",
" }",
" int s = message;", // Here [message] could have any type.
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_issue20904BuggyTypePromotionAtIfJoin_4() throws Exception {
// https://code.google.com/p/dart/issues/detail?id=20904
Source source = addSource(createSource(//
"f(var message) {",
" if (message is Function) {",
" message = '';",
" } else {",
" return;",
" }",
" String s = message;", // Here [message] is necessarily a string.
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_missingReturn_emptyFunctionBody() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" int m();",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_missingReturn_expressionFunctionBody() throws Exception {
Source source = addSource(createSource(//
"int f() => 0;"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_missingReturn_noReturnType() throws Exception {
Source source = addSource(createSource(//
"f() {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_missingReturn_voidReturnType() throws Exception {
Source source = addSource(createSource(//
"void f() {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideEqualsButNotHashCode() throws Exception {
Source source = addSource(createSource(//
"class A {",
" bool operator ==(x) { return x; }",
" get hashCode => 0;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideOnNonOverridingGetter_inInterface() throws Exception {
Source source = addSource(createSource(//
"library dart.core;",
"const override = null;",
"class A {",
" int get m => 0;",
"}",
"class B implements A {",
" @override",
" int get m => 1;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideOnNonOverridingGetter_inSuperclass() throws Exception {
Source source = addSource(createSource(//
"library dart.core;",
"const override = null;",
"class A {",
" int get m => 0;",
"}",
"class B extends A {",
" @override",
" int get m => 1;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideOnNonOverridingMethod_inInterface() throws Exception {
Source source = addSource(createSource(//
"library dart.core;",
"const override = null;",
"class A {",
" int m() => 0;",
"}",
"class B implements A {",
" @override",
" int m() => 1;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideOnNonOverridingMethod_inSuperclass() throws Exception {
Source source = addSource(createSource(//
"library dart.core;",
"const override = null;",
"class A {",
" int m() => 0;",
"}",
"class B extends A {",
" @override",
" int m() => 1;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideOnNonOverridingSetter_inInterface() throws Exception {
Source source = addSource(createSource(//
"library dart.core;",
"const override = null;",
"class A {",
" set m(int x) {}",
"}",
"class B implements A {",
" @override",
" set m(int x) {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_overrideOnNonOverridingSetter_inSuperclass() throws Exception {
Source source = addSource(createSource(//
"library dart.core;",
"const override = null;",
"class A {",
" set m(int x) {}",
"}",
"class B extends A {",
" @override",
" set m(int x) {}",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_propagatedFieldType() throws Exception {
// From dartbug.com/20019
Source source = addSource(createSource(//
"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());",
" }",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_proxy_annotation_prefixed() throws Exception {
Source source = addSource(createSource(//
"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;",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_proxy_annotation_prefixed2() throws Exception {
Source source = addSource(createSource(//
"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;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_proxy_annotation_prefixed3() throws Exception {
Source source = addSource(createSource(//
"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 {}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedGetter_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" get b => 0;",
"}",
"f(var a) {",
" if(a is A) {",
" return a.b;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedMethod_assignmentExpression_inSubtype() throws Exception {
Source source = addSource(createSource(//
"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;",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedMethod_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" b() {}",
"}",
"f() {",
" var a = new A();",
" a.b();",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedMethod_unionType_all() throws Exception {
Source source = addSource(createSource(//
"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();",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedMethod_unionType_some() throws Exception {
Source source = addSource(createSource(//
"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);",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedOperator_binaryExpression_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" operator +(B b) {}",
"}",
"f(var a) {",
" if(a is A) {",
" a + 1;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedOperator_indexBoth_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" operator [](int index) {}",
"}",
"f(var a) {",
" if(a is A) {",
" a[0]++;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedOperator_indexGetter_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" operator [](int index) {}",
"}",
"f(var a) {",
" if(a is A) {",
" a[0];",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedOperator_indexSetter_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" operator []=(i, v) {}",
"}",
"f(var a) {",
" if(a is A) {",
" a[0] = 1;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedOperator_postfixExpression() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" operator +(B b) {return new B();}",
"}",
"f(var a) {",
" if(a is A) {",
" a++;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedOperator_prefixExpression() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" operator +(B b) {return new B();}",
"}",
"f(var a) {",
" if(a is A) {",
" ++a;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_undefinedSetter_inSubtype() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" set b(x) {}",
"}",
"f(var a) {",
" if(a is A) {",
" a.b = 0;",
" }",
"}"));
resolve(source);
assertNoErrors(source);
}
public void test_unnecessaryCast_13855_parameter_A() throws Exception {
// dartbug.com/13855, dartbug.com/13732
Source source = addSource(createSource(//
"class A{",
" a() {}",
"}",
"class B<E> {",
" E e;",
" m() {",
" (e as A).a();",
" }",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unnecessaryCast_dynamic_type() throws Exception {
Source source = addSource(createSource(//
"m(v) {",
" var b = v as Object;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unnecessaryCast_generics() throws Exception {
// dartbug.com/18953
Source source = addSource(createSource(//
"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) {});",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unnecessaryCast_type_dynamic() throws Exception {
Source source = addSource(createSource(//
"m(v) {",
" var b = Object as dynamic;",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unusedImport_annotationOnDirective() throws Exception {
Source source = addSource(createSource(//
"library L;",
"@A()",
"import 'lib1.dart';"));
Source source2 = addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class A {",
" const A() {}",
"}"));
resolve(source);
assertErrors(source);
verify(source, source2);
}
public void test_unusedImport_as_equalPrefixes() throws Exception {
// 18818
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart' as one;",
"import 'lib2.dart' as one;",
"one.A a;",
"one.B b;"));
Source source2 = addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class A {}"));
Source source3 = addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class B {}"));
resolve(source);
assertErrors(source);
assertNoErrors(source2);
assertNoErrors(source3);
verify(source, source2, source3);
}
public void test_unusedImport_core_library() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'dart:core';"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unusedImport_export() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"Two two;"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"export 'lib2.dart';",
"class One {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class Two {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unusedImport_export_infiniteLoop() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"Two two;"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"export 'lib2.dart';",
"class One {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"export 'lib3.dart';",
"class Two {}"));
addNamedSource("/lib3.dart", createSource(//
"library lib3;",
"export 'lib2.dart';",
"class Three {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unusedImport_export2() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"Three three;"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"export 'lib2.dart';",
"class One {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"export 'lib3.dart';",
"class Two {}"));
addNamedSource("/lib3.dart", createSource(//
"library lib3;",
"class Three {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unusedImport_metadata() throws Exception {
Source source = addSource(createSource(//
"library L;",
"@A(x)",
"import 'lib1.dart';",
"class A {",
" final int value;",
" const A(this.value);",
"}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"const x = 0;"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_unusedImport_prefix_topLevelFunction() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart' hide topLevelFunction;", // used by One o
"import 'lib1.dart' as one show topLevelFunction;", // used by one.top...
"class A {",
" static void x() {",
" One o;",
" one.topLevelFunction();",
" }",
"}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class One {}",
"topLevelFunction() {}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_useOfVoidResult_implicitReturnValue() throws Exception {
Source source = addSource(createSource(//
"f() {}",
"class A {",
" n() {",
" var a = f();",
" }",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_useOfVoidResult_nonVoidReturnValue() throws Exception {
Source source = addSource(createSource(//
"int f() => 1;",
"g() {",
" var a = f();",
"}"));
resolve(source);
assertNoErrors(source);
verify(source);
}
}