blob: 3892d5d15eaa4cf0308f5741dff78d633f3c0353 [file] [log] [blame]
// 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.index.dart_index_contributor;
import 'package:analysis_services/index/index.dart';
import 'package:analysis_services/index/index_store.dart';
import 'package:analysis_services/src/index/index_contributor.dart';
import 'package:analysis_testing/abstract_context.dart';
import 'package:analysis_testing/reflective_tests.dart';
import 'package:analyzer/src/generated/ast.dart';
import 'package:analyzer/src/generated/element.dart';
import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/java_engine.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:typed_mock/typed_mock.dart';
import 'package:unittest/unittest.dart';
main() {
groupSep = ' | ';
group('DartUnitContributor', () {
runReflectiveTests(DartUnitContributorTest);
});
}
/**
* Returns `true` if the [actual] location the same properties as [expected].
*/
bool _equalsLocation(Location actual, ExpectedLocation expected) {
return _equalsLocationProperties(actual, expected.element, expected.offset,
expected.length);
}
/**
* Returns `true` if the [actual] location the expected properties.
*/
bool _equalsLocationProperties(Location actual, Element expectedElement,
int expectedOffset, int expectedLength) {
return expectedElement == actual.element && expectedOffset == actual.offset &&
expectedLength == actual.length;
}
bool _equalsRecordedRelation(RecordedRelation recordedRelation,
Element expectedElement, Relationship expectedRelationship,
ExpectedLocation expectedLocation) {
return expectedElement == recordedRelation.element && expectedRelationship ==
recordedRelation.relationship && (expectedLocation == null || _equalsLocation(
recordedRelation.location, expectedLocation));
}
int _getLeadingIdentifierLength(String search) {
int length = 0;
while (length < search.length) {
int c = search.codeUnitAt(length);
if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) {
length++;
continue;
}
if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) {
length++;
continue;
}
if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) {
length++;
continue;
}
break;
}
return length;
}
@ReflectiveTestCase()
class DartUnitContributorTest extends AbstractContextTest {
IndexStore store = new MockIndexStore();
List<RecordedRelation> recordedRelations = <RecordedRelation>[];
bool verifyNoTestUnitErrors = true;
String testCode;
Source testSource;
CompilationUnit testUnit;
CompilationUnitElement testUnitElement;
LibraryElement testLibraryElement;
void setUp() {
super.setUp();
when(store.aboutToIndexDart(context, anyObject)).thenReturn(true);
when(store.recordRelationship(anyObject, anyObject, anyObject)).thenInvoke(
(Element element, Relationship relationship, Location location) {
recordedRelations.add(new RecordedRelation(element, relationship,
location));
});
}
void test_FieldElement_noAssignedType_notLHS() {
_indexTestUnit('''
class A {
var myField;
main() {
print(myField);
}
}''');
// prepare elements
Element mainElement = _findElement("main");
FieldElement fieldElement = _findElement("myField");
PropertyAccessorElement getterElement = fieldElement.getter;
// verify
_assertRecordedRelation(getterElement,
IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
'myField);'));
}
void test_definesClass() {
_indexTestUnit('class A {}');
// prepare elements
ClassElement classElement = _findElement("A");
// verify
_assertDefinesTopLevelElement(IndexConstants.DEFINES_CLASS,
_expectedLocation(classElement, 'A {}'));
}
void test_definesClassAlias() {
_indexTestUnit('''
class Mix {}
class MyClass = Object with Mix;''');
// prepare elements
Element classElement = _findElement("MyClass");
// verify
_assertDefinesTopLevelElement(IndexConstants.DEFINES_CLASS_ALIAS,
_expectedLocation(classElement, 'MyClass ='));
}
void test_definesFunction() {
_indexTestUnit('myFunction() {}');
// prepare elements
FunctionElement functionElement = _findElement("myFunction");
// verify
_assertDefinesTopLevelElement(IndexConstants.DEFINES_FUNCTION,
_expectedLocation(functionElement, 'myFunction() {}'));
}
void test_definesFunctionType() {
_indexTestUnit('typedef MyFunction(int p);');
// prepare elements
FunctionTypeAliasElement typeAliasElement = _findElement("MyFunction");
// verify
_assertDefinesTopLevelElement(IndexConstants.DEFINES_FUNCTION_TYPE,
_expectedLocation(typeAliasElement, 'MyFunction(int p);'));
}
void test_definesVariable() {
_indexTestUnit('var myVar = 42;');
// prepare elements
VariableElement varElement = _findElement("myVar");
// verify
_assertDefinesTopLevelElement(IndexConstants.DEFINES_VARIABLE,
_expectedLocation(varElement, 'myVar = 42;'));
}
void test_forIn() {
_indexTestUnit('''
main() {
for (var v in []) {
}
}''');
// prepare elements
Element mainElement = _findElement("main");
VariableElement variableElement = _findElement("v");
// verify
_assertNoRecordedRelation(variableElement, IndexConstants.IS_READ_BY,
_expectedLocation(mainElement, 'v in []'));
}
void test_isDefinedBy_ConstructorElement() {
_indexTestUnit('''
class A {
A() {}
A.foo() {}
}''');
// prepare elements
ClassElement classA = _findElement("A");
ConstructorElement consA = _findNodeElementAtString("A()", (node) => node is
ConstructorDeclaration);
ConstructorElement consA_foo = _findNodeElementAtString("A.foo()", (node) =>
node is ConstructorDeclaration);
// verify
_assertRecordedRelation(consA, IndexConstants.IS_DEFINED_BY,
_expectedLocation(classA, '() {}'));
_assertRecordedRelation(consA_foo, IndexConstants.IS_DEFINED_BY,
_expectedLocation(classA, '.foo() {}', '.foo'.length));
}
void test_isDefinedBy_NameElement_method() {
_indexTestUnit('''
class A {
m() {}
}''');
// prepare elements
Element methodElement = _findElement("m");
Element nameElement = new NameElement("m");
// verify
_assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
_expectedLocation(methodElement, 'm() {}'));
}
void test_isDefinedBy_NameElement_operator() {
_indexTestUnit('''
class A {
operator +(o) {}
}''');
// prepare elements
Element methodElement = _findElement("+");
Element nameElement = new NameElement("+");
// verify
_assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
_expectedLocation(methodElement, '+(o) {}', 1));
}
void test_isExtendedBy_ClassDeclaration() {
_indexTestUnit('''
class A {} // 1
class B extends A {} // 2
''');
// prepare elements
ClassElement classElementA = _findElement("A");
ClassElement classElementB = _findElement("B");
// verify
_assertRecordedRelation(classElementA, IndexConstants.IS_EXTENDED_BY,
_expectedLocation(classElementB, 'A {} // 2'));
}
void test_isExtendedBy_ClassDeclaration_Object() {
_indexTestUnit('''
class A {} // 1
''');
// prepare elements
ClassElement classElementA = _findElement("A");
ClassElement classElementObject = classElementA.supertype.element;
// verify
_assertRecordedRelation(classElementObject, IndexConstants.IS_EXTENDED_BY,
_expectedLocation(classElementA, 'A {}', 0));
}
void test_isExtendedBy_ClassTypeAlias() {
_indexTestUnit('''
class A {} // 1
class B {} // 2
class C = A with B; // 3
''');
// prepare elements
ClassElement classElementA = _findElement("A");
ClassElement classElementC = _findElement("C");
// verify
_assertRecordedRelation(classElementA, IndexConstants.IS_EXTENDED_BY,
_expectedLocation(classElementC, 'A with'));
}
void test_isImplementedBy_ClassDeclaration() {
_indexTestUnit('''
class A {} // 1
class B implements A {} // 2
''');
// prepare elements
ClassElement classElementA = _findElement("A");
ClassElement classElementB = _findElement("B");
// verify
_assertRecordedRelation(classElementA, IndexConstants.IS_IMPLEMENTED_BY,
_expectedLocation(classElementB, 'A {} // 2'));
}
void test_isImplementedBy_ClassTypeAlias() {
_indexTestUnit('''
class A {} // 1
class B {} // 2
class C = Object with A implements B; // 3
''');
// prepare elements
ClassElement classElementB = _findElement("B");
ClassElement classElementC = _findElement("C");
// verify
_assertRecordedRelation(classElementB, IndexConstants.IS_IMPLEMENTED_BY,
_expectedLocation(classElementC, 'B; // 3'));
}
void test_isInvokedByQualified_FieldElement() {
_indexTestUnit('''
class A {
var field;
main() {
this.field();
}
}''');
// prepare elements
Element mainElement = _findElement("main");
FieldElement fieldElement = _findElement("field");
PropertyAccessorElement getterElement = fieldElement.getter;
// verify
_assertRecordedRelation(getterElement,
IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement,
'field();'));
}
void test_isInvokedByQualified_MethodElement() {
_indexTestUnit('''
class A {
foo() {}
main() {
this.foo();
}
}''');
// prepare elements
Element mainElement = _findElement("main");
Element methodElement = _findElement("foo");
// verify
var location = _expectedLocation(mainElement, 'foo();');
_assertRecordedRelation(methodElement,
IndexConstants.IS_INVOKED_BY_QUALIFIED, location);
_assertNoRecordedRelation(methodElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED, location);
}
void test_isInvokedByQualified_MethodElement_propagatedType() {
_indexTestUnit('''
class A {
foo() {}
}
main() {
var a = new A();
a.foo();
}
''');
// prepare elements
Element mainElement = _findElement("main");
Element methodElement = _findElement("foo");
// verify
_assertRecordedRelation(methodElement,
IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement,
'foo();'));
}
void test_isInvokedByUnqualified_MethodElement() {
_indexTestUnit('''
class A {
foo() {}
main() {
foo();
}
}''');
// prepare elements
Element mainElement = _findElement("main");
Element methodElement = _findElement("foo");
// verify
_assertRecordedRelation(methodElement,
IndexConstants.IS_INVOKED_BY_UNQUALIFIED, _expectedLocation(mainElement,
'foo();'));
}
void test_isInvokedBy_FunctionElement() {
_indexTestUnit('''
foo() {}
main() {
foo();
}''');
// prepare elements
Element mainElement = _findElement("main");
FunctionElement functionElement = _findElement("foo");
// verify
_assertRecordedRelation(functionElement, IndexConstants.IS_INVOKED_BY,
_expectedLocation(mainElement, 'foo();'));
}
void test_isInvokedBy_LocalVariableElement() {
_indexTestUnit('''
main() {
var v;
v();
}''');
// prepare elements
Element mainElement = _findElement("main");
Element element = _findElement("v");
// verify
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY,
_expectedLocation(mainElement, 'v();'));
}
void test_isInvokedBy_ParameterElement() {
_indexTestUnit('''
main(p()) {
p();
}''');
// prepare elements
Element mainElement = _findElement("main");
Element element = _findElement("p");
// verify
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY,
_expectedLocation(mainElement, 'p();'));
}
void test_isMixedInBy_ClassDeclaration() {
_indexTestUnit('''
class A {} // 1
class B extends Object with A {} // 2
''');
// prepare elements
ClassElement classElementA = _findElement("A");
ClassElement classElementB = _findElement("B");
// verify
_assertRecordedRelation(classElementA, IndexConstants.IS_MIXED_IN_BY,
_expectedLocation(classElementB, 'A {} // 2'));
}
void test_isMixedInBy_ClassTypeAlias() {
_indexTestUnit('''
class A {} // 1
class B = Object with A; // 2
''');
// prepare elements
ClassElement classElementA = _findElement("A");
ClassElement classElementB = _findElement("B");
// verify
_assertRecordedRelation(classElementA, IndexConstants.IS_MIXED_IN_BY,
_expectedLocation(classElementB, 'A; // 2'));
}
void test_isReadBy_ParameterElement() {
_indexTestUnit('''
main(var p) {
print(p);
}
''');
// prepare elements
Element mainElement = _findElement("main");
Element parameterElement = _findElement("p");
// verify
_assertRecordedRelation(parameterElement, IndexConstants.IS_READ_BY,
_expectedLocation(mainElement, 'p);'));
}
void test_isReadBy_VariableElement() {
_indexTestUnit('''
main() {
var v = 0;
print(v);
}
''');
// prepare elements
Element mainElement = _findElement("main");
Element variableElement = _findElement("v");
// verify
_assertRecordedRelation(variableElement, IndexConstants.IS_READ_BY,
_expectedLocation(mainElement, 'v);'));
}
void test_isReadWrittenBy_ParameterElement() {
_indexTestUnit('''
main(int p) {
p += 1;
}
''');
// prepare elements
Element mainElement = _findElement("main");
Element parameterElement = _findElement("p");
// verify
_assertRecordedRelation(parameterElement, IndexConstants.IS_READ_WRITTEN_BY,
_expectedLocation(mainElement, 'p += 1'));
}
void test_isReadWrittenBy_VariableElement() {
_indexTestUnit('''
main() {
var v = 0;
v += 1;
}
''');
// prepare elements
Element mainElement = _findElement("main");
Element variableElement = _findElement("v");
// verify
_assertRecordedRelation(variableElement, IndexConstants.IS_READ_WRITTEN_BY,
_expectedLocation(mainElement, 'v += 1'));
}
void test_isReferencedByQualifiedResolved_NameElement_field() {
_indexTestUnit('''
class A {
int field;
}
main(A a) {
print(a.field);
}
''');
// prepare elements
Element mainElement = _findElement('main');
Element nameElement = new NameElement('field');
// verify
_assertRecordedRelation(nameElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, 'field);'));
}
void test_isReferencedByQualifiedResolved_NameElement_method() {
_indexTestUnit('''
class A {
method() {}
}
main(A a) {
a.method();
}
''');
// prepare elements
Element mainElement = _findElement('main');
Element nameElement = new NameElement('method');
// verify
_assertRecordedRelation(nameElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, 'method();'));
}
void test_isReferencedByQualifiedResolved_NameElement_operator() {
_indexTestUnit('''
class A {
operator +(o) {}
operator -(o) {}
operator ~() {}
operator ==(o) {}
}
main(A a) {
a + 5;
a += 5;
a == 5;
++a;
--a;
~a;
a++;
a--;
}
''');
// prepare elements
Element mainElement = _findElement('main');
// binary
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '+ 5', '+'.length));
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '+= 5', '+='.length));
_assertRecordedRelation(new NameElement('=='),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '== 5', '=='.length));
// prefix
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '++a', '++'.length));
_assertRecordedRelation(new NameElement('-'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '--a', '--'.length));
_assertRecordedRelation(new NameElement('~'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '~a', '~'.length));
// postfix
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '++;', '++'.length));
_assertRecordedRelation(new NameElement('-'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation(
mainElement, '--;', '--'.length));
}
void test_isReferencedByQualifiedUnresolved_NameElement_field() {
_indexTestUnit('''
class A {
int field;
}
main(var a) {
print(a.field);
}
''');
// prepare elements
Element mainElement = _findElement('main');
FieldElement fieldElement = _findElement('field');
Element nameElement = new NameElement('field');
// verify
_assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
_expectedLocation(fieldElement, 'field;'));
_assertRecordedRelation(nameElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, 'field);'));
}
void test_isReferencedByQualifiedUnresolved_NameElement_method() {
_indexTestUnit('''
class A {
method() {}
}
main(var a) {
a.method();
}
''');
// prepare elements
Element mainElement = _findElement('main');
MethodElement methodElement = _findElement('method');
Element nameElement = new NameElement('method');
// verify
_assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY,
_expectedLocation(methodElement, 'method() {}'));
_assertRecordedRelation(nameElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, 'method();'));
}
void test_isReferencedByQualifiedUnresolved_NameElement_operator() {
_indexTestUnit('''
class A {
operator +(o) {}
operator -(o) {}
operator ~() {}
operator ==(o) {}
}
main(a) {
a + 5;
a += 5;
a == 5;
++a;
--a;
~a;
a++;
a--;
}
''');
// prepare elements
Element mainElement = _findElement('main');
// binary
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '+ 5', '+'.length));
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '+= 5', '+='.length));
_assertRecordedRelation(new NameElement('=='),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '== 5', '=='.length));
// prefix
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '++a', '++'.length));
_assertRecordedRelation(new NameElement('-'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '--a', '--'.length));
_assertRecordedRelation(new NameElement('~'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '~a', '~'.length));
// postfix
_assertRecordedRelation(new NameElement('+'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '++;', '++'.length));
_assertRecordedRelation(new NameElement('-'),
IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation(
mainElement, '--;', '--'.length));
}
void test_isReferencedByQualified_ConstructorElement() {
_indexTestUnit('''
class A implements B {
A() {}
A.foo() {}
}
class B extends A {
B() : super(); // marker-1
B.foo() : super.foo(); // marker-2
factory B.bar() = A.foo; // marker-3
}
main() {
new A(); // marker-main-1
new A.foo(); // marker-main-2
}
''');
// prepare elements
Element mainElement = _findElement('main');
var isConstructor = (node) => node is ConstructorDeclaration;
ConstructorElement consA = _findNodeElementAtString("A()", isConstructor);
ConstructorElement consA_foo = _findNodeElementAtString("A.foo()",
isConstructor);
ConstructorElement consB = _findNodeElementAtString("B()", isConstructor);
ConstructorElement consB_foo = _findNodeElementAtString("B.foo()",
isConstructor);
ConstructorElement consB_bar = _findNodeElementAtString("B.bar()",
isConstructor);
// A()
_assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(consB, '(); // marker-1', 0));
_assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, '(); // marker-main-1', 0));
// A.foo()
_assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(consB_foo, '.foo(); // marker-2', '.foo'.length));
_assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(consB_bar, '.foo; // marker-3', '.foo'.length));
_assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, '.foo(); // marker-main-2', '.foo'.length));
}
void test_isReferencedByQualified_ConstructorElement_classTypeAlias() {
_indexTestUnit('''
class M {}
class A implements B {
A() {}
A.named() {}
}
class B = A with M;
main() {
new B(); // marker-main-1
new B.named(); // marker-main-2
}
''');
// prepare elements
Element mainElement = _findElement('main');
var isConstructor = (node) => node is ConstructorDeclaration;
ConstructorElement consA = _findNodeElementAtString("A()", isConstructor);
ConstructorElement consA_named = _findNodeElementAtString("A.named()",
isConstructor);
// verify
_assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, '(); // marker-main-1', 0));
_assertRecordedRelation(consA_named, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, '.named(); // marker-main-2', '.named'.length));
}
void test_isReferencedByQualified_FieldElement() {
_indexTestUnit('''
class A {
static var field;
}
main() {
A.field = 1;
}
''');
// prepare elements
Element mainElement = _findElement('main');
FieldElement fieldElement = _findElement('field');
PropertyAccessorElement setterElement = fieldElement.setter;
// verify
_assertRecordedRelation(setterElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(mainElement,
'field = 1'));
}
void test_isReferencedByQualified_MethodElement() {
_indexTestUnit('''
class A {
foo() {}
main() {
print(this.foo);
}
}
''');
// prepare elements
Element fooElement = _findElement('foo');
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(fooElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(mainElement,
'foo);'));
}
void test_isReferencedByQualified_MethodElement_operator_binary() {
_indexTestUnit('''
class A {
operator +(other) => this;
}
main(A a) {
print(a + 1);
a += 2;
++a;
a++;
}
''');
// prepare elements
Element element = _findElement('+');
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
_expectedLocation(mainElement, '+ 1', "+".length));
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
_expectedLocation(mainElement, '+= 2', "+=".length));
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
_expectedLocation(mainElement, '++a;', "++".length));
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
_expectedLocation(mainElement, '++;', "++".length));
}
void test_isReferencedByQualified_MethodElement_operator_index() {
_indexTestUnit('''
class A {
operator [](i) => null;
operator []=(i, v) {}
}
main(A a) {
print(a[0]);
a[1] = 42;
}
''');
// prepare elements
MethodElement readElement = _findElement("[]");
MethodElement writeElement = _findElement("[]=");
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(readElement, IndexConstants.IS_INVOKED_BY_QUALIFIED,
_expectedLocation(mainElement, '[0]', "[".length));
_assertRecordedRelation(writeElement,
IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement, '[1] =',
"[".length));
}
void test_isReferencedByQualified_MethodElement_operator_prefix() {
_indexTestUnit('''
class A {
A operator ~() => this;
}
main(A a) {
print(~a);
}
''');
// prepare elements
MethodElement element = _findElement("~");
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED,
_expectedLocation(mainElement, '~a', "~".length));
}
void test_isReferencedByQualified_PropertyAccessorElement_method_getter() {
_indexTestUnit('''
class A {
get foo => 42;
main() {
print(this.foo);
}
}
''');
// prepare elements
PropertyAccessorElement element = _findNodeElementAtString('foo =>');
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
_expectedLocation(mainElement, 'foo);'));
_assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null);
}
void test_isReferencedByQualified_PropertyAccessorElement_method_setter() {
_indexTestUnit('''
class A {
set foo(x) {}
main() {
this.foo = 42;
}
}
''');
// prepare elements
PropertyAccessorElement element = _findNodeElementAtString('foo(x)');
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
_expectedLocation(mainElement, 'foo = 42;'));
_assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null);
}
void test_isReferencedByQualified_PropertyAccessorElement_topLevelField() {
addSource('/lib.dart', '''
library lib;
var myVar;
''');
_indexTestUnit('''
import 'lib.dart' as pref;
main() {
pref.myVar = 1;
print(pref.myVar);
}
''');
// prepare elements
Element mainElement = _findElement('main');
ImportElement importElement = testLibraryElement.imports[0];
CompilationUnitElement impUnit =
importElement.importedLibrary.definingCompilationUnit;
TopLevelVariableElement myVar = impUnit.topLevelVariables[0];
PropertyAccessorElement getter = myVar.getter;
PropertyAccessorElement setter = myVar.setter;
// verify
_assertRecordedRelation(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
_expectedLocation(mainElement, 'myVar = 1'));
_assertRecordedRelation(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED,
_expectedLocation(mainElement, 'myVar);'));
}
void test_isReferencedByUnqualified_FieldElement() {
_indexTestUnit('''
class A {
var field;
main() {
field = 5;
print(field);
}
}''');
// prepare elements
Element mainElement = _findElement("main");
FieldElement fieldElement = _findElement("field");
PropertyAccessorElement getter = fieldElement.getter;
PropertyAccessorElement setter = fieldElement.setter;
// verify
_assertRecordedRelation(setter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
_expectedLocation(mainElement, 'field = 5'));
_assertRecordedRelation(getter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED,
_expectedLocation(mainElement, 'field);'));
}
void test_isReferencedByUnqualified_MethodElement() {
_indexTestUnit('''
class A {
method() {}
main() {
print(method);
}
}''');
// prepare elements
Element mainElement = _findElement("main");
MethodElement methodElement = _findElement("method");
// verify
_assertRecordedRelation(methodElement,
IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
'method);'));
_assertNoRecordedRelation(methodElement, IndexConstants.IS_REFERENCED_BY,
null);
}
void test_isReferencedByUnqualified_TopLevelVariableElement() {
_indexTestUnit('''
var topVariable;
main() {
topVariable = 5;
print(topVariable);
}''');
// prepare elements
Element mainElement = _findElement("main");
TopLevelVariableElement variableElement = _findElement("topVariable");
// verify
_assertRecordedRelation(variableElement.setter,
IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
'topVariable = 5'));
_assertRecordedRelation(variableElement.getter,
IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainElement,
'topVariable);'));
}
void test_isReferencedBy_ClassElement() {
_indexTestUnit('''
class A {
static var field;
}
main(A p) {
A v;
new A(); // 2
A.field = 1;
print(A.field); // 3
}
''');
// prepare elements
ClassElement aElement = _findElement("A");
Element mainElement = _findElement("main");
ParameterElement pElement = _findElement("p");
VariableElement vElement = _findElement("v");
// verify
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(pElement, 'A p) {'));
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(vElement, 'A v;'));
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'A(); // 2'));
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'A.field = 1;'));
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'A.field); // 3'));
}
void test_isReferencedBy_ClassTypeAlias() {
_indexTestUnit('''
class A {}
class B = Object with A;
main(B p) {
B v;
}
''');
// prepare elements
ClassElement bElement = _findElement("B");
ParameterElement pElement = _findElement("p");
VariableElement vElement = _findElement("v");
// verify
_assertRecordedRelation(bElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(pElement, 'B p) {'));
_assertRecordedRelation(bElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(vElement, 'B v;'));
}
void test_isReferencedBy_CompilationUnitElement() {
addSource('/my_unit.dart', 'part of my_lib;');
_indexTestUnit('''
library my_lib;
part 'my_unit.dart';
''');
// prepare elements
CompilationUnitElement myUnitElement = testLibraryElement.parts[0];
// verify
_assertRecordedRelation(myUnitElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, "'my_unit.dart';", "'my_unit.dart'".length));
}
void test_isReferencedBy_ConstructorFieldInitializer() {
_indexTestUnit('''
class A {
int field;
A() : field = 5;
}
''');
// prepare elements
ConstructorElement constructorElement = _findNodeElementAtString("A()",
(node) => node is ConstructorDeclaration);
FieldElement fieldElement = _findElement("field");
// verify
_assertRecordedRelation(fieldElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(constructorElement, 'field = 5'));
}
void test_isReferencedBy_FieldFormalParameterElement() {
_indexTestUnit('''
class A {
int field;
A(this.field);
}
''');
// prepare elements
FieldElement fieldElement = _findElement("field");
Element fieldParameterElement = _findNodeElementAtString("field);");
// verify
_assertRecordedRelation(fieldElement,
IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(
fieldParameterElement, 'field);'));
}
void test_isReferencedBy_FunctionElement() {
_indexTestUnit('''
foo() {}
main() {
print(foo);
print(foo());
}
''');
// prepare elements
FunctionElement element = _findElement("foo");
Element mainElement = _findElement("main");
// "referenced" here
_assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'foo);'));
// only "invoked", but not "referenced"
{
_assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY,
_expectedLocation(mainElement, 'foo());'));
_assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'foo());'));
}
}
void test_isReferencedBy_FunctionTypeAliasElement() {
_indexTestUnit('''
typedef A();
main(A p) {
}
''');
// prepare elements
Element aElement = _findElement('A');
Element pElement = _findElement('p');
// verify
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(pElement, 'A p) {'));
}
void test_isReferencedBy_ImportElement_noPrefix() {
addSource('/lib.dart', '''
library lib;
var myVar;
myFunction() {}
myToHide() {}
''');
_indexTestUnit('''
import 'lib.dart' show myVar, myFunction hide myToHide;
main() {
myVar = 1;
myFunction();
print(0);
}
''');
// prepare elements
ImportElement importElement = testLibraryElement.imports[0];
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'myVar = 1;', 0));
_assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'myFunction();', 0));
_assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'print(0);', 0));
// no references from import combinators
_assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, 'myVar, ', 0));
_assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, 'myFunction hide', 0));
_assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, 'myToHide;', 0));
}
void test_isReferencedBy_ImportElement_withPrefix() {
addSource('/libA.dart', '''
library libA;
var myVar;
''');
addSource('/libB.dart', '''
library libB;
class MyClass {}
''');
_indexTestUnit('''
import 'libA.dart' as pref;
import 'libB.dart' as pref;
main() {
pref.myVar = 1;
new pref.MyClass();
}
''');
// prepare elements
ImportElement importElementA = testLibraryElement.imports[0];
ImportElement importElementB = testLibraryElement.imports[1];
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(importElementA, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'pref.myVar = 1;', 'pref.'.length));
_assertRecordedRelation(importElementB, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'pref.MyClass();', 'pref.'.length));
}
void test_isReferencedBy_ImportElement_withPrefix_combinators() {
addSource('/lib.dart', '''
library lib;
class A {}
class B {}
''');
_indexTestUnit('''
import 'lib.dart' as pref show A;
import 'lib.dart' as pref show B;
import 'lib.dart';
import 'lib.dart' as otherPrefix;
main() {
new pref.A();
new pref.B();
}
''');
// prepare elements
ImportElement importElementA = testLibraryElement.imports[0];
ImportElement importElementB = testLibraryElement.imports[1];
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(importElementA, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'pref.A();', 'pref.'.length));
_assertRecordedRelation(importElementB, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'pref.B();', 'pref.'.length));
}
void test_isReferencedBy_ImportElement_withPrefix_invocation() {
addSource('/lib.dart', '''
library lib;
myFunc() {}
''');
_indexTestUnit('''
import 'lib.dart' as pref;
main() {
pref.myFunc();
}
''');
// prepare elements
ImportElement importElement = testLibraryElement.imports[0];
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'pref.myFunc();', 'pref.'.length));
}
void test_isReferencedBy_ImportElement_withPrefix_oneCandidate() {
addSource('/lib.dart', '''
library lib;
class A {}
class B {}
''');
_indexTestUnit('''
import 'lib.dart' as pref show A;
main() {
new pref.A();
}
''');
// prepare elements
ImportElement importElement = testLibraryElement.imports[0];
Element mainElement = _findElement('main');
// verify
_assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'pref.A();', 'pref.'.length));
}
void test_isReferencedBy_ImportElement_withPrefix_unresolvedElement() {
verifyNoTestUnitErrors = false;
addSource('/lib.dart', '''
library lib;
''');
_indexTestUnit('''
import 'lib.dart' as pref;
main() {
pref.myVar = 1;
}
''');
}
void test_isReferencedBy_ImportElement_withPrefix_wrongInvocation() {
verifyNoTestUnitErrors = false;
_indexTestUnit('''
import 'dart:math' as m;
main() {
m();
}''');
}
void test_isReferencedBy_ImportElement_withPrefix_wrongPrefixedIdentifier() {
verifyNoTestUnitErrors = false;
_indexTestUnit('''
import 'dart:math' as m;
main() {
x.m;
}
''');
}
void test_isReferencedBy_LabelElement() {
_indexTestUnit('''
main() {
L: while (true) {
break L;
}
}
''');
// prepare elements
Element mainElement = _findElement('main');
Element element = _findElement('L');
// verify
_assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'L;'));
}
void test_isReferencedBy_LibraryElement_export() {
addSource('/lib.dart', '''
library lib;
''');
_indexTestUnit('''
export 'lib.dart';
''');
// prepare elements
LibraryElement libElement = testLibraryElement.exportedLibraries[0];
CompilationUnitElement libUnitElement = libElement.definingCompilationUnit;
// verify
_assertRecordedRelation(libUnitElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length));
}
void test_isReferencedBy_LibraryElement_import() {
addSource('/lib.dart', '''
library lib;
''');
_indexTestUnit('''
import 'lib.dart';
''');
// prepare elements
LibraryElement libElement = testLibraryElement.imports[0].importedLibrary;
CompilationUnitElement libUnitElement = libElement.definingCompilationUnit;
// verify
_assertRecordedRelation(libUnitElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length));
}
void test_isReferencedBy_ParameterElement() {
_indexTestUnit('''
foo({var p}) {}
main() {
foo(p: 1);
}
''');
// prepare elements
Element mainElement = _findElement('main');
Element element = _findElement('p');
// verify
_assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(mainElement, 'p: 1'));
}
void test_isReferencedBy_TypeParameterElement() {
_indexTestUnit('''
class A<T> {
T f;
foo(T p) {
T v;
}
}
''');
// prepare elements
Element typeParameterElement = _findElement('T');
Element fieldElement = _findElement('f');
Element parameterElement = _findElement('p');
Element variableElement = _findElement('v');
// verify
_assertRecordedRelation(typeParameterElement,
IndexConstants.IS_REFERENCED_BY, _expectedLocation(fieldElement, 'T f'));
_assertRecordedRelation(typeParameterElement,
IndexConstants.IS_REFERENCED_BY, _expectedLocation(parameterElement, 'T p'));
_assertRecordedRelation(typeParameterElement,
IndexConstants.IS_REFERENCED_BY, _expectedLocation(variableElement, 'T v'));
}
/**
* There was a bug in the AST structure, when single [Comment] was cloned and
* assigned to both [FieldDeclaration] and [VariableDeclaration].
*
* This caused duplicate indexing.
* Here we test that the problem is fixed one way or another.
*/
void test_isReferencedBy_identifierInComment() {
_indexTestUnit('''
class A {}
/// [A] text
var myVariable = null;
''');
// prepare elements
Element aElement = _findElement('A');
Element variableElement = _findElement('myVariable');
// verify
_assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, 'A] text'));
_assertNoRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(variableElement, 'A] text'));
}
void test_isReferencedBy_libraryName() {
Source libSource = addSource('/lib.dart', '''
library lib;
part 'test.dart';
''');
testCode = 'part of lib;';
testSource = addSource('/test.dart', testCode);
testUnit = resolveDartUnit(testSource, libSource);
testUnitElement = testUnit.element;
testLibraryElement = testUnitElement.library;
indexDartUnit(store, context, testUnit);
// verify
_assertRecordedRelation(testLibraryElement, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(testUnitElement, "lib;"));
}
void test_isReferencedBy_typeInVariableList() {
_indexTestUnit('''
class A {}
A myVariable = null;
''');
// prepare elements
Element classElementA = _findElement('A');
Element variableElement = _findElement('myVariable');
// verify
_assertRecordedRelation(classElementA, IndexConstants.IS_REFERENCED_BY,
_expectedLocation(variableElement, 'A myVariable'));
}
void test_isWrittenBy_ParameterElement() {
_indexTestUnit('''
main(var p) {
p = 1;
}''');
// prepare elements
Element mainElement = _findElement("main");
ParameterElement pElement = _findElement("p");
// verify
_assertRecordedRelation(pElement, IndexConstants.IS_WRITTEN_BY,
_expectedLocation(mainElement, 'p = 1'));
}
void test_isWrittenBy_VariableElement() {
_indexTestUnit('''
main() {
var v = 0;
v = 1;
}''');
// prepare elements
Element mainElement = _findElement("main");
LocalVariableElement vElement = _findElement("v");
// verify
_assertRecordedRelation(vElement, IndexConstants.IS_WRITTEN_BY,
_expectedLocation(mainElement, 'v = 1'));
}
void test_nameIsInvokedBy() {
_indexTestUnit('''
class A {
test(x) {}
}
main(A a, p) {
a.test(1);
p.test(2);
}''');
// prepare elements
Element mainElement = _findElement("main");
Element nameElement = new NameElement('test');
// verify
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_INVOKED_BY_RESOLVED, _expectedLocation(mainElement,
'test(1)'));
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED, _expectedLocation(mainElement,
'test(2)'));
_assertNoRecordedRelation(nameElement,
IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _expectedLocation(mainElement,
'test(2)'));
}
void test_nameIsReadBy() {
_indexTestUnit('''
class A {
var test;
}
main(A a, p) {
print(a.test); // a
print(p.test); // p
}''');
// prepare elements
Element mainElement = _findElement("main");
Element nameElement = new NameElement('test');
// verify
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_READ_BY_RESOLVED, _expectedLocation(mainElement,
'test); // a'));
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _expectedLocation(mainElement,
'test); // p'));
}
void test_nameIsReadWrittenBy() {
_indexTestUnit('''
class A {
var test;
}
main(A a, p) {
a.test += 1;
p.test += 2;
}''');
// prepare elements
Element mainElement = _findElement("main");
Element nameElement = new NameElement('test');
// verify
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED, _expectedLocation(mainElement,
'test += 1'));
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED, _expectedLocation(
mainElement, 'test += 2'));
}
void test_nameIsWrittenBy() {
_indexTestUnit('''
class A {
var test;
}
main(A a, p) {
a.test = 1;
p.test = 2;
}''');
// prepare elements
Element mainElement = _findElement("main");
Element nameElement = new NameElement('test');
// verify
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED, _expectedLocation(mainElement,
'test = 1'));
_assertRecordedRelation(nameElement,
IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED, _expectedLocation(mainElement,
'test = 2'));
}
void test_nullUnit() {
indexDartUnit(store, context, null);
}
void test_nullUnitElement() {
CompilationUnit unit = new CompilationUnit(null, null, [], [], null);
indexDartUnit(store, context, unit);
}
void _assertDefinesTopLevelElement(Relationship relationship,
ExpectedLocation expectedLocation) {
_assertRecordedRelation(testLibraryElement, relationship, expectedLocation);
_assertRecordedRelation(UniverseElement.INSTANCE, relationship,
expectedLocation);
}
void _assertNoErrorsInSource() {
List<AnalysisError> errors = context.getErrors(testSource).errors;
expect(errors, isEmpty);
}
/**
* Asserts that [recordedRelations] has no item with the specified properties.
*/
void _assertNoRecordedRelation(Element element, Relationship relationship,
ExpectedLocation location) {
for (RecordedRelation recordedRelation in recordedRelations) {
if (_equalsRecordedRelation(recordedRelation, element, relationship,
location)) {
fail('not expected: ${recordedRelation} in\n' + recordedRelations.join(
'\n'));
}
}
}
/**
* Asserts that [recordedRelations] has an item with the expected properties.
*/
Location _assertRecordedRelation(Element expectedElement,
Relationship expectedRelationship, ExpectedLocation expectedLocation) {
for (RecordedRelation recordedRelation in recordedRelations) {
if (_equalsRecordedRelation(recordedRelation, expectedElement,
expectedRelationship, expectedLocation)) {
return recordedRelation.location;
}
}
fail("not found\n$expectedElement $expectedRelationship "
"in $expectedLocation in\n" + recordedRelations.join('\n'));
return null;
}
ExpectedLocation _expectedLocation(Element element, String search, [int length
= -1]) {
int offset = _findOffset(search);
if (length == -1) {
length = _getLeadingIdentifierLength(search);
}
return new ExpectedLocation(element, offset, length);
}
Element _findElement(String name, [ElementKind kind]) {
return findChildElement(testUnitElement, name, kind);
}
AstNode _findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) {
AstNode result = new NodeLocator.con1(offset).searchWithin(testUnit);
if (result != null && predicate != null) {
result = result.getAncestor(predicate);
}
return result;
}
AstNode _findNodeAtString(String search, [Predicate<AstNode> predicate]) {
int offset = _findOffset(search);
return _findNodeAtOffset(offset, predicate);
}
Element _findNodeElementAtString(String search,
[Predicate<AstNode> predicate]) {
AstNode node = _findNodeAtString(search, predicate);
if (node == null) {
return null;
}
return ElementLocator.locate(node);
}
int _findOffset(String search) {
int offset = testCode.indexOf(search);
expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode");
return offset;
}
void _indexTestUnit(String code) {
testCode = code;
testSource = addSource('/test.dart', code);
testUnit = resolveLibraryUnit(testSource);
if (verifyNoTestUnitErrors) {
_assertNoErrorsInSource();
}
testUnitElement = testUnit.element;
testLibraryElement = testUnitElement.library;
indexDartUnit(store, context, testUnit);
}
}
class ExpectedLocation {
Element element;
int offset;
int length;
ExpectedLocation(this.element, this.offset, this.length);
@override
String toString() {
return 'ExpectedLocation(element=$element; offset=$offset; length=$length)';
}
}
class MockIndexStore extends TypedMock implements IndexStore {
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
/**
* Information about a relation recorded into {@link IndexStore}.
*/
class RecordedRelation {
final Element element;
final Relationship relationship;
final Location location;
RecordedRelation(this.element, this.relationship, this.location);
@override
String toString() {
return 'RecordedRelation(element=$element; relationship=$relationship; '
'location=$location)';
}
}