Index: compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
diff --git a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
index bb3ea765129c446bb030dc4c01aa74e77d538320..783497cd918fe6c589ccbdf32d66affa50c243f9 100644 |
--- a/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
+++ b/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
@@ -5,12 +5,8 @@ |
package com.google.dart.compiler.resolver; |
import com.google.common.base.Joiner; |
-import com.google.dart.compiler.DartCompilationError; |
import com.google.dart.compiler.ErrorCode; |
-import com.google.dart.compiler.ErrorSeverity; |
import com.google.dart.compiler.ast.DartClass; |
-import com.google.dart.compiler.testing.TestCompilerContext; |
-import com.google.dart.compiler.testing.TestCompilerContext.EventKind; |
import com.google.dart.compiler.type.DynamicType; |
import com.google.dart.compiler.type.InterfaceType; |
import com.google.dart.compiler.type.Type; |
@@ -306,50 +302,12 @@ public class ResolverTest extends ResolverTestCase { |
} |
public void testBadFactory() { |
- |
- TestCompilerContext context1 = new TestCompilerContext(EventKind.TYPE_ERROR) { |
- @Override |
- public void onError(DartCompilationError event) { |
- recordError(event); |
- } |
- @Override |
- public boolean shouldWarnOnNoSuchType() { |
- return false; |
- } |
- }; |
- resolve(parseUnit("class Object {}", |
- "class Zebra {", |
- " factory foo() {}", |
- "}"), context1); |
- { |
- ErrorCode[] expected = { |
- ResolverErrorCode.NO_SUCH_TYPE |
- }; |
- checkExpectedErrors(expected); |
- } |
- |
- resetExpectedErrors(); |
- TestCompilerContext context2 = new TestCompilerContext(EventKind.TYPE_ERROR) { |
- @Override |
- public void onError(DartCompilationError event) { |
- if (event.getErrorCode().getErrorSeverity() == ErrorSeverity.ERROR) { |
- recordError(event); |
- } |
- } |
- @Override |
- public boolean shouldWarnOnNoSuchType() { |
- return true; |
- } |
- }; |
- resolve(parseUnit("class Object {}", |
- "class Zebra {", |
- " factory foo() {}", |
- "}"), context2); |
- { |
- ErrorCode[] expected = { |
- }; |
- checkExpectedErrors(expected); |
- } |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class Zebra {", |
+ " factory foo() {}", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_CONSTRUCTOR); |
} |
/** |
@@ -515,7 +473,7 @@ public class ResolverTest extends ResolverTestCase { |
" var Bar;", |
" create() { return new Bar();}", |
"}"), |
- ResolverErrorCode.NO_SUCH_TYPE, |
+ ResolverErrorCode.NO_SUCH_TYPE_NEW, |
ResolverErrorCode.NEW_EXPRESSION_NOT_CONSTRUCTOR); |
// New expression tied to an unbound type variable is not allowed. |
@@ -536,7 +494,128 @@ public class ResolverTest extends ResolverTestCase { |
"class B {", |
" foo() { return new Foo<T>(); }", |
"}"), |
- ResolverErrorCode.NO_SUCH_TYPE); |
+ TypeErrorCode.NO_SUCH_TYPE_GENERICS_ARGUMENT); |
+ } |
+ |
+ public void test_noSuchType_field() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " Unknown field;", |
+ "}"), |
+ TypeErrorCode.NO_SUCH_TYPE_FIELD); |
+ } |
+ |
+ public void test_noSuchType_variableStatement() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " foo() {", |
+ " Unknown bar;", |
+ " }", |
+ "}"), |
+ TypeErrorCode.NO_SUCH_TYPE_VARIABLE_STATEMENT); |
+ } |
+ |
+ public void test_noSuchType_classExtends() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass extends Unknown {", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_EXTENDS); |
+ } |
+ |
+ public void test_noSuchType_classExtendsTypeVariable() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass<E> extends E {", |
+ "}"), |
+ ResolverErrorCode.NOT_A_CLASS); |
+ } |
+ |
+ public void test_noSuchType_classImplements() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass implements Unknown {", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_IMPLEMENTS); |
+ } |
+ |
+ public void test_noSuchType_classImplementsTypeVariable() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass<E> implements E {", |
+ "}"), |
+ ResolverErrorCode.NOT_A_CLASS_OR_INTERFACE); |
+ } |
+ |
+ public void test_noSuchType_typeArgument() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class Base<T> {}", |
+ "class MyClass extends Base<Unknown> {", |
+ "}"), |
+ TypeErrorCode.NO_SUCH_TYPE_GENERICS_ARGUMENT); |
+ } |
+ |
+ public void test_noSuchType_methodParameterType() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " Object foo(Unknown p) {", |
+ " return null;", |
+ " }", |
+ "}"), |
+ TypeErrorCode.NO_SUCH_TYPE_PARAMETER); |
+ } |
+ |
+ public void test_noSuchType_returnType() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " Unknown foo() {", |
+ " return null;", |
+ " }", |
+ "}"), |
+ TypeErrorCode.NO_SUCH_TYPE_RETURN); |
+ } |
+ |
+ public void test_noSuchType_inExpression() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " foo() {", |
+ " var bar;", |
+ " if (bar is Bar) {", |
+ " }", |
+ " }", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_IN_EXPRESSION); |
+ } |
+ |
+ public void test_noSuchType_inCatch() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " foo() {", |
+ " try {", |
+ " } catch (Unknown e) {", |
+ " }", |
+ " }", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_IN_CATCH); |
+ } |
+ |
+ public void test_noSuchType_new() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass {", |
+ " foo() {", |
+ " new Unknown();", |
+ " }", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_NEW, |
+ ResolverErrorCode.NEW_EXPRESSION_NOT_CONSTRUCTOR); |
} |
/** |
@@ -545,14 +624,83 @@ public class ResolverTest extends ResolverTestCase { |
* second unknown type "UnknownB", we expect in {@link Elements#findElement()} specific |
* {@link ClassElement} implementation and {@link DynamicElement} is not valid. |
*/ |
- public void test_classDynamicElement_fieldDynamicElement() throws Exception { |
+ public void test_classExtendsUnknown_fieldUnknownType() throws Exception { |
resolveAndTest(Joiner.on("\n").join( |
"class Object {}", |
- "class MyClass implements UnknownA {", |
+ "class MyClass extends UnknownA {", |
" UnknownB field;", |
"}"), |
- ResolverErrorCode.NO_SUCH_TYPE, |
- ResolverErrorCode.NOT_A_CLASS_OR_INTERFACE, |
- ResolverErrorCode.NO_SUCH_TYPE); |
+ ResolverErrorCode.NO_SUCH_TYPE_EXTENDS, |
+ TypeErrorCode.NO_SUCH_TYPE_FIELD); |
+ } |
+ |
+ /** |
+ * When {@link SupertypeResolver} can not find "UnknownA", it uses {@link DynamicType}, which |
+ * returns {@link DynamicElement}. By itself, this is OK. However when we later try to resolve |
+ * super() constructor invocation, this should not cause exception. |
+ */ |
+ public void test_classExtendsUnknown_callSuperConstructor() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass extends UnknownA {", |
+ " MyClass() : super() {", |
+ " }", |
+ "}"), |
+ ResolverErrorCode.NO_SUCH_TYPE_EXTENDS, |
+ ResolverErrorCode.CANNOT_RESOLVE_SUPER_CONSTRUCTOR); |
+ } |
+ |
+ public void test_shadowType_withVariable() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class Foo<T> {}", |
+ "class Param {}", |
+ "class MyClass {", |
+ " foo() {", |
+ " var Param;", |
+ " new Foo<Param>();", |
+ " }", |
+ "}"), |
+ TypeErrorCode.NO_SUCH_TYPE_GENERICS_ARGUMENT); |
+ } |
+ |
+ // TODO(scheglov) check for "extends/implements Dynamic" |
+ public void _test_extendsDynamic() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass extends Dynamic {", |
+ "}"), |
+ ResolverErrorCode.DYNAMIC_EXTENDS); |
+ } |
+ |
+ // TODO(scheglov) check for "extends/implements Dynamic" |
+ public void _test_implementsDynamic() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class MyClass implements Dynamic {", |
+ "}"), |
+ ResolverErrorCode.DYNAMIC_IMPLEMENTS); |
+ } |
+ |
+ public void test_explicitDynamicTypeArgument() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class Map<K, V>{}", |
+ "class MyClass implements Map<Object, Dynamic> {", |
+ "}")); |
+ } |
+ |
+ public void test_operatorIs_withFunctionAlias() throws Exception { |
+ resolveAndTest(Joiner.on("\n").join( |
+ "class Object {}", |
+ "class int {}", |
+ "typedef Dynamic F1<T>(Dynamic x, T y);", |
+ "class MyClass {", |
+ " main() {", |
+ " F1<int> f1 = (Object o, int i) => null;", |
+ " if (f1 is F1<int>) {", |
+ " }", |
+ " }", |
+ "}")); |
} |
} |