| Index: pkg/analyzer/test/src/summary/index_unit_test.dart
|
| diff --git a/pkg/analyzer/test/src/summary/index_unit_test.dart b/pkg/analyzer/test/src/summary/index_unit_test.dart
|
| deleted file mode 100644
|
| index 06f6efb11f8b4bd3c997cad65cec8af3caa2d132..0000000000000000000000000000000000000000
|
| --- a/pkg/analyzer/test/src/summary/index_unit_test.dart
|
| +++ /dev/null
|
| @@ -1,1340 +0,0 @@
|
| -// Copyright (c) 2016, 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.
|
| -
|
| -import 'dart:convert';
|
| -
|
| -import 'package:analyzer/dart/ast/ast.dart';
|
| -import 'package:analyzer/dart/element/element.dart';
|
| -import 'package:analyzer/src/summary/format.dart';
|
| -import 'package:analyzer/src/summary/idl.dart';
|
| -import 'package:analyzer/src/summary/index_unit.dart';
|
| -import 'package:test_reflective_loader/test_reflective_loader.dart';
|
| -import 'package:unittest/unittest.dart';
|
| -
|
| -import '../abstract_single_unit.dart';
|
| -
|
| -main() {
|
| - groupSep = ' | ';
|
| - defineReflectiveTests(PackageIndexAssemblerTest);
|
| -}
|
| -
|
| -class ExpectedLocation {
|
| - final CompilationUnitElement unitElement;
|
| - final int offset;
|
| - final int length;
|
| - final bool isQualified;
|
| -
|
| - ExpectedLocation(
|
| - this.unitElement, this.offset, this.length, this.isQualified);
|
| -
|
| - @override
|
| - String toString() {
|
| - return '(unit=$unitElement; offset=$offset; length=$length;'
|
| - ' isQualified=$isQualified)';
|
| - }
|
| -}
|
| -
|
| -@reflectiveTest
|
| -class PackageIndexAssemblerTest extends AbstractSingleUnitTest {
|
| - PackageIndex packageIndex;
|
| - UnitIndex unitIndex;
|
| -
|
| - _ElementIndexAssert assertThat(Element element) {
|
| - List<_Relation> relations = _getElementRelations(element);
|
| - return new _ElementIndexAssert(this, element, relations);
|
| - }
|
| -
|
| - _NameIndexAssert assertThatName(String name) {
|
| - return new _NameIndexAssert(this, name);
|
| - }
|
| -
|
| - CompilationUnitElement importedUnit({int index: 0}) {
|
| - List<ImportElement> imports = testLibraryElement.imports;
|
| - return imports[index].importedLibrary.definingCompilationUnit;
|
| - }
|
| -
|
| - void test_definedName_classMember_field() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - int f;
|
| -}''');
|
| - _assertDefinedName('f', IndexNameKind.classMember, 'f;');
|
| - }
|
| -
|
| - void test_definedName_classMember_getter() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - int get g => 0;
|
| -}''');
|
| - _assertDefinedName('g', IndexNameKind.classMember, 'g => 0;');
|
| - }
|
| -
|
| - void test_definedName_classMember_method() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - m() {}
|
| -}''');
|
| - _assertDefinedName('m', IndexNameKind.classMember, 'm() {}');
|
| - }
|
| -
|
| - void test_definedName_classMember_operator() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - operator +(o) {}
|
| -}''');
|
| - _assertDefinedName('+', IndexNameKind.classMember, '+(o) {}');
|
| - }
|
| -
|
| - void test_definedName_classMember_setter() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - int set s (_) {}
|
| -}''');
|
| - _assertDefinedName('s', IndexNameKind.classMember, 's (_) {}');
|
| - }
|
| -
|
| - void test_definedName_topLevel_class() {
|
| - _indexTestUnit('class A {}');
|
| - _assertDefinedName('A', IndexNameKind.topLevel, 'A {}');
|
| - }
|
| -
|
| - void test_definedName_topLevel_class2() {
|
| - _indexTestUnit('class A {}', declOnly: true);
|
| - _assertDefinedName('A', IndexNameKind.topLevel, 'A {}');
|
| - }
|
| -
|
| - void test_definedName_topLevel_classAlias() {
|
| - _indexTestUnit('''
|
| -class M {}
|
| -class C = Object with M;''');
|
| - _assertDefinedName('C', IndexNameKind.topLevel, 'C =');
|
| - }
|
| -
|
| - void test_definedName_topLevel_enum() {
|
| - _indexTestUnit('enum E {a, b, c}');
|
| - _assertDefinedName('E', IndexNameKind.topLevel, 'E {');
|
| - }
|
| -
|
| - void test_definedName_topLevel_function() {
|
| - _indexTestUnit('foo() {}');
|
| - _assertDefinedName('foo', IndexNameKind.topLevel, 'foo() {}');
|
| - }
|
| -
|
| - void test_definedName_topLevel_functionTypeAlias() {
|
| - _indexTestUnit('typedef F(int p);');
|
| - _assertDefinedName('F', IndexNameKind.topLevel, 'F(int p);');
|
| - }
|
| -
|
| - void test_definedName_topLevel_getter() {
|
| - _indexTestUnit('''
|
| -int get g => 0;
|
| -''');
|
| - _assertDefinedName('g', IndexNameKind.topLevel, 'g => 0;');
|
| - }
|
| -
|
| - void test_definedName_topLevel_setter() {
|
| - _indexTestUnit('''
|
| -int set s (_) {}
|
| -''');
|
| - _assertDefinedName('s', IndexNameKind.topLevel, 's (_) {}');
|
| - }
|
| -
|
| - void test_definedName_topLevel_topLevelVariable() {
|
| - _indexTestUnit('var V = 42;');
|
| - _assertDefinedName('V', IndexNameKind.topLevel, 'V = 42;');
|
| - }
|
| -
|
| - void test_hasAncestor_ClassDeclaration() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -class B1 extends A {}
|
| -class B2 implements A {}
|
| -class C1 extends B1 {}
|
| -class C2 extends B2 {}
|
| -class C3 implements B1 {}
|
| -class C4 implements B2 {}
|
| -class M extends Object with A {}
|
| -''');
|
| - ClassElement classElementA = findElement("A");
|
| - assertThat(classElementA)
|
| - ..isAncestorOf('B1 extends A')
|
| - ..isAncestorOf('B2 implements A')
|
| - ..isAncestorOf('C1 extends B1')
|
| - ..isAncestorOf('C2 extends B2')
|
| - ..isAncestorOf('C3 implements B1')
|
| - ..isAncestorOf('C4 implements B2')
|
| - ..isAncestorOf('M extends Object with A');
|
| - }
|
| -
|
| - void test_hasAncestor_ClassTypeAlias() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -class B extends A {}
|
| -class C1 = Object with A;
|
| -class C2 = Object with B;
|
| -''');
|
| - ClassElement classElementA = findElement('A');
|
| - ClassElement classElementB = findElement('B');
|
| - assertThat(classElementA)
|
| - ..isAncestorOf('C1 = Object with A')
|
| - ..isAncestorOf('C2 = Object with B');
|
| - assertThat(classElementB)..isAncestorOf('C2 = Object with B');
|
| - }
|
| -
|
| - void test_isExtendedBy_ClassDeclaration() {
|
| - _indexTestUnit('''
|
| -class A {} // 1
|
| -class B extends A {} // 2
|
| -''');
|
| - ClassElement elementA = findElement('A');
|
| - assertThat(elementA)
|
| - ..isExtendedAt('A {} // 2', false)
|
| - ..isReferencedAt('A {} // 2', false);
|
| - }
|
| -
|
| - void test_isExtendedBy_ClassDeclaration_isQualified() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -class A {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' as p;
|
| -class B extends p.A {} // 2
|
| -''');
|
| - ClassElement elementA = importedUnit().getType('A');
|
| - assertThat(elementA).isExtendedAt('A {} // 2', true);
|
| - }
|
| -
|
| - void test_isExtendedBy_ClassDeclaration_Object() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -''');
|
| - ClassElement elementA = findElement('A');
|
| - ClassElement elementObject = elementA.supertype.element;
|
| - assertThat(elementObject).isExtendedAt('A {}', true, length: 0);
|
| - }
|
| -
|
| - void test_isExtendedBy_ClassTypeAlias() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -class B {}
|
| -class C = A with B;
|
| -''');
|
| - ClassElement elementA = findElement('A');
|
| - assertThat(elementA)
|
| - ..isExtendedAt('A with', false)
|
| - ..isReferencedAt('A with', false);
|
| - }
|
| -
|
| - void test_isExtendedBy_ClassTypeAlias_isQualified() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -class A {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' as p;
|
| -class B {}
|
| -class C = p.A with B;
|
| -''');
|
| - ClassElement elementA = importedUnit().getType('A');
|
| - assertThat(elementA)
|
| - ..isExtendedAt('A with', true)
|
| - ..isReferencedAt('A with', true);
|
| - }
|
| -
|
| - void test_isImplementedBy_ClassDeclaration() {
|
| - _indexTestUnit('''
|
| -class A {} // 1
|
| -class B implements A {} // 2
|
| -''');
|
| - ClassElement elementA = findElement('A');
|
| - assertThat(elementA)
|
| - ..isImplementedAt('A {} // 2', false)
|
| - ..isReferencedAt('A {} // 2', false);
|
| - }
|
| -
|
| - void test_isImplementedBy_ClassDeclaration_isQualified() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -class A {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' as p;
|
| -class B implements p.A {} // 2
|
| -''');
|
| - ClassElement elementA = importedUnit().getType('A');
|
| - assertThat(elementA)
|
| - ..isImplementedAt('A {} // 2', true)
|
| - ..isReferencedAt('A {} // 2', true);
|
| - }
|
| -
|
| - void test_isImplementedBy_ClassTypeAlias() {
|
| - _indexTestUnit('''
|
| -class A {} // 1
|
| -class B {} // 2
|
| -class C = Object with A implements B; // 3
|
| -''');
|
| - ClassElement elementB = findElement('B');
|
| - assertThat(elementB)
|
| - ..isImplementedAt('B; // 3', false)
|
| - ..isReferencedAt('B; // 3', false);
|
| - }
|
| -
|
| - void test_isInvokedBy_FieldElement() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - var field;
|
| - main() {
|
| - this.field(); // q
|
| - field(); // nq
|
| - }
|
| -}''');
|
| - FieldElement field = findElement('field');
|
| - assertThat(field.getter)
|
| - ..isInvokedAt('field(); // q', true)
|
| - ..isInvokedAt('field(); // nq', false);
|
| - }
|
| -
|
| - void test_isInvokedBy_FunctionElement() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -library lib;
|
| -foo() {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart';
|
| -import 'lib.dart' as pref;
|
| -main() {
|
| - pref.foo(); // q
|
| - foo(); // nq
|
| -}''');
|
| - FunctionElement element = importedUnit().functions[0];
|
| - assertThat(element)
|
| - ..isInvokedAt('foo(); // q', true)
|
| - ..isInvokedAt('foo(); // nq', false);
|
| - }
|
| -
|
| - void test_isInvokedBy_FunctionElement_synthetic_loadLibrary() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -import 'dart:math' deferred as math;
|
| -main() {
|
| - math.loadLibrary(); // 1
|
| - math.loadLibrary(); // 2
|
| -}
|
| -''');
|
| - LibraryElement mathLib = testLibraryElement.imports[0].importedLibrary;
|
| - FunctionElement element = mathLib.loadLibraryFunction;
|
| - assertThat(element).isInvokedAt('loadLibrary(); // 1', true);
|
| - assertThat(element).isInvokedAt('loadLibrary(); // 2', true);
|
| - }
|
| -
|
| - void test_isInvokedBy_MethodElement() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - foo() {}
|
| - main() {
|
| - this.foo(); // q
|
| - foo(); // nq
|
| - }
|
| -}''');
|
| - Element element = findElement('foo');
|
| - assertThat(element)
|
| - ..isInvokedAt('foo(); // q', true)
|
| - ..isInvokedAt('foo(); // nq', false);
|
| - }
|
| -
|
| - void test_isInvokedBy_MethodElement_propagatedType() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - foo() {}
|
| -}
|
| -main() {
|
| - var a = new A();
|
| - a.foo();
|
| -}
|
| -''');
|
| - Element element = findElement('foo');
|
| - assertThat(element).isInvokedAt('foo();', true);
|
| - }
|
| -
|
| - void test_isInvokedBy_operator_binary() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - operator +(other) => this;
|
| -}
|
| -main(A a) {
|
| - print(a + 1);
|
| - a += 2;
|
| - ++a;
|
| - a++;
|
| -}
|
| -''');
|
| - MethodElement element = findElement('+');
|
| - assertThat(element)
|
| - ..isInvokedAt('+ 1', true, length: 1)
|
| - ..isInvokedAt('+= 2', true, length: 2)
|
| - ..isInvokedAt('++a', true, length: 2)
|
| - ..isInvokedAt('++;', true, length: 2);
|
| - }
|
| -
|
| - void test_isInvokedBy_operator_index() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - operator [](i) => null;
|
| - operator []=(i, v) {}
|
| -}
|
| -main(A a) {
|
| - print(a[0]);
|
| - a[1] = 42;
|
| -}
|
| -''');
|
| - MethodElement readElement = findElement('[]');
|
| - MethodElement writeElement = findElement('[]=');
|
| - assertThat(readElement).isInvokedAt('[0]', true, length: 1);
|
| - assertThat(writeElement).isInvokedAt('[1]', true, length: 1);
|
| - }
|
| -
|
| - void test_isInvokedBy_operator_prefix() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - A operator ~() => this;
|
| -}
|
| -main(A a) {
|
| - print(~a);
|
| -}
|
| -''');
|
| - MethodElement element = findElement('~');
|
| - assertThat(element).isInvokedAt('~a', true, length: 1);
|
| - }
|
| -
|
| - void test_isInvokedBy_PropertyAccessorElement_getter() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - get ggg => null;
|
| - main() {
|
| - this.ggg(); // q
|
| - ggg(); // nq
|
| - }
|
| -}''');
|
| - PropertyAccessorElement element = findElement('ggg', ElementKind.GETTER);
|
| - assertThat(element)
|
| - ..isInvokedAt('ggg(); // q', true)
|
| - ..isInvokedAt('ggg(); // nq', false);
|
| - }
|
| -
|
| - void test_isMixedInBy_ClassDeclaration() {
|
| - _indexTestUnit('''
|
| -class A {} // 1
|
| -class B extends Object with A {} // 2
|
| -''');
|
| - ClassElement elementA = findElement('A');
|
| - assertThat(elementA)
|
| - ..isMixedInAt('A {} // 2', false)
|
| - ..isReferencedAt('A {} // 2', false);
|
| - }
|
| -
|
| - void test_isMixedInBy_ClassDeclaration_isQualified() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -class A {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' as p;
|
| -class B extends Object with p.A {} // 2
|
| -''');
|
| - ClassElement elementA = importedUnit().getType('A');
|
| - assertThat(elementA).isMixedInAt('A {} // 2', true);
|
| - }
|
| -
|
| - void test_isMixedInBy_ClassTypeAlias() {
|
| - _indexTestUnit('''
|
| -class A {} // 1
|
| -class B = Object with A; // 2
|
| -''');
|
| - ClassElement elementA = findElement('A');
|
| - assertThat(elementA).isMixedInAt('A; // 2', false);
|
| - }
|
| -
|
| - 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
|
| -}
|
| -''');
|
| - ClassElement element = findElement('A');
|
| - assertThat(element)
|
| - ..isReferencedAt('A p) {', false)
|
| - ..isReferencedAt('A v;', false)
|
| - ..isReferencedAt('A(); // 2', false)
|
| - ..isReferencedAt('A.field = 1;', false)
|
| - ..isReferencedAt('A.field); // 3', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_ClassElement_invocation() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -class A {}
|
| -main() {
|
| - A(); // invalid code, but still a reference
|
| -}''');
|
| - Element element = findElement('A');
|
| - assertThat(element).isReferencedAt('A();', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_ClassElement_invocation_isQualified() {
|
| - verifyNoTestUnitErrors = false;
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -class A {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' as p;
|
| -main() {
|
| - p.A(); // invalid code, but still a reference
|
| -}''');
|
| - Element element = importedUnit().getType('A');
|
| - assertThat(element).isReferencedAt('A();', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_ClassTypeAlias() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -class B = Object with A;
|
| -main(B p) {
|
| - B v;
|
| -}
|
| -''');
|
| - ClassElement element = findElement('B');
|
| - assertThat(element)
|
| - ..isReferencedAt('B p) {', false)
|
| - ..isReferencedAt('B v;', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_CompilationUnitElement_export() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -library lib;
|
| -''');
|
| - _indexTestUnit('''
|
| -export 'lib.dart';
|
| -''');
|
| - LibraryElement element = testLibraryElement.exports[0].exportedLibrary;
|
| - assertThat(element)..isReferencedAt("'lib.dart'", true, length: 10);
|
| - }
|
| -
|
| - void test_isReferencedBy_CompilationUnitElement_import() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -library lib;
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart';
|
| -''');
|
| - LibraryElement element = testLibraryElement.imports[0].importedLibrary;
|
| - assertThat(element)..isReferencedAt("'lib.dart'", true, length: 10);
|
| - }
|
| -
|
| - void test_isReferencedBy_CompilationUnitElement_part() {
|
| - addSource('/my_unit.dart', 'part of my_lib;');
|
| - _indexTestUnit('''
|
| -library my_lib;
|
| -part 'my_unit.dart';
|
| -''');
|
| - CompilationUnitElement element = testLibraryElement.parts[0];
|
| - assertThat(element)..isReferencedAt("'my_unit.dart';", true, length: 14);
|
| - }
|
| -
|
| - void test_isReferencedBy_ConstructorElement() {
|
| - _indexTestUnit('''
|
| -class A implements B {
|
| - A() {}
|
| - A.foo() {}
|
| -}
|
| -class B extends A {
|
| - B() : super(); // 1
|
| - B.foo() : super.foo(); // 2
|
| - factory B.bar() = A.foo; // 3
|
| -}
|
| -main() {
|
| - new A(); // 4
|
| - new A.foo(); // 5
|
| -}
|
| -''');
|
| - ClassElement classA = findElement('A');
|
| - ConstructorElement constA = classA.constructors[0];
|
| - ConstructorElement constA_foo = classA.constructors[1];
|
| - // A()
|
| - assertThat(constA)
|
| - ..hasRelationCount(2)
|
| - ..isReferencedAt('(); // 1', true, length: 0)
|
| - ..isReferencedAt('(); // 4', true, length: 0);
|
| - // A.foo()
|
| - assertThat(constA_foo)
|
| - ..hasRelationCount(3)
|
| - ..isReferencedAt('.foo(); // 2', true, length: 4)
|
| - ..isReferencedAt('.foo; // 3', true, length: 4)
|
| - ..isReferencedAt('.foo(); // 5', true, length: 4);
|
| - }
|
| -
|
| - void test_isReferencedBy_ConstructorElement_classTypeAlias() {
|
| - _indexTestUnit('''
|
| -class M {}
|
| -class A implements B {
|
| - A() {}
|
| - A.named() {}
|
| -}
|
| -class B = A with M;
|
| -class C = B with M;
|
| -main() {
|
| - new B(); // B1
|
| - new B.named(); // B2
|
| - new C(); // C1
|
| - new C.named(); // C2
|
| -}
|
| -''');
|
| - ClassElement classA = findElement('A');
|
| - ConstructorElement constA = classA.constructors[0];
|
| - ConstructorElement constA_named = classA.constructors[1];
|
| - assertThat(constA)
|
| - ..isReferencedAt('(); // B1', true, length: 0)
|
| - ..isReferencedAt('(); // C1', true, length: 0);
|
| - assertThat(constA_named)
|
| - ..isReferencedAt('.named(); // B2', true, length: 6)
|
| - ..isReferencedAt('.named(); // C2', true, length: 6);
|
| - }
|
| -
|
| - void test_isReferencedBy_ConstructorElement_classTypeAlias_cycle() {
|
| - _indexTestUnit('''
|
| -class M {}
|
| -class A = B with M;
|
| -class B = A with M;
|
| -main() {
|
| - new A();
|
| - new B();
|
| -}
|
| -''');
|
| - // No additional validation, but it should not fail with stack overflow.
|
| - }
|
| -
|
| - void test_isReferencedBy_ConstructorElement_namedOnlyWithDot() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - A.named() {}
|
| -}
|
| -main() {
|
| - new A.named();
|
| -}
|
| -''');
|
| - // has ".named()", but does not have "named()"
|
| - int offsetWithoutDot = findOffset('named();');
|
| - int offsetWithDot = findOffset('.named();');
|
| - expect(unitIndex.usedElementOffsets, isNot(contains(offsetWithoutDot)));
|
| - expect(unitIndex.usedElementOffsets, contains(offsetWithDot));
|
| - }
|
| -
|
| - void test_isReferencedBy_ConstructorElement_redirection() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - A() : this.bar(); // 1
|
| - A.foo() : this(); // 2
|
| - A.bar();
|
| -}
|
| -''');
|
| - ClassElement classA = findElement('A');
|
| - ConstructorElement constA = classA.constructors[0];
|
| - ConstructorElement constA_bar = classA.constructors[2];
|
| - assertThat(constA).isReferencedAt('(); // 2', true, length: 0);
|
| - assertThat(constA_bar).isReferencedAt('.bar(); // 1', true, length: 4);
|
| - }
|
| -
|
| - void test_isReferencedBy_ConstructorElement_synthetic() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -main() {
|
| - new A(); // 1
|
| -}
|
| -''');
|
| - ClassElement classA = findElement('A');
|
| - ConstructorElement constA = classA.constructors[0];
|
| - // A()
|
| - assertThat(constA)..isReferencedAt('(); // 1', true, length: 0);
|
| - }
|
| -
|
| - void test_isReferencedBy_DynamicElement() {
|
| - _indexTestUnit('''
|
| -dynamic f() {
|
| -}''');
|
| - expect(unitIndex.usedElementOffsets, isEmpty);
|
| - }
|
| -
|
| - void test_isReferencedBy_FieldElement() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - var field;
|
| - A({this.field});
|
| - m() {
|
| - field = 2; // nq
|
| - print(field); // nq
|
| - }
|
| -}
|
| -main(A a) {
|
| - a.field = 3; // q
|
| - print(a.field); // q
|
| - new A(field: 4);
|
| -}
|
| -''');
|
| - FieldElement field = findElement('field', ElementKind.FIELD);
|
| - PropertyAccessorElement getter = field.getter;
|
| - PropertyAccessorElement setter = field.setter;
|
| - // A()
|
| - assertThat(field)..isWrittenAt('field});', true);
|
| - // m()
|
| - assertThat(setter)..isReferencedAt('field = 2; // nq', false);
|
| - assertThat(getter)..isReferencedAt('field); // nq', false);
|
| - // main()
|
| - assertThat(setter)..isReferencedAt('field = 3; // q', true);
|
| - assertThat(getter)..isReferencedAt('field); // q', true);
|
| - assertThat(field)..isReferencedAt('field: 4', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_FieldElement_multiple() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - var aaa;
|
| - var bbb;
|
| - A(this.aaa, this.bbb) {}
|
| - m() {
|
| - print(aaa);
|
| - aaa = 1;
|
| - print(bbb);
|
| - bbb = 2;
|
| - }
|
| -}
|
| -''');
|
| - // aaa
|
| - {
|
| - FieldElement field = findElement('aaa', ElementKind.FIELD);
|
| - PropertyAccessorElement getter = field.getter;
|
| - PropertyAccessorElement setter = field.setter;
|
| - assertThat(field)..isWrittenAt('aaa, ', true);
|
| - assertThat(getter)..isReferencedAt('aaa);', false);
|
| - assertThat(setter)..isReferencedAt('aaa = 1;', false);
|
| - }
|
| - // bbb
|
| - {
|
| - FieldElement field = findElement('bbb', ElementKind.FIELD);
|
| - PropertyAccessorElement getter = field.getter;
|
| - PropertyAccessorElement setter = field.setter;
|
| - assertThat(field)..isWrittenAt('bbb) {}', true);
|
| - assertThat(getter)..isReferencedAt('bbb);', false);
|
| - assertThat(setter)..isReferencedAt('bbb = 2;', false);
|
| - }
|
| - }
|
| -
|
| - void test_isReferencedBy_FieldElement_ofEnum() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -enum MyEnum {
|
| - A, B, C
|
| -}
|
| -main() {
|
| - print(MyEnum.values);
|
| - print(MyEnum.A.index);
|
| - print(MyEnum.A);
|
| - print(MyEnum.B);
|
| -}
|
| -''');
|
| - ClassElement enumElement = findElement('MyEnum');
|
| - assertThat(enumElement.getGetter('values'))
|
| - ..isReferencedAt('values);', true);
|
| - assertThat(enumElement.getGetter('index'))..isReferencedAt('index);', true);
|
| - assertThat(enumElement.getGetter('A'))..isReferencedAt('A);', true);
|
| - assertThat(enumElement.getGetter('B'))..isReferencedAt('B);', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_FieldElement_synthetic_hasGetter() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -class A {
|
| - A() : f = 42;
|
| - int get f => 0;
|
| -}
|
| -''');
|
| - ClassElement element2 = findElement('A');
|
| - assertThat(element2.getField('f')).isWrittenAt('f = 42', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_FieldElement_synthetic_hasGetterSetter() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -class A {
|
| - A() : f = 42;
|
| - int get f => 0;
|
| - set f(_) {}
|
| -}
|
| -''');
|
| - ClassElement element2 = findElement('A');
|
| - assertThat(element2.getField('f')).isWrittenAt('f = 42', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_FieldElement_synthetic_hasSetter() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -class A {
|
| - A() : f = 42;
|
| - set f(_) {}
|
| -}
|
| -''');
|
| - ClassElement element2 = findElement('A');
|
| - assertThat(element2.getField('f')).isWrittenAt('f = 42', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_FunctionElement() {
|
| - _indexTestUnit('''
|
| -foo() {}
|
| -main() {
|
| - print(foo);
|
| - print(foo());
|
| -}
|
| -''');
|
| - FunctionElement element = findElement('foo');
|
| - assertThat(element)
|
| - ..isReferencedAt('foo);', false)
|
| - ..isInvokedAt('foo());', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_FunctionElement_with_LibraryElement() {
|
| - addSource(
|
| - '/foo.dart',
|
| - r'''
|
| -bar() {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import "foo.dart";
|
| -main() {
|
| - bar();
|
| -}
|
| -''');
|
| - LibraryElement fooLibrary = testLibraryElement.imports[0].importedLibrary;
|
| - assertThat(fooLibrary)..isReferencedAt('"foo.dart";', true, length: 10);
|
| - {
|
| - FunctionElement bar = fooLibrary.definingCompilationUnit.functions[0];
|
| - assertThat(bar)..isInvokedAt('bar();', false);
|
| - }
|
| - }
|
| -
|
| - void test_isReferencedBy_FunctionTypeAliasElement() {
|
| - _indexTestUnit('''
|
| -typedef A();
|
| -main(A p) {
|
| -}
|
| -''');
|
| - Element element = findElement('A');
|
| - assertThat(element)..isReferencedAt('A p) {', false);
|
| - }
|
| -
|
| - /**
|
| - * 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;
|
| -''');
|
| - Element element = findElement('A');
|
| - assertThat(element)..isReferencedAt('A] text', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_MethodElement() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - method() {}
|
| - main() {
|
| - print(this.method); // q
|
| - print(method); // nq
|
| - }
|
| -}''');
|
| - MethodElement element = findElement('method');
|
| - assertThat(element)
|
| - ..isReferencedAt('method); // q', true)
|
| - ..isReferencedAt('method); // nq', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_ParameterElement() {
|
| - _indexTestUnit('''
|
| -foo({var p}) {}
|
| -main() {
|
| - foo(p: 1);
|
| -}
|
| -''');
|
| - Element element = findElement('p');
|
| - assertThat(element)..isReferencedAt('p: 1', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_TopLevelVariableElement() {
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -library lib;
|
| -var V;
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' show V; // imp
|
| -import 'lib.dart' as pref;
|
| -main() {
|
| - pref.V = 5; // q
|
| - print(pref.V); // q
|
| - V = 5; // nq
|
| - print(V); // nq
|
| -}''');
|
| - TopLevelVariableElement variable = importedUnit().topLevelVariables[0];
|
| - assertThat(variable)..isReferencedAt('V; // imp', true);
|
| - assertThat(variable.getter)
|
| - ..isReferencedAt('V); // q', true)
|
| - ..isReferencedAt('V); // nq', false);
|
| - assertThat(variable.setter)
|
| - ..isReferencedAt('V = 5; // q', true)
|
| - ..isReferencedAt('V = 5; // nq', false);
|
| - }
|
| -
|
| - void test_isReferencedBy_TopLevelVariableElement_synthetic_hasGetterSetter() {
|
| - verifyNoTestUnitErrors = false;
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -int get V => 0;
|
| -void set V(_) {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' show V;
|
| -''');
|
| - TopLevelVariableElement element = importedUnit().topLevelVariables[0];
|
| - assertThat(element).isReferencedAt('V;', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_TopLevelVariableElement_synthetic_hasSetter() {
|
| - verifyNoTestUnitErrors = false;
|
| - addSource(
|
| - '/lib.dart',
|
| - '''
|
| -void set V(_) {}
|
| -''');
|
| - _indexTestUnit('''
|
| -import 'lib.dart' show V;
|
| -''');
|
| - TopLevelVariableElement element = importedUnit().topLevelVariables[0];
|
| - assertThat(element).isReferencedAt('V;', true);
|
| - }
|
| -
|
| - void test_isReferencedBy_typeInVariableList() {
|
| - _indexTestUnit('''
|
| -class A {}
|
| -A myVariable = null;
|
| -''');
|
| - Element element = findElement('A');
|
| - assertThat(element).isReferencedAt('A myVariable', false);
|
| - }
|
| -
|
| - void test_isWrittenBy_FieldElement() {
|
| - _indexTestUnit('''
|
| -class A {
|
| - int field;
|
| - A.foo({this.field});
|
| - A.bar() : field = 5;
|
| -}
|
| -''');
|
| - FieldElement element = findElement('field', ElementKind.FIELD);
|
| - assertThat(element)
|
| - ..isWrittenAt('field})', true)
|
| - ..isWrittenAt('field = 5', true);
|
| - }
|
| -
|
| - void test_usedName_inLibraryIdentifier() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -library aaa.bbb.ccc;
|
| -class C {
|
| - var bbb;
|
| -}
|
| -main(p) {
|
| - p.bbb = 1;
|
| -}
|
| -''');
|
| - assertThatName('bbb')
|
| - ..isNotUsed('bbb.ccc', IndexRelationKind.IS_READ_BY)
|
| - ..isUsedQ('bbb = 1;', IndexRelationKind.IS_WRITTEN_BY);
|
| - }
|
| -
|
| - void test_usedName_qualified_resolved() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -class C {
|
| - var x;
|
| -}
|
| -main(C c) {
|
| - c.x;
|
| - c.x = 1;
|
| - c.x += 2;
|
| - c.x();
|
| -}
|
| -''');
|
| - assertThatName('x')
|
| - ..isNotUsedQ('x;', IndexRelationKind.IS_READ_BY)
|
| - ..isNotUsedQ('x = 1;', IndexRelationKind.IS_WRITTEN_BY)
|
| - ..isNotUsedQ('x += 2;', IndexRelationKind.IS_READ_WRITTEN_BY)
|
| - ..isNotUsedQ('x();', IndexRelationKind.IS_INVOKED_BY);
|
| - }
|
| -
|
| - void test_usedName_qualified_unresolved() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -main(p) {
|
| - p.x;
|
| - p.x = 1;
|
| - p.x += 2;
|
| - p.x();
|
| -}
|
| -''');
|
| - assertThatName('x')
|
| - ..isUsedQ('x;', IndexRelationKind.IS_READ_BY)
|
| - ..isUsedQ('x = 1;', IndexRelationKind.IS_WRITTEN_BY)
|
| - ..isUsedQ('x += 2;', IndexRelationKind.IS_READ_WRITTEN_BY)
|
| - ..isUsedQ('x();', IndexRelationKind.IS_INVOKED_BY);
|
| - }
|
| -
|
| - void test_usedName_unqualified_resolved() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -class C {
|
| - var x;
|
| - m() {
|
| - x;
|
| - x = 1;
|
| - x += 2;
|
| - x();
|
| - }
|
| -}
|
| -''');
|
| - assertThatName('x')
|
| - ..isNotUsedQ('x;', IndexRelationKind.IS_READ_BY)
|
| - ..isNotUsedQ('x = 1;', IndexRelationKind.IS_WRITTEN_BY)
|
| - ..isNotUsedQ('x += 2;', IndexRelationKind.IS_READ_WRITTEN_BY)
|
| - ..isNotUsedQ('x();', IndexRelationKind.IS_INVOKED_BY);
|
| - }
|
| -
|
| - void test_usedName_unqualified_unresolved() {
|
| - verifyNoTestUnitErrors = false;
|
| - _indexTestUnit('''
|
| -main() {
|
| - x;
|
| - x = 1;
|
| - x += 2;
|
| - x();
|
| -}
|
| -''');
|
| - assertThatName('x')
|
| - ..isUsed('x;', IndexRelationKind.IS_READ_BY)
|
| - ..isUsed('x = 1;', IndexRelationKind.IS_WRITTEN_BY)
|
| - ..isUsed('x += 2;', IndexRelationKind.IS_READ_WRITTEN_BY)
|
| - ..isUsed('x();', IndexRelationKind.IS_INVOKED_BY);
|
| - }
|
| -
|
| - void _assertDefinedName(String name, IndexNameKind kind, String search) {
|
| - int offset = findOffset(search);
|
| - int nameId = _getStringId(name);
|
| - for (int i = 0; i < unitIndex.definedNames.length; i++) {
|
| - if (unitIndex.definedNames[i] == nameId &&
|
| - unitIndex.definedNameKinds[i] == kind &&
|
| - unitIndex.definedNameOffsets[i] == offset) {
|
| - return;
|
| - }
|
| - }
|
| - _failWithIndexDump('Not found $name $kind at $offset');
|
| - }
|
| -
|
| - /**
|
| - * Asserts that [unitIndex] has an item with the expected properties.
|
| - */
|
| - void _assertHasRelation(
|
| - Element element,
|
| - List<_Relation> relations,
|
| - IndexRelationKind expectedRelationKind,
|
| - ExpectedLocation expectedLocation) {
|
| - for (_Relation relation in relations) {
|
| - if (relation.kind == expectedRelationKind &&
|
| - relation.offset == expectedLocation.offset &&
|
| - relation.length == expectedLocation.length &&
|
| - relation.isQualified == expectedLocation.isQualified) {
|
| - return;
|
| - }
|
| - }
|
| - _failWithIndexDump(
|
| - 'not found\n$element $expectedRelationKind at $expectedLocation');
|
| - }
|
| -
|
| - void _assertUsedName(String name, IndexRelationKind kind,
|
| - ExpectedLocation expectedLocation, bool isNot) {
|
| - int nameId = _getStringId(name);
|
| - for (int i = 0; i < unitIndex.usedNames.length; i++) {
|
| - if (unitIndex.usedNames[i] == nameId &&
|
| - unitIndex.usedNameKinds[i] == kind &&
|
| - unitIndex.usedNameOffsets[i] == expectedLocation.offset &&
|
| - unitIndex.usedNameIsQualifiedFlags[i] ==
|
| - expectedLocation.isQualified) {
|
| - if (isNot) {
|
| - _failWithIndexDump('Unexpected $name $kind at $expectedLocation');
|
| - }
|
| - return;
|
| - }
|
| - }
|
| - if (isNot) {
|
| - return;
|
| - }
|
| - _failWithIndexDump('Not found $name $kind at $expectedLocation');
|
| - }
|
| -
|
| - ExpectedLocation _expectedLocation(String search, bool isQualified,
|
| - {int length}) {
|
| - int offset = findOffset(search);
|
| - if (length == null) {
|
| - length = getLeadingIdentifierLength(search);
|
| - }
|
| - return new ExpectedLocation(testUnitElement, offset, length, isQualified);
|
| - }
|
| -
|
| - void _failWithIndexDump(String msg) {
|
| - String packageIndexJsonString =
|
| - new JsonEncoder.withIndent(' ').convert(packageIndex.toJson());
|
| - fail('$msg in\n' + packageIndexJsonString);
|
| - }
|
| -
|
| - /**
|
| - * Return the [element] identifier in [packageIndex] or fail.
|
| - */
|
| - int _findElementId(Element element) {
|
| - int unitId = _getUnitId(element);
|
| - // Prepare the element that was put into the index.
|
| - IndexElementInfo info = new IndexElementInfo(element);
|
| - element = info.element;
|
| - // Prepare element's name components.
|
| - int unitMemberId = _getStringId(PackageIndexAssembler.NULL_STRING);
|
| - int classMemberId = _getStringId(PackageIndexAssembler.NULL_STRING);
|
| - int parameterId = _getStringId(PackageIndexAssembler.NULL_STRING);
|
| - for (Element e = element; e != null; e = e.enclosingElement) {
|
| - if (e.enclosingElement is CompilationUnitElement) {
|
| - unitMemberId = _getStringId(e.name);
|
| - }
|
| - }
|
| - for (Element e = element; e != null; e = e.enclosingElement) {
|
| - if (e.enclosingElement is ClassElement) {
|
| - classMemberId = _getStringId(e.name);
|
| - }
|
| - }
|
| - if (element is ParameterElement) {
|
| - parameterId = _getStringId(element.name);
|
| - }
|
| - // Find the element's id.
|
| - for (int elementId = 0;
|
| - elementId < packageIndex.elementUnits.length;
|
| - elementId++) {
|
| - if (packageIndex.elementUnits[elementId] == unitId &&
|
| - packageIndex.elementNameUnitMemberIds[elementId] == unitMemberId &&
|
| - packageIndex.elementNameClassMemberIds[elementId] == classMemberId &&
|
| - packageIndex.elementNameParameterIds[elementId] == parameterId &&
|
| - packageIndex.elementKinds[elementId] == info.kind) {
|
| - return elementId;
|
| - }
|
| - }
|
| - _failWithIndexDump('Element $element is not referenced');
|
| - return 0;
|
| - }
|
| -
|
| - /**
|
| - * Return all relations with [element] in [unitIndex].
|
| - */
|
| - List<_Relation> _getElementRelations(Element element) {
|
| - int elementId = _findElementId(element);
|
| - List<_Relation> relations = <_Relation>[];
|
| - for (int i = 0; i < unitIndex.usedElementOffsets.length; i++) {
|
| - if (unitIndex.usedElements[i] == elementId) {
|
| - relations.add(new _Relation(
|
| - unitIndex.usedElementKinds[i],
|
| - unitIndex.usedElementOffsets[i],
|
| - unitIndex.usedElementLengths[i],
|
| - unitIndex.usedElementIsQualifiedFlags[i]));
|
| - }
|
| - }
|
| - return relations;
|
| - }
|
| -
|
| - int _getStringId(String str) {
|
| - int id = packageIndex.strings.indexOf(str);
|
| - expect(id, isNonNegative);
|
| - return id;
|
| - }
|
| -
|
| - int _getUnitId(Element element) {
|
| - CompilationUnitElement unitElement =
|
| - PackageIndexAssembler.getUnitElement(element);
|
| - int libraryUriId = _getUriId(unitElement.library.source.uri);
|
| - int unitUriId = _getUriId(unitElement.source.uri);
|
| - expect(packageIndex.unitLibraryUris,
|
| - hasLength(packageIndex.unitUnitUris.length));
|
| - for (int i = 0; i < packageIndex.unitLibraryUris.length; i++) {
|
| - if (packageIndex.unitLibraryUris[i] == libraryUriId &&
|
| - packageIndex.unitUnitUris[i] == unitUriId) {
|
| - return i;
|
| - }
|
| - }
|
| - _failWithIndexDump('Unit $unitElement of $element is not referenced');
|
| - return -1;
|
| - }
|
| -
|
| - int _getUriId(Uri uri) {
|
| - String str = uri.toString();
|
| - return _getStringId(str);
|
| - }
|
| -
|
| - void _indexTestUnit(String code, {bool declOnly: false}) {
|
| - resolveTestUnit(code);
|
| - PackageIndexAssembler assembler = new PackageIndexAssembler();
|
| - if (declOnly) {
|
| - assembler.indexDeclarations(testUnit);
|
| - } else {
|
| - assembler.indexUnit(testUnit);
|
| - }
|
| - // assemble, write and read
|
| - PackageIndexBuilder indexBuilder = assembler.assemble();
|
| - List<int> indexBytes = indexBuilder.toBuffer();
|
| - packageIndex = new PackageIndex.fromBuffer(indexBytes);
|
| - // prepare the only unit index
|
| - expect(packageIndex.units, hasLength(1));
|
| - unitIndex = packageIndex.units[0];
|
| - expect(unitIndex.unit, _getUnitId(testUnitElement));
|
| - }
|
| -}
|
| -
|
| -class _ElementIndexAssert {
|
| - final PackageIndexAssemblerTest test;
|
| - final Element element;
|
| - final List<_Relation> relations;
|
| -
|
| - _ElementIndexAssert(this.test, this.element, this.relations);
|
| -
|
| - void hasRelationCount(int expectedCount) {
|
| - expect(relations, hasLength(expectedCount));
|
| - }
|
| -
|
| - void isAncestorOf(String search, {int length}) {
|
| - test._assertHasRelation(
|
| - element,
|
| - relations,
|
| - IndexRelationKind.IS_ANCESTOR_OF,
|
| - test._expectedLocation(search, false, length: length));
|
| - }
|
| -
|
| - void isExtendedAt(String search, bool isQualified, {int length}) {
|
| - test._assertHasRelation(
|
| - element,
|
| - relations,
|
| - IndexRelationKind.IS_EXTENDED_BY,
|
| - test._expectedLocation(search, isQualified, length: length));
|
| - }
|
| -
|
| - void isImplementedAt(String search, bool isQualified, {int length}) {
|
| - test._assertHasRelation(
|
| - element,
|
| - relations,
|
| - IndexRelationKind.IS_IMPLEMENTED_BY,
|
| - test._expectedLocation(search, isQualified, length: length));
|
| - }
|
| -
|
| - void isInvokedAt(String search, bool isQualified, {int length}) {
|
| - test._assertHasRelation(element, relations, IndexRelationKind.IS_INVOKED_BY,
|
| - test._expectedLocation(search, isQualified, length: length));
|
| - }
|
| -
|
| - void isMixedInAt(String search, bool isQualified, {int length}) {
|
| - test._assertHasRelation(
|
| - element,
|
| - relations,
|
| - IndexRelationKind.IS_MIXED_IN_BY,
|
| - test._expectedLocation(search, isQualified, length: length));
|
| - }
|
| -
|
| - void isReferencedAt(String search, bool isQualified, {int length}) {
|
| - test._assertHasRelation(
|
| - element,
|
| - relations,
|
| - IndexRelationKind.IS_REFERENCED_BY,
|
| - test._expectedLocation(search, isQualified, length: length));
|
| - }
|
| -
|
| - void isWrittenAt(String search, bool isQualified, {int length}) {
|
| - test._assertHasRelation(element, relations, IndexRelationKind.IS_WRITTEN_BY,
|
| - test._expectedLocation(search, isQualified, length: length));
|
| - }
|
| -}
|
| -
|
| -class _NameIndexAssert {
|
| - final PackageIndexAssemblerTest test;
|
| - final String name;
|
| -
|
| - _NameIndexAssert(this.test, this.name);
|
| -
|
| - void isNotUsed(String search, IndexRelationKind kind) {
|
| - test._assertUsedName(
|
| - name, kind, test._expectedLocation(search, false), true);
|
| - }
|
| -
|
| - void isNotUsedQ(String search, IndexRelationKind kind) {
|
| - test._assertUsedName(
|
| - name, kind, test._expectedLocation(search, true), true);
|
| - }
|
| -
|
| - void isUsed(String search, IndexRelationKind kind) {
|
| - test._assertUsedName(
|
| - name, kind, test._expectedLocation(search, false), false);
|
| - }
|
| -
|
| - void isUsedQ(String search, IndexRelationKind kind) {
|
| - test._assertUsedName(
|
| - name, kind, test._expectedLocation(search, true), false);
|
| - }
|
| -}
|
| -
|
| -class _Relation {
|
| - final IndexRelationKind kind;
|
| - final int offset;
|
| - final int length;
|
| - final bool isQualified;
|
| -
|
| - _Relation(this.kind, this.offset, this.length, this.isQualified);
|
| -
|
| - @override
|
| - String toString() {
|
| - return '_Relation{kind: $kind, offset: $offset, length: $length, '
|
| - 'isQualified: $isQualified}';
|
| - }
|
| -}
|
|
|