blob: af46005b97bef31ce140fc1425b45f28a3f7ff13 [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.internal.scope;
import com.google.dart.engine.EngineTestCase;
import com.google.dart.engine.ast.ClassDeclaration;
import com.google.dart.engine.ast.ClassTypeAlias;
import com.google.dart.engine.ast.CompilationUnit;
import com.google.dart.engine.ast.ConstructorDeclaration;
import com.google.dart.engine.ast.FunctionDeclaration;
import com.google.dart.engine.ast.FunctionTypeAlias;
import com.google.dart.engine.ast.MethodDeclaration;
import com.google.dart.engine.ast.SimpleIdentifier;
import com.google.dart.engine.context.AnalysisContextFactory;
import com.google.dart.engine.context.AnalysisException;
import com.google.dart.engine.element.ClassElement;
import com.google.dart.engine.element.ConstructorElement;
import com.google.dart.engine.element.FunctionElement;
import com.google.dart.engine.element.FunctionTypeAliasElement;
import com.google.dart.engine.element.MethodElement;
import com.google.dart.engine.error.GatheringErrorListener;
import com.google.dart.engine.internal.element.ClassElementImpl;
import com.google.dart.engine.internal.element.CompilationUnitElementImpl;
import com.google.dart.engine.internal.element.FunctionTypeAliasElementImpl;
import com.google.dart.engine.internal.element.LibraryElementImpl;
import static com.google.dart.engine.ast.AstFactory.classDeclaration;
import static com.google.dart.engine.ast.AstFactory.classTypeAlias;
import static com.google.dart.engine.ast.AstFactory.compilationUnit;
import static com.google.dart.engine.ast.AstFactory.constructorDeclaration;
import static com.google.dart.engine.ast.AstFactory.formalParameterList;
import static com.google.dart.engine.ast.AstFactory.functionDeclaration;
import static com.google.dart.engine.ast.AstFactory.functionExpression;
import static com.google.dart.engine.ast.AstFactory.identifier;
import static com.google.dart.engine.ast.AstFactory.methodDeclaration;
import static com.google.dart.engine.ast.AstFactory.typeAlias;
import static com.google.dart.engine.ast.AstFactory.typeName;
import static com.google.dart.engine.ast.AstFactory.typeParameterList;
import static com.google.dart.engine.element.ElementFactory.classElement;
import static com.google.dart.engine.element.ElementFactory.constructorElement;
import static com.google.dart.engine.element.ElementFactory.functionElement;
import static com.google.dart.engine.element.ElementFactory.library;
import static com.google.dart.engine.element.ElementFactory.methodElement;
public class ScopeBuilderTest extends EngineTestCase {
public void test_scopeFor_ClassDeclaration() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedClassDeclaration(), listener);
assertInstanceOf(LibraryScope.class, scope);
}
public void test_scopeFor_ClassTypeAlias() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedClassTypeAlias(), listener);
assertInstanceOf(LibraryScope.class, scope);
}
public void test_scopeFor_CompilationUnit() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedCompilationUnit(), listener);
assertInstanceOf(LibraryScope.class, scope);
}
public void test_scopeFor_ConstructorDeclaration() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedConstructorDeclaration(), listener);
assertInstanceOf(ClassScope.class, scope);
}
public void test_scopeFor_ConstructorDeclaration_parameters() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(
createResolvedConstructorDeclaration().getParameters(),
listener);
assertInstanceOf(FunctionScope.class, scope);
}
public void test_scopeFor_FunctionDeclaration() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionDeclaration(), listener);
assertInstanceOf(LibraryScope.class, scope);
}
public void test_scopeFor_FunctionDeclaration_parameters() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(
createResolvedFunctionDeclaration().getFunctionExpression().getParameters(),
listener);
assertInstanceOf(FunctionScope.class, scope);
}
public void test_scopeFor_FunctionTypeAlias() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionTypeAlias(), listener);
assertInstanceOf(LibraryScope.class, scope);
}
public void test_scopeFor_FunctionTypeAlias_parameters() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedFunctionTypeAlias().getParameters(), listener);
assertInstanceOf(FunctionTypeScope.class, scope);
}
public void test_scopeFor_MethodDeclaration() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedMethodDeclaration(), listener);
assertInstanceOf(ClassScope.class, scope);
}
public void test_scopeFor_MethodDeclaration_body() throws AnalysisException {
GatheringErrorListener listener = new GatheringErrorListener();
Scope scope = ScopeBuilder.scopeFor(createResolvedMethodDeclaration().getBody(), listener);
assertInstanceOf(FunctionScope.class, scope);
}
public void test_scopeFor_notInCompilationUnit() {
GatheringErrorListener listener = new GatheringErrorListener();
try {
ScopeBuilder.scopeFor(identifier("x"), listener);
fail("Expected AnalysisException");
} catch (AnalysisException exception) {
// Expected
}
}
public void test_scopeFor_null() {
GatheringErrorListener listener = new GatheringErrorListener();
try {
ScopeBuilder.scopeFor(null, listener);
fail("Expected AnalysisException");
} catch (AnalysisException exception) {
// Expected
}
}
public void test_scopeFor_unresolved() {
GatheringErrorListener listener = new GatheringErrorListener();
try {
ScopeBuilder.scopeFor(compilationUnit(), listener);
fail("Expected AnalysisException");
} catch (AnalysisException exception) {
// Expected
}
}
private ClassDeclaration createResolvedClassDeclaration() {
CompilationUnit unit = createResolvedCompilationUnit();
String className = "C";
ClassDeclaration classNode = classDeclaration(
null,
className,
typeParameterList(),
null,
null,
null);
unit.getDeclarations().add(classNode);
ClassElement classElement = classElement(className);
classNode.getName().setStaticElement(classElement);
((CompilationUnitElementImpl) unit.getElement()).setTypes(new ClassElement[] {classElement});
return classNode;
}
private ClassTypeAlias createResolvedClassTypeAlias() {
CompilationUnit unit = createResolvedCompilationUnit();
String className = "C";
ClassTypeAlias classNode = classTypeAlias(
className,
typeParameterList(),
null,
null,
null,
null);
unit.getDeclarations().add(classNode);
ClassElement classElement = classElement(className);
classNode.getName().setStaticElement(classElement);
((CompilationUnitElementImpl) unit.getElement()).setTypes(new ClassElement[] {classElement});
return classNode;
}
private CompilationUnit createResolvedCompilationUnit() {
CompilationUnit unit = compilationUnit();
LibraryElementImpl library = library(AnalysisContextFactory.contextWithCore(), "lib");
unit.setElement(library.getDefiningCompilationUnit());
return unit;
}
private ConstructorDeclaration createResolvedConstructorDeclaration() {
ClassDeclaration classNode = createResolvedClassDeclaration();
String constructorName = "f";
ConstructorDeclaration constructorNode = constructorDeclaration(
identifier(constructorName),
null,
formalParameterList(),
null);
classNode.getMembers().add(constructorNode);
ConstructorElement constructorElement = constructorElement(classNode.getElement(), null);
constructorNode.setElement(constructorElement);
((ClassElementImpl) classNode.getElement()).setConstructors(new ConstructorElement[] {constructorElement});
return constructorNode;
}
private FunctionDeclaration createResolvedFunctionDeclaration() {
CompilationUnit unit = createResolvedCompilationUnit();
String functionName = "f";
FunctionDeclaration functionNode = functionDeclaration(
null,
null,
functionName,
functionExpression());
unit.getDeclarations().add(functionNode);
FunctionElement functionElement = functionElement(functionName);
functionNode.getName().setStaticElement(functionElement);
((CompilationUnitElementImpl) unit.getElement()).setFunctions(new FunctionElement[] {functionElement});
return functionNode;
}
private FunctionTypeAlias createResolvedFunctionTypeAlias() {
CompilationUnit unit = createResolvedCompilationUnit();
FunctionTypeAlias aliasNode = typeAlias(
typeName("A"),
"F",
typeParameterList(),
formalParameterList());
unit.getDeclarations().add(aliasNode);
SimpleIdentifier aliasName = aliasNode.getName();
FunctionTypeAliasElement aliasElement = new FunctionTypeAliasElementImpl(aliasName);
aliasName.setStaticElement(aliasElement);
((CompilationUnitElementImpl) unit.getElement()).setTypeAliases(new FunctionTypeAliasElement[] {aliasElement});
return aliasNode;
}
private MethodDeclaration createResolvedMethodDeclaration() {
ClassDeclaration classNode = createResolvedClassDeclaration();
String methodName = "f";
MethodDeclaration methodNode = methodDeclaration(
null,
null,
null,
null,
identifier(methodName),
formalParameterList());
classNode.getMembers().add(methodNode);
MethodElement methodElement = methodElement(methodName, null);
methodNode.getName().setStaticElement(methodElement);
((ClassElementImpl) classNode.getElement()).setMethods(new MethodElement[] {methodElement});
return methodNode;
}
}