blob: 3dfae2ba204a52d0183270d27d652b722501c0f8 [file] [log] [blame]
// Copyright (c) 2015, 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.
library engine.declaration_resolver_test;
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/resolver.dart';
import 'package:unittest/unittest.dart';
import '../reflective_tests.dart';
import '../utils.dart';
import 'resolver_test.dart';
import 'test_support.dart';
main() {
initializeTestEnvironment();
runReflectiveTests(DeclarationResolverTest);
runReflectiveTests(StrongModeDeclarationResolverTest);
}
CompilationUnit _cloneResolveUnit(CompilationUnit unit) {
CompilationUnit clonedUnit = AstCloner.clone(unit);
new DeclarationResolver().resolve(clonedUnit, unit.element);
return clonedUnit;
}
SimpleIdentifier _findSimpleIdentifier(
AstNode root, String code, String search) {
return EngineTestCase.findNode(
root, code, search, (n) => n is SimpleIdentifier);
}
@reflectiveTest
class DeclarationResolverTest extends ResolverTestCase {
@override
void setUp() {
super.setUp();
}
void test_functionDeclaration_getter() {
String code = r'''
int get zzz => 42;
''';
CompilationUnit unit = resolveSource(code);
PropertyAccessorElement getterElement =
_findSimpleIdentifier(unit, code, 'zzz =>').staticElement;
expect(getterElement.isGetter, isTrue);
// re-resolve
CompilationUnit unit2 = _cloneResolveUnit(unit);
SimpleIdentifier getterName = _findSimpleIdentifier(unit2, code, 'zzz =>');
expect(getterName.staticElement, same(getterElement));
}
void test_functionDeclaration_setter() {
String code = r'''
void set zzz(_) {}
''';
CompilationUnit unit = resolveSource(code);
PropertyAccessorElement setterElement =
_findSimpleIdentifier(unit, code, 'zzz(_)').staticElement;
expect(setterElement.isSetter, isTrue);
// re-resolve
CompilationUnit unit2 = _cloneResolveUnit(unit);
SimpleIdentifier getterName = _findSimpleIdentifier(unit2, code, 'zzz(_)');
expect(getterName.staticElement, same(setterElement));
}
void test_invalid_functionDeclaration_getter_inFunction() {
String code = r'''
main() {
int get zzz => 42;
}
''';
CompilationUnit unit = resolveSource(code);
FunctionElement getterElement =
_findSimpleIdentifier(unit, code, 'zzz =>').staticElement;
// re-resolve
CompilationUnit unit2 = _cloneResolveUnit(unit);
SimpleIdentifier getterName = _findSimpleIdentifier(unit2, code, 'zzz =>');
expect(getterName.staticElement, same(getterElement));
}
void test_invalid_functionDeclaration_setter_inFunction() {
String code = r'''
main() {
set zzz(x) {}
}
''';
CompilationUnit unit = resolveSource(code);
FunctionElement setterElement =
_findSimpleIdentifier(unit, code, 'zzz(x)').staticElement;
// re-resolve
CompilationUnit unit2 = _cloneResolveUnit(unit);
SimpleIdentifier setterName = _findSimpleIdentifier(unit2, code, 'zzz(x)');
expect(setterName.staticElement, same(setterElement));
}
}
/**
* Strong mode DeclarationResolver tests
*/
@reflectiveTest
class StrongModeDeclarationResolverTest extends ResolverTestCase {
@override
void setUp() {
resetWithOptions(new AnalysisOptionsImpl()..strongMode = true);
}
void test_genericFunction_typeParameter() {
String code = r'''
/*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null;
''';
CompilationUnit unit = resolveSource(code);
FunctionDeclaration node = _findSimpleIdentifier(unit, code, 'max').parent;
TypeParameter t = node.functionExpression.typeParameters.typeParameters[0];
FunctionElement element = node.name.staticElement;
TypeParameterElement tElement = element.typeParameters[0];
expect(tElement, isNotNull);
expect(element.typeParameters.toString(), "[T]");
expect(element.type.toString(), "<T>(T, T) → T");
expect(t.element, same(tElement));
// re-resolve
CompilationUnit unit2 = _cloneResolveUnit(unit);
node = _findSimpleIdentifier(unit2, code, 'max').parent;
t = node.functionExpression.typeParameters.typeParameters[0];
expect(t.element, same(tElement));
}
void test_genericMethod_typeParameter() {
String code = r'''
class C {
/*=T*/ max/*<T>*/(/*=T*/ x, /*=T*/ y) => null;
}
''';
CompilationUnit unit = resolveSource(code);
MethodDeclaration node = _findSimpleIdentifier(unit, code, 'max').parent;
TypeParameter t = node.typeParameters.typeParameters[0];
MethodElement element = node.name.staticElement;
TypeParameterElement tElement = element.typeParameters[0];
expect(tElement, isNotNull);
expect(element.typeParameters.toString(), "[T]");
expect(element.type.toString(), "<T>(T, T) → T");
expect(t.element, same(tElement));
// re-resolve
CompilationUnit unit2 = _cloneResolveUnit(unit);
node = _findSimpleIdentifier(unit2, code, 'max').parent;
t = node.typeParameters.typeParameters[0];
expect(t.element, same(tElement));
}
}