Chromium Code Reviews| Index: compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerSlowTest.java |
| diff --git a/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerSlowTest.java b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerSlowTest.java |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..1fa8281aad2947ca3d57f63de0ef5c9b0c3a07d3 |
| --- /dev/null |
| +++ b/compiler/javatests/com/google/dart/compiler/type/TypeAnalyzerSlowTest.java |
| @@ -0,0 +1,114 @@ |
| +// Copyright (c) 2011, 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.type; |
| + |
| +import com.google.common.base.Joiner; |
| +import com.google.common.collect.Iterables; |
| +import com.google.dart.compiler.CompilerTestCase; |
| +import com.google.dart.compiler.ast.DartFunctionExpression; |
| +import com.google.dart.compiler.ast.DartInvocation; |
| +import com.google.dart.compiler.ast.DartNode; |
| +import com.google.dart.compiler.ast.DartNodeTraverser; |
| +import com.google.dart.compiler.ast.DartUnit; |
| +import com.google.dart.compiler.resolver.ClassElement; |
| +import com.google.dart.compiler.resolver.Element; |
| +import com.google.dart.compiler.resolver.ElementKind; |
| +import com.google.dart.compiler.resolver.EnclosingElement; |
| +import com.google.dart.compiler.resolver.MethodElement; |
| + |
| +/** |
| + * Variant of {@link TypeAnalyzerTest}, which is based on {@link CompilerTestCase}. It is probably |
| + * slower, not actually unit test, but easier to use if you need access to DartNode's. |
| + */ |
| +public class TypeAnalyzerSlowTest extends CompilerTestCase { |
|
zundel
2011/11/07 19:26:53
maybe call this TypeAnalyzerCompiledTest?
|
| + /** |
| + * Tests that we correctly provide {@link Element#getEnclosingElement()} for method of class. |
| + */ |
| + public void test_resolveClassMethod() throws Exception { |
| + AnalyzeLibraryResult libraryResult = |
| + analyzeLibrary( |
| + "Test.dart", |
| + Joiner.on("\n").join( |
| + "class Object {}", |
| + "class Test {", |
| + " foo() {", |
| + " f();", |
| + " }", |
| + " f() {", |
| + " }", |
| + "}")); |
| + DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next(); |
| + // find f() invocation |
| + DartInvocation invocation = findInvocationSimple(unit, "f()"); |
| + assertNotNull(invocation); |
| + // referenced Element should be resolved to MethodElement |
| + Element methodElement = invocation.getReferencedElement(); |
| + assertNotNull(methodElement); |
| + assertSame(ElementKind.METHOD, methodElement.getKind()); |
| + assertEquals("f", ((MethodElement) methodElement).getOriginalSymbolName()); |
| + // enclosing Element of MethodElement is ClassElement |
| + EnclosingElement classElement = methodElement.getEnclosingElement(); |
| + assertNotNull(classElement); |
| + assertSame(ElementKind.CLASS, classElement.getKind()); |
| + assertEquals("Test", ((ClassElement) classElement).getOriginalSymbolName()); |
| + } |
| + |
| + /** |
| + * Test that local {@link DartFunctionExpression} has {@link Element} with enclosing |
| + * {@link Element}. |
| + * <p> |
| + * http://code.google.com/p/dart/issues/detail?id=145 |
| + */ |
| + public void test_resolveLocalFunction() throws Exception { |
| + AnalyzeLibraryResult libraryResult = |
| + analyzeLibrary( |
| + "Test.dart", |
| + Joiner.on("\n").join( |
| + "class Object {}", |
| + "class Test {", |
| + " foo() {", |
| + " f() {", |
| + " }", |
| + " f();", |
| + " }", |
| + "}")); |
| + DartUnit unit = libraryResult.getLibraryUnitResult().getUnits().iterator().next(); |
| + // find f() invocation |
| + DartInvocation invocation = findInvocationSimple(unit, "f()"); |
| + assertNotNull(invocation); |
| + // referenced Element should be resolved to MethodElement |
| + Element functionElement = invocation.getReferencedElement(); |
| + assertNotNull(functionElement); |
| + assertSame(ElementKind.FUNCTION_OBJECT, functionElement.getKind()); |
| + assertEquals("f", ((MethodElement) functionElement).getOriginalSymbolName()); |
| + // enclosing Element of this FUNCTION_OBJECT is enclosing method |
| + EnclosingElement enclosingMethodElement = functionElement.getEnclosingElement(); |
| + assertNotNull(enclosingMethodElement); |
| + assertSame(ElementKind.METHOD, enclosingMethodElement.getKind()); |
| + assertEquals("foo", ((MethodElement) enclosingMethodElement).getName()); |
| + // use EnclosingElement methods implementations in MethodElement |
| + assertEquals(false, enclosingMethodElement.isInterface()); |
| + assertEquals(true, Iterables.isEmpty(enclosingMethodElement.getMembers())); |
| + assertEquals(null, enclosingMethodElement.lookupLocalElement("f")); |
| + } |
| + |
| + /** |
| + * @return the {@link DartInvocation} with given source. This is inaccurate approach, but good |
| + * enough for specific tests. |
| + */ |
| + private static DartInvocation findInvocationSimple(DartNode rootNode, |
| + final String invocationString) { |
| + final DartInvocation invocationRef[] = new DartInvocation[1]; |
| + rootNode.accept(new DartNodeTraverser<Void>() { |
| + @Override |
| + public Void visitInvocation(DartInvocation node) { |
| + if (node.toSource().equals(invocationString)) { |
| + invocationRef[0] = node; |
| + } |
| + return super.visitInvocation(node); |
| + } |
| + }); |
| + return invocationRef[0]; |
| + } |
| +} |