Index: dart/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
diff --git a/dart/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java b/dart/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
deleted file mode 100644 |
index 29826f4e7f2ad775b119272abf44655cddd7d1eb..0000000000000000000000000000000000000000 |
--- a/dart/compiler/javatests/com/google/dart/compiler/resolver/ResolverTest.java |
+++ /dev/null |
@@ -1,1439 +0,0 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
-// for details. All rights reserved. Use of this source code is governed by a |
-// BSD-style license that can be found in the LICENSE file. |
- |
-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.ast.DartClass; |
-import com.google.dart.compiler.common.ErrorExpectation; |
-import com.google.dart.compiler.type.DynamicType; |
-import com.google.dart.compiler.type.InterfaceType; |
-import com.google.dart.compiler.type.Type; |
-import com.google.dart.compiler.type.Types; |
- |
-import static com.google.dart.compiler.common.ErrorExpectation.errEx; |
- |
-import junit.framework.Assert; |
- |
-import java.util.List; |
- |
-/** |
- * Basic tests of the resolver. |
- */ |
-public class ResolverTest extends ResolverTestCase { |
- private final DartClass object = makeClass("Object", null); |
- private final DartClass array = makeClass("Array", makeType("Object"), "E"); |
- private final DartClass growableArray = makeClass("GrowableArray", makeType("Array", "S"), "S"); |
- private final Types types = Types.getInstance(null); |
- |
- private ClassElement findElementOrFail(Scope libScope, String elementName) { |
- Element element = libScope.findElement(libScope.getLibrary(), elementName); |
- assertEquals(ElementKind.CLASS, ElementKind.of(element)); |
- return (ClassElement) element; |
- } |
- |
- public void testToString() { |
- Assert.assertEquals("class Object {\n}", object.toString().trim()); |
- Assert.assertEquals("class Array<E> extends Object {\n}", array.toString().trim()); |
- } |
- |
- public void testResolve() { |
- Scope libScope = resolve(makeUnit(object, array, growableArray), getContext()); |
- LibraryElement library = libScope.getLibrary(); |
- ClassElement objectElement = (ClassElement) libScope.findElement(library, "Object"); |
- Assert.assertNotNull(objectElement); |
- ClassElement arrayElement = (ClassElement) libScope.findElement(library, "Array"); |
- Assert.assertNotNull(arrayElement); |
- ClassElement growableArrayElement = (ClassElement) libScope.findElement(library, |
- "GrowableArray"); |
- Assert.assertNotNull(growableArrayElement); |
- |
- Type objectType = objectElement.getType(); |
- Type arrayType = arrayElement.getType(); |
- Type growableArrayType = growableArrayElement.getType(); |
- Assert.assertNotNull(objectType); |
- Assert.assertNotNull(arrayType); |
- Assert.assertNotNull(growableArrayType); |
- |
- Assert.assertTrue(types.isSubtype(arrayType, objectType)); |
- Assert.assertFalse(types.isSubtype(objectType, arrayType)); |
- |
- Assert.assertTrue(types.isSubtype(growableArrayType, objectType)); |
- |
- // GrowableArray<S> is not a subtype of Array<E> because S and E aren't |
- // related. |
- Assert.assertFalse(types.isSubtype(growableArrayType, arrayType)); |
- Assert.assertFalse(types.isSubtype(objectType, growableArrayType)); |
- Assert.assertFalse(types.isSubtype(arrayType, growableArrayType)); |
- } |
- |
- /** |
- * class A {} |
- * class B extends A {} |
- * class C extends A {} |
- * class E extends C {} |
- * class D extends C {} |
- */ |
- @SuppressWarnings("unused") |
- public void testGetSubtypes() { |
- DartClass a = makeClass("A", makeType("Object")); |
- DartClass b = makeClass("B", makeType("A")); |
- DartClass c = makeClass("C", makeType("A")); |
- DartClass e = makeClass("E", makeType("C")); |
- DartClass d = makeClass("D", makeType("C")); |
- |
- Scope libScope = resolve(makeUnit(object, a, b, c, d, e), getContext()); |
- |
- ClassElement elementA = findElementOrFail(libScope, "A"); |
- ClassElement elementB = findElementOrFail(libScope, "B"); |
- ClassElement elementC = findElementOrFail(libScope, "C"); |
- ClassElement elementD = findElementOrFail(libScope, "D"); |
- ClassElement elementE = findElementOrFail(libScope, "E"); |
- } |
- |
- /** |
- * interface IA extends ID default B {} |
- * interface IB extends IA {} |
- * interface IC extends IA, IB {} |
- * interface ID extends IB {} |
- * class A extends IA {} |
- * class B {} |
- */ |
- @SuppressWarnings("unused") |
- public void testGetSubtypesWithInterfaceCycles() { |
- DartClass ia = makeInterface("IA", makeTypes("ID"), makeDefault("B")); |
- DartClass ib = makeInterface("IB", makeTypes("IA"), null); |
- DartClass ic = makeInterface("IC", makeTypes("IA", "IB"), null); |
- DartClass id = makeInterface("ID", makeTypes("IB"), null); |
- |
- DartClass a = makeClass("A", null, makeTypes("IA")); |
- DartClass b = makeClass("B", null); |
- |
- Scope libScope = resolve(makeUnit(object, ia, ib, ic, id, a, b), getContext()); |
- ErrorCode[] expected = { |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- }; |
- checkExpectedErrors(expected); |
- |
- ClassElement elementIA = findElementOrFail(libScope, "IA"); |
- ClassElement elementIB = findElementOrFail(libScope, "IB"); |
- ClassElement elementIC = findElementOrFail(libScope, "IC"); |
- ClassElement elementID = findElementOrFail(libScope, "ID"); |
- ClassElement elementA = findElementOrFail(libScope, "A"); |
- ClassElement elementB = findElementOrFail(libScope, "B"); |
- |
- assert(elementIA.getDefaultClass().getElement().getName().equals("B")); |
- } |
- |
- /** |
- * interface IA extends IB {} |
- * interface IB extends IA {} |
- */ |
- @SuppressWarnings("unused") |
- public void testGetSubtypesWithSimpleInterfaceCycle() { |
- DartClass ia = makeInterface("IA", makeTypes("IB"), null); |
- DartClass ib = makeInterface("IB", makeTypes("IA"), null); |
- |
- |
- Scope libScope = resolve(makeUnit(object, ia, ib), getContext()); |
- ErrorCode[] expected = { |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- }; |
- checkExpectedErrors(expected); |
- |
- ClassElement elementIA = findElementOrFail(libScope, "IA"); |
- ClassElement elementIB = findElementOrFail(libScope, "IB"); |
- } |
- |
- /** |
- * class A<T> {} |
- * class B extends A<C> {} |
- * class C {} |
- */ |
- @SuppressWarnings("unused") |
- public void testGetSubtypesWithParemeterizedSupertypes() { |
- DartClass a = makeClass("A", null, "T"); |
- DartClass b = makeClass("B", makeType("A", "C")); |
- DartClass c = makeClass("C", null); |
- |
- Scope libScope = resolve(makeUnit(object, a, b, c), getContext()); |
- |
- ClassElement elementA = findElementOrFail(libScope, "A"); |
- ClassElement elementB = findElementOrFail(libScope, "B"); |
- ClassElement elementC = findElementOrFail(libScope, "C"); |
- |
- } |
- |
- public void testDuplicatedInterfaces() { |
- // The analyzer used to catch inheriting from two different variations of the same interface |
- // but the spec mentions no such error |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class bool {}", |
- "abstract class I<X> {", |
- "}", |
- "class A extends C implements I<int> {}", |
- "class B extends C implements I<bool> {}", |
- "class C implements I<int> {}")); |
- } |
- |
- public void testImplicitDefaultConstructor() { |
- // Check that the implicit constructor is resolved correctly |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class B {}", |
- "class C { main() { new B(); } }")); |
- |
- /* |
- * We should check for signature mismatch but that is a TypeAnalyzer issue. |
- */ |
- } |
- |
- public void testImplicitDefaultConstructor_WithConstCtor() { |
- // Check that we generate an error if the implicit constructor would violate const. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class B { const B() {} }", |
- "class C extends B {}", |
- "class D { main() { new C(); } }"), |
- ResolverErrorCode.CONST_CONSTRUCTOR_CANNOT_HAVE_BODY); |
- } |
- |
- public void testImplicitSuperCall_ImplicitCtor() { |
- // Check that we can properly resolve the super ctor that exists. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class B { B() {} }", |
- "class C extends B {}", |
- "class D { main() { new C(); } }")); |
- } |
- |
- public void testImplicitSuperCall_OnExistingCtor() { |
- // Check that we can properly resolve the super ctor that exists. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class B { B() {} }", |
- "class C extends B { C(){} }", |
- "class D { main() { new C(); } }")); |
- } |
- |
- public void testImplicitSuperCall_NonExistentSuper() { |
- // Check that we generate an error if the implicit constructor would call a non-existent super. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class B { B(Object o) {} }", |
- "class C extends B {}", |
- "class D { main() { new C(); } }"), |
- ResolverErrorCode.CANNOT_RESOLVE_IMPLICIT_CALL_TO_SUPER_CONSTRUCTOR); |
- } |
- |
- public void testImplicitSuperCall_NonExistentSuper2() { |
- // Check that we generate an error if the implicit constructor would call a non-existent super. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class B { B.foo() {} }", |
- "class C extends B {}", |
- "class D { main() { new C(); } }"), |
- ResolverErrorCode.CANNOT_RESOLVE_IMPLICIT_CALL_TO_SUPER_CONSTRUCTOR); |
- } |
- |
- public void testCyclicSupertype() { |
- |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class bool {}", |
- "class Cyclic extends Cyclic {", |
- "}", |
- "class A extends B {", |
- "}", |
- "class B extends A {", |
- "}", |
- "class C implements C {", |
- "}"), |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS, |
- ResolverErrorCode.CYCLIC_CLASS |
- ); |
- } |
- |
- public void test_constFactory() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " const factory A() { }", |
- "}"), |
- errEx(ResolverErrorCode.FACTORY_CANNOT_BE_CONST, 3, 17, 1)); |
- } |
- |
- public void testBadGenerativeConstructor1() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object { }", |
- "class B { }", |
- "class A {", |
- " var val; ", |
- " B.foo() : this.val = 1;", |
- "}"), |
- ResolverErrorCode.CANNOT_DECLARE_NON_FACTORY_CONSTRUCTOR); |
- } |
- |
- public void testBadGenerativeConstructor2() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object { }", |
- "class A {", |
- " var val; ", |
- " A.foo.bar() : this.val = 1;", |
- "}"), |
- ResolverErrorCode.TOO_MANY_QUALIFIERS_FOR_METHOD); |
- } |
- |
- public void testGenerativeConstructor() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " var val; ", |
- " A.foo(arg) : this.val = arg;", |
- "}")); |
- } |
- |
- /** |
- * Test that a class may implement the implied interface of another class and that interfaces may |
- * extend the implied interface of a class. |
- */ |
- @SuppressWarnings("unused") |
- public void testImpliedInterfaces() throws Exception { |
- DartClass a = makeClass("A", null); |
- DartClass b = makeClass("B", null, makeTypes("A")); |
- DartClass ia = makeInterface("IA", makeTypes("B"), null); |
- Scope libScope = resolve(makeUnit(object, a, b, ia), getContext()); |
- ErrorCode[] expected = {}; |
- checkExpectedErrors(expected); |
- |
- ClassElement elementA = findElementOrFail(libScope, "A"); |
- ClassElement elementB = findElementOrFail(libScope, "B"); |
- ClassElement elementIA = findElementOrFail(libScope, "IA"); |
- List<InterfaceType> superTypes = elementB.getAllSupertypes(); |
- assertEquals(2, superTypes.size()); // Object and A |
- superTypes = elementIA.getAllSupertypes(); |
- assertEquals(3, superTypes.size()); // Object, A, and B |
- } |
- |
- public void testUnresolvedSuper() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo {", |
- " foo() { super.foo(); }", |
- "}")); |
- } |
- |
- /** |
- * Tests for the 'new' keyword |
- */ |
- public void testNewExpression1() { |
- // A very ordinary new expression is OK |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo {", |
- " Foo create() {", |
- " return new Foo();", |
- " }", |
- "}")); |
- } |
- |
- public void testNewExpression2() { |
- // A new expression with generic type argument is OK |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {", |
- " Foo<T> create() {", |
- " return new Foo<T>();", |
- " }", |
- "}")); |
- } |
- |
- public void testNewExpression3() { |
- // Trying new on a variable name shouldn't work. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo {", |
- " var Bar;", |
- " create() { return new Bar();}", |
- "}"), |
- TypeErrorCode.NOT_A_TYPE); |
- } |
- |
- public void testNewExpression4() { |
- // New expression tied to an unbound type variable is not allowed. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {", |
- " T create() {", |
- " return new T();", |
- " }", |
- "}"), |
- ResolverErrorCode.NEW_EXPRESSION_CANT_USE_TYPE_VAR); |
- } |
- |
- public void testConstExpression4() { |
- // New expression tied to an unbound type variable is not allowed. |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {", |
- " T create() {", |
- " return const T();", |
- " }", |
- "}"), |
- ResolverErrorCode.CONST_EXPRESSION_CANT_USE_TYPE_VAR); |
- } |
- |
- public void testNewExpression5() { |
- // More cowbell. (Foo<T> isn't a type yet) |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> { }", |
- "class B {", |
- " foo() { return new Foo<T>(); }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_noSuchType_field() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " Unknown field;", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_variableStatement_noSuchType() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " foo() {", |
- " Unknown bar;", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_variableStatement_noSuchType_typeArgument() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {}", |
- "class MyClass {", |
- " bar() {", |
- " Foo<Unknown> foo;", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_variableStatement_wrongTypeArgumentsNumber() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {}", |
- "class MyClass {", |
- " bar() {", |
- " Foo<Object, Object> foo;", |
- " }", |
- "}"), |
- TypeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- } |
- |
- public void test_variableStatement_typeArgumentsForNonGeneric() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo {}", |
- "class MyClass {", |
- " bar() {", |
- " Foo<Object> foo;", |
- " }", |
- "}"), |
- TypeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- } |
- |
- public void test_variableStatement_typeArgumentsForDynamic() throws Exception { |
- resolveAndTest( |
- Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " bar() {", |
- " dynamic<Object> v1;", |
- " }", |
- "}"), |
- TypeErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- } |
- |
- public void test_noSuchType_classExtends() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass extends Unknown {", |
- "}"), |
- ResolverErrorCode.NO_SUCH_TYPE); |
- } |
- |
- 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_superClass_typeArgument() throws Exception { |
- String source = |
- Joiner.on("\n").join( |
- "class Object {}", |
- "class Base<T> {}", |
- "class MyClass extends Base<Unknown> {", |
- "}"); |
- List<DartCompilationError> errors = resolveAndTest(source, ResolverErrorCode.NO_SUCH_TYPE); |
- assertEquals(1, errors.size()); |
- { |
- DartCompilationError error = errors.get(0); |
- assertEquals(3, error.getLineNumber()); |
- assertEquals(28, error.getColumnNumber()); |
- assertEquals("Unknown".length(), error.getLength()); |
- assertEquals(source.indexOf("Unknown"), error.getStartPosition()); |
- } |
- } |
- |
- public void test_noSuchType_superInterface_typeArgument() throws Exception { |
- String source = |
- Joiner.on("\n").join( |
- "class Object {}", |
- "abstract class Base<T> {}", |
- "class MyClass implements Base<Unknown> {", |
- "}"); |
- List<DartCompilationError> errors = resolveAndTest(source, ResolverErrorCode.NO_SUCH_TYPE); |
- assertEquals(1, errors.size()); |
- { |
- DartCompilationError error = errors.get(0); |
- assertEquals(3, error.getLineNumber()); |
- assertEquals(31, error.getColumnNumber()); |
- assertEquals("Unknown".length(), error.getLength()); |
- assertEquals(source.indexOf("Unknown"), error.getStartPosition()); |
- } |
- } |
- |
- 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); |
- } |
- |
- public void test_noSuchType_methodParameterType_noQualifier() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " Object foo(lib.Unknown p) {", |
- " return null;", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_noSuchType_returnType() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " Unknown foo() {", |
- " return null;", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_noSuchType_inExpression() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " foo() {", |
- " var bar;", |
- " if (bar is Bar) {", |
- " }", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_noSuchType_inCatch() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " foo() {", |
- " try {", |
- " } on Unknown catch (e) {", |
- " }", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_const_array() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class MyClass<E> {", |
- " var a1 = <int>[];", |
- " var a2 = <E>[];", |
- " var a3 = const <int>[];", |
- " var a4 = const <E>[];", |
- "}"), |
- ErrorExpectation.errEx(ResolverErrorCode.CONST_ARRAY_WITH_TYPE_VARIABLE, 7, 19, 1)); |
- } |
- |
- public void test_const_map() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class String {}", |
- "class int {}", |
- "class MyClass<E> {", |
- " var a1 = <int>{};", |
- " var a2 = <E>{};", |
- " var a3 = const <int>{};", |
- " var a4 = const <E>{};", |
- "}"), |
- ErrorExpectation.errEx(ResolverErrorCode.CONST_MAP_WITH_TYPE_VARIABLE, 8, 19, 1)); |
- } |
- |
- public void test_multipleLabels() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass<E> {", |
- " foo() {", |
- " a: b: while (true) { break a; } // ok", |
- " a: b: while (true) { break b; } // ok", |
- " a: b: while (true) { break c; } // error, no such label", |
- " }", |
- "}"), |
- ErrorExpectation.errEx(ResolverErrorCode.CANNOT_RESOLVE_LABEL, 6, 32, 1)); |
- } |
- |
- public void test_multipleLabelsSwitch() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "foo() {", |
- " switch(1) {", |
- " a: case (0): break;", |
- " a: case (1): break;", |
- " }", |
- "}"), |
- ErrorExpectation.errEx(ResolverErrorCode.DUPLICATE_LABEL_IN_SWITCH_STATEMENT, 5, 3, 2)); |
- } |
- |
- public void test_breakInSwitch() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "foo() {", |
- " switch(1) {", |
- " a: case 0:", |
- " break a;", |
- " }", |
- "}"), |
- ErrorExpectation.errEx(ResolverErrorCode.BREAK_LABEL_RESOLVES_TO_CASE_OR_DEFAULT, 5, 14, 1)); |
- } |
- |
- public void test_continueInSwitch1() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "foo() {", |
- " switch(1) {", |
- " a: case 0:", |
- " continue a;", |
- " }", |
- "}")); |
- } |
- |
- public void test_continueInSwitch2() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "foo() {", |
- " switch(1) {", |
- " case 0:", |
- " continue a;", |
- " a: case 1:", |
- " break;", |
- " }", |
- "}")); |
- } |
- |
- public void test_continueInSwitch3() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "foo() {", |
- " a: switch(1) {", |
- " case 0:", |
- " continue a;", |
- " }", |
- "}"), |
- ErrorExpectation.errEx(ResolverErrorCode.CONTINUE_LABEL_RESOLVES_TO_SWITCH, 5, 17, 1)); |
- } |
- |
- public void test_new_noSuchType() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " foo() {", |
- " new Unknown();", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_new_noSuchType_typeArgument() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {}", |
- "class MyClass {", |
- " foo() {", |
- " new Foo<T>();", |
- " }", |
- "}"), |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_new_wrongTypeArgumentsNumber() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Foo<T> {}", |
- "class MyClass {", |
- " foo() {", |
- " new Foo<Object, Object>();", |
- " }", |
- "}"), |
- ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- } |
- |
- public void test_noSuchType_mapLiteral_typeArgument() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class String {}", |
- "class MyClass {", |
- " foo() {", |
- " var map = <T>{};", |
- " }", |
- "}"), |
- ResolverErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_noSuchType_mapLiteral_num_type_args() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class String {}", |
- "class MyClass {", |
- " foo() {", |
- " var map0 = {};", |
- " var map1 = <int>{'foo': 1};", |
- " var map2 = <String, int>{'foo' : 1};", |
- " var map3 = <String, int, int>{'foo' : 1};", |
- " }", |
- "}"), |
-// ResolverErrorCode.DEPRECATED_MAP_LITERAL_SYNTAX, |
- ResolverErrorCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS); |
- } |
- |
- public void test_noSuchType_arrayLiteral_typeArgument() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass {", |
- " foo() {", |
- " var map = <T>[null];", |
- " }", |
- "}"), |
- ResolverErrorCode.NO_SUCH_TYPE); |
- } |
- |
- /** |
- * 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 |
- * second unknown type "UnknownB", we expect in {@link Elements#findElement()} specific |
- * {@link ClassElement} implementation and {@link DynamicElement} is not valid. |
- */ |
- public void test_classExtendsUnknown_fieldUnknownType() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class MyClass extends UnknownA {", |
- " UnknownB field;", |
- "}"), |
- ResolverErrorCode.NO_SUCH_TYPE, |
- TypeErrorCode.NO_SUCH_TYPE); |
- } |
- |
- public void test_cascadeWithTypeVariable() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C<T> {", |
- " test() {", |
- " this..T;", |
- " }", |
- "}"), |
- ResolverErrorCode.TYPE_VARIABLE_NOT_ALLOWED_IN_IDENTIFIER); |
- } |
- |
- public void test_cascade_complex() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class Spline {", |
- " Spline a() {", |
- " return this;", |
- " }", |
- " Line b() {", |
- " return null;", |
- " }", |
- " Spline f() {", |
- " Line x = new Line();", |
- " x.h()..a()..b().g();", |
- " }", |
- "}", |
- "class Line {", |
- " Line g() {", |
- " return this;", |
- " }", |
- " Spline h() {", |
- " return null;", |
- " }", |
- "}" |
- )); |
- } |
- |
- /** |
- * 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); |
- } |
- |
- public void test_typedefUsedAsExpression() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "typedef f();", |
- "main() {", |
- " try {", |
- " 0.25 - f;", |
- " } catch(e) {}", |
- "}")); |
- } |
- |
- public void test_classUsedAsExpression() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "main() {", |
- " 0.25 - Object;", |
- "}")); |
- } |
- |
- public void test_typeVariableUsedAsExpression() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A<B> {", |
- " var field = B;", |
- " f() {", |
- " process(x);", |
- " }", |
- "}", |
- "process(x) {}", |
- "")); |
- } |
- |
- 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.NOT_A_TYPE); |
- } |
- |
- 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>) {", |
- " }", |
- " }", |
- "}")); |
- } |
- |
- public void testTypeVariableInStatic() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A<T> {", |
- " static foo() { new T(); }", // can't ref type variable in method |
- " static bar() { T variable = 1; }", |
- "}"), |
- errEx(ResolverErrorCode.TYPE_VARIABLE_IN_STATIC_CONTEXT, 3, 22 , 1), |
- errEx(ResolverErrorCode.TYPE_VARIABLE_IN_STATIC_CONTEXT, 4, 18, 1)); |
- } |
- |
- public void testConstClass() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class GoodBase {", |
- " const GoodBase() : foo = 1;", |
- " final foo;", |
- "}", |
- "class BadBase {", |
- " BadBase() {}", |
- " var foo;", |
- "}", // line 10 |
- "class Bad {", |
- " const Bad() : bar = 1;", |
- " var bar;", // error: non-final field in const class |
- "}", |
- "class BadSub1 extends BadBase {", |
- " const BadSub1() : super(), bar = 1;", // error2: inherits non-final field, super !const |
- " final bar;", |
- "}", |
- "class BadSub2 extends GoodBase {", |
- " const BadSub2() : super(), bar = 1;", // line 20 |
- " var bar;", // error: non-final field in constant class |
- "}", |
- "class GoodSub1 extends GoodBase {", |
- " const GoodSub1() : super(), bar = 1;", |
- " final bar;", |
- "}", |
- "class GoodSub2 extends GoodBase {", |
- " const GoodSub2() : super();", |
- " static int bar;", // OK, non-final but it is static |
- "}"), |
- errEx(ResolverErrorCode.CONST_CLASS_WITH_NONFINAL_FIELDS, 13, 7, 3), |
- errEx(ResolverErrorCode.CONST_CONSTRUCTOR_MUST_CALL_CONST_SUPER, 16, 9, 7), |
- errEx(ResolverErrorCode.CONST_CLASS_WITH_INHERITED_NONFINAL_FIELDS, 9, 7, 3), |
- errEx(ResolverErrorCode.CONST_CLASS_WITH_NONFINAL_FIELDS, 21, 7, 3)); |
- } |
- |
- public void testFinalInit1() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "final f1 = 1;", |
- "final f2;", // error |
- "class A {", |
- " final f3 = 1;", |
- " final f4;", // should be initialized in constructor |
- " static final f5 = 1;", |
- " static final f6;", // error |
- " method() {", |
- " final f7 = 1;", |
- " final f8;", // error |
- " }", |
- "}"), |
- errEx(ResolverErrorCode.TOPLEVEL_FINAL_REQUIRES_VALUE, 4, 7 , 2), |
- errEx(ResolverErrorCode.STATIC_FINAL_REQUIRES_VALUE, 9, 16, 2), |
- errEx(ResolverErrorCode.CONSTANTS_MUST_BE_INITIALIZED, 12, 11, 2), |
- errEx(ResolverErrorCode.FINAL_FIELD_MUST_BE_INITIALIZED, 7, 9, 2)); |
- } |
- |
- public void testFinalInit2() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " final a;", |
- " C() {}", // explicit constructor does not initialize |
- "}"), |
- errEx(ResolverErrorCode.FINAL_FIELD_MUST_BE_INITIALIZED, 3, 9, 1)); |
- } |
- |
- public void testFinalInit3() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " final a;", // implicit constructor does not initialize |
- "}"), |
- errEx(ResolverErrorCode.FINAL_FIELD_MUST_BE_INITIALIZED, 3, 9, 1)); |
- } |
- |
- public void testFinalInit4() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " final a;", |
- " C(this.a);", // no error if initialized in initializer list |
- "}")); |
- } |
- |
- public void testFinalInit5() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " final a;", |
- " C() : this.named(1);", // no error on redirect |
- " C.named(this.a) {}", |
- "}")); |
- } |
- |
- public void testFinalInit7() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " final a = 1;", |
- "}")); |
- } |
- |
- public void testFinalInit8() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " final a;", |
- " C() : this.a = 1;", |
- "}")); |
- } |
- |
- public void test_const_requiresValue() { |
- resolveAndTest(Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class Object {}", |
- "class int {}", |
- "const f;", |
- ""), |
- errEx(ResolverErrorCode.CONST_REQUIRES_VALUE, 4, 7, 1)); |
- } |
- |
- public void test_const_requiresConstValue() { |
- resolveAndTestCtConstExpectErrors(Joiner.on("\n").join( |
- "class Object {}", |
- "f() {", |
- " const id = 1.toString();", |
- "}"), |
- errEx(ResolverErrorCode.EXPECTED_CONSTANT_EXPRESSION, 3, 14, 12)); |
- } |
- |
- public void test_const_undefinedClass() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "main() {", |
- " const A();", |
- "}"), |
- errEx(ResolverErrorCode.NO_SUCH_TYPE_CONST, 3, 8, 1)); |
- } |
- |
- public void testNoGetterOrSetter() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "get getter1 {}", |
- "set setter1(arg) {}", |
- "class A {", |
- " static get getter2 {}", |
- " static set setter2(arg) {}", |
- " get getter3 {}", |
- " set setter3(arg) {}", |
- "}", |
- "method() {", |
- " var result;", |
- " result = getter1;", |
- " getter1 = 1;", |
- " result = setter1;", |
- " setter1 = 1;", |
- " result = A.getter2;", |
- " A.getter2 = 1;", |
- " result = A.setter2;", |
- " A.setter2 = 1;", |
- " var instance = new A();", |
- " result = instance.getter3;", |
- " instance.getter3 = 1;", |
- " result = instance.setter3;", |
- " instance.setter3 = 1;", |
- "}"), |
- errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER, 13, 3, 7), |
- errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_GETTER, 14, 12, 7), |
- errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_SETTER, 17, 5, 7), |
- errEx(ResolverErrorCode.FIELD_DOES_NOT_HAVE_A_GETTER, 18, 14, 7)); |
- } |
- |
- public void testErrorInUnqualifiedInvocation1() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class Foo {", |
- " Foo() {}", |
- "}", |
- "method() {", |
- " Foo();", |
- "}"), |
- errEx(ResolverErrorCode.DID_YOU_MEAN_NEW, 7, 2, 5)); |
- } |
- |
- public void testErrorInUnqualifiedInvocation2() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class Foo {}", |
- "method() {", |
- " Foo();", |
- "}"), |
- errEx(ResolverErrorCode.DID_YOU_MEAN_NEW, 5, 2, 5)); |
- } |
- |
- public void testErrorInUnqualifiedInvocation3() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class Foo<T> {", |
- " method() {", |
- " T();", |
- " }", |
- "}"), |
- errEx(ResolverErrorCode.DID_YOU_MEAN_NEW, 5, 4, 3)); |
- } |
- |
- |
- public void testErrorInUnqualifiedInvocation4() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "typedef int foo();", |
- "method() {", |
- " foo();", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_CALL_FUNCTION_TYPE_ALIAS, 5, 2, 5)); |
- } |
- |
- public void testErrorInUnqualifiedInvocation5() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "method() {", |
- " outer: for(int i = 0; i < 1; i++) {", |
- " outer();", |
- " }", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_RESOLVE_METHOD, 5, 5, 5)); |
- } |
- |
- public void testUndercoreInNamedParameterMethodDefinition() { |
- // TODO(scheglov) |
- // Language change 4288 adds new syntax for optional named parameters. |
- // However before "remove old optional parameter syntax" we have to support old syntax too. |
- // And this conflicts with "_" handling in optional named parameters. |
- // |
- // http://code.google.com/p/dart/issues/detail?id=4539 |
- // requested to disable this |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "method({_foo}) {}", |
- "class Foo {", |
- " var _bar;", |
- " //Foo({this._bar}){}", |
- " method({_foo}){}", |
- "}"), |
- errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 9, 4), |
-// errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 5, 8, 9), |
- errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 6, 11, 4)); |
- } |
- |
- public void testUndercoreInOptionalParameterMethodDefinition() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "method([_foo]) {}", |
- "typedef myFuncType([_foo]);", |
- "class Foo {", |
- " var _bar;", |
- " method([_foo]){}", |
- "}"), |
- errEx(ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 9, 4), |
- errEx(ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER, 6, 11, 4), |
- errEx(ResolverErrorCode.OPTIONAL_PARAMETERS_CANNOT_START_WITH_UNDER, 3, 21, 4)); |
- } |
- |
- public void testUndercoreInNamedParameterFunctionDefinition() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "func({_foo}) {}"), |
- errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 7, 4)); |
- } |
- |
- public void testUndercoreInNamedParameterFunctionAlias() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "typedef Object func({_foo});"), |
- errEx(ResolverErrorCode.NAMED_PARAMETERS_CANNOT_START_WITH_UNDER, 2, 22, 4)); |
- } |
- |
- /** |
- * "this" is not accessible to initializers, so invocation of instance method is error. |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=2477 |
- */ |
- public void test_callInstanceMethod_fromInitializer() throws Exception { |
- resolveAndTest( |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class Object {}", |
- "class A {", |
- " var x;", |
- " A() : x = foo() {}", |
- " foo() {}", |
- "}", |
- ""), |
- errEx(ResolverErrorCode.INSTANCE_METHOD_FROM_INITIALIZER, 5, 13, 5)); |
- } |
- |
- /** |
- * "this" is not accessible to initializers, so reference of instance method is error. |
- * <p> |
- * http://code.google.com/p/dart/issues/detail?id=2477 |
- */ |
- public void test_referenceInstanceMethod_fromInitializer() throws Exception { |
- resolveAndTest( |
- Joiner.on("\n").join( |
- "// filler filler filler filler filler filler filler filler filler filler", |
- "class Object {}", |
- "class A {", |
- " var x;", |
- " A() : x = foo {}", |
- " foo() {}", |
- "}", |
- ""), |
- errEx(ResolverErrorCode.INSTANCE_METHOD_FROM_INITIALIZER, 5, 13, 3)); |
- } |
- |
- public void test_redirectConstructor() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "int topLevel() {}", |
- "class A {", |
- " method() {}", |
- "}", |
- "class C {", |
- " C(arg){}", |
- " C.named1() : this(topLevel());", // ok |
- " C.named2() : this(method());", // error, not a static method |
- " C.named3() : this(new A().method());", // ok |
- " method() {}", |
- "}"), |
- errEx(ResolverErrorCode.INSTANCE_METHOD_FROM_REDIRECT, 10, 21, 8)); |
- } |
- |
- public void test_unresolvedRedirectConstructor() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " A() : this.named();", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_RESOLVE_CONSTRUCTOR, 3, 9, 12)); |
- } |
- |
- public void test_unresolvedSuperConstructor() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " A() : super.named() {}", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_RESOLVE_SUPER_CONSTRUCTOR, 3, 9, 13)); |
- } |
- |
- public void test_unresolvedFieldInInitializer() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " const A() : this.field = 1;", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_RESOLVE_FIELD, 3, 20, 5)); |
- } |
- |
- public void test_illegalConstructorModifiers() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " static A() {}", |
- " static A.named() {}", |
- "}"), |
- errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_STATIC, 3, 10, 1), |
- errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_BE_STATIC, 4, 10, 7)); |
- } |
- |
- public void test_illegalConstructorReturnType() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class int {}", |
- "class A {", |
- " void A();", |
- " void A.named();", |
- "}", |
- "class B {", |
- " int B();", |
- " int B.named();", |
- "}"), |
- errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_HAVE_RETURN_TYPE, 4, 3, 4), |
- errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_HAVE_RETURN_TYPE, 5, 3, 4), |
- errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_HAVE_RETURN_TYPE, 8, 3, 3), |
- errEx(ResolverErrorCode.CONSTRUCTOR_CANNOT_HAVE_RETURN_TYPE, 9, 3, 3)); |
- } |
- |
- public void test_fieldAccessInInitializer() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " var f1;", |
- " var f2;", |
- " A() : this.f2 = f1;", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_ACCESS_FIELD_IN_INIT, 5, 19, 2)); |
- } |
- |
- public void test_cannotBeResolved() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " static var field = B;", |
- " }", |
- "method() {", |
- " A.noField = 1;", |
- "}"), |
- errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 3, 22, 1), |
- errEx(TypeErrorCode.CANNOT_BE_RESOLVED, 6, 5, 7)); |
- } |
- |
- public void test_invokeTypeAlias() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "typedef Object func();", |
- "method() {", |
- " func();", |
- "}"), |
- errEx(ResolverErrorCode.CANNOT_CALL_FUNCTION_TYPE_ALIAS, 4, 3, 6)); |
- } |
- |
- public void test_initializerErrors() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A { }", |
- "class B<T> {", |
- " method() { }", |
- " B(arg) : A = 1, ", |
- " method = 2,", |
- " arg = 3,", |
- " T = 4 {}", |
- "}"), |
- errEx(ResolverErrorCode.EXPECTED_FIELD_NOT_CLASS, 5, 12, 1), |
- errEx(ResolverErrorCode.EXPECTED_FIELD_NOT_METHOD, 6, 12, 6), |
- errEx(ResolverErrorCode.EXPECTED_FIELD_NOT_PARAMETER, 7, 12, 3), |
- errEx(ResolverErrorCode.EXPECTED_FIELD_NOT_TYPE_VAR, 8, 12, 1)); |
- } |
- |
- public void test_illegalAccessFromStatic() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " var f;", |
- " m() {}", |
- " static method () {", |
- " f = 1;", |
- " m();", |
- " var func = m;", |
- " }", |
- "}"), |
- errEx(ResolverErrorCode.ILLEGAL_FIELD_ACCESS_FROM_STATIC, 6, 5, 1), |
- errEx(ResolverErrorCode.INSTANCE_METHOD_FROM_STATIC, 7, 5, 3), |
- errEx(ResolverErrorCode.ILLEGAL_METHOD_ACCESS_FROM_STATIC, 8, 16, 1)); |
- } |
- |
- public void test_invalidGenerativeConstructorReturn() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " C() { return 5 + 7; }", |
- "}"), |
- errEx(ResolverErrorCode.INVALID_RETURN_IN_CONSTRUCTOR, 3, 9, 13)); |
- } |
- |
- public void test_isAClass() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "method () {", |
- " var a = Object;", |
- "}")); |
- } |
- |
- public void test_isAnInstanceMethod() { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " method() {}", |
- "}", |
- "method () {", |
- " var a = C.method();", |
- "}"), |
- errEx(ResolverErrorCode.IS_AN_INSTANCE_METHOD, 6, 13, 6)); |
- } |
- |
- public void test_staticAccess() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class C {", |
- " var field;", |
- " method() {}", |
- "}", |
- "method() {", |
- " C.method = 1;", |
- " C.field();", |
- " var a = C.field;", |
- "}"), |
- errEx(ResolverErrorCode.NOT_A_STATIC_METHOD, 7, 5, 6), |
- errEx(ResolverErrorCode.CANNOT_ASSIGN_TO_METHOD, 7, 3, 8), |
- errEx(ResolverErrorCode.IS_AN_INSTANCE_FIELD, 8, 5, 5), |
- errEx(ResolverErrorCode.NOT_A_STATIC_FIELD, 9, 13, 5)); |
- } |
- |
- public void test_redirectedConstructor() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " A() : this.named1();", |
- " A.named1() : this.named2();", |
- " A.named2() : this.named1();", |
- "}"), |
- errEx(ResolverErrorCode.REDIRECTED_CONSTRUCTOR_CYCLE, 3, 3, 20), |
- errEx(ResolverErrorCode.REDIRECTED_CONSTRUCTOR_CYCLE, 4, 3, 27), |
- errEx(ResolverErrorCode.REDIRECTED_CONSTRUCTOR_CYCLE, 5, 3, 27)); |
- } |
- |
- public void test_tooFewArgumentsInImplicitSuper() throws Exception { |
- resolveAndTest(Joiner.on("\n").join( |
- "class Object {}", |
- "class A {", |
- " A(arg) {}", |
- "}", |
- "class B extends A {", |
- " B() { }", |
- "}"), |
- errEx(ResolverErrorCode.TOO_FEW_ARGUMENTS_IN_IMPLICIT_SUPER, 6, 3, 7)); |
- } |
-} |