| Index: pkg/analysis_server/test/services/search/search_engine2_test.dart
|
| diff --git a/pkg/analysis_server/test/services/search/search_engine2_test.dart b/pkg/analysis_server/test/services/search/search_engine2_test.dart
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..02c0c6d0445ef17b1be047431d116908f74a6e50
|
| --- /dev/null
|
| +++ b/pkg/analysis_server/test/services/search/search_engine2_test.dart
|
| @@ -0,0 +1,671 @@
|
| +// Copyright (c) 2014, 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 test.services.src.search.search_engine2;
|
| +
|
| +import 'dart:async';
|
| +
|
| +import 'package:analysis_server/src/services/index2/index2.dart';
|
| +import 'package:analysis_server/src/services/search/search_engine.dart';
|
| +import 'package:analysis_server/src/services/search/search_engine_internal2.dart';
|
| +import 'package:analyzer/dart/element/element.dart';
|
| +import 'package:analyzer/src/dart/element/element.dart';
|
| +import 'package:analyzer/src/dart/element/member.dart';
|
| +import 'package:analyzer/src/generated/source.dart';
|
| +import 'package:test_reflective_loader/test_reflective_loader.dart';
|
| +import 'package:unittest/unittest.dart';
|
| +
|
| +import '../../abstract_single_unit.dart';
|
| +import '../../utils.dart';
|
| +
|
| +main() {
|
| + initializeTestEnvironment();
|
| + defineReflectiveTests(SearchEngineImpl2Test);
|
| +}
|
| +
|
| +class ExpectedMatch {
|
| + final Element element;
|
| + final MatchKind kind;
|
| + SourceRange range;
|
| + final bool isResolved;
|
| + final bool isQualified;
|
| +
|
| + ExpectedMatch(this.element, this.kind, int offset, int length,
|
| + {this.isResolved: true, this.isQualified: false}) {
|
| + this.range = new SourceRange(offset, length);
|
| + }
|
| +
|
| + bool operator ==(SearchMatch match) {
|
| + return match.element == this.element &&
|
| + match.kind == this.kind &&
|
| + match.isResolved == this.isResolved &&
|
| + match.isQualified == this.isQualified &&
|
| + match.sourceRange == this.range;
|
| + }
|
| +
|
| + @override
|
| + String toString() {
|
| + StringBuffer buffer = new StringBuffer();
|
| + buffer.write("ExpectedMatch(kind=");
|
| + buffer.write(kind);
|
| + buffer.write(", element=");
|
| + buffer.write(element != null ? element.displayName : 'null');
|
| + buffer.write(", range=");
|
| + buffer.write(range);
|
| + buffer.write(", isResolved=");
|
| + buffer.write(isResolved);
|
| + buffer.write(", isQualified=");
|
| + buffer.write(isQualified);
|
| + buffer.write(")");
|
| + return buffer.toString();
|
| + }
|
| +}
|
| +
|
| +@reflectiveTest
|
| +class SearchEngineImpl2Test extends AbstractSingleUnitTest {
|
| + Index2 index;
|
| + SearchEngineImpl2 searchEngine;
|
| +
|
| + void setUp() {
|
| + super.setUp();
|
| + index = createMemoryIndex2();
|
| + searchEngine = new SearchEngineImpl2(context, index);
|
| + }
|
| +
|
| +// Future test_searchAllSubtypes() {
|
| +// _indexTestUnit('''
|
| +//class T {}
|
| +//class A extends T {}
|
| +//class B extends A {}
|
| +//class C implements B {}
|
| +//''');
|
| +// ClassElement element = findElement('T');
|
| +// ClassElement elementA = findElement('A');
|
| +// ClassElement elementB = findElement('B');
|
| +// ClassElement elementC = findElement('C');
|
| +// var expected = [
|
| +// _expectId(elementA, MatchKind.DECLARATION, 'A extends T'),
|
| +// _expectId(elementB, MatchKind.DECLARATION, 'B extends A'),
|
| +// _expectId(elementC, MatchKind.DECLARATION, 'C implements B')
|
| +// ];
|
| +// return searchEngine.searchAllSubtypes(element).then((matches) {
|
| +// _assertMatches(matches, expected);
|
| +// });
|
| +// }
|
| +//
|
| +// Future test_searchElementDeclarations() {
|
| +// _indexTestUnit('''
|
| +//class A {
|
| +// test() {}
|
| +//}
|
| +//class B {
|
| +// int test = 1;
|
| +// main() {
|
| +// int test = 2;
|
| +// }
|
| +//}
|
| +//''');
|
| +// ClassElement elementA = findElement('A');
|
| +// ClassElement elementB = findElement('B');
|
| +// Element element_test = findElement('test', ElementKind.LOCAL_VARIABLE);
|
| +// var expected = [
|
| +// _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
|
| +// _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;'),
|
| +// _expectId(element_test, MatchKind.DECLARATION, 'test = 2;'),
|
| +// ];
|
| +// return searchEngine.searchElementDeclarations('test').then((matches) {
|
| +// _assertMatches(matches, expected);
|
| +// });
|
| +// }
|
| +//
|
| +// Future test_searchMemberDeclarations() {
|
| +// _indexTestUnit('''
|
| +//class A {
|
| +// test() {}
|
| +//}
|
| +//class B {
|
| +// int test = 1;
|
| +// main() {
|
| +// int test = 2;
|
| +// }
|
| +//}
|
| +//''');
|
| +// ClassElement elementA = findElement('A');
|
| +// ClassElement elementB = findElement('B');
|
| +// var expected = [
|
| +// _expectId(elementA.methods[0], MatchKind.DECLARATION, 'test() {}'),
|
| +// _expectId(elementB.fields[0], MatchKind.DECLARATION, 'test = 1;')
|
| +// ];
|
| +// return searchEngine.searchMemberDeclarations('test').then((matches) {
|
| +// _assertMatches(matches, expected);
|
| +// });
|
| +// }
|
| +//
|
| +// Future test_searchMemberReferences() {
|
| +// _indexTestUnit('''
|
| +//class A {
|
| +// var test; // A
|
| +// mainA() {
|
| +// test(); // a-inv-r-nq
|
| +// test = 1; // a-write-r-nq
|
| +// test += 2; // a-read-write-r-nq
|
| +// print(test); // a-read-r-nq
|
| +// }
|
| +//}
|
| +//main(A a, p) {
|
| +// a.test(); // a-inv-r-q
|
| +// a.test = 1; // a-write-r-q
|
| +// a.test += 2; // a-read-write-r-q
|
| +// print(a.test); // a-read-r-q
|
| +// p.test(); // p-inv-ur-q
|
| +// p.test = 1; // p-write-ur-q
|
| +// p.test += 2; // p-read-write-ur-q
|
| +// print(p.test); // p-read-ur-q
|
| +//}
|
| +//''');
|
| +// Element mainA = findElement('mainA');
|
| +// Element main = findElement('main');
|
| +// var expected = [
|
| +// _expectId(mainA, MatchKind.INVOCATION, 'test(); // a-inv-r-nq'),
|
| +// _expectId(mainA, MatchKind.WRITE, 'test = 1; // a-write-r-nq'),
|
| +// _expectId(mainA, MatchKind.READ_WRITE, 'test += 2; // a-read-write-r-nq'),
|
| +// _expectId(mainA, MatchKind.READ, 'test); // a-read-r-nq'),
|
| +// _expectIdQ(main, MatchKind.INVOCATION, 'test(); // a-inv-r-q'),
|
| +// _expectIdQ(main, MatchKind.WRITE, 'test = 1; // a-write-r-q'),
|
| +// _expectIdQ(main, MatchKind.READ_WRITE, 'test += 2; // a-read-write-r-q'),
|
| +// _expectIdQ(main, MatchKind.READ, 'test); // a-read-r-q'),
|
| +// _expectIdU(main, MatchKind.INVOCATION, 'test(); // p-inv-ur-q'),
|
| +// _expectIdU(main, MatchKind.WRITE, 'test = 1; // p-write-ur-q'),
|
| +// _expectIdU(main, MatchKind.READ_WRITE, 'test += 2; // p-read-write-ur-q'),
|
| +// _expectIdU(main, MatchKind.READ, 'test); // p-read-ur-q'),
|
| +// ];
|
| +// return searchEngine.searchMemberReferences('test').then((matches) {
|
| +// _assertMatches(matches, expected);
|
| +// });
|
| +// }
|
| +
|
| + test_searchReferences_ClassElement() async {
|
| + _indexTestUnit('''
|
| +class A {}
|
| +main(A p) {
|
| + A v;
|
| +}
|
| +''');
|
| + ClassElement element = findElement('A');
|
| + Element pElement = findElement('p');
|
| + Element vElement = findElement('v');
|
| + var expected = [
|
| + _expectId(pElement, MatchKind.REFERENCE, 'A p'),
|
| + _expectId(vElement, MatchKind.REFERENCE, 'A v')
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_CompilationUnitElement() async {
|
| + addSource(
|
| + '/my_part.dart',
|
| + '''
|
| +part of lib;
|
| +''');
|
| + _indexTestUnit('''
|
| +library lib;
|
| +part 'my_part.dart';
|
| +''');
|
| + CompilationUnitElement element = testLibraryElement.parts[0];
|
| + var expected = [
|
| + _expectIdQ(testUnitElement, MatchKind.REFERENCE, "'my_part.dart'",
|
| + length: "'my_part.dart'".length)
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_ConstructorElement() async {
|
| + _indexTestUnit('''
|
| +class A {
|
| + A.named() {}
|
| +}
|
| +main() {
|
| + new A.named();
|
| +}
|
| +''');
|
| + ConstructorElement element = findElement('named');
|
| + Element mainElement = findElement('main');
|
| + var expected = [
|
| + _expectIdQ(mainElement, MatchKind.REFERENCE, '.named();', length: 6)
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_Element_unknown() async {
|
| + await _verifyReferences(DynamicElementImpl.instance, []);
|
| + }
|
| +
|
| + test_searchReferences_FieldElement() async {
|
| + _indexTestUnit('''
|
| +class A {
|
| + var field;
|
| + A({this.field});
|
| + main() {
|
| + new A(field: 1);
|
| + // getter
|
| + print(field); // ref-nq
|
| + print(this.field); // ref-q
|
| + field(); // inv-nq
|
| + this.field(); // inv-q
|
| + // setter
|
| + field = 2; // ref-nq;
|
| + this.field = 3; // ref-q;
|
| + }
|
| +}
|
| +''');
|
| + FieldElement element = findElement('field');
|
| + Element main = findElement('main');
|
| + Element fieldParameter = findElement('field', ElementKind.PARAMETER);
|
| + var expected = [
|
| + _expectIdQ(fieldParameter, MatchKind.REFERENCE, 'field}'),
|
| + _expectIdQ(main, MatchKind.REFERENCE, 'field: 1'),
|
| + _expectId(main, MatchKind.READ, 'field); // ref-nq'),
|
| + _expectIdQ(main, MatchKind.READ, 'field); // ref-q'),
|
| + _expectId(main, MatchKind.INVOCATION, 'field(); // inv-nq'),
|
| + _expectIdQ(main, MatchKind.INVOCATION, 'field(); // inv-q'),
|
| + _expectId(main, MatchKind.WRITE, 'field = 2; // ref-nq'),
|
| + _expectIdQ(main, MatchKind.WRITE, 'field = 3; // ref-q'),
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_FunctionElement() async {
|
| + _indexTestUnit('''
|
| +test() {}
|
| +main() {
|
| + test();
|
| + print(test);
|
| +}
|
| +''');
|
| + FunctionElement element = findElement('test');
|
| + Element mainElement = findElement('main');
|
| + var expected = [
|
| + _expectId(mainElement, MatchKind.INVOCATION, 'test();'),
|
| + _expectId(mainElement, MatchKind.REFERENCE, 'test);')
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_FunctionTypeAliasElement() async {
|
| + _indexTestUnit('''
|
| +typedef Test();
|
| +main() {
|
| + Test a;
|
| + Test b;
|
| +}
|
| +''');
|
| + FunctionTypeAliasElement element = findElement('Test');
|
| + Element aElement = findElement('a');
|
| + Element bElement = findElement('b');
|
| + var expected = [
|
| + _expectId(aElement, MatchKind.REFERENCE, 'Test a;'),
|
| + _expectId(bElement, MatchKind.REFERENCE, 'Test b;')
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| +// Future test_searchReferences_ImportElement_noPrefix() {
|
| +// _indexTestUnit('''
|
| +//import 'dart:math';
|
| +//main() {
|
| +// print(E);
|
| +//}
|
| +//''');
|
| +// ImportElement element = testLibraryElement.imports[0];
|
| +// Element mainElement = findElement('main');
|
| +// var kind = MatchKind.REFERENCE;
|
| +// var expected = [_expectId(mainElement, kind, 'E);', length: 0)];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +//
|
| +// Future test_searchReferences_ImportElement_withPrefix() {
|
| +// _indexTestUnit('''
|
| +//import 'dart:math' as math;
|
| +//main() {
|
| +// print(math.PI);
|
| +//}
|
| +//''');
|
| +// ImportElement element = testLibraryElement.imports[0];
|
| +// Element mainElement = findElement('main');
|
| +// var kind = MatchKind.REFERENCE;
|
| +// var expected = [
|
| +// _expectId(mainElement, kind, 'math.PI);', length: 'math.'.length)
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +//
|
| +// Future test_searchReferences_LabelElement() {
|
| +// _indexTestUnit('''
|
| +//main() {
|
| +//label:
|
| +// while (true) {
|
| +// if (true) {
|
| +// break label; // 1
|
| +// }
|
| +// break label; // 2
|
| +// }
|
| +//}
|
| +//''');
|
| +// LabelElement element = findElement('label');
|
| +// Element mainElement = findElement('main');
|
| +// var expected = [
|
| +// _expectId(mainElement, MatchKind.REFERENCE, 'label; // 1'),
|
| +// _expectId(mainElement, MatchKind.REFERENCE, 'label; // 2')
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +//
|
| +// Future test_searchReferences_LibraryElement() {
|
| +// var codeA = 'part of lib; // A';
|
| +// var codeB = 'part of lib; // B';
|
| +// addSource('/unitA.dart', codeA);
|
| +// addSource('/unitB.dart', codeB);
|
| +// _indexTestUnit('''
|
| +//library lib;
|
| +//part 'unitA.dart';
|
| +//part 'unitB.dart';
|
| +//''');
|
| +// LibraryElement element = testLibraryElement;
|
| +// CompilationUnitElement elementA = element.parts[0];
|
| +// CompilationUnitElement elementB = element.parts[1];
|
| +// index.index(context, elementA.computeNode());
|
| +// index.index(context, elementB.computeNode());
|
| +// var expected = [
|
| +// new ExpectedMatch(elementA, MatchKind.REFERENCE,
|
| +// codeA.indexOf('lib; // A'), 'lib'.length),
|
| +// new ExpectedMatch(elementB, MatchKind.REFERENCE,
|
| +// codeB.indexOf('lib; // B'), 'lib'.length),
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +//
|
| +// Future test_searchReferences_LocalVariableElement() {
|
| +// _indexTestUnit('''
|
| +//main() {
|
| +// var v;
|
| +// v = 1;
|
| +// v += 2;
|
| +// print(v);
|
| +// v();
|
| +//}
|
| +//''');
|
| +// LocalVariableElement element = findElement('v');
|
| +// Element mainElement = findElement('main');
|
| +// var expected = [
|
| +// _expectId(mainElement, MatchKind.WRITE, 'v = 1;'),
|
| +// _expectId(mainElement, MatchKind.READ_WRITE, 'v += 2;'),
|
| +// _expectId(mainElement, MatchKind.READ, 'v);'),
|
| +// _expectId(mainElement, MatchKind.INVOCATION, 'v();')
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +
|
| + test_searchReferences_MethodElement() async {
|
| + _indexTestUnit('''
|
| +class A {
|
| + m() {}
|
| + main() {
|
| + m(); // 1
|
| + this.m(); // 2
|
| + print(m); // 3
|
| + print(this.m); // 4
|
| + }
|
| +}
|
| +''');
|
| + MethodElement method = findElement('m');
|
| + Element mainElement = findElement('main');
|
| + var expected = [
|
| + _expectId(mainElement, MatchKind.INVOCATION, 'm(); // 1'),
|
| + _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // 2'),
|
| + _expectId(mainElement, MatchKind.REFERENCE, 'm); // 3'),
|
| + _expectIdQ(mainElement, MatchKind.REFERENCE, 'm); // 4')
|
| + ];
|
| + await _verifyReferences(method, expected);
|
| + }
|
| +
|
| + test_searchReferences_MethodMember() async {
|
| + _indexTestUnit('''
|
| +class A<T> {
|
| + T m() => null;
|
| +}
|
| +main(A<int> a) {
|
| + a.m(); // ref
|
| +}
|
| +''');
|
| + MethodMember method = findNodeElementAtString('m(); // ref');
|
| + Element mainElement = findElement('main');
|
| + var expected = [
|
| + _expectIdQ(mainElement, MatchKind.INVOCATION, 'm(); // ref')
|
| + ];
|
| + await _verifyReferences(method, expected);
|
| + }
|
| +
|
| +// Future test_searchReferences_ParameterElement() {
|
| +// _indexTestUnit('''
|
| +//foo({p}) {
|
| +// p = 1;
|
| +// p += 2;
|
| +// print(p);
|
| +// p();
|
| +//}
|
| +//main() {
|
| +// foo(p: 42);
|
| +//}
|
| +//''');
|
| +// ParameterElement element = findElement('p');
|
| +// Element fooElement = findElement('foo');
|
| +// Element mainElement = findElement('main');
|
| +// var expected = [
|
| +// _expectId(fooElement, MatchKind.WRITE, 'p = 1;'),
|
| +// _expectId(fooElement, MatchKind.READ_WRITE, 'p += 2;'),
|
| +// _expectId(fooElement, MatchKind.READ, 'p);'),
|
| +// _expectId(fooElement, MatchKind.INVOCATION, 'p();'),
|
| +// _expectId(mainElement, MatchKind.REFERENCE, 'p: 42')
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +//
|
| +// Future test_searchReferences_PrefixElement() {
|
| +// _indexTestUnit('''
|
| +//import 'dart:async' as ppp;
|
| +//main() {
|
| +// ppp.Future a;
|
| +// ppp.Stream b;
|
| +//}
|
| +//''');
|
| +// PrefixElement element = findNodeElementAtString('ppp;');
|
| +// Element elementA = findElement('a');
|
| +// Element elementB = findElement('b');
|
| +// var expected = [
|
| +// _expectId(elementA, MatchKind.REFERENCE, 'ppp.Future'),
|
| +// _expectId(elementB, MatchKind.REFERENCE, 'ppp.Stream')
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +
|
| + test_searchReferences_PropertyAccessorElement_getter() async {
|
| + _indexTestUnit('''
|
| +class A {
|
| + get g => null;
|
| + main() {
|
| + g; // 1
|
| + this.g; // 2
|
| + }
|
| +}
|
| +''');
|
| + PropertyAccessorElement element = findElement('g', ElementKind.GETTER);
|
| + Element mainElement = findElement('main');
|
| + var expected = [
|
| + _expectId(mainElement, MatchKind.REFERENCE, 'g; // 1'),
|
| + _expectIdQ(mainElement, MatchKind.REFERENCE, 'g; // 2')
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_PropertyAccessorElement_setter() async {
|
| + _indexTestUnit('''
|
| +class A {
|
| + set s(x) {}
|
| + main() {
|
| + s = 1;
|
| + this.s = 2;
|
| + }
|
| +}
|
| +''');
|
| + PropertyAccessorElement element = findElement('s=');
|
| + Element mainElement = findElement('main');
|
| + var expected = [
|
| + _expectId(mainElement, MatchKind.REFERENCE, 's = 1'),
|
| + _expectIdQ(mainElement, MatchKind.REFERENCE, 's = 2')
|
| + ];
|
| + await _verifyReferences(element, expected);
|
| + }
|
| +
|
| + test_searchReferences_TopLevelVariableElement() async {
|
| + addSource(
|
| + '/lib.dart',
|
| + '''
|
| +library lib;
|
| +var V;
|
| +''');
|
| + _indexTestUnit('''
|
| +import 'lib.dart' show V; // imp
|
| +import 'lib.dart' as pref;
|
| +main() {
|
| + pref.V = 1; // q
|
| + print(pref.V); // q
|
| + pref.V(); // q
|
| + V = 1; // nq
|
| + print(V); // nq
|
| + V(); // nq
|
| +}
|
| +''');
|
| + ImportElement importElement = testLibraryElement.imports[0];
|
| + CompilationUnitElement impUnit =
|
| + importElement.importedLibrary.definingCompilationUnit;
|
| + TopLevelVariableElement variable = impUnit.topLevelVariables[0];
|
| + Element main = findElement('main');
|
| + var expected = [
|
| + _expectIdQ(testUnitElement, MatchKind.REFERENCE, 'V; // imp'),
|
| + _expectIdQ(main, MatchKind.WRITE, 'V = 1; // q'),
|
| + _expectIdQ(main, MatchKind.READ, 'V); // q'),
|
| + _expectIdQ(main, MatchKind.INVOCATION, 'V(); // q'),
|
| + _expectId(main, MatchKind.WRITE, 'V = 1; // nq'),
|
| + _expectId(main, MatchKind.READ, 'V); // nq'),
|
| + _expectId(main, MatchKind.INVOCATION, 'V(); // nq'),
|
| + ];
|
| + await _verifyReferences(variable, expected);
|
| + }
|
| +
|
| +// Future test_searchReferences_TypeParameterElement() {
|
| +// _indexTestUnit('''
|
| +//class A<T> {
|
| +// main(T a, T b) {}
|
| +//}
|
| +//''');
|
| +// TypeParameterElement element = findElement('T');
|
| +// Element aElement = findElement('a');
|
| +// Element bElement = findElement('b');
|
| +// var expected = [
|
| +// _expectId(aElement, MatchKind.REFERENCE, 'T a'),
|
| +// _expectId(bElement, MatchKind.REFERENCE, 'T b')
|
| +// ];
|
| +// return _verifyReferences(element, expected);
|
| +// }
|
| +
|
| +// Future test_searchSubtypes() {
|
| +// _indexTestUnit('''
|
| +//class T {}
|
| +//class A extends T {} // A
|
| +//class B = Object with T; // B
|
| +//class C implements T {} // C
|
| +//''');
|
| +// ClassElement element = findElement('T');
|
| +// ClassElement elementA = findElement('A');
|
| +// ClassElement elementB = findElement('B');
|
| +// ClassElement elementC = findElement('C');
|
| +// var expected = [
|
| +// _expectId(elementA, MatchKind.REFERENCE, 'T {} // A'),
|
| +// _expectId(elementB, MatchKind.REFERENCE, 'T; // B'),
|
| +// _expectId(elementC, MatchKind.REFERENCE, 'T {} // C')
|
| +// ];
|
| +// return searchEngine.searchSubtypes(element).then((matches) {
|
| +// _assertMatches(matches, expected);
|
| +// });
|
| +// }
|
| +//
|
| +// Future test_searchTopLevelDeclarations() {
|
| +// _indexTestUnit('''
|
| +//class A {} // A
|
| +//class B = Object with A;
|
| +//typedef C();
|
| +//D() {}
|
| +//var E = null;
|
| +//class NoMatchABCDE {}
|
| +//''');
|
| +// Element topA = findElement('A');
|
| +// Element topB = findElement('B');
|
| +// Element topC = findElement('C');
|
| +// Element topD = findElement('D');
|
| +// Element topE = findElement('E');
|
| +// var expected = [
|
| +// _expectId(topA, MatchKind.DECLARATION, 'A {} // A'),
|
| +// _expectId(topB, MatchKind.DECLARATION, 'B ='),
|
| +// _expectId(topC, MatchKind.DECLARATION, 'C()'),
|
| +// _expectId(topD, MatchKind.DECLARATION, 'D() {}'),
|
| +// _expectId(topE, MatchKind.DECLARATION, 'E = null')
|
| +// ];
|
| +// return _verifyTopLevelDeclarations('^[A-E]\$', expected);
|
| +// }
|
| +
|
| + ExpectedMatch _expectId(Element element, MatchKind kind, String search,
|
| + {int length, bool isResolved: true, bool isQualified: false}) {
|
| + int offset = findOffset(search);
|
| + if (length == null) {
|
| + length = getLeadingIdentifierLength(search);
|
| + }
|
| + return new ExpectedMatch(element, kind, offset, length,
|
| + isResolved: isResolved, isQualified: isQualified);
|
| + }
|
| +
|
| + ExpectedMatch _expectIdQ(Element element, MatchKind kind, String search,
|
| + {int length}) {
|
| + return _expectId(element, kind, search, isQualified: true, length: length);
|
| + }
|
| +
|
| +// ExpectedMatch _expectIdU(Element element, MatchKind kind, String search) {
|
| +// return _expectId(element, kind, search,
|
| +// isQualified: true, isResolved: false);
|
| +// }
|
| +
|
| + void _indexTestUnit(String code) {
|
| + resolveTestUnit(code);
|
| + index.indexUnit(testUnit);
|
| + }
|
| +
|
| + Future _verifyReferences(
|
| + Element element, List<ExpectedMatch> expectedMatches) async {
|
| + List<SearchMatch> matches = await searchEngine.searchReferences(element);
|
| + _assertMatches(matches, expectedMatches);
|
| + }
|
| +
|
| +// Future _verifyTopLevelDeclarations(
|
| +// String pattern, List<ExpectedMatch> expectedMatches) {
|
| +// return searchEngine
|
| +// .searchTopLevelDeclarations(pattern)
|
| +// .then((List<SearchMatch> matches) {
|
| +// _assertMatches(matches, expectedMatches);
|
| +// });
|
| +// }
|
| +
|
| + static void _assertMatches(
|
| + List<SearchMatch> matches, List<ExpectedMatch> expectedMatches) {
|
| + expect(matches, unorderedEquals(expectedMatches));
|
| + }
|
| +}
|
|
|