Index: compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
index d492a5f37326dac234de52ef1678489a38f3e46f..150b4b83f271310ef43d43fa28e813363d85bea7 100644 |
--- a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
+++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerCompilerTest.java |
@@ -36,6 +36,7 @@ import com.google.dart.compiler.ast.DartNode; |
import com.google.dart.compiler.ast.DartParameter; |
import com.google.dart.compiler.ast.DartUnit; |
import com.google.dart.compiler.ast.DartUnqualifiedInvocation; |
+import com.google.dart.compiler.common.SourceInfo; |
import com.google.dart.compiler.parser.ParserErrorCode; |
import com.google.dart.compiler.resolver.ClassElement; |
import com.google.dart.compiler.resolver.Element; |
@@ -48,7 +49,9 @@ import com.google.dart.compiler.resolver.TypeErrorCode; |
import java.io.Reader; |
import java.io.StringReader; |
import java.net.URI; |
+import java.util.Iterator; |
import java.util.List; |
+import java.util.concurrent.atomic.AtomicReference; |
/** |
* Variant of {@link TypeAnalyzerTest}, which is based on {@link CompilerTestCase}. It is probably |
@@ -75,6 +78,36 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase { |
} |
/** |
+ * We should support resolving to the method "call". |
+ * <p> |
+ * http://code.google.com/p/dart/issues/detail?id=1355 |
+ */ |
+ public void test_resolveCallMethod() throws Exception { |
+ AnalyzeLibraryResult libraryResult = analyzeLibrary( |
+ "// filler filler filler filler filler filler filler filler filler filler", |
+ "class A {", |
+ " call() => 42;", |
+ "}", |
+ "main() {", |
+ " A a = new A();", |
+ " a();", |
+ "}", |
+ ""); |
+ assertErrors(libraryResult.getErrors()); |
+ // find a() |
+ DartIdentifier aVar = findNode(libraryResult, DartIdentifier.class, "a()"); |
+ assertNotNull(aVar); |
+ DartUnqualifiedInvocation invocation = (DartUnqualifiedInvocation) aVar.getParent(); |
+ // analyze a() element |
+ MethodElement element = (MethodElement) invocation.getElement(); |
+ assertNotNull(element); |
+ assertEquals("call", element.getName()); |
+ assertEquals( |
+ libraryResult.source.indexOf("call() => 42"), |
+ element.getNameLocation().getOffset()); |
+ } |
+ |
+ /** |
* It is a compile-time error if a typedef refers to itself via a chain of references that does |
* not include a class or interface type. |
* <p> |
@@ -2613,4 +2646,30 @@ public class TypeAnalyzerCompilerTest extends CompilerTestCase { |
private AnalyzeLibraryResult analyzeLibrary(String... lines) throws Exception { |
return analyzeLibrary(getName(), makeCode(lines)); |
} |
+ |
+ private static <T extends DartNode> T findNode( |
+ AnalyzeLibraryResult libraryResult, |
+ final Class<T> clazz, |
+ String pattern) { |
+ final int index = libraryResult.source.indexOf(pattern); |
+ assertTrue(index != -1); |
+ final AtomicReference<T> result = new AtomicReference<T>(); |
+ Iterator<DartUnit> unitsIterator = libraryResult.getLibraryUnitResult().getUnits().iterator(); |
+ unitsIterator.next(); |
+ DartUnit unit = unitsIterator.next(); |
+ unit.accept(new ASTVisitor<Void>() { |
+ @Override |
+ @SuppressWarnings("unchecked") |
+ public Void visitNode(DartNode node) { |
+ SourceInfo sourceInfo = node.getSourceInfo(); |
+ if (sourceInfo.getOffset() <= index |
+ && index < sourceInfo.getEnd() |
+ && clazz.isInstance(node)) { |
+ result.set((T) node); |
+ } |
+ return super.visitNode(node); |
+ } |
+ }); |
+ return result.get(); |
+ } |
} |