blob: 4aa26979c25ac8094f23d5f0b9ea78034fb4ef77 [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.HintCode;
import com.google.dart.engine.error.StaticTypeWarningCode;
import com.google.dart.engine.error.StaticWarningCode;
import com.google.dart.engine.source.Source;
public class StaticTypeWarningCodeTest extends ResolverTestCase {
public void fail_await_flattened() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"import 'dart:async';",
"Future<Future<int>> ffi() => null;",
"f() async {",
" Future<int> b = await ffi(); // Warning: int not assignable to Future<int>",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void fail_await_simple() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"import 'dart:async';",
"Future<int> fi() => null;",
"f() async {",
" String a = await fi(); // Warning: int not assignable to String",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void fail_illegal_return_type_async_function() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"int f() async {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, HintCode.MISSING_RETURN);
verify(source);
}
public void fail_illegal_return_type_async_generator_function() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"int f() async* {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void fail_illegal_return_type_async_generator_method() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"class C",
" int f() async* {}",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void fail_illegal_return_type_async_method() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"class C {",
" int f() async {}",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE, HintCode.MISSING_RETURN);
verify(source);
}
public void fail_illegal_return_type_sync_generator_method() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"class C",
" int f() sync* {}",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void fail_inaccessibleSetter() throws Exception {
Source source = addSource(createSource(//
// TODO
));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INACCESSIBLE_SETTER);
verify(source);
}
public void fail_returnOfInvalidType_async_future_int_mismatches_future_null() 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<Null> f() async {",
" return 5;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void fail_returnOfInvalidType_async_future_int_mismatches_future_string() 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<String> f() async {",
" return 5;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void fail_returnOfInvalidType_async_future_int_mismatches_int() 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(//
"int f() async {",
" return 5;",
"}"));
resolve(source);
assertErrors(
source,
StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
StaticTypeWarningCode.ILLEGAL_ASYNC_RETURN_TYPE);
verify(source);
}
public void fail_undefinedEnumConstant() throws Exception {
// We need a way to set the parseEnum flag in the parser to true.
Source source = addSource(createSource(//
"enum E { ONE }",
"E e() {",
" return E.TWO;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_ENUM_CONSTANT);
verify(source);
}
public void fail_yield_async_to_basic_type() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"int f() async* {",
" yield 3;",
"}"));
resolve(source);
assertErrors(
source,
StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void fail_yield_async_to_iterable() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"Iterable<int> f() async* {",
" yield 3;",
"}"));
resolve(source);
assertErrors(
source,
StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
StaticTypeWarningCode.ILLEGAL_ASYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void fail_yield_async_to_mistyped_stream() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
Source source = addSource(createSource(//
"import 'dart:async';",
"Stream<int> f() async* {",
" yield 'foo';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE);
verify(source);
}
public void fail_yield_each_async_non_stream() throws Exception {
// TODO(paulberry): Some async/await type checking has not been fully backported from dart.
// See dartbug.com/22252.
resetWithAsync();
Source source = addSource(createSource(//
"f() async* {",
" yield* 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE);
verify(source);
}
public void test_ambiguousImport_function() throws Exception {
Source source = addSource(createSource(//
"import 'lib1.dart';",
"import 'lib2.dart';",
"g() { return 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_expectedOneListTypeArgument() throws Exception {
Source source = addSource(createSource(//
"main() {",
" <int, int> [];",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
verify(source);
}
public void test_expectedTwoMapTypeArguments_one() throws Exception {
Source source = addSource(createSource(//
"main() {",
" <int> {};",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
verify(source);
}
public void test_expectedTwoMapTypeArguments_three() throws Exception {
Source source = addSource(createSource(//
"main() {",
" <int, int, int> {};",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
verify(source);
}
public void test_illegal_return_type_sync_generator_function() throws Exception {
Source source = addSource(createSource(//
"int f() sync* {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void test_inconsistentMethodInheritance_paramCount() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" int x();",
"}",
"abstract class B {",
" int x(int y);",
"}",
"class C implements A, B {",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
verify(source);
}
public void test_inconsistentMethodInheritance_paramType() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" x(int i);",
"}",
"abstract class B {",
" x(String s);",
"}",
"abstract class C implements A, B {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
verify(source);
}
public void test_inconsistentMethodInheritance_returnType() throws Exception {
Source source = addSource(createSource(//
"abstract class A {",
" int x();",
"}",
"abstract class B {",
" String x();",
"}",
"abstract class C implements A, B {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE);
verify(source);
}
public void test_instanceAccessToStaticMember_method_invocation() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static m() {}",
"}",
"main(A a) {",
" a.m();",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER);
verify(source);
}
public void test_instanceAccessToStaticMember_method_reference() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static m() {}",
"}",
"main(A a) {",
" a.m;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER);
verify(source);
}
public void test_instanceAccessToStaticMember_propertyAccess_field() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static var f;",
"}",
"main(A a) {",
" a.f;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER);
verify(source);
}
public void test_instanceAccessToStaticMember_propertyAccess_getter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static get f => 42;",
"}",
"main(A a) {",
" a.f;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER);
verify(source);
}
public void test_instanceAccessToStaticMember_propertyAccess_setter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static set f(x) {}",
"}",
"main(A a) {",
" a.f = 42;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER);
verify(source);
}
public void test_invalidAssignment_compoundAssignment() throws Exception {
Source source = addSource(createSource(//
"class byte {",
" int _value;",
" byte(this._value);",
" int operator +(int val) { return 0; }",
"}",
"",
"void main() {",
" byte b = new byte(52);",
" b += 3;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_defaultValue_named() throws Exception {
Source source = addSource(createSource(//
"f({String x: 0}) {",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_defaultValue_optional() throws Exception {
Source source = addSource(createSource(//
"f([String x = 0]) {",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_instanceVariable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int x;",
"}",
"f() {",
" A a;",
" a.x = '0';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_localVariable() throws Exception {
Source source = addSource(createSource(//
"f() {",
" int x;",
" x = '0';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_regressionInIssue18468Fix() throws Exception {
// https://code.google.com/p/dart/issues/detail?id=18628
Source source = addSource(createSource(//
"class C<T> {",
" T t = int;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_staticVariable() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int x;",
"}",
"f() {",
" A.x = '0';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_topLevelVariableDeclaration() throws Exception {
Source source = addSource(createSource(//
"int x = 'string';"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_typeParameter() throws Exception {
// 14221
Source source = addSource(createSource(//
"class B<T> {",
" T value;",
" void test(num n) {",
" value = n;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invalidAssignment_variableDeclaration() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int x = 'string';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVALID_ASSIGNMENT);
verify(source);
}
public void test_invocationOfNonFunction_class() throws Exception {
Source source = addSource(createSource(//
"class A {",
" void m() {",
" A();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION);
}
public void test_invocationOfNonFunction_localVariable() throws Exception {
Source source = addSource(createSource(//
"f() {",
" int x;",
" return x();",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION);
verify(source);
}
public void test_invocationOfNonFunction_ordinaryInvocation() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int x;",
"}",
"class B {",
" m() {",
" A.x();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION);
// A call to verify(source) fails as A.x() cannot be resolved.
}
public void test_invocationOfNonFunction_staticInvocation() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int get g => 0;",
" f() {",
" A.g();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION);
// A call to verify(source) fails as g() cannot be resolved.
}
public void test_invocationOfNonFunction_superExpression() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int get g => 0;",
"}",
"class B extends A {",
" m() {",
" var v = super.g();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION);
verify(source);
}
public void test_invocationOfNonFunctionExpression_literal() throws Exception {
Source source = addSource(createSource(//
"f() {",
" 3(5);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION);
verify(source);
}
public void test_nonBoolCondition_conditional() throws Exception {
Source source = addSource(createSource(//
"f() { return 3 ? 2 : 1; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_CONDITION);
verify(source);
}
public void test_nonBoolCondition_do() throws Exception {
Source source = addSource(createSource(//
"f() {",
" do {} while (3);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_CONDITION);
verify(source);
}
public void test_nonBoolCondition_if() throws Exception {
Source source = addSource(createSource(//
"f() {",
" if (3) return 2; else return 1;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_CONDITION);
verify(source);
}
public void test_nonBoolCondition_while() throws Exception {
Source source = addSource(createSource(//
"f() {",
" while (3) {}",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_CONDITION);
verify(source);
}
public void test_nonBoolExpression_functionType() throws Exception {
Source source = addSource(createSource(//
"int makeAssertion() => 1;",
"f() {",
" assert(makeAssertion);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_EXPRESSION);
verify(source);
}
public void test_nonBoolExpression_interfaceType() throws Exception {
Source source = addSource(createSource(//
"f() {",
" assert(0);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_EXPRESSION);
verify(source);
}
public void test_nonBoolNegationExpression() throws Exception {
Source source = addSource(createSource(//
"f() {",
" !42;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION);
verify(source);
}
public void test_nonBoolOperand_and_left() throws Exception {
Source source = addSource(createSource(//
"bool f(int left, bool right) {",
" return left && right;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_OPERAND);
verify(source);
}
public void test_nonBoolOperand_and_right() throws Exception {
Source source = addSource(createSource(//
"bool f(bool left, String right) {",
" return left && right;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_OPERAND);
verify(source);
}
public void test_nonBoolOperand_or_left() throws Exception {
Source source = addSource(createSource(//
"bool f(List<int> left, bool right) {",
" return left || right;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_OPERAND);
verify(source);
}
public void test_nonBoolOperand_or_right() throws Exception {
Source source = addSource(createSource(//
"bool f(bool left, double right) {",
" return left || right;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_BOOL_OPERAND);
verify(source);
}
public void test_nonTypeAsTypeArgument_notAType() throws Exception {
Source source = addSource(createSource(//
"int A;",
"class B<E> {}",
"f(B<A> b) {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT);
verify(source);
}
public void test_nonTypeAsTypeArgument_undefinedIdentifier() throws Exception {
Source source = addSource(createSource(//
"class B<E> {}",
"f(B<A> b) {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT);
verify(source);
}
public void test_notEnoughRequiredArguments_mergedUnionTypeMethod() throws Exception {
enableUnionTypes(false);
Source source = addSource(createSource(//
"class A {",
" int m(int x) => 0;",
"}",
"class B {",
" String m(String x) => '0';",
"}",
"f(A a, B b) {",
" var ab;",
" if (0 < 1) {",
" ab = a;",
" } else {",
" ab = b;",
" }",
" ab.m();",
"}"));
resolve(source);
assertErrors(source, StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS);
verify(source);
}
public void test_returnOfInvalidType_expressionFunctionBody_function() throws Exception {
Source source = addSource(createSource(//
"int f() => '0';"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_expressionFunctionBody_getter() throws Exception {
Source source = addSource(createSource(//
"int get g => '0';"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_expressionFunctionBody_localFunction() throws Exception {
Source source = addSource(createSource(//
"class A {",
" String m() {",
" int f() => '0';",
" return '0';",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_expressionFunctionBody_method() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int f() => '0';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_expressionFunctionBody_void() throws Exception {
Source source = addSource(createSource(//
"void f() => 42;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_function() throws Exception {
Source source = addSource(createSource(//
"int f() { return '0'; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_getter() throws Exception {
Source source = addSource(createSource(//
"int get g { return '0'; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_localFunction() throws Exception {
Source source = addSource(createSource(//
"class A {",
" String m() {",
" int f() { return '0'; }",
" return '0';",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_method() throws Exception {
Source source = addSource(createSource(//
"class A {",
" int f() { return '0'; }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_returnOfInvalidType_void() throws Exception {
Source source = addSource(createSource(//
"void f() { return 42; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.RETURN_OF_INVALID_TYPE);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_classTypeAlias() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class C {}",
"class G<E extends A> {}",
"class D = G<B> with C;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_extends() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"class C extends G<B>{}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_extends_regressionInIssue18468Fix()
throws Exception {
// https://code.google.com/p/dart/issues/detail?id=18628
Source source = addSource(createSource(//
"class X<T extends Type> {}",
"class Y<U> extends X<U> {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_fieldFormalParameter() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"class C {",
" var f;",
" C(G<B> this.f) {}",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_functionReturnType() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"G<B> f() { return null; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_functionTypeAlias() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"typedef G<B> f();"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_functionTypedFormalParameter() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"f(G<B> h()) {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_implements() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"class C implements G<B>{}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_is() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"var b = 1 is G<B>;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_methodReturnType() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"class C {",
" G<B> m() { return null; }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_new() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"f() { return new G<B>(); }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_new_superTypeOfUpperBound() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {}",
"class C extends B {}",
"class G<E extends B> {}",
"f() { return new G<A>(); }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_parameter() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"f(G<B> g) {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_redirectingConstructor() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class X<T extends A> {",
" X(int x, int y) {}",
" factory X.name(int x, int y) = X<B>;",
"}"));
resolve(source);
assertErrors(
source,
StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS,
StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_typeArgumentList() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class C<E> {}",
"class D<E extends A> {}",
"C<D<B>> Var;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_typeParameter() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class C {}",
"class G<E extends A> {}",
"class D<F extends G<B>> {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_variableDeclaration() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"G<B> g;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeArgumentNotMatchingBounds_with() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {}",
"class G<E extends A> {}",
"class C extends Object with G<B>{}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS);
verify(source);
}
public void test_typeParameterSupertypeOfItsBound() throws Exception {
Source source = addSource(createSource(//
"class A<T extends T> {",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND);
verify(source);
}
public void test_typePromotion_booleanAnd_useInRight_accessedInClosureRight_mutated()
throws Exception {
Source source = addSource(createSource(//
"callMe(f()) { f(); }",
"main(Object p) {",
" (p is String) && callMe(() { p.length; });",
" p = 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_booleanAnd_useInRight_mutatedInLeft() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" ((p is String) && ((p = 42) == 42)) && p.length != 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_booleanAnd_useInRight_mutatedInRight() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" (p is String) && (((p = 42) == 42) && p.length != 0);",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_after()
throws Exception {
Source source = addSource(createSource(//
"callMe(f()) { f(); }",
"main(Object p) {",
" p is String ? callMe(() { p.length; }) : 0;",
" p = 42;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_conditional_useInThen_accessedInClosure_hasAssignment_before()
throws Exception {
Source source = addSource(createSource(//
"callMe(f()) { f(); }",
"main(Object p) {",
" p = 42;",
" p is String ? callMe(() { p.length; }) : 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_conditional_useInThen_hasAssignment() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" p is String ? (p.length + (p = 42)) : 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_accessedInClosure_hasAssignment() throws Exception {
Source source = addSource(createSource(//
"callMe(f()) { f(); }",
"main(Object p) {",
" if (p is String) {",
" callMe(() {",
" p.length;",
" });",
" }",
" p = 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_and_right_hasAssignment() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" if (p is String && (p = null) == null) {",
" p.length;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_extends_notMoreSpecific_dynamic() throws Exception {
Source source = addSource(createSource(//
"class V {}",
"class A<T> {}",
"class B<S> extends A<S> {",
" var b;",
"}",
"",
"main(A<V> p) {",
" if (p is B) {",
" p.b;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_extends_notMoreSpecific_notMoreSpecificTypeArg()
throws Exception {
Source source = addSource(createSource(//
"class V {}",
"class A<T> {}",
"class B<S> extends A<S> {",
" var b;",
"}",
"",
"main(A<V> p) {",
" if (p is B<int>) {",
" p.b;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_hasAssignment_after() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" if (p is String) {",
" p.length;",
" p = 0;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_hasAssignment_before() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" if (p is String) {",
" p = 0;",
" p.length;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_hasAssignment_inClosure_anonymous_after() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" if (p is String) {",
" p.length;",
" }",
" () {p = 0;};",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_hasAssignment_inClosure_anonymous_before() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" () {p = 0;};",
" if (p is String) {",
" p.length;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_hasAssignment_inClosure_function_after() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" if (p is String) {",
" p.length;",
" }",
" f() {p = 0;};",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_hasAssignment_inClosure_function_before() throws Exception {
Source source = addSource(createSource(//
"main(Object p) {",
" f() {p = 0;};",
" if (p is String) {",
" p.length;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_implements_notMoreSpecific_dynamic() throws Exception {
Source source = addSource(createSource(//
"class V {}",
"class A<T> {}",
"class B<S> implements A<S> {",
" var b;",
"}",
"",
"main(A<V> p) {",
" if (p is B) {",
" p.b;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_typePromotion_if_with_notMoreSpecific_dynamic() throws Exception {
Source source = addSource(createSource(//
"class V {}",
"class A<T> {}",
"class B<S> extends Object with A<S> {",
" var b;",
"}",
"",
"main(A<V> p) {",
" if (p is B) {",
" p.b;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_undefinedFunction() throws Exception {
Source source = addSource(createSource(//
"void f() {",
" g();",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_FUNCTION);
}
public void test_undefinedFunction_hasImportPrefix() throws Exception {
Source source = addSource(createSource(//
"import 'lib.dart' as f;",
"main() { return f(); }"));
addNamedSource("/lib.dart", "library lib;");
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_FUNCTION);
}
public void test_undefinedFunction_inCatch() throws Exception {
Source source = addSource(createSource(//
"void f() {",
" try {",
" } on Object {",
" g();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_FUNCTION);
}
public void test_undefinedFunction_inImportedLib() throws Exception {
Source source = addSource(createSource(//
"import 'lib.dart' as f;",
"main() { return f.g(); }"));
addNamedSource("/lib.dart", createSource(//
"library lib;",
"h() {}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_FUNCTION);
}
public void test_undefinedGetter() throws Exception {
Source source = addSource(createSource(//
"class T {}",
"f(T e) { return e.m; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_undefinedGetter_proxy_annotation_fakeProxy() throws Exception {
Source source = addSource(createSource(//
"library L;",
"class Fake {",
" const Fake();",
"}",
"const proxy = const Fake();",
"@proxy class PrefixProxy {}",
"main() {",
" new PrefixProxy().foo;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_undefinedGetter_static() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"var a = A.B;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_undefinedGetter_void() throws Exception {
Source source = addSource(createSource(//
"class T {",
" void m() {}",
"}",
"f(T e) { return e.m().f; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_GETTER);
}
public void test_undefinedGetter_wrongNumberOfTypeArguments_tooLittle() throws Exception {
Source source = addSource(createSource(//
"class A<K, V> {",
" K element;",
"}",
"main(A<int> a) {",
" a.element.anyGetterExistsInDynamic;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_undefinedGetter_wrongNumberOfTypeArguments_tooMany() throws Exception {
Source source = addSource(createSource(//
"class A<E> {",
" E element;",
"}",
"main(A<int,int> a) {",
" a.element.anyGetterExistsInDynamic;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_undefinedGetter_wrongOfTypeArgument() throws Exception {
Source source = addSource(createSource(//
"class A<E> {",
" E element;",
"}",
"main(A<NoSuchType> a) {",
" a.element.anyGetterExistsInDynamic;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.NON_TYPE_AS_TYPE_ARGUMENT);
verify(source);
}
public void test_undefinedMethod() throws Exception {
Source source = addSource(createSource(//
"class A {",
" void m() {",
" n();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
public void test_undefinedMethod_assignmentExpression() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B {",
" f(A a) {",
" A a2 = new A();",
" a += a2;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
public void test_undefinedMethod_ignoreTypePropagation() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" m() {}",
"}",
"class C {",
" f() {",
" A a = new B();",
" a.m();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
public void test_undefinedMethod_private() throws Exception {
addNamedSource("/lib.dart", createSource(//
"library lib;",
"class A {",
" _foo() {}",
"}"));
Source source = addSource(createSource(//
"import 'lib.dart';",
"class B extends A {",
" test() {",
" _foo();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
public void test_undefinedMethod_proxy_annotation_fakeProxy() throws Exception {
Source source = addSource(createSource(//
"library L;",
"class Fake {",
" const Fake();",
"}",
"const proxy = const Fake();",
"@proxy class PrefixProxy {}",
"main() {",
" new PrefixProxy().foo();",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_METHOD);
}
public void test_undefinedOperator_indexBoth() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f(A a) {",
" a[0]++;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_OPERATOR);
}
public void test_undefinedOperator_indexGetter() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f(A a) {",
" a[0];",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_OPERATOR);
}
public void test_undefinedOperator_indexSetter() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f(A a) {",
" a[0] = 1;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_OPERATOR);
}
public void test_undefinedOperator_plus() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f(A a) {",
" a + 1;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_OPERATOR);
}
public void test_undefinedOperator_postfixExpression() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f(A a) {",
" a++;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_OPERATOR);
}
public void test_undefinedOperator_prefixExpression() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f(A a) {",
" ++a;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_OPERATOR);
}
public void test_undefinedSetter() throws Exception {
Source source = addSource(createSource(//
"class T {}",
"f(T e1) { e1.m = 0; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_SETTER);
}
public void test_undefinedSetter_static() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"f() { A.B = 0;}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_SETTER);
}
public void test_undefinedSetter_void() throws Exception {
Source source = addSource(createSource(//
"class T {",
" void m() {}",
"}",
"f(T e) { e.m().f = 0; }"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_SETTER);
}
public void test_undefinedSuperMethod() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class B extends A {",
" m() { return super.m(); }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNDEFINED_SUPER_METHOD);
}
public void test_unqualifiedReferenceToNonLocalStaticMember_getter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static int get a => 0;",
"}",
"class B extends A {",
" int b() {",
" return a;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER);
verify(source);
}
public void test_unqualifiedReferenceToNonLocalStaticMember_method() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static void a() {}",
"}",
"class B extends A {",
" void b() {",
" a();",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER);
verify(source);
}
public void test_unqualifiedReferenceToNonLocalStaticMember_setter() throws Exception {
Source source = addSource(createSource(//
"class A {",
" static set a(x) {}",
"}",
"class B extends A {",
" b(y) {",
" a = y;",
" }",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER);
verify(source);
}
public void test_wrongNumberOfTypeArguments_classAlias() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class M {}",
"class B<F extends num> = A<F> with M;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_wrongNumberOfTypeArguments_tooFew() throws Exception {
Source source = addSource(createSource(//
"class A<E, F> {}",
"A<A> a = null;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_wrongNumberOfTypeArguments_tooMany() throws Exception {
Source source = addSource(createSource(//
"class A<E> {}",
"A<A, A> a = null;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_wrongNumberOfTypeArguments_typeTest_tooFew() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class C<K, V> {}",
"f(p) {",
" return p is C<A>;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_wrongNumberOfTypeArguments_typeTest_tooMany() throws Exception {
Source source = addSource(createSource(//
"class A {}",
"class C<E> {}",
"f(p) {",
" return p is C<A, A>;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS);
verify(source);
}
public void test_yield_each_async_to_mistyped_stream() throws Exception {
Source source = addSource(createSource(//
"import 'dart:async';",
"Stream<int> f() async* {",
" yield* g();",
"}",
"Stream<String> g() => null;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE);
verify(source);
}
public void test_yield_each_sync_non_iterable() throws Exception {
resetWithAsync();
Source source = addSource(createSource(//
"f() sync* {",
" yield* 0;",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE);
verify(source);
}
public void test_yield_each_sync_to_mistyped_iterable() throws Exception {
Source source = addSource(createSource(//
"Iterable<int> f() sync* {",
" yield* g();",
"}",
"Iterable<String> g() => null;"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE);
verify(source);
}
public void test_yield_sync_to_basic_type() throws Exception {
Source source = addSource(createSource(//
"int f() sync* {",
" yield 3;",
"}"));
resolve(source);
assertErrors(
source,
StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
public void test_yield_sync_to_mistyped_iterable() throws Exception {
Source source = addSource(createSource(//
"Iterable<int> f() sync* {",
" yield 'foo';",
"}"));
resolve(source);
assertErrors(source, StaticTypeWarningCode.YIELD_OF_INVALID_TYPE);
verify(source);
}
public void test_yield_sync_to_stream() throws Exception {
Source source = addSource(createSource(//
"import 'dart:async';",
"Stream<int> f() sync* {",
" yield 3;",
"}"));
resolve(source);
assertErrors(
source,
StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
StaticTypeWarningCode.ILLEGAL_SYNC_GENERATOR_RETURN_TYPE);
verify(source);
}
}