mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:30:32 +00:00
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:
parent
b133bb1ec3
commit
6323bedc58
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;'),
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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].
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue