Stop depending on LabelElement(s) to be reported in visitChildren().

R=brianwilkerson@google.com
BUG=

Review-Url: https://codereview.chromium.org/2973093002 .
This commit is contained in:
Konstantin Shcheglov 2017-07-06 11:28:04 -07:00
parent b133bb1ec3
commit 6323bedc58
5 changed files with 80 additions and 15 deletions

View file

@ -25,6 +25,16 @@ main() {
});
}
/**
* Search the [unit] for the [engine.Element]s with the given [name].
*/
List<engine.Element> findElementsByName(
engine.CompilationUnit unit, String name) {
var finder = new _ElementsByNameFinder(name);
unit.accept(finder);
return finder.elements;
}
@reflectiveTest
class ElementKindTest {
void test_fromEngine() {
@ -97,7 +107,9 @@ class ElementKindTest {
class ElementTest extends AbstractContextTest {
engine.Element findElementInUnit(engine.CompilationUnit unit, String name,
[engine.ElementKind kind]) {
return findChildElement(unit.element, name, kind);
return findElementsByName(unit, name)
.where((e) => kind == null || e.kind == kind)
.single;
}
test_fromElement_CLASS() async {
@ -273,7 +285,8 @@ enum E2 { three, four }''');
expect(element.flags, Element.FLAG_CONST | Element.FLAG_STATIC);
}
{
engine.FieldElement engineElement = findElementInUnit(unit, 'index');
engine.FieldElement engineElement =
unit.element.enums[1].getField('index');
// create notification Element
Element element = convertElement(engineElement);
expect(element.kind, ElementKind.FIELD);
@ -291,7 +304,8 @@ enum E2 { three, four }''');
expect(element.flags, Element.FLAG_FINAL);
}
{
engine.FieldElement engineElement = findElementInUnit(unit, 'values');
engine.FieldElement engineElement =
unit.element.enums[1].getField('values');
// create notification Element
Element element = convertElement(engineElement);
expect(element.kind, ElementKind.FIELD);
@ -455,9 +469,8 @@ class A {
set mySetter(String x) {}
}''');
engine.CompilationUnit unit = await resolveLibraryUnit(source);
engine.FieldElement engineFieldElement =
findElementInUnit(unit, 'mySetter', engine.ElementKind.FIELD);
engine.PropertyAccessorElement engineElement = engineFieldElement.setter;
engine.PropertyAccessorElement engineElement =
findElementInUnit(unit, 'mySetter', engine.ElementKind.SETTER);
// create notification Element
Element element = convertElement(engineElement);
expect(element.kind, ElementKind.SETTER);
@ -475,3 +488,17 @@ class A {
expect(element.flags, 0);
}
}
class _ElementsByNameFinder extends engine.RecursiveAstVisitor<Null> {
final String name;
final List<engine.Element> elements = [];
_ElementsByNameFinder(this.name);
@override
visitSimpleIdentifier(engine.SimpleIdentifier node) {
if (node.name == name && node.inDeclarationContext()) {
elements.add(node.staticElement);
}
}
}

View file

@ -14,6 +14,7 @@ import 'package:analyzer/src/dart/element/member.dart';
import 'package:test/test.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import '../../../utils.dart';
import 'base.dart';
main() {
@ -572,7 +573,7 @@ label:
}
}
''');
Element element = _findElement('label');
Element element = findElementsByName(testUnit, 'label').single;
Element main = _findElement('main');
var expected = [
_expectId(main, SearchResultKind.REFERENCE, 'label; // 1'),
@ -613,7 +614,7 @@ main() {
v();
}
''');
Element element = _findElementAtString('v;');
Element element = findElementsByName(testUnit, 'v').single;
Element main = _findElement('main');
var expected = [
_expectId(main, SearchResultKind.WRITE, 'v = 1;'),
@ -635,7 +636,7 @@ main() {
}
}
''');
Element element = _findElementAtString('v in []');
Element element = findElementsByName(testUnit, 'v').single;
Element main = _findElement('main');
var expected = [
_expectId(main, SearchResultKind.WRITE, 'v = 1;'),

View file

@ -13,6 +13,15 @@ import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
import 'package:front_end/src/base/source.dart';
import 'package:test/test.dart';
/**
* Search the [unit] for the [Element]s with the given [name].
*/
List<Element> findElementsByName(CompilationUnit unit, String name) {
var finder = new _ElementsByNameFinder(name);
unit.accept(finder);
return finder.elements;
}
/**
* Search the [unit] for the [LocalVariableElement] with the given [name].
* Fail if there is not exactly one such variable.

View file

@ -6,6 +6,7 @@ import 'dart:async';
import 'package:analyzer/dart/analysis/session.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/visitor.dart';
import 'package:analyzer/exception/exception.dart';
@ -40,6 +41,15 @@ Element findChildElement(Element root, String name, [ElementKind kind]) {
return result;
}
/**
* Search the [unit] for the [Element]s with the given [name].
*/
List<Element> findElementsByName(CompilationUnit unit, String name) {
var finder = new _ElementsByNameFinder(name);
unit.accept(finder);
return finder.elements;
}
/**
* A function to be called for every [Element].
*/
@ -99,7 +109,9 @@ class Required {
Element findElementInUnit(CompilationUnit unit, String name,
[ElementKind kind]) {
return findChildElement(unit.element, name, kind);
return findElementsByName(unit, name)
.where((e) => kind == null || e.kind == kind)
.single;
}
File newFile(String path, [String content]) =>
@ -177,6 +189,20 @@ class PrintLogger implements Logger {
}
}
class _ElementsByNameFinder extends RecursiveAstVisitor<Null> {
final String name;
final List<Element> elements = [];
_ElementsByNameFinder(this.name);
@override
visitSimpleIdentifier(SimpleIdentifier node) {
if (node.name == name && node.inDeclarationContext()) {
elements.add(node.staticElement);
}
}
}
/**
* Wraps the given [_ElementVisitorFunction] into an instance of
* [engine.GeneralizingElementVisitor].

View file

@ -354,7 +354,8 @@ enum E2 { three, four }''');
plugin.Element.FLAG_CONST | plugin.Element.FLAG_STATIC);
}
{
analyzer.FieldElement engineElement = findElementInUnit(unit, 'index');
analyzer.FieldElement engineElement =
unit.element.enums[1].getField('index');
// create notification Element
plugin.Element element = converter.convertElement(engineElement);
expect(element.kind, plugin.ElementKind.FIELD);
@ -372,7 +373,9 @@ enum E2 { three, four }''');
expect(element.flags, plugin.Element.FLAG_FINAL);
}
{
analyzer.FieldElement engineElement = findElementInUnit(unit, 'values');
analyzer.FieldElement engineElement =
unit.element.enums[1].getField('values');
// create notification Element
plugin.Element element = converter.convertElement(engineElement);
expect(element.kind, plugin.ElementKind.FIELD);
@ -509,9 +512,8 @@ class A {
set mySetter(String x) {}
}''');
analyzer.CompilationUnit unit = await resolveLibraryUnit(source);
analyzer.FieldElement engineFieldElement =
findElementInUnit(unit, 'mySetter', analyzer.ElementKind.FIELD);
analyzer.PropertyAccessorElement engineElement = engineFieldElement.setter;
analyzer.PropertyAccessorElement engineElement =
findElementInUnit(unit, 'mySetter', analyzer.ElementKind.SETTER);
// create notification Element
plugin.Element element = converter.convertElement(engineElement);
expect(element.kind, plugin.ElementKind.SETTER);