blob: cb87325331f9138d9f531d75e8c9095ed5f40ca5 [file] [log] [blame]
/*
* 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.AnalysisError;
import com.google.dart.engine.error.CompileTimeErrorCode;
import com.google.dart.engine.error.ErrorCode;
import com.google.dart.engine.error.HintCode;
import com.google.dart.engine.error.StaticTypeWarningCode;
import com.google.dart.engine.error.StaticWarningCode;
import com.google.dart.engine.source.Source;
public class StaticWarningCodeTest extends ResolverTestCase {
public void fail_returnWithoutValue_async() throws Exception {
// TODO(paulberry): Some async/await type checking has not yet been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"import 'dart:async';",
"Future<int> f() async {",
" return;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.RETURN_WITHOUT_VALUE);
verify(source);
}
public void fail_undefinedGetter() throws Exception {
Source source = addSource(createSource(//
// TODO
));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_GETTER);
verify(source);
}
public void fail_undefinedIdentifier_commentReference() throws Exception {
Source source = addSource(createSource(//
"/** [m] xxx [new B.c] */",
"class A {",
"}"));
resolve(source);
assertErrors(
source,
StaticWarningCode.UNDEFINED_IDENTIFIER,
StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void fail_undefinedSetter() throws Exception {
Source source = addSource(createSource(//
"class C {}",
"f(var p) {",
" C.m = 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_SETTER);
verify(source);
}
public void test_ambiguousImport_as() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"f(p) {p as N;}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_extends() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"class A extends N {}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT, CompileTimeErrorCode.EXTENDS_NON_CLASS);
}
public void test_ambiguousImport_implements() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"class A implements N {}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(
source,
StaticWarningCode.AMBIGUOUS_IMPORT,
CompileTimeErrorCode.IMPLEMENTS_NON_CLASS);
}
public void test_ambiguousImport_inPart() throws Exception {
Source source = addSource(createSource(//
"library lib;",
"import 'lib1.dart';",
"import 'lib2.dart';",
"part 'part.dart';"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
Source partSource = addNamedSource("/part.dart", createSource(//
"part of lib;",
"class A extends N {}"));
resolve(source);
assertErrors(
partSource,
StaticWarningCode.AMBIGUOUS_IMPORT,
CompileTimeErrorCode.EXTENDS_NON_CLASS);
}
public void test_ambiguousImport_instanceCreation() throws Exception {
Source source = addSource(createSource(//
"library L;",
"import 'lib1.dart';",
"import 'lib2.dart';",
"f() {new N();}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_is() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"f(p) {p is N;}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_qualifier() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"g() { N.FOO; }"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_typeAnnotation() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"typedef N FT(N p);",
"N f(N p) {",
" N v;",
" return null;",
"}",
"class A {",
" N m() { return null; }",
"}",
"class B<T extends N> {}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(
source,
StaticWarningCode.AMBIGUOUS_IMPORT,
StaticWarningCode.AMBIGUOUS_IMPORT,
StaticWarningCode.AMBIGUOUS_IMPORT,
StaticWarningCode.AMBIGUOUS_IMPORT,
StaticWarningCode.AMBIGUOUS_IMPORT,
StaticWarningCode.AMBIGUOUS_IMPORT,
StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_typeArgument_annotation() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"class A<T> {}",
"A<N> f() { return null; }"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_typeArgument_instanceCreation() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"class A<T> {}",
"f() {new A<N>();}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"class N {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class N {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_varRead() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"f() { g(v); }",
"g(p) {}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"var v;"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"var v;"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_varWrite() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"f() { v = 0; }"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"var v;"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"var v;"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_ambiguousImport_withPrefix() throws Exception {
Source source = addSource(createSource(//
"library test;",
"import 'lib1.dart' as p;",
"import 'lib2.dart' as p;",
"main() {",
" p.f();",
"}"));
addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"f() {}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"f() {}"));
resolve(source);
assertErrors(source, StaticWarningCode.AMBIGUOUS_IMPORT);
}
public void test_argumentTypeNotAssignable_ambiguousClassName() throws Exception {
// See dartbug.com/19624
Source source = addNamedSource("/lib1.dart", createSource(//
"library lib1;",
"import 'lib2.dart';",
"class _A {}",
"f() {",
" g((_A a) {});",
"}"));
addNamedSource("/lib2.dart", createSource(//
"library lib2;",
"class _A {}",
"g(h(_A a)) {}"));
resolve(source);
// The name _A is private to the library it's defined in, so this is a type mismatch.
// Furthermore, the error message should mention both _A and the filenames
// so the user can figure out what's going on.
AnalysisError[] errors = analysisContext.computeErrors(source);
assertLength(1, errors);
AnalysisError error = errors[0];
assertEquals(error.getErrorCode(), StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
String message = error.getMessage();
assertTrue(message.indexOf("_A") != -1);
assertTrue(message.indexOf("lib1.dart") != -1);
assertTrue(message.indexOf("lib2.dart") != -1);
}
public void test_argumentTypeNotAssignable_annotation_namedConstructor() throws Exception {
Source source = addSource(createSource(//
"class A {",
" const A.fromInt(int p);",
"}",
"@A.fromInt('0')",
"main() {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_annotation_unnamedConstructor() throws Exception {
Source source = addSource(createSource(//
"class A {",
" const A(int p);",
"}",
"@A('0')",
"main() {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_binary() throws Exception {
Source source = addSource(createSource(//
"class A {",
" operator +(int p) {}",
"}",
"f(A a) {",
" a + '0';",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_cascadeSecond() throws Exception {
Source source = addSource(createSource(//
"// filler filler filler filler filler filler filler filler filler filler",
"class A {",
" B ma() { return new B(); }",
"}",
"class B {",
" mb(String p) {}",
"}",
"",
"main() {",
" A a = new A();",
" a.. ma().mb(0);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_const() throws Exception {
Source source = addSource(createSource(//
"class A {",
" const A(String p);",
"}",
"main() {",
" const A(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_const_super() throws Exception {
Source source = addSource(createSource(//
"class A {",
" const A(String p);",
"}",
"class B extends A {",
" const B() : super(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_functionExpressionInvocation_required()
throws Exception {
Source source = addSource(createSource(//
"main() {",
" (int x) {} ('');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_index() throws Exception {
Source source = addSource(createSource(//
"class A {",
" operator [](int index) {}",
"}",
"f(A a) {",
" a['0'];",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_callParameter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" call(int p) {}",
"}",
"f(A a) {",
" a('0');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_callVariable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" call(int p) {}",
"}",
"main() {",
" A a = new A();",
" a('0');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_functionParameter() throws Exception {
Source source = addSource(createSource(//
"a(b(int p)) {",
" b('0');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_functionParameter_generic()
throws Exception {
Source source = addSource(createSource(//
"class A<K, V> {",
" m(f(K k), V v) {",
" f(v);",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_functionTypes_optional() throws Exception {
Source source = addSource(createSource(//
"void acceptFunNumOptBool(void funNumOptBool([bool b])) {}",
"void funNumBool(bool b) {}",
"main() {",
" acceptFunNumOptBool(funNumBool);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_generic() throws Exception {
Source source = addSource(createSource(//
"class A<T> {",
" m(T t) {}",
"}",
"f(A<String> a) {",
" a.m(1);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_named() throws Exception {
Source source = addSource(createSource(//
"f({String p}) {}",
"main() {",
" f(p: 42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_optional() throws Exception {
Source source = addSource(createSource(//
"f([String p]) {}",
"main() {",
" f(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_required() throws Exception {
Source source = addSource(createSource(//
"f(String p) {}",
"main() {",
" f(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_typedef_generic() throws Exception {
Source source = addSource(createSource(//
"typedef A<T>(T p);",
"f(A<int> a) {",
" a('1');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_typedef_local() throws Exception {
Source source = addSource(createSource(//
"typedef A(int p);",
"A getA() => null;",
"main() {",
" A a = getA();",
" a('1');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_invocation_typedef_parameter() throws Exception {
Source source = addSource(createSource(//
"typedef A(int p);",
"f(A a) {",
" a('1');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_new_generic() throws Exception {
Source source = addSource(createSource(//
"class A<T> {",
" A(T p) {}",
"}",
"main() {",
" new A<String>(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_new_optional() throws Exception {
Source source = addSource(createSource(//
"class A {",
" A([String p]) {}",
"}",
"main() {",
" new A(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_argumentTypeNotAssignable_new_required() throws Exception {
Source source = addSource(createSource(//
"class A {",
" A(String p) {}",
"}",
"main() {",
" new A(42);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_assignmentToConst_instanceVariable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static const v = 0;",
"}",
"f() {",
" A.v = 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_CONST);
verify(source);
}
public void test_assignmentToConst_instanceVariable_plusEq() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static const v = 0;",
"}",
"f() {",
" A.v += 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_CONST);
verify(source);
}
public void test_assignmentToConst_localVariable() throws Exception {
Source source = addSource(createSource(//
"f() {",
" const x = 0;",
" x = 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_CONST);
verify(source);
}
public void test_assignmentToConst_localVariable_plusEq() throws Exception {
Source source = addSource(createSource(//
"f() {",
" const x = 0;",
" x += 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_CONST);
verify(source);
}
public void test_assignmentToFinal_instanceVariable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" final v = 0;",
"}",
"f() {",
" A a = new A();",
" a.v = 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_instanceVariable_plusEq() throws Exception {
Source source = addSource(createSource(//
"class A {",
" final v = 0;",
"}",
"f() {",
" A a = new A();",
" a.v += 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_localVariable() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" x = 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_localVariable_plusEq() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" x += 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_postfixMinusMinus() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" x--;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_postfixPlusPlus() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" x++;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_prefixMinusMinus() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" --x;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_prefixPlusPlus() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" ++x;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_suffixMinusMinus() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" x--;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_suffixPlusPlus() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final x = 0;",
" x++;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinal_topLevelVariable() throws Exception {
Source source = addSource(createSource(//
"final x = 0;",
"f() { x = 1; }"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL);
verify(source);
}
public void test_assignmentToFinalNoSetter_prefixedIdentifier() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int get x => 0;",
"}",
"main() {",
" A a = new A();",
" a.x = 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER);
verify(source);
}
public void test_assignmentToFinalNoSetter_propertyAccess() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int get x => 0;",
"}",
"class B {",
" static A a;",
"}",
"main() {",
" B.a.x = 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER);
verify(source);
}
public void test_assignmentToFunction() throws Exception {
Source source = addSource(createSource(//
"f() {}",
"main() {",
" f = null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_FUNCTION);
verify(source);
}
public void test_assignmentToMethod() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m() {}",
"}",
"f(A a) {",
" a.m = () {};",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ASSIGNMENT_TO_METHOD);
verify(source);
}
public void test_caseBlockNotTerminated() throws Exception {
Source source = addSource(createSource(//
"f(int p) {",
" switch (p) {",
" case 0:",
" f(p);",
" case 1:",
" break;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CASE_BLOCK_NOT_TERMINATED);
verify(source);
}
public void test_castToNonType() throws Exception {
Source source = addSource(createSource(//
"var A = 0;",
"f(String s) { var x = s as A; }"));
resolve(source);
assertErrors(source, StaticWarningCode.CAST_TO_NON_TYPE);
verify(source);
}
public void test_concreteClassWithAbstractMember() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER);
verify(source);
}
public void test_conflictingDartImport() throws Exception {
Source source = addSource(createSource(//
"import 'lib.dart';",
"import 'dart:async';",
"Future f = null;",
"Stream s;"));
addNamedSource("/lib.dart", createSource(//
"library lib;",
"class Future {}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_DART_IMPORT);
}
public void test_conflictingInstanceGetterAndSuperclassMember_declField_direct_setter()
throws Exception {
Source source = addSource(createSource(//
"class A {",
" static set v(x) {}",
"}",
"class B extends A {",
" var v;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_getter()
throws Exception {
Source source = addSource(createSource(//
"class A {",
" static get v => 0;",
"}",
"class B extends A {",
" get v => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_method()
throws Exception {
Source source = addSource(createSource(//
"class A {",
" static v() {}",
"}",
"class B extends A {",
" get v => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceGetterAndSuperclassMember_declGetter_direct_setter()
throws Exception {
Source source = addSource(createSource(//
"class A {",
" static set v(x) {}",
"}",
"class B extends A {",
" get v => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceGetterAndSuperclassMember_declGetter_indirect()
throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int v;",
"}",
"class B extends A {}",
"class C extends B {",
" get v => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceGetterAndSuperclassMember_declGetter_mixin() throws Exception {
Source source = addSource(createSource(//
"class M {",
" static int v;",
"}",
"class B extends Object with M {",
" get v => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceGetterAndSuperclassMember_direct_field() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int v;",
"}",
"class B extends A {",
" get v => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingInstanceMethodSetter_sameClass() throws Exception {
Source source = addSource(createSource(//
"class A {",
" set foo(a) {}",
" foo() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER);
verify(source);
}
public void test_conflictingInstanceMethodSetter_setterInInterface() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" set foo(a);",
"}",
"abstract class B implements A {",
" foo() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER);
verify(source);
}
public void test_conflictingInstanceMethodSetter_setterInSuper() throws Exception {
Source source = addSource(createSource(//
"class A {",
" set foo(a) {}",
"}",
"class B extends A {",
" foo() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER);
verify(source);
}
public void test_conflictingInstanceMethodSetter2() throws Exception {
Source source = addSource(createSource(//
"class A {",
" foo() {}",
" set foo(a) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2);
verify(source);
}
public void test_conflictingInstanceSetterAndSuperclassMember() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int v;",
"}",
"class B extends A {",
" set v(x) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER);
verify(source);
}
public void test_conflictingStaticGetterAndInstanceSetter_mixin() throws Exception {
Source source = addSource(createSource(//
"class A {",
" set x(int p) {}",
"}",
"class B extends Object with A {",
" static get x => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER);
verify(source);
}
public void test_conflictingStaticGetterAndInstanceSetter_superClass() throws Exception {
Source source = addSource(createSource(//
"class A {",
" set x(int p) {}",
"}",
"class B extends A {",
" static get x => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER);
verify(source);
}
public void test_conflictingStaticGetterAndInstanceSetter_thisClass() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static get x => 0;",
" set x(int p) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER);
verify(source);
}
public void test_conflictingStaticSetterAndInstanceMember_thisClass_getter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" get x => 0;",
" static set x(int p) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER);
verify(source);
}
public void test_conflictingStaticSetterAndInstanceMember_thisClass_method() throws Exception {
Source source = addSource(createSource(//
"class A {",
" x() {}",
" static set x(int p) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER);
verify(source);
}
public void test_constWithAbstractClass() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" const A();",
"}",
"void f() {",
" A a = const A();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.CONST_WITH_ABSTRACT_CLASS);
verify(source);
}
public void test_equalKeysInMap() throws Exception {
Source source = addSource(createSource(//
"var m = {'a' : 0, 'b' : 1, 'a' : 2};"));
resolve(source);
assertErrors(source, StaticWarningCode.EQUAL_KEYS_IN_MAP);
verify(source);
}
public void test_equalKeysInMap_withEqualTypeParams() throws Exception {
Source source = addSource(createSource(//
"class A<T> {",
" const A();",
"}",
"var m = {const A<int>(): 0, const A<int>(): 1};"));
resolve(source);
assertErrors(source, StaticWarningCode.EQUAL_KEYS_IN_MAP);
verify(source);
}
public void test_equalKeysInMap_withUnequalTypeParams() throws Exception {
// No error should be produced because A<int> and A<num> are different types.
Source source = addSource(createSource(//
"class A<T> {",
" const A();",
"}",
"var m = {const A<int>(): 0, const A<num>(): 1};"));
resolve(source);
assertNoErrors(source);
verify(source);
}
public void test_exportDuplicatedLibraryName() throws Exception {
Source source = addSource(createSource(//
"library test;",
"export 'lib1.dart';",
"export 'lib2.dart';"));
addNamedSource("/lib1.dart", "library lib;");
addNamedSource("/lib2.dart", "library lib;");
resolve(source);
assertErrors(source, StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAME);
verify(source);
}
public void test_extraPositionalArguments() throws Exception {
Source source = addSource(createSource(//
"f() {}",
"main() {",
" f(0, 1, '2');",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS);
verify(source);
}
public void test_extraPositionalArguments_functionExpression() throws Exception {
Source source = addSource(createSource(//
"main() {",
" (int x) {} (0, 1);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS);
verify(source);
}
public void test_fieldInitializedInInitializerAndDeclaration_final() throws Exception {
Source source = addSource(createSource(//
"class A {",
" final int x = 0;",
" A() : x = 1 {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION);
verify(source);
}
public void test_fieldInitializerNotAssignable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int x;",
" A() : x = '';",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE);
verify(source);
}
public void test_fieldInitializingFormalNotAssignable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int x;",
" A(String this.x) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE);
verify(source);
}
/**
* This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
* FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
* coverage over all of the permutations of initializers in constructor declarations.
* <p>
* Note: FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION covers a subset of
* FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, since it more specific, we use it instead of
* the broader code
*/
public void test_finalInitializedInDeclarationAndConstructor_initializers() throws Exception {
Source source = addSource(createSource(//
"class A {",
" final x = 0;",
" A() : x = 0 {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION);
verify(source);
}
public void test_finalInitializedInDeclarationAndConstructor_initializingFormal()
throws Exception {
Source source = addSource(createSource(//
"class A {",
" final x = 0;",
" A(this.x) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR);
verify(source);
}
public void test_finalNotInitialized_inConstructor() throws Exception {
Source source = addSource(createSource(//
"class A {",
" final int x;",
" A() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FINAL_NOT_INITIALIZED);
verify(source);
}
public void test_finalNotInitialized_instanceField_final() throws Exception {
Source source = addSource(createSource(//
"class A {",
" final F;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FINAL_NOT_INITIALIZED);
verify(source);
}
public void test_finalNotInitialized_instanceField_final_static() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static final F;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FINAL_NOT_INITIALIZED);
verify(source);
}
public void test_finalNotInitialized_library_final() throws Exception {
Source source = addSource(createSource(//
"final F;"));
resolve(source);
assertErrors(source, StaticWarningCode.FINAL_NOT_INITIALIZED);
verify(source);
}
public void test_finalNotInitialized_local_final() throws Exception {
Source source = addSource(createSource(//
"f() {",
" final int x;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FINAL_NOT_INITIALIZED);
verify(source);
}
public void test_functionWithoutCall_direct() throws Exception {
Source source = addSource(createSource(//
"class A implements Function {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FUNCTION_WITHOUT_CALL);
verify(source);
}
public void test_functionWithoutCall_indirect_extends() throws Exception {
Source source = addSource(createSource(//
"abstract class A implements Function {",
"}",
"class B extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FUNCTION_WITHOUT_CALL);
verify(source);
}
public void test_functionWithoutCall_indirect_implements() throws Exception {
Source source = addSource(createSource(//
"abstract class A implements Function {",
"}",
"class B implements A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.FUNCTION_WITHOUT_CALL);
verify(source);
}
public void test_importDuplicatedLibraryName() throws Exception {
Source source = addSource(createSource(//
"library test;",
"import 'lib1.dart';",
"import 'lib2.dart';"));
addNamedSource("/lib1.dart", "library lib;");
addNamedSource("/lib2.dart", "library lib;");
resolve(source);
assertErrors(
source,
StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAME,
HintCode.UNUSED_IMPORT,
HintCode.UNUSED_IMPORT);
verify(source);
}
public void test_importOfNonLibrary() throws Exception {
resolve(new String[] {createSource(//
"part of lib;",
"class A {}"),//
createSource(//
"library lib;",
"import 'lib1.dart' deferred as p;",
"var a = new p.A();")}, new ErrorCode[] {StaticWarningCode.IMPORT_OF_NON_LIBRARY});
}
public void test_inconsistentMethodInheritanceGetterAndMethod() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" int x();",
"}",
"abstract class B {",
" int get x;",
"}",
"class C implements A, B {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_field() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static var n;",
"}",
"class B extends A {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_field2() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static var n;",
"}",
"class B extends A {",
"}",
"class C extends B {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_getter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static get n {return 0;}",
"}",
"class B extends A {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_getter2() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static get n {return 0;}",
"}",
"class B extends A {",
"}",
"class C extends B {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_method() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static n () {}",
"}",
"class B extends A {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_method2() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static n () {}",
"}",
"class B extends A {",
"}",
"class C extends B {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_setter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static set n(int x) {}",
"}",
"class B extends A {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_instanceMethodNameCollidesWithSuperclassStatic_setter2() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static set n(int x) {}",
"}",
"class B extends A {",
"}",
"class C extends B {",
" void n() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC);
verify(source);
}
public void test_invalidGetterOverrideReturnType() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int get g { return 0; }",
"}",
"class B extends A {",
" String get g { return 'a'; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidGetterOverrideReturnType_implicit() throws Exception {
Source source = addSource(createSource(//
"class A {",
" String f;",
"}",
"class B extends A {",
" int f;",
"}"));
resolve(source);
assertErrors(
source,
StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidGetterOverrideReturnType_twoInterfaces() throws Exception {
// test from language/override_inheritance_field_test_11.dart
Source source = addSource(createSource(//
"abstract class I {",
" int get getter => null;",
"}",
"abstract class J {",
" num get getter => null;",
"}",
"abstract class A implements I, J {}",
"class B extends A {",
" String get getter => null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidGetterOverrideReturnType_twoInterfaces_conflicting() throws Exception {
Source source = addSource(createSource(//
"abstract class I<U> {",
" U get g => null;",
"}",
"abstract class J<V> {",
" V get g => null;",
"}",
"class B implements I<int>, J<String> {",
" double get g => null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideNamedParamType() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m({int a}) {}",
"}",
"class B implements A {",
" m({String a}) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideNormalParamType_interface() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m(int a) {}",
"}",
"class B implements A {",
" m(String a) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideNormalParamType_superclass() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m(int a) {}",
"}",
"class B extends A {",
" m(String a) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideNormalParamType_superclass_interface() throws Exception {
Source source = addSource(createSource(//
"abstract class I<U> {",
" m(U u) => null;",
"}",
"abstract class J<V> {",
" m(V v) => null;",
"}",
"class B extends I<int> implements J<String> {",
" m(double d) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideNormalParamType_twoInterfaces() throws Exception {
Source source = addSource(createSource(//
"abstract class I {",
" m(int n);",
"}",
"abstract class J {",
" m(num n);",
"}",
"abstract class A implements I, J {}",
"class B extends A {",
" m(String n) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting()
throws Exception {
// language/override_inheritance_generic_test/08
Source source = addSource(createSource(//
"abstract class I<U> {",
" m(U u) => null;",
"}",
"abstract class J<V> {",
" m(V v) => null;",
"}",
"class B implements I<int>, J<String> {",
" m(double d) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideOptionalParamType() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m([int a]) {}",
"}",
"class B implements A {",
" m([String a]) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideOptionalParamType_twoInterfaces() throws Exception {
Source source = addSource(createSource(//
"abstract class I {",
" m([int n]);",
"}",
"abstract class J {",
" m([num n]);",
"}",
"abstract class A implements I, J {}",
"class B extends A {",
" m([String n]) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_interface() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int m() { return 0; }",
"}",
"class B implements A {",
" String m() { return 'a'; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_interface_grandparent() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" int m();",
"}",
"abstract class B implements A {",
"}",
"class C implements B {",
" String m() { return 'a'; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_mixin() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int m() { return 0; }",
"}",
"class B extends Object with A {",
" String m() { return 'a'; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_superclass() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int m() { return 0; }",
"}",
"class B extends A {",
" String m() { return 'a'; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_superclass_grandparent() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int m() { return 0; }",
"}",
"class B extends A {",
"}",
"class C extends B {",
" String m() { return 'a'; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_twoInterfaces() throws Exception {
Source source = addSource(createSource(//
"abstract class I {",
" int m();",
"}",
"abstract class J {",
" num m();",
"}",
"abstract class A implements I, J {}",
"class B extends A {",
" String m() => '';",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidMethodOverrideReturnType_void() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int m() { return 0; }",
"}",
"class B extends A {",
" void m() {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE);
verify(source);
}
public void test_invalidOverrideDifferentDefaultValues_named() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m({int p : 0}) {}",
"}",
"class B extends A {",
" m({int p : 1}) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED);
verify(source);
}
public void test_invalidOverrideDifferentDefaultValues_positional() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m([int p = 0]) {}",
"}",
"class B extends A {",
" m([int p = 1]) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL);
verify(source);
}
public void test_invalidOverrideNamed_fewerNamedParameters() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m({a, b}) {}",
"}",
"class B extends A {",
" m({a}) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_NAMED);
verify(source);
}
public void test_invalidOverrideNamed_missingNamedParameter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m({a, b}) {}",
"}",
"class B extends A {",
" m({a, c}) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_NAMED);
verify(source);
}
public void test_invalidOverridePositional_optional() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m([a, b]) {}",
"}",
"class B extends A {",
" m([a]) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_POSITIONAL);
verify(source);
}
public void test_invalidOverridePositional_optionalAndRequired() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m(a, b, [c, d]) {}",
"}",
"class B extends A {",
" m(a, b, [c]) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_POSITIONAL);
verify(source);
}
public void test_invalidOverridePositional_optionalAndRequired2() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m(a, b, [c, d]) {}",
"}",
"class B extends A {",
" m(a, [c, d]) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_POSITIONAL);
verify(source);
}
public void test_invalidOverrideRequired() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m(a) {}",
"}",
"class B extends A {",
" m(a, b) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_OVERRIDE_REQUIRED);
verify(source);
}
public void test_invalidSetterOverrideNormalParamType() throws Exception {
Source source = addSource(createSource(//
"class A {",
" void set s(int v) {}",
"}",
"class B extends A {",
" void set s(String v) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidSetterOverrideNormalParamType_superclass_interface() throws Exception {
Source source = addSource(createSource(//
"abstract class I {",
" set setter14(int _) => null;",
"}",
"abstract class J {",
" set setter14(num _) => null;",
"}",
"abstract class A extends I implements J {}",
"class B extends A {",
" set setter14(String _) => null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidSetterOverrideNormalParamType_twoInterfaces() throws Exception {
// test from language/override_inheritance_field_test_34.dart
Source source = addSource(createSource(//
"abstract class I {",
" set setter14(int _) => null;",
"}",
"abstract class J {",
" set setter14(num _) => null;",
"}",
"abstract class A implements I, J {}",
"class B extends A {",
" set setter14(String _) => null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting()
throws Exception {
Source source = addSource(createSource(//
"abstract class I<U> {",
" set s(U u) {}",
"}",
"abstract class J<V> {",
" set s(V v) {}",
"}",
"class B implements I<int>, J<String> {",
" set s(double d) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE);
verify(source);
}
public void test_listElementTypeNotAssignable() throws Exception {
Source source = addSource(createSource(//
"var v = <String> [42];"));
resolve(source);
assertErrors(source, StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_mapKeyTypeNotAssignable() throws Exception {
Source source = addSource(createSource(//
"var v = <String, int > {1 : 2};"));
resolve(source);
assertErrors(source, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_mapValueTypeNotAssignable() throws Exception {
Source source = addSource(createSource(//
"var v = <String, String> {'a' : 2};"));
resolve(source);
assertErrors(source, StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
verify(source);
}
public void test_mismatchedAccessorTypes_class() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int get g { return 0; }",
" set g(String v) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES);
verify(source);
}
public void test_mismatchedAccessorTypes_getterAndSuperSetter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int get g { return 0; }",
"}",
"class B extends A {",
" set g(String v) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE);
verify(source);
}
public void test_mismatchedAccessorTypes_setterAndSuperGetter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" set g(int v) {}",
"}",
"class B extends A {",
" String get g { return ''; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE);
verify(source);
}
public void test_mismatchedAccessorTypes_topLevel() throws Exception {
Source source = addSource(createSource(//
"int get g { return 0; }",
"set g(String v) {}"));
resolve(source);
assertErrors(source, StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES);
verify(source);
}
public void test_mixedReturnTypes_localFunction() throws Exception {
Source source = addSource(createSource(//
"class C {",
" m(int x) {",
" return (int y) {",
" if (y < 0) {",
" return;",
" }",
" return 0;",
" };",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.MIXED_RETURN_TYPES, StaticWarningCode.MIXED_RETURN_TYPES);
verify(source);
}
public void test_mixedReturnTypes_method() throws Exception {
Source source = addSource(createSource(//
"class C {",
" m(int x) {",
" if (x < 0) {",
" return;",
" }",
" return 0;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.MIXED_RETURN_TYPES, StaticWarningCode.MIXED_RETURN_TYPES);
verify(source);
}
public void test_mixedReturnTypes_topLevelFunction() throws Exception {
Source source = addSource(createSource(//
"f(int x) {",
" if (x < 0) {",
" return;",
" }",
" return 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.MIXED_RETURN_TYPES, StaticWarningCode.MIXED_RETURN_TYPES);
verify(source);
}
public void test_newWithAbstractClass() throws Exception {
Source source = addSource(createSource(//
"abstract class A {}",
"void f() {",
" A a = new A();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_ABSTRACT_CLASS);
verify(source);
}
public void test_newWithInvalidTypeParameters() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f() { return new A<A>(); }"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS);
verify(source);
}
public void test_newWithInvalidTypeParameters_tooFew() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class C<K, V> {}",
"f(p) {",
" return new C<A>();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS);
verify(source);
}
public void test_newWithInvalidTypeParameters_tooMany() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class C<E> {}",
"f(p) {",
" return new C<A, A>();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS);
verify(source);
}
public void test_newWithNonType() throws Exception {
Source source = addSource(createSource(//
"var A = 0;",
"void f() {",
" var a = new A();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_NON_TYPE);
verify(source);
}
public void test_newWithNonType_fromLibrary() throws Exception {
Source source1 = addNamedSource("lib.dart", "class B {}");
Source source2 = addNamedSource("lib2.dart", createSource(//
"import 'lib.dart' as lib;",
"void f() {",
" var a = new lib.A();",
"}",
"lib.B b;"));
resolve(source1);
resolve(source2);
assertErrors(source2, StaticWarningCode.NEW_WITH_NON_TYPE);
verify(source1);
}
public void test_newWithUndefinedConstructor() throws Exception {
Source source = addSource(createSource(//
"class A {",
" A() {}",
"}",
"f() {",
" new A.name();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR);
// no verify(), 'name' is not resolved
}
public void test_newWithUndefinedConstructorDefault() throws Exception {
Source source = addSource(createSource(//
"class A {",
" A.name() {}",
"}",
"f() {",
" new A();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberFivePlus() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" m();",
" n();",
" o();",
" p();",
" q();",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberFour() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" m();",
" n();",
" o();",
" p();",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface()
throws Exception {
// 15979
Source source = addSource(createSource(//
"abstract class M {}",
"abstract class A {}",
"abstract class I {",
" m();",
"}",
"class B = A with M implements I;"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin()
throws Exception {
// 15979
Source source = addSource(createSource(//
"abstract class M {",
" m();",
"}",
"abstract class A {}",
"class B = A with M;"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass()
throws Exception {
// 15979
Source source = addSource(createSource(//
"class M {}",
"abstract class A {",
" m();",
"}",
"class B = A with M;"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_ensureCorrectFunctionSubtypeIsUsedInImplementation()
throws Exception {
// 15028
Source source = addSource(createSource(//
"class C {",
" foo(int x) => x;",
"}",
"abstract class D {",
" foo(x, [y]);",
"}",
"class E extends C implements D {}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface()
throws Exception {
Source source = addSource(createSource(//
"class I {",
" int get g {return 1;}",
"}",
"class C implements I {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass()
throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" int get g;",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface()
throws Exception {
Source source = addSource(createSource(//
"class I {",
" m(p) {}",
"}",
"class C implements I {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass()
throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" m(p);",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount()
throws Exception {
// 7640
Source source = addSource(createSource(//
"abstract class A {",
" int x(int a);",
"}",
"abstract class B {",
" int x(int a, [int b]);",
"}",
"class C implements A, B {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_getter()
throws Exception {
// 15001
Source source = addSource(createSource(//
"abstract class A { get g1; get g2; }",
"abstract class B implements A { get g1 => 1; }",
"class C extends Object with B {}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_method()
throws Exception {
// 15001
Source source = addSource(createSource(//
"abstract class A { m1(); m2(); }",
"abstract class B implements A { m1() => 1; }",
"class C extends Object with B {}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_setter()
throws Exception {
// 15001
Source source = addSource(createSource(//
"abstract class A { set s1(v); set s2(v); }",
"abstract class B implements A { set s1(v) {} }",
"class C extends Object with B {}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter()
throws Exception {
// test from language/override_inheritance_abstract_test_14.dart
Source source = addSource(createSource(//
"abstract class A {",
" set field(_);",
"}",
"abstract class I {",
" var field;",
"}",
"class B extends A implements I {",
" get field => 0;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface()
throws Exception {
Source source = addSource(createSource(//
"class I {",
" set s(int i) {}",
"}",
"class C implements I {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass()
throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" set s(int i);",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface()
throws Exception {
// bug 11154
Source source = addSource(createSource(//
"class A {",
" get a => 'a';",
"}",
"abstract class B implements A {",
" get b => 'b';",
"}",
"class C extends B {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter()
throws Exception {
// 16133
Source source = addSource(createSource(//
"class I {",
" var v;",
"}",
"class C implements I {",
" set v(_) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter()
throws Exception {
// 16133
Source source = addSource(createSource(//
"class I {",
" var v;",
"}",
"class C implements I {",
" get v => 1;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberThree() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" m();",
" n();",
" o();",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberTwo() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" m();",
" n();",
"}",
"class C extends A {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO);
verify(source);
}
public void test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth()
throws Exception {
// 16133
Source source = addSource(createSource(//
"class I {",
" var v;",
"}",
"class C implements I {",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO);
verify(source);
}
public void test_nonTypeInCatchClause_noElement() throws Exception {
Source source = addSource(createSource(//
"f() {",
" try {",
" } on T catch (e) {",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE);
verify(source);
}
public void test_nonTypeInCatchClause_notType() throws Exception {
Source source = addSource(createSource(//
"var T = 0;",
"f() {",
" try {",
" } on T catch (e) {",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE);
verify(source);
}
public void test_nonVoidReturnForOperator() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int operator []=(a, b) { return a; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR);
verify(source);
}
public void test_nonVoidReturnForSetter_function() throws Exception {
Source source = addSource(createSource(//
"int set x(int v) {",
" return 42;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_VOID_RETURN_FOR_SETTER);
verify(source);
}
public void test_nonVoidReturnForSetter_method() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int set x(int v) {",
" return 42;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NON_VOID_RETURN_FOR_SETTER);
verify(source);
}
public void test_notAType() throws Exception {
Source source = addSource(createSource(//
"f() {}",
"main() {",
" f v = null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NOT_A_TYPE);
verify(source);
}
public void test_notEnoughRequiredArguments() throws Exception {
Source source = addSource(createSource(//
"f(int a, String b) {}",
"main() {",
" f();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
verify(source);
}
public void test_notEnoughRequiredArguments_functionExpression() throws Exception {
Source source = addSource(createSource(//
"main() {",
" (int x) {} ();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
verify(source);
}
public void test_notEnoughRequiredArguments_getterReturningFunction() throws Exception {
Source source = addSource(createSource(//
"typedef Getter(self);",
"Getter getter = (x) => x;",
"main() {",
" getter();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
verify(source);
}
public void test_partOfDifferentLibrary() throws Exception {
Source source = addSource(createSource(//
"library lib;",
"part 'part.dart';"));
addNamedSource("/part.dart", createSource(//
"part of lub;"));
resolve(source);
assertErrors(source, StaticWarningCode.PART_OF_DIFFERENT_LIBRARY);
verify(source);
}
public void test_redirectToInvalidFunctionType() throws Exception {
Source source = addSource(createSource(//
"class A implements B {",
" A(int p) {}",
"}",
"class B {",
" factory B() = A;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE);
verify(source);
}
public void test_redirectToInvalidReturnType() throws Exception {
Source source = addSource(createSource(//
"class A {",
" A() {}",
"}",
"class B {",
" factory B() = A;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE);
verify(source);
}
public void test_redirectToMissingConstructor_named() throws Exception {
Source source = addSource(createSource(//
"class A implements B{",
" A() {}",
"}",
"class B {",
" factory B() = A.name;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
}
public void test_redirectToMissingConstructor_unnamed() throws Exception {
Source source = addSource(createSource(//
"class A implements B{",
" A.name() {}",
"}",
"class B {",
" factory B() = A;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
}
public void test_redirectToNonClass_notAType() throws Exception {
Source source = addSource(createSource(//
"class B {",
" int A;",
" factory B() = A;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.REDIRECT_TO_NON_CLASS);
verify(source);
}
public void test_redirectToNonClass_undefinedIdentifier() throws Exception {
Source source = addSource(createSource(//
"class B {",
" factory B() = A;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.REDIRECT_TO_NON_CLASS);
verify(source);
}
public void test_returnWithoutValue_factoryConstructor() throws Exception {
Source source = addSource(createSource(//
"class A { factory A() { return; } }"));
resolve(source);
assertErrors(source, StaticWarningCode.RETURN_WITHOUT_VALUE);
verify(source);
}
public void test_returnWithoutValue_function() throws Exception {
Source source = addSource(createSource(//
"int f() { return; }"));
resolve(source);
assertErrors(source, StaticWarningCode.RETURN_WITHOUT_VALUE);
verify(source);
}
public void test_returnWithoutValue_method() throws Exception {
Source source = addSource(createSource(//
"class A { int m() { return; } }"));
resolve(source);
assertErrors(source, StaticWarningCode.RETURN_WITHOUT_VALUE);
verify(source);
}
public void test_returnWithoutValue_mixedReturnTypes_function() throws Exception {
// Tests that only the RETURN_WITHOUT_VALUE warning is created, and no MIXED_RETURN_TYPES are
// created.
Source source = addSource(createSource(//
"int f(int x) {",
" if (x < 0) {",
" return 1;",
" }",
" return;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.RETURN_WITHOUT_VALUE);
verify(source);
}
public void test_staticAccessToInstanceMember_method_invocation() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m() {}",
"}",
"main() {",
" A.m();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER);
verify(source);
}
public void test_staticAccessToInstanceMember_method_reference() throws Exception {
Source source = addSource(createSource(//
"class A {",
" m() {}",
"}",
"main() {",
" A.m;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER);
verify(source);
}
public void test_staticAccessToInstanceMember_propertyAccess_field() throws Exception {
Source source = addSource(createSource(//
"class A {",
" var f;",
"}",
"main() {",
" A.f;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER);
verify(source);
}
public void test_staticAccessToInstanceMember_propertyAccess_getter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" get f => 42;",
"}",
"main() {",
" A.f;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER);
verify(source);
}
public void test_staticAccessToInstanceMember_propertyAccess_setter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" set f(x) {}",
"}",
"main() {",
" A.f = 42;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER);
verify(source);
}
public void test_switchExpressionNotAssignable() throws Exception {
Source source = addSource(createSource(//
"f(int p) {",
" switch (p) {",
" case 'a': break;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE);
verify(source);
}
public void test_typeAnnotationDeferredClass_asExpression() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"f(var v) {",
" v as a.A;",
"}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_catchClause() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"f(var v) {",
" try {",
" } on a.A {",
" }",
"}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_fieldFormalParameter() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"class C {",
" var v;",
" C(a.A this.v);",
"}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_functionDeclaration_returnType() throws Exception {
resolve(
new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"a.A f() { return null; }")},
new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_functionTypedFormalParameter_returnType()
throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"f(a.A g()) {}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_isExpression() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"f(var v) {",
" bool b = v is a.A;",
"}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_methodDeclaration_returnType() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"class C {",
" a.A m() { return null; }",
"}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_simpleFormalParameter() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"f(a.A v) {}")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_typeArgumentList() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"class C<E> {}",
"C<a.A> c;")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_typeArgumentList2() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"class C<E, F> {}",
"C<a.A, a.A> c;")}, new ErrorCode[] {
StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS,
StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_typeParameter_bound() throws Exception {
resolve(
new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"class C<E extends a.A> {}")},
new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeAnnotationDeferredClass_variableDeclarationList() throws Exception {
resolve(new String[] {createSource(//
"library lib1;",
"class A {}"),//
createSource(//
"library root;",
"import 'lib1.dart' deferred as a;",
"a.A v;")}, new ErrorCode[] {StaticWarningCode.TYPE_ANNOTATION_DEFERRED_CLASS});
}
public void test_typeParameterReferencedByStatic_field() throws Exception {
Source source = addSource(createSource(//
"class A<K> {",
" static K k;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC);
verify(source);
}
public void test_typeParameterReferencedByStatic_getter() throws Exception {
Source source = addSource(createSource(//
"class A<K> {",
" static K get k => null;",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC);
verify(source);
}
public void test_typeParameterReferencedByStatic_methodBodyReference() throws Exception {
Source source = addSource(createSource(//
"class A<K> {",
" static m() {",
" K k;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC);
verify(source);
}
public void test_typeParameterReferencedByStatic_methodParameter() throws Exception {
Source source = addSource(createSource(//
"class A<K> {",
" static m(K k) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC);
verify(source);
}
public void test_typeParameterReferencedByStatic_methodReturn() throws Exception {
Source source = addSource(createSource(//
"class A<K> {",
" static K m() { return null; }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC);
verify(source);
}
public void test_typeParameterReferencedByStatic_setter() throws Exception {
Source source = addSource(createSource(//
"class A<K> {",
" static set s(K k) {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC);
verify(source);
}
public void test_typePromotion_functionType_arg_InterToDyn() throws Exception {
Source source = addSource(createSource(//
"typedef FuncDyn(x);",
"typedef FuncA(A a);",
"class A {}",
"class B {}",
"main(FuncA f) {",
" if (f is FuncDyn) {", // ignored: dynamic !<< A
" f(new B());",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE);
}
public void test_typeTestNonType() throws Exception {
Source source = addSource(createSource(//
"var A = 0;",
"f(var p) {",
" if (p is A) {",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.TYPE_TEST_NON_TYPE);
verify(source);
}
public void test_undefinedClass_instanceCreation() throws Exception {
Source source = addSource(createSource(//
"f() { new C(); }"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_CLASS);
}
public void test_undefinedClass_variableDeclaration() throws Exception {
Source source = addSource(createSource(//
"f() { C c; }"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_CLASS);
}
public void test_undefinedClassBoolean_variableDeclaration() throws Exception {
Source source = addSource(createSource(//
"f() { boolean v; }"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_CLASS_BOOLEAN);
}
public void test_undefinedGetter_fromLibrary() throws Exception {
Source source1 = addNamedSource("lib.dart", "");
Source source2 = addNamedSource("lib2.dart", createSource(//
"import 'lib.dart' as lib;",
"void f() {",
" var g = lib.gg;",
"}"));
resolve(source1);
resolve(source2);
assertErrors(source2, StaticWarningCode.UNDEFINED_GETTER);
verify(source1);
}
public void test_undefinedIdentifier_for() throws Exception {
Source source = addSource(createSource(//
"f(var l) {",
" for (e in l) {",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedIdentifier_function() throws Exception {
Source source = addSource(createSource(//
"int a() => b;"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedIdentifier_function_prefix() throws Exception {
addNamedSource("/lib.dart", createSource(//
"library lib;",
"class C {}"));
Source source = addSource(createSource(//
"import 'lib.dart' as b;",
"",
"int a() => b;",
"b.C c;"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
verify(source);
}
public void test_undefinedIdentifier_initializer() throws Exception {
Source source = addSource(createSource(//
"var a = b;"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedIdentifier_initializer_prefix() throws Exception {
addNamedSource("/lib.dart", createSource(//
"library lib;",
"class C {}"));
Source source = addSource(createSource(//
"import 'lib.dart' as b;",
"",
"var a = b;",
"b.C c;"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedIdentifier_methodInvocation() throws Exception {
Source source = addSource(createSource(//
"f() { C.m(); }"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedIdentifier_private_getter() throws Exception {
addNamedSource("/lib.dart", createSource(//
"library lib;",
"class A {",
" var _foo;",
"}"));
Source source = addSource(createSource(//
"import 'lib.dart';",
"class B extends A {",
" test() {",
" var v = _foo;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedIdentifier_private_setter() throws Exception {
addNamedSource("/lib.dart", createSource(//
"library lib;",
"class A {",
" var _foo;",
"}"));
Source source = addSource(createSource(//
"import 'lib.dart';",
"class B extends A {",
" test() {",
" _foo = 42;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_IDENTIFIER);
}
public void test_undefinedNamedParameter() throws Exception {
Source source = addSource(createSource(//
"f({a, b}) {}",
"main() {",
" f(c: 1);",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.UNDEFINED_NAMED_PARAMETER);
// no verify(), 'c' is not resolved
}
public void test_undefinedSetter() throws Exception {
Source source1 = addNamedSource("lib.dart", "");
Source source2 = addNamedSource("lib2.dart", createSource(//
"import 'lib.dart' as lib;",
"void f() {",
" lib.gg = null;",
"}"));
resolve(source1);
resolve(source2);
assertErrors(source2, StaticWarningCode.UNDEFINED_SETTER);
}
// See comment on StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER
public void test_undefinedStaticMethodOrGetter_getter() throws Exception {
Source source = addSource(createSource(//
"class C {}",
"f(var p) {",
" f(C.m);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
// See comment on StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER
public void test_undefinedStaticMethodOrGetter_getter_inSuperclass() throws Exception {
Source source = addSource(createSource(//
"class S {",
" static int get g => 0;",
"}",
"class C extends S {}",
"f(var p) {",
" f(C.g);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
// See comment on StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER
public void test_undefinedStaticMethodOrGetter_method() throws Exception {
Source source = addSource(createSource(//
"class C {}",
"f(var p) {",
" f(C.m());",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
// See comment on StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER
public void test_undefinedStaticMethodOrGetter_method_inSuperclass() throws Exception {
Source source = addSource(createSource(//
"class S {",
" static m() {}",
"}",
"class C extends S {}",
"f(var p) {",
" f(C.m());",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
// See comment on StaticWarningCode.UNDEFINED_STATIC_METHOD_OR_GETTER
public void test_undefinedStaticMethodOrGetter_setter_inSuperclass() throws Exception {
Source source = addSource(createSource(//
"class S {",
" static set s(int i) {}",
"}",
"class C extends S {}",
"f(var p) {",
" f(C.s = 1);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_SETTER);
}
public void test_voidReturnForGetter() throws Exception {
Source source = addSource(createSource(//
"class S {",
" void get value {}",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.VOID_RETURN_FOR_GETTER);
}
}