| OLD | NEW |
| 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 library test.services.src.index.dart_index_contributor; | 5 library test.services.src.index.dart_index_contributor; |
| 6 | 6 |
| 7 import 'package:analysis_services/index/index.dart'; | 7 import 'package:analysis_services/index/index.dart'; |
| 8 import 'package:analysis_services/index/index_store.dart'; | 8 import 'package:analysis_services/index/index_store.dart'; |
| 9 import 'package:analysis_services/src/index/index_contributor.dart'; | 9 import 'package:analysis_services/src/index/index_contributor.dart'; |
| 10 import 'package:analysis_testing/abstract_context.dart'; | |
| 11 import 'package:analysis_testing/reflective_tests.dart'; | 10 import 'package:analysis_testing/reflective_tests.dart'; |
| 12 import 'package:analyzer/src/generated/ast.dart'; | 11 import 'package:analyzer/src/generated/ast.dart'; |
| 13 import 'package:analyzer/src/generated/element.dart'; | 12 import 'package:analyzer/src/generated/element.dart'; |
| 14 import 'package:analyzer/src/generated/error.dart'; | |
| 15 import 'package:analyzer/src/generated/java_engine.dart'; | |
| 16 import 'package:analyzer/src/generated/source.dart'; | 13 import 'package:analyzer/src/generated/source.dart'; |
| 17 import 'package:typed_mock/typed_mock.dart'; | 14 import 'package:typed_mock/typed_mock.dart'; |
| 18 import 'package:unittest/unittest.dart'; | 15 import 'package:unittest/unittest.dart'; |
| 19 | 16 |
| 17 import 'abstract_single_unit.dart'; |
| 18 |
| 20 | 19 |
| 21 main() { | 20 main() { |
| 22 groupSep = ' | '; | 21 groupSep = ' | '; |
| 23 group('DartUnitContributor', () { | 22 group('DartUnitContributor', () { |
| 24 runReflectiveTests(DartUnitContributorTest); | 23 runReflectiveTests(DartUnitContributorTest); |
| 25 }); | 24 }); |
| 26 } | 25 } |
| 27 | 26 |
| 28 | 27 |
| 29 /** | 28 /** |
| 30 * Returns `true` if the [actual] location the same properties as [expected]. | 29 * Returns `true` if the [actual] location the same properties as [expected]. |
| 31 */ | 30 */ |
| 32 bool _equalsLocation(Location actual, ExpectedLocation expected) { | 31 bool _equalsLocation(Location actual, ExpectedLocation expected) { |
| 33 return _equalsLocationProperties(actual, expected.element, expected.offset, | 32 return _equalsLocationProperties( |
| 33 actual, |
| 34 expected.element, |
| 35 expected.offset, |
| 34 expected.length); | 36 expected.length); |
| 35 } | 37 } |
| 36 | 38 |
| 37 | 39 |
| 38 /** | 40 /** |
| 39 * Returns `true` if the [actual] location the expected properties. | 41 * Returns `true` if the [actual] location the expected properties. |
| 40 */ | 42 */ |
| 41 bool _equalsLocationProperties(Location actual, Element expectedElement, | 43 bool _equalsLocationProperties(Location actual, Element expectedElement, |
| 42 int expectedOffset, int expectedLength) { | 44 int expectedOffset, int expectedLength) { |
| 43 return expectedElement == actual.element && expectedOffset == actual.offset && | 45 return expectedElement == actual.element && |
| 46 expectedOffset == actual.offset && |
| 44 expectedLength == actual.length; | 47 expectedLength == actual.length; |
| 45 } | 48 } |
| 46 | 49 |
| 47 | 50 |
| 48 bool _equalsRecordedRelation(RecordedRelation recordedRelation, | 51 bool _equalsRecordedRelation(RecordedRelation recordedRelation, |
| 49 Element expectedElement, Relationship expectedRelationship, | 52 Element expectedElement, Relationship expectedRelationship, |
| 50 ExpectedLocation expectedLocation) { | 53 ExpectedLocation expectedLocation) { |
| 51 return expectedElement == recordedRelation.element && expectedRelationship == | 54 return expectedElement == recordedRelation.element && |
| 52 recordedRelation.relationship && (expectedLocation == null || _equalsLocat
ion( | 55 expectedRelationship == recordedRelation.relationship && |
| 53 recordedRelation.location, expectedLocation)); | 56 (expectedLocation == null || |
| 57 _equalsLocation(recordedRelation.location, expectedLocation)); |
| 54 } | 58 } |
| 55 | 59 |
| 56 | 60 |
| 57 int _getLeadingIdentifierLength(String search) { | |
| 58 int length = 0; | |
| 59 while (length < search.length) { | |
| 60 int c = search.codeUnitAt(length); | |
| 61 if (c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0)) { | |
| 62 length++; | |
| 63 continue; | |
| 64 } | |
| 65 if (c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0)) { | |
| 66 length++; | |
| 67 continue; | |
| 68 } | |
| 69 if (c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0)) { | |
| 70 length++; | |
| 71 continue; | |
| 72 } | |
| 73 break; | |
| 74 } | |
| 75 return length; | |
| 76 } | |
| 77 | |
| 78 @ReflectiveTestCase() | 61 @ReflectiveTestCase() |
| 79 class DartUnitContributorTest extends AbstractContextTest { | 62 class DartUnitContributorTest extends AbstractSingleUnitTest { |
| 80 IndexStore store = new MockIndexStore(); | 63 IndexStore store = new MockIndexStore(); |
| 81 List<RecordedRelation> recordedRelations = <RecordedRelation>[]; | 64 List<RecordedRelation> recordedRelations = <RecordedRelation>[]; |
| 82 | 65 |
| 83 bool verifyNoTestUnitErrors = true; | |
| 84 | |
| 85 String testCode; | |
| 86 Source testSource; | |
| 87 CompilationUnit testUnit; | |
| 88 CompilationUnitElement testUnitElement; | |
| 89 LibraryElement testLibraryElement; | |
| 90 | |
| 91 void setUp() { | 66 void setUp() { |
| 92 super.setUp(); | 67 super.setUp(); |
| 93 when(store.aboutToIndexDart(context, anyObject)).thenReturn(true); | 68 when(store.aboutToIndexDart(context, anyObject)).thenReturn(true); |
| 94 when(store.recordRelationship(anyObject, anyObject, anyObject)).thenInvoke( | 69 when( |
| 95 (Element element, Relationship relationship, Location location) { | 70 store.recordRelationship( |
| 96 recordedRelations.add(new RecordedRelation(element, relationship, | 71 anyObject, |
| 97 location)); | 72 anyObject, |
| 73 anyObject)).thenInvoke( |
| 74 (Element element, Relationship relationship, Location location)
{ |
| 75 recordedRelations.add( |
| 76 new RecordedRelation(element, relationship, location)); |
| 98 }); | 77 }); |
| 99 } | 78 } |
| 100 | 79 |
| 101 void test_FieldElement_noAssignedType_notLHS() { | 80 void test_FieldElement_noAssignedType_notLHS() { |
| 102 _indexTestUnit(''' | 81 _indexTestUnit(''' |
| 103 class A { | 82 class A { |
| 104 var myField; | 83 var myField; |
| 105 main() { | 84 main() { |
| 106 print(myField); | 85 print(myField); |
| 107 } | 86 } |
| 108 }'''); | 87 }'''); |
| 109 // prepare elements | 88 // prepare elements |
| 110 Element mainElement = _findElement("main"); | 89 Element mainElement = findElement("main"); |
| 111 FieldElement fieldElement = _findElement("myField"); | 90 FieldElement fieldElement = findElement("myField"); |
| 112 PropertyAccessorElement getterElement = fieldElement.getter; | 91 PropertyAccessorElement getterElement = fieldElement.getter; |
| 113 // verify | 92 // verify |
| 114 _assertRecordedRelation(getterElement, | 93 _assertRecordedRelation( |
| 115 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainEleme
nt, | 94 getterElement, |
| 116 'myField);')); | 95 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, |
| 96 _expectedLocation(mainElement, 'myField);')); |
| 117 } | 97 } |
| 118 | 98 |
| 119 void test_definesClass() { | 99 void test_definesClass() { |
| 120 _indexTestUnit('class A {}'); | 100 _indexTestUnit('class A {}'); |
| 121 // prepare elements | 101 // prepare elements |
| 122 ClassElement classElement = _findElement("A"); | 102 ClassElement classElement = findElement("A"); |
| 123 // verify | 103 // verify |
| 124 _assertDefinesTopLevelElement(IndexConstants.DEFINES_CLASS, | 104 _assertDefinesTopLevelElement( |
| 105 IndexConstants.DEFINES_CLASS, |
| 125 _expectedLocation(classElement, 'A {}')); | 106 _expectedLocation(classElement, 'A {}')); |
| 126 } | 107 } |
| 127 | 108 |
| 128 void test_definesClassAlias() { | 109 void test_definesClassAlias() { |
| 129 _indexTestUnit(''' | 110 _indexTestUnit(''' |
| 130 class Mix {} | 111 class Mix {} |
| 131 class MyClass = Object with Mix;'''); | 112 class MyClass = Object with Mix;'''); |
| 132 // prepare elements | 113 // prepare elements |
| 133 Element classElement = _findElement("MyClass"); | 114 Element classElement = findElement("MyClass"); |
| 134 // verify | 115 // verify |
| 135 _assertDefinesTopLevelElement(IndexConstants.DEFINES_CLASS_ALIAS, | 116 _assertDefinesTopLevelElement( |
| 117 IndexConstants.DEFINES_CLASS_ALIAS, |
| 136 _expectedLocation(classElement, 'MyClass =')); | 118 _expectedLocation(classElement, 'MyClass =')); |
| 137 } | 119 } |
| 138 | 120 |
| 139 void test_definesFunction() { | 121 void test_definesFunction() { |
| 140 _indexTestUnit('myFunction() {}'); | 122 _indexTestUnit('myFunction() {}'); |
| 141 // prepare elements | 123 // prepare elements |
| 142 FunctionElement functionElement = _findElement("myFunction"); | 124 FunctionElement functionElement = findElement("myFunction"); |
| 143 // verify | 125 // verify |
| 144 _assertDefinesTopLevelElement(IndexConstants.DEFINES_FUNCTION, | 126 _assertDefinesTopLevelElement( |
| 127 IndexConstants.DEFINES_FUNCTION, |
| 145 _expectedLocation(functionElement, 'myFunction() {}')); | 128 _expectedLocation(functionElement, 'myFunction() {}')); |
| 146 } | 129 } |
| 147 | 130 |
| 148 void test_definesFunctionType() { | 131 void test_definesFunctionType() { |
| 149 _indexTestUnit('typedef MyFunction(int p);'); | 132 _indexTestUnit('typedef MyFunction(int p);'); |
| 150 // prepare elements | 133 // prepare elements |
| 151 FunctionTypeAliasElement typeAliasElement = _findElement("MyFunction"); | 134 FunctionTypeAliasElement typeAliasElement = findElement("MyFunction"); |
| 152 // verify | 135 // verify |
| 153 _assertDefinesTopLevelElement(IndexConstants.DEFINES_FUNCTION_TYPE, | 136 _assertDefinesTopLevelElement( |
| 137 IndexConstants.DEFINES_FUNCTION_TYPE, |
| 154 _expectedLocation(typeAliasElement, 'MyFunction(int p);')); | 138 _expectedLocation(typeAliasElement, 'MyFunction(int p);')); |
| 155 } | 139 } |
| 156 | 140 |
| 157 | 141 |
| 158 void test_definesVariable() { | 142 void test_definesVariable() { |
| 159 _indexTestUnit('var myVar = 42;'); | 143 _indexTestUnit('var myVar = 42;'); |
| 160 // prepare elements | 144 // prepare elements |
| 161 VariableElement varElement = _findElement("myVar"); | 145 VariableElement varElement = findElement("myVar"); |
| 162 // verify | 146 // verify |
| 163 _assertDefinesTopLevelElement(IndexConstants.DEFINES_VARIABLE, | 147 _assertDefinesTopLevelElement( |
| 148 IndexConstants.DEFINES_VARIABLE, |
| 164 _expectedLocation(varElement, 'myVar = 42;')); | 149 _expectedLocation(varElement, 'myVar = 42;')); |
| 165 } | 150 } |
| 166 | 151 |
| 167 void test_forIn() { | 152 void test_forIn() { |
| 168 _indexTestUnit(''' | 153 _indexTestUnit(''' |
| 169 main() { | 154 main() { |
| 170 for (var v in []) { | 155 for (var v in []) { |
| 171 } | 156 } |
| 172 }'''); | 157 }'''); |
| 173 // prepare elements | 158 // prepare elements |
| 174 Element mainElement = _findElement("main"); | 159 Element mainElement = findElement("main"); |
| 175 VariableElement variableElement = _findElement("v"); | 160 VariableElement variableElement = findElement("v"); |
| 176 // verify | 161 // verify |
| 177 _assertNoRecordedRelation(variableElement, IndexConstants.IS_READ_BY, | 162 _assertNoRecordedRelation( |
| 163 variableElement, |
| 164 IndexConstants.IS_READ_BY, |
| 178 _expectedLocation(mainElement, 'v in []')); | 165 _expectedLocation(mainElement, 'v in []')); |
| 179 } | 166 } |
| 180 | 167 |
| 181 void test_isDefinedBy_ConstructorElement() { | 168 void test_isDefinedBy_ConstructorElement() { |
| 182 _indexTestUnit(''' | 169 _indexTestUnit(''' |
| 183 class A { | 170 class A { |
| 184 A() {} | 171 A() {} |
| 185 A.foo() {} | 172 A.foo() {} |
| 186 }'''); | 173 }'''); |
| 187 // prepare elements | 174 // prepare elements |
| 188 ClassElement classA = _findElement("A"); | 175 ClassElement classA = findElement("A"); |
| 189 ConstructorElement consA = _findNodeElementAtString("A()", (node) => node is | 176 ConstructorElement consA = |
| 190 ConstructorDeclaration); | 177 findNodeElementAtString("A()", (node) => node is ConstructorDeclaration)
; |
| 191 ConstructorElement consA_foo = _findNodeElementAtString("A.foo()", (node) => | 178 ConstructorElement consA_foo = |
| 192 node is ConstructorDeclaration); | 179 findNodeElementAtString("A.foo()", (node) => node is ConstructorDeclarat
ion); |
| 193 // verify | 180 // verify |
| 194 _assertRecordedRelation(consA, IndexConstants.IS_DEFINED_BY, | 181 _assertRecordedRelation( |
| 182 consA, |
| 183 IndexConstants.IS_DEFINED_BY, |
| 195 _expectedLocation(classA, '() {}')); | 184 _expectedLocation(classA, '() {}')); |
| 196 _assertRecordedRelation(consA_foo, IndexConstants.IS_DEFINED_BY, | 185 _assertRecordedRelation( |
| 186 consA_foo, |
| 187 IndexConstants.IS_DEFINED_BY, |
| 197 _expectedLocation(classA, '.foo() {}', '.foo'.length)); | 188 _expectedLocation(classA, '.foo() {}', '.foo'.length)); |
| 198 } | 189 } |
| 199 | 190 |
| 200 void test_isDefinedBy_NameElement_method() { | 191 void test_isDefinedBy_NameElement_method() { |
| 201 _indexTestUnit(''' | 192 _indexTestUnit(''' |
| 202 class A { | 193 class A { |
| 203 m() {} | 194 m() {} |
| 204 }'''); | 195 }'''); |
| 205 // prepare elements | 196 // prepare elements |
| 206 Element methodElement = _findElement("m"); | 197 Element methodElement = findElement("m"); |
| 207 Element nameElement = new NameElement("m"); | 198 Element nameElement = new NameElement("m"); |
| 208 // verify | 199 // verify |
| 209 _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY, | 200 _assertRecordedRelation( |
| 201 nameElement, |
| 202 IndexConstants.IS_DEFINED_BY, |
| 210 _expectedLocation(methodElement, 'm() {}')); | 203 _expectedLocation(methodElement, 'm() {}')); |
| 211 } | 204 } |
| 212 | 205 |
| 213 | 206 |
| 214 void test_isDefinedBy_NameElement_operator() { | 207 void test_isDefinedBy_NameElement_operator() { |
| 215 _indexTestUnit(''' | 208 _indexTestUnit(''' |
| 216 class A { | 209 class A { |
| 217 operator +(o) {} | 210 operator +(o) {} |
| 218 }'''); | 211 }'''); |
| 219 // prepare elements | 212 // prepare elements |
| 220 Element methodElement = _findElement("+"); | 213 Element methodElement = findElement("+"); |
| 221 Element nameElement = new NameElement("+"); | 214 Element nameElement = new NameElement("+"); |
| 222 // verify | 215 // verify |
| 223 _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY, | 216 _assertRecordedRelation( |
| 217 nameElement, |
| 218 IndexConstants.IS_DEFINED_BY, |
| 224 _expectedLocation(methodElement, '+(o) {}', 1)); | 219 _expectedLocation(methodElement, '+(o) {}', 1)); |
| 225 } | 220 } |
| 226 | 221 |
| 227 void test_isExtendedBy_ClassDeclaration() { | 222 void test_isExtendedBy_ClassDeclaration() { |
| 228 _indexTestUnit(''' | 223 _indexTestUnit(''' |
| 229 class A {} // 1 | 224 class A {} // 1 |
| 230 class B extends A {} // 2 | 225 class B extends A {} // 2 |
| 231 '''); | 226 '''); |
| 232 // prepare elements | 227 // prepare elements |
| 233 ClassElement classElementA = _findElement("A"); | 228 ClassElement classElementA = findElement("A"); |
| 234 ClassElement classElementB = _findElement("B"); | 229 ClassElement classElementB = findElement("B"); |
| 235 // verify | 230 // verify |
| 236 _assertRecordedRelation(classElementA, IndexConstants.IS_EXTENDED_BY, | 231 _assertRecordedRelation( |
| 232 classElementA, |
| 233 IndexConstants.IS_EXTENDED_BY, |
| 237 _expectedLocation(classElementB, 'A {} // 2')); | 234 _expectedLocation(classElementB, 'A {} // 2')); |
| 238 } | 235 } |
| 239 | 236 |
| 240 void test_isExtendedBy_ClassDeclaration_Object() { | 237 void test_isExtendedBy_ClassDeclaration_Object() { |
| 241 _indexTestUnit(''' | 238 _indexTestUnit(''' |
| 242 class A {} // 1 | 239 class A {} // 1 |
| 243 '''); | 240 '''); |
| 244 // prepare elements | 241 // prepare elements |
| 245 ClassElement classElementA = _findElement("A"); | 242 ClassElement classElementA = findElement("A"); |
| 246 ClassElement classElementObject = classElementA.supertype.element; | 243 ClassElement classElementObject = classElementA.supertype.element; |
| 247 // verify | 244 // verify |
| 248 _assertRecordedRelation(classElementObject, IndexConstants.IS_EXTENDED_BY, | 245 _assertRecordedRelation( |
| 246 classElementObject, |
| 247 IndexConstants.IS_EXTENDED_BY, |
| 249 _expectedLocation(classElementA, 'A {}', 0)); | 248 _expectedLocation(classElementA, 'A {}', 0)); |
| 250 } | 249 } |
| 251 | 250 |
| 252 void test_isExtendedBy_ClassTypeAlias() { | 251 void test_isExtendedBy_ClassTypeAlias() { |
| 253 _indexTestUnit(''' | 252 _indexTestUnit(''' |
| 254 class A {} // 1 | 253 class A {} // 1 |
| 255 class B {} // 2 | 254 class B {} // 2 |
| 256 class C = A with B; // 3 | 255 class C = A with B; // 3 |
| 257 '''); | 256 '''); |
| 258 // prepare elements | 257 // prepare elements |
| 259 ClassElement classElementA = _findElement("A"); | 258 ClassElement classElementA = findElement("A"); |
| 260 ClassElement classElementC = _findElement("C"); | 259 ClassElement classElementC = findElement("C"); |
| 261 // verify | 260 // verify |
| 262 _assertRecordedRelation(classElementA, IndexConstants.IS_EXTENDED_BY, | 261 _assertRecordedRelation( |
| 262 classElementA, |
| 263 IndexConstants.IS_EXTENDED_BY, |
| 263 _expectedLocation(classElementC, 'A with')); | 264 _expectedLocation(classElementC, 'A with')); |
| 264 } | 265 } |
| 265 | 266 |
| 266 void test_isImplementedBy_ClassDeclaration() { | 267 void test_isImplementedBy_ClassDeclaration() { |
| 267 _indexTestUnit(''' | 268 _indexTestUnit(''' |
| 268 class A {} // 1 | 269 class A {} // 1 |
| 269 class B implements A {} // 2 | 270 class B implements A {} // 2 |
| 270 '''); | 271 '''); |
| 271 // prepare elements | 272 // prepare elements |
| 272 ClassElement classElementA = _findElement("A"); | 273 ClassElement classElementA = findElement("A"); |
| 273 ClassElement classElementB = _findElement("B"); | 274 ClassElement classElementB = findElement("B"); |
| 274 // verify | 275 // verify |
| 275 _assertRecordedRelation(classElementA, IndexConstants.IS_IMPLEMENTED_BY, | 276 _assertRecordedRelation( |
| 277 classElementA, |
| 278 IndexConstants.IS_IMPLEMENTED_BY, |
| 276 _expectedLocation(classElementB, 'A {} // 2')); | 279 _expectedLocation(classElementB, 'A {} // 2')); |
| 277 } | 280 } |
| 278 | 281 |
| 279 void test_isImplementedBy_ClassTypeAlias() { | 282 void test_isImplementedBy_ClassTypeAlias() { |
| 280 _indexTestUnit(''' | 283 _indexTestUnit(''' |
| 281 class A {} // 1 | 284 class A {} // 1 |
| 282 class B {} // 2 | 285 class B {} // 2 |
| 283 class C = Object with A implements B; // 3 | 286 class C = Object with A implements B; // 3 |
| 284 '''); | 287 '''); |
| 285 // prepare elements | 288 // prepare elements |
| 286 ClassElement classElementB = _findElement("B"); | 289 ClassElement classElementB = findElement("B"); |
| 287 ClassElement classElementC = _findElement("C"); | 290 ClassElement classElementC = findElement("C"); |
| 288 // verify | 291 // verify |
| 289 _assertRecordedRelation(classElementB, IndexConstants.IS_IMPLEMENTED_BY, | 292 _assertRecordedRelation( |
| 293 classElementB, |
| 294 IndexConstants.IS_IMPLEMENTED_BY, |
| 290 _expectedLocation(classElementC, 'B; // 3')); | 295 _expectedLocation(classElementC, 'B; // 3')); |
| 291 } | 296 } |
| 292 | 297 |
| 293 | 298 |
| 294 void test_isInvokedByQualified_FieldElement() { | 299 void test_isInvokedByQualified_FieldElement() { |
| 295 _indexTestUnit(''' | 300 _indexTestUnit(''' |
| 296 class A { | 301 class A { |
| 297 var field; | 302 var field; |
| 298 main() { | 303 main() { |
| 299 this.field(); | 304 this.field(); |
| 300 } | 305 } |
| 301 }'''); | 306 }'''); |
| 302 // prepare elements | 307 // prepare elements |
| 303 Element mainElement = _findElement("main"); | 308 Element mainElement = findElement("main"); |
| 304 FieldElement fieldElement = _findElement("field"); | 309 FieldElement fieldElement = findElement("field"); |
| 305 PropertyAccessorElement getterElement = fieldElement.getter; | 310 PropertyAccessorElement getterElement = fieldElement.getter; |
| 306 // verify | 311 // verify |
| 307 _assertRecordedRelation(getterElement, | 312 _assertRecordedRelation( |
| 308 IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement, | 313 getterElement, |
| 309 'field();')); | 314 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 315 _expectedLocation(mainElement, 'field();')); |
| 310 } | 316 } |
| 311 | 317 |
| 312 | 318 |
| 313 void test_isInvokedByQualified_MethodElement() { | 319 void test_isInvokedByQualified_MethodElement() { |
| 314 _indexTestUnit(''' | 320 _indexTestUnit(''' |
| 315 class A { | 321 class A { |
| 316 foo() {} | 322 foo() {} |
| 317 main() { | 323 main() { |
| 318 this.foo(); | 324 this.foo(); |
| 319 } | 325 } |
| 320 }'''); | 326 }'''); |
| 321 // prepare elements | 327 // prepare elements |
| 322 Element mainElement = _findElement("main"); | 328 Element mainElement = findElement("main"); |
| 323 Element methodElement = _findElement("foo"); | 329 Element methodElement = findElement("foo"); |
| 324 // verify | 330 // verify |
| 325 var location = _expectedLocation(mainElement, 'foo();'); | 331 var location = _expectedLocation(mainElement, 'foo();'); |
| 326 _assertRecordedRelation(methodElement, | 332 _assertRecordedRelation( |
| 327 IndexConstants.IS_INVOKED_BY_QUALIFIED, location); | 333 methodElement, |
| 328 _assertNoRecordedRelation(methodElement, | 334 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 329 IndexConstants.IS_REFERENCED_BY_QUALIFIED, location); | 335 location); |
| 336 _assertNoRecordedRelation( |
| 337 methodElement, |
| 338 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 339 location); |
| 330 } | 340 } |
| 331 | 341 |
| 332 void test_isInvokedByQualified_MethodElement_propagatedType() { | 342 void test_isInvokedByQualified_MethodElement_propagatedType() { |
| 333 _indexTestUnit(''' | 343 _indexTestUnit(''' |
| 334 class A { | 344 class A { |
| 335 foo() {} | 345 foo() {} |
| 336 } | 346 } |
| 337 main() { | 347 main() { |
| 338 var a = new A(); | 348 var a = new A(); |
| 339 a.foo(); | 349 a.foo(); |
| 340 } | 350 } |
| 341 '''); | 351 '''); |
| 342 // prepare elements | 352 // prepare elements |
| 343 Element mainElement = _findElement("main"); | 353 Element mainElement = findElement("main"); |
| 344 Element methodElement = _findElement("foo"); | 354 Element methodElement = findElement("foo"); |
| 345 // verify | 355 // verify |
| 346 _assertRecordedRelation(methodElement, | 356 _assertRecordedRelation( |
| 347 IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement, | 357 methodElement, |
| 348 'foo();')); | 358 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 359 _expectedLocation(mainElement, 'foo();')); |
| 349 } | 360 } |
| 350 | 361 |
| 351 void test_isInvokedByUnqualified_MethodElement() { | 362 void test_isInvokedByUnqualified_MethodElement() { |
| 352 _indexTestUnit(''' | 363 _indexTestUnit(''' |
| 353 class A { | 364 class A { |
| 354 foo() {} | 365 foo() {} |
| 355 main() { | 366 main() { |
| 356 foo(); | 367 foo(); |
| 357 } | 368 } |
| 358 }'''); | 369 }'''); |
| 359 // prepare elements | 370 // prepare elements |
| 360 Element mainElement = _findElement("main"); | 371 Element mainElement = findElement("main"); |
| 361 Element methodElement = _findElement("foo"); | 372 Element methodElement = findElement("foo"); |
| 362 // verify | 373 // verify |
| 363 _assertRecordedRelation(methodElement, | 374 _assertRecordedRelation( |
| 364 IndexConstants.IS_INVOKED_BY_UNQUALIFIED, _expectedLocation(mainElement, | 375 methodElement, |
| 365 'foo();')); | 376 IndexConstants.IS_INVOKED_BY_UNQUALIFIED, |
| 377 _expectedLocation(mainElement, 'foo();')); |
| 366 } | 378 } |
| 367 | 379 |
| 368 void test_isInvokedBy_FunctionElement() { | 380 void test_isInvokedBy_FunctionElement() { |
| 369 _indexTestUnit(''' | 381 _indexTestUnit(''' |
| 370 foo() {} | 382 foo() {} |
| 371 main() { | 383 main() { |
| 372 foo(); | 384 foo(); |
| 373 }'''); | 385 }'''); |
| 374 // prepare elements | 386 // prepare elements |
| 375 Element mainElement = _findElement("main"); | 387 Element mainElement = findElement("main"); |
| 376 FunctionElement functionElement = _findElement("foo"); | 388 FunctionElement functionElement = findElement("foo"); |
| 377 // verify | 389 // verify |
| 378 _assertRecordedRelation(functionElement, IndexConstants.IS_INVOKED_BY, | 390 _assertRecordedRelation( |
| 391 functionElement, |
| 392 IndexConstants.IS_INVOKED_BY, |
| 379 _expectedLocation(mainElement, 'foo();')); | 393 _expectedLocation(mainElement, 'foo();')); |
| 380 } | 394 } |
| 381 | 395 |
| 382 void test_isInvokedBy_LocalVariableElement() { | 396 void test_isInvokedBy_LocalVariableElement() { |
| 383 _indexTestUnit(''' | 397 _indexTestUnit(''' |
| 384 main() { | 398 main() { |
| 385 var v; | 399 var v; |
| 386 v(); | 400 v(); |
| 387 }'''); | 401 }'''); |
| 388 // prepare elements | 402 // prepare elements |
| 389 Element mainElement = _findElement("main"); | 403 Element mainElement = findElement("main"); |
| 390 Element element = _findElement("v"); | 404 Element element = findElement("v"); |
| 391 // verify | 405 // verify |
| 392 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY, | 406 _assertRecordedRelation( |
| 407 element, |
| 408 IndexConstants.IS_INVOKED_BY, |
| 393 _expectedLocation(mainElement, 'v();')); | 409 _expectedLocation(mainElement, 'v();')); |
| 394 } | 410 } |
| 395 | 411 |
| 396 void test_isInvokedBy_ParameterElement() { | 412 void test_isInvokedBy_ParameterElement() { |
| 397 _indexTestUnit(''' | 413 _indexTestUnit(''' |
| 398 main(p()) { | 414 main(p()) { |
| 399 p(); | 415 p(); |
| 400 }'''); | 416 }'''); |
| 401 // prepare elements | 417 // prepare elements |
| 402 Element mainElement = _findElement("main"); | 418 Element mainElement = findElement("main"); |
| 403 Element element = _findElement("p"); | 419 Element element = findElement("p"); |
| 404 // verify | 420 // verify |
| 405 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY, | 421 _assertRecordedRelation( |
| 422 element, |
| 423 IndexConstants.IS_INVOKED_BY, |
| 406 _expectedLocation(mainElement, 'p();')); | 424 _expectedLocation(mainElement, 'p();')); |
| 407 } | 425 } |
| 408 | 426 |
| 409 void test_isMixedInBy_ClassDeclaration() { | 427 void test_isMixedInBy_ClassDeclaration() { |
| 410 _indexTestUnit(''' | 428 _indexTestUnit(''' |
| 411 class A {} // 1 | 429 class A {} // 1 |
| 412 class B extends Object with A {} // 2 | 430 class B extends Object with A {} // 2 |
| 413 '''); | 431 '''); |
| 414 // prepare elements | 432 // prepare elements |
| 415 ClassElement classElementA = _findElement("A"); | 433 ClassElement classElementA = findElement("A"); |
| 416 ClassElement classElementB = _findElement("B"); | 434 ClassElement classElementB = findElement("B"); |
| 417 // verify | 435 // verify |
| 418 _assertRecordedRelation(classElementA, IndexConstants.IS_MIXED_IN_BY, | 436 _assertRecordedRelation( |
| 437 classElementA, |
| 438 IndexConstants.IS_MIXED_IN_BY, |
| 419 _expectedLocation(classElementB, 'A {} // 2')); | 439 _expectedLocation(classElementB, 'A {} // 2')); |
| 420 } | 440 } |
| 421 | 441 |
| 422 void test_isMixedInBy_ClassTypeAlias() { | 442 void test_isMixedInBy_ClassTypeAlias() { |
| 423 _indexTestUnit(''' | 443 _indexTestUnit(''' |
| 424 class A {} // 1 | 444 class A {} // 1 |
| 425 class B = Object with A; // 2 | 445 class B = Object with A; // 2 |
| 426 '''); | 446 '''); |
| 427 // prepare elements | 447 // prepare elements |
| 428 ClassElement classElementA = _findElement("A"); | 448 ClassElement classElementA = findElement("A"); |
| 429 ClassElement classElementB = _findElement("B"); | 449 ClassElement classElementB = findElement("B"); |
| 430 // verify | 450 // verify |
| 431 _assertRecordedRelation(classElementA, IndexConstants.IS_MIXED_IN_BY, | 451 _assertRecordedRelation( |
| 452 classElementA, |
| 453 IndexConstants.IS_MIXED_IN_BY, |
| 432 _expectedLocation(classElementB, 'A; // 2')); | 454 _expectedLocation(classElementB, 'A; // 2')); |
| 433 } | 455 } |
| 434 | 456 |
| 435 void test_isReadBy_ParameterElement() { | 457 void test_isReadBy_ParameterElement() { |
| 436 _indexTestUnit(''' | 458 _indexTestUnit(''' |
| 437 main(var p) { | 459 main(var p) { |
| 438 print(p); | 460 print(p); |
| 439 } | 461 } |
| 440 '''); | 462 '''); |
| 441 // prepare elements | 463 // prepare elements |
| 442 Element mainElement = _findElement("main"); | 464 Element mainElement = findElement("main"); |
| 443 Element parameterElement = _findElement("p"); | 465 Element parameterElement = findElement("p"); |
| 444 // verify | 466 // verify |
| 445 _assertRecordedRelation(parameterElement, IndexConstants.IS_READ_BY, | 467 _assertRecordedRelation( |
| 468 parameterElement, |
| 469 IndexConstants.IS_READ_BY, |
| 446 _expectedLocation(mainElement, 'p);')); | 470 _expectedLocation(mainElement, 'p);')); |
| 447 } | 471 } |
| 448 | 472 |
| 449 void test_isReadBy_VariableElement() { | 473 void test_isReadBy_VariableElement() { |
| 450 _indexTestUnit(''' | 474 _indexTestUnit(''' |
| 451 main() { | 475 main() { |
| 452 var v = 0; | 476 var v = 0; |
| 453 print(v); | 477 print(v); |
| 454 } | 478 } |
| 455 '''); | 479 '''); |
| 456 // prepare elements | 480 // prepare elements |
| 457 Element mainElement = _findElement("main"); | 481 Element mainElement = findElement("main"); |
| 458 Element variableElement = _findElement("v"); | 482 Element variableElement = findElement("v"); |
| 459 // verify | 483 // verify |
| 460 _assertRecordedRelation(variableElement, IndexConstants.IS_READ_BY, | 484 _assertRecordedRelation( |
| 485 variableElement, |
| 486 IndexConstants.IS_READ_BY, |
| 461 _expectedLocation(mainElement, 'v);')); | 487 _expectedLocation(mainElement, 'v);')); |
| 462 } | 488 } |
| 463 | 489 |
| 464 void test_isReadWrittenBy_ParameterElement() { | 490 void test_isReadWrittenBy_ParameterElement() { |
| 465 _indexTestUnit(''' | 491 _indexTestUnit(''' |
| 466 main(int p) { | 492 main(int p) { |
| 467 p += 1; | 493 p += 1; |
| 468 } | 494 } |
| 469 '''); | 495 '''); |
| 470 // prepare elements | 496 // prepare elements |
| 471 Element mainElement = _findElement("main"); | 497 Element mainElement = findElement("main"); |
| 472 Element parameterElement = _findElement("p"); | 498 Element parameterElement = findElement("p"); |
| 473 // verify | 499 // verify |
| 474 _assertRecordedRelation(parameterElement, IndexConstants.IS_READ_WRITTEN_BY, | 500 _assertRecordedRelation( |
| 501 parameterElement, |
| 502 IndexConstants.IS_READ_WRITTEN_BY, |
| 475 _expectedLocation(mainElement, 'p += 1')); | 503 _expectedLocation(mainElement, 'p += 1')); |
| 476 } | 504 } |
| 477 | 505 |
| 478 void test_isReadWrittenBy_VariableElement() { | 506 void test_isReadWrittenBy_VariableElement() { |
| 479 _indexTestUnit(''' | 507 _indexTestUnit(''' |
| 480 main() { | 508 main() { |
| 481 var v = 0; | 509 var v = 0; |
| 482 v += 1; | 510 v += 1; |
| 483 } | 511 } |
| 484 '''); | 512 '''); |
| 485 // prepare elements | 513 // prepare elements |
| 486 Element mainElement = _findElement("main"); | 514 Element mainElement = findElement("main"); |
| 487 Element variableElement = _findElement("v"); | 515 Element variableElement = findElement("v"); |
| 488 // verify | 516 // verify |
| 489 _assertRecordedRelation(variableElement, IndexConstants.IS_READ_WRITTEN_BY, | 517 _assertRecordedRelation( |
| 518 variableElement, |
| 519 IndexConstants.IS_READ_WRITTEN_BY, |
| 490 _expectedLocation(mainElement, 'v += 1')); | 520 _expectedLocation(mainElement, 'v += 1')); |
| 491 } | 521 } |
| 492 | 522 |
| 493 void test_isReferencedByQualifiedResolved_NameElement_field() { | 523 void test_isReferencedByQualifiedResolved_NameElement_field() { |
| 494 _indexTestUnit(''' | 524 _indexTestUnit(''' |
| 495 class A { | 525 class A { |
| 496 int field; | 526 int field; |
| 497 } | 527 } |
| 498 main(A a) { | 528 main(A a) { |
| 499 print(a.field); | 529 print(a.field); |
| 500 } | 530 } |
| 501 '''); | 531 '''); |
| 502 // prepare elements | 532 // prepare elements |
| 503 Element mainElement = _findElement('main'); | 533 Element mainElement = findElement('main'); |
| 504 Element nameElement = new NameElement('field'); | 534 Element nameElement = new NameElement('field'); |
| 505 // verify | 535 // verify |
| 506 _assertRecordedRelation(nameElement, | 536 _assertRecordedRelation( |
| 507 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 537 nameElement, |
| 508 mainElement, 'field);')); | 538 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 539 _expectedLocation(mainElement, 'field);')); |
| 509 } | 540 } |
| 510 | 541 |
| 511 void test_isReferencedByQualifiedResolved_NameElement_method() { | 542 void test_isReferencedByQualifiedResolved_NameElement_method() { |
| 512 _indexTestUnit(''' | 543 _indexTestUnit(''' |
| 513 class A { | 544 class A { |
| 514 method() {} | 545 method() {} |
| 515 } | 546 } |
| 516 main(A a) { | 547 main(A a) { |
| 517 a.method(); | 548 a.method(); |
| 518 } | 549 } |
| 519 '''); | 550 '''); |
| 520 // prepare elements | 551 // prepare elements |
| 521 Element mainElement = _findElement('main'); | 552 Element mainElement = findElement('main'); |
| 522 Element nameElement = new NameElement('method'); | 553 Element nameElement = new NameElement('method'); |
| 523 // verify | 554 // verify |
| 524 _assertRecordedRelation(nameElement, | 555 _assertRecordedRelation( |
| 525 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 556 nameElement, |
| 526 mainElement, 'method();')); | 557 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 558 _expectedLocation(mainElement, 'method();')); |
| 527 } | 559 } |
| 528 | 560 |
| 529 void test_isReferencedByQualifiedResolved_NameElement_operator() { | 561 void test_isReferencedByQualifiedResolved_NameElement_operator() { |
| 530 _indexTestUnit(''' | 562 _indexTestUnit(''' |
| 531 class A { | 563 class A { |
| 532 operator +(o) {} | 564 operator +(o) {} |
| 533 operator -(o) {} | 565 operator -(o) {} |
| 534 operator ~() {} | 566 operator ~() {} |
| 535 operator ==(o) {} | 567 operator ==(o) {} |
| 536 } | 568 } |
| 537 main(A a) { | 569 main(A a) { |
| 538 a + 5; | 570 a + 5; |
| 539 a += 5; | 571 a += 5; |
| 540 a == 5; | 572 a == 5; |
| 541 ++a; | 573 ++a; |
| 542 --a; | 574 --a; |
| 543 ~a; | 575 ~a; |
| 544 a++; | 576 a++; |
| 545 a--; | 577 a--; |
| 546 } | 578 } |
| 547 '''); | 579 '''); |
| 548 // prepare elements | 580 // prepare elements |
| 549 Element mainElement = _findElement('main'); | 581 Element mainElement = findElement('main'); |
| 550 // binary | 582 // binary |
| 551 _assertRecordedRelation(new NameElement('+'), | 583 _assertRecordedRelation( |
| 552 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 584 new NameElement('+'), |
| 553 mainElement, '+ 5', '+'.length)); | 585 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 554 _assertRecordedRelation(new NameElement('+'), | 586 _expectedLocation(mainElement, '+ 5', '+'.length)); |
| 555 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 587 _assertRecordedRelation( |
| 556 mainElement, '+= 5', '+='.length)); | 588 new NameElement('+'), |
| 557 _assertRecordedRelation(new NameElement('=='), | 589 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 558 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 590 _expectedLocation(mainElement, '+= 5', '+='.length)); |
| 559 mainElement, '== 5', '=='.length)); | 591 _assertRecordedRelation( |
| 592 new NameElement('=='), |
| 593 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 594 _expectedLocation(mainElement, '== 5', '=='.length)); |
| 560 // prefix | 595 // prefix |
| 561 _assertRecordedRelation(new NameElement('+'), | 596 _assertRecordedRelation( |
| 562 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 597 new NameElement('+'), |
| 563 mainElement, '++a', '++'.length)); | 598 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 564 _assertRecordedRelation(new NameElement('-'), | 599 _expectedLocation(mainElement, '++a', '++'.length)); |
| 565 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 600 _assertRecordedRelation( |
| 566 mainElement, '--a', '--'.length)); | 601 new NameElement('-'), |
| 567 _assertRecordedRelation(new NameElement('~'), | 602 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 568 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 603 _expectedLocation(mainElement, '--a', '--'.length)); |
| 569 mainElement, '~a', '~'.length)); | 604 _assertRecordedRelation( |
| 605 new NameElement('~'), |
| 606 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 607 _expectedLocation(mainElement, '~a', '~'.length)); |
| 570 // postfix | 608 // postfix |
| 571 _assertRecordedRelation(new NameElement('+'), | 609 _assertRecordedRelation( |
| 572 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 610 new NameElement('+'), |
| 573 mainElement, '++;', '++'.length)); | 611 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 574 _assertRecordedRelation(new NameElement('-'), | 612 _expectedLocation(mainElement, '++;', '++'.length)); |
| 575 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, _expectedLocation( | 613 _assertRecordedRelation( |
| 576 mainElement, '--;', '--'.length)); | 614 new NameElement('-'), |
| 615 IndexConstants.IS_REFERENCED_BY_QUALIFIED_RESOLVED, |
| 616 _expectedLocation(mainElement, '--;', '--'.length)); |
| 577 } | 617 } |
| 578 | 618 |
| 579 void test_isReferencedByQualifiedUnresolved_NameElement_field() { | 619 void test_isReferencedByQualifiedUnresolved_NameElement_field() { |
| 580 _indexTestUnit(''' | 620 _indexTestUnit(''' |
| 581 class A { | 621 class A { |
| 582 int field; | 622 int field; |
| 583 } | 623 } |
| 584 main(var a) { | 624 main(var a) { |
| 585 print(a.field); | 625 print(a.field); |
| 586 } | 626 } |
| 587 '''); | 627 '''); |
| 588 // prepare elements | 628 // prepare elements |
| 589 Element mainElement = _findElement('main'); | 629 Element mainElement = findElement('main'); |
| 590 FieldElement fieldElement = _findElement('field'); | 630 FieldElement fieldElement = findElement('field'); |
| 591 Element nameElement = new NameElement('field'); | 631 Element nameElement = new NameElement('field'); |
| 592 // verify | 632 // verify |
| 593 _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY, | 633 _assertRecordedRelation( |
| 634 nameElement, |
| 635 IndexConstants.IS_DEFINED_BY, |
| 594 _expectedLocation(fieldElement, 'field;')); | 636 _expectedLocation(fieldElement, 'field;')); |
| 595 _assertRecordedRelation(nameElement, | 637 _assertRecordedRelation( |
| 596 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 638 nameElement, |
| 597 mainElement, 'field);')); | 639 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 640 _expectedLocation(mainElement, 'field);')); |
| 598 } | 641 } |
| 599 | 642 |
| 600 void test_isReferencedByQualifiedUnresolved_NameElement_method() { | 643 void test_isReferencedByQualifiedUnresolved_NameElement_method() { |
| 601 _indexTestUnit(''' | 644 _indexTestUnit(''' |
| 602 class A { | 645 class A { |
| 603 method() {} | 646 method() {} |
| 604 } | 647 } |
| 605 main(var a) { | 648 main(var a) { |
| 606 a.method(); | 649 a.method(); |
| 607 } | 650 } |
| 608 '''); | 651 '''); |
| 609 // prepare elements | 652 // prepare elements |
| 610 Element mainElement = _findElement('main'); | 653 Element mainElement = findElement('main'); |
| 611 MethodElement methodElement = _findElement('method'); | 654 MethodElement methodElement = findElement('method'); |
| 612 Element nameElement = new NameElement('method'); | 655 Element nameElement = new NameElement('method'); |
| 613 // verify | 656 // verify |
| 614 _assertRecordedRelation(nameElement, IndexConstants.IS_DEFINED_BY, | 657 _assertRecordedRelation( |
| 658 nameElement, |
| 659 IndexConstants.IS_DEFINED_BY, |
| 615 _expectedLocation(methodElement, 'method() {}')); | 660 _expectedLocation(methodElement, 'method() {}')); |
| 616 _assertRecordedRelation(nameElement, | 661 _assertRecordedRelation( |
| 617 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 662 nameElement, |
| 618 mainElement, 'method();')); | 663 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 664 _expectedLocation(mainElement, 'method();')); |
| 619 } | 665 } |
| 620 | 666 |
| 621 void test_isReferencedByQualifiedUnresolved_NameElement_operator() { | 667 void test_isReferencedByQualifiedUnresolved_NameElement_operator() { |
| 622 _indexTestUnit(''' | 668 _indexTestUnit(''' |
| 623 class A { | 669 class A { |
| 624 operator +(o) {} | 670 operator +(o) {} |
| 625 operator -(o) {} | 671 operator -(o) {} |
| 626 operator ~() {} | 672 operator ~() {} |
| 627 operator ==(o) {} | 673 operator ==(o) {} |
| 628 } | 674 } |
| 629 main(a) { | 675 main(a) { |
| 630 a + 5; | 676 a + 5; |
| 631 a += 5; | 677 a += 5; |
| 632 a == 5; | 678 a == 5; |
| 633 ++a; | 679 ++a; |
| 634 --a; | 680 --a; |
| 635 ~a; | 681 ~a; |
| 636 a++; | 682 a++; |
| 637 a--; | 683 a--; |
| 638 } | 684 } |
| 639 '''); | 685 '''); |
| 640 // prepare elements | 686 // prepare elements |
| 641 Element mainElement = _findElement('main'); | 687 Element mainElement = findElement('main'); |
| 642 // binary | 688 // binary |
| 643 _assertRecordedRelation(new NameElement('+'), | 689 _assertRecordedRelation( |
| 644 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 690 new NameElement('+'), |
| 645 mainElement, '+ 5', '+'.length)); | 691 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 646 _assertRecordedRelation(new NameElement('+'), | 692 _expectedLocation(mainElement, '+ 5', '+'.length)); |
| 647 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 693 _assertRecordedRelation( |
| 648 mainElement, '+= 5', '+='.length)); | 694 new NameElement('+'), |
| 649 _assertRecordedRelation(new NameElement('=='), | 695 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 650 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 696 _expectedLocation(mainElement, '+= 5', '+='.length)); |
| 651 mainElement, '== 5', '=='.length)); | 697 _assertRecordedRelation( |
| 698 new NameElement('=='), |
| 699 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 700 _expectedLocation(mainElement, '== 5', '=='.length)); |
| 652 // prefix | 701 // prefix |
| 653 _assertRecordedRelation(new NameElement('+'), | 702 _assertRecordedRelation( |
| 654 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 703 new NameElement('+'), |
| 655 mainElement, '++a', '++'.length)); | 704 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 656 _assertRecordedRelation(new NameElement('-'), | 705 _expectedLocation(mainElement, '++a', '++'.length)); |
| 657 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 706 _assertRecordedRelation( |
| 658 mainElement, '--a', '--'.length)); | 707 new NameElement('-'), |
| 659 _assertRecordedRelation(new NameElement('~'), | 708 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 660 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 709 _expectedLocation(mainElement, '--a', '--'.length)); |
| 661 mainElement, '~a', '~'.length)); | 710 _assertRecordedRelation( |
| 711 new NameElement('~'), |
| 712 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 713 _expectedLocation(mainElement, '~a', '~'.length)); |
| 662 // postfix | 714 // postfix |
| 663 _assertRecordedRelation(new NameElement('+'), | 715 _assertRecordedRelation( |
| 664 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 716 new NameElement('+'), |
| 665 mainElement, '++;', '++'.length)); | 717 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 666 _assertRecordedRelation(new NameElement('-'), | 718 _expectedLocation(mainElement, '++;', '++'.length)); |
| 667 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, _expectedLocation( | 719 _assertRecordedRelation( |
| 668 mainElement, '--;', '--'.length)); | 720 new NameElement('-'), |
| 721 IndexConstants.IS_REFERENCED_BY_QUALIFIED_UNRESOLVED, |
| 722 _expectedLocation(mainElement, '--;', '--'.length)); |
| 669 } | 723 } |
| 670 | 724 |
| 671 void test_isReferencedByQualified_ConstructorElement() { | 725 void test_isReferencedByQualified_ConstructorElement() { |
| 672 _indexTestUnit(''' | 726 _indexTestUnit(''' |
| 673 class A implements B { | 727 class A implements B { |
| 674 A() {} | 728 A() {} |
| 675 A.foo() {} | 729 A.foo() {} |
| 676 } | 730 } |
| 677 class B extends A { | 731 class B extends A { |
| 678 B() : super(); // marker-1 | 732 B() : super(); // marker-1 |
| 679 B.foo() : super.foo(); // marker-2 | 733 B.foo() : super.foo(); // marker-2 |
| 680 factory B.bar() = A.foo; // marker-3 | 734 factory B.bar() = A.foo; // marker-3 |
| 681 } | 735 } |
| 682 main() { | 736 main() { |
| 683 new A(); // marker-main-1 | 737 new A(); // marker-main-1 |
| 684 new A.foo(); // marker-main-2 | 738 new A.foo(); // marker-main-2 |
| 685 } | 739 } |
| 686 '''); | 740 '''); |
| 687 // prepare elements | 741 // prepare elements |
| 688 Element mainElement = _findElement('main'); | 742 Element mainElement = findElement('main'); |
| 689 var isConstructor = (node) => node is ConstructorDeclaration; | 743 var isConstructor = (node) => node is ConstructorDeclaration; |
| 690 ConstructorElement consA = _findNodeElementAtString("A()", isConstructor); | 744 ConstructorElement consA = findNodeElementAtString("A()", isConstructor); |
| 691 ConstructorElement consA_foo = _findNodeElementAtString("A.foo()", | 745 ConstructorElement consA_foo = |
| 692 isConstructor); | 746 findNodeElementAtString("A.foo()", isConstructor); |
| 693 ConstructorElement consB = _findNodeElementAtString("B()", isConstructor); | 747 ConstructorElement consB = findNodeElementAtString("B()", isConstructor); |
| 694 ConstructorElement consB_foo = _findNodeElementAtString("B.foo()", | 748 ConstructorElement consB_foo = |
| 695 isConstructor); | 749 findNodeElementAtString("B.foo()", isConstructor); |
| 696 ConstructorElement consB_bar = _findNodeElementAtString("B.bar()", | 750 ConstructorElement consB_bar = |
| 697 isConstructor); | 751 findNodeElementAtString("B.bar()", isConstructor); |
| 698 // A() | 752 // A() |
| 699 _assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY, | 753 _assertRecordedRelation( |
| 754 consA, |
| 755 IndexConstants.IS_REFERENCED_BY, |
| 700 _expectedLocation(consB, '(); // marker-1', 0)); | 756 _expectedLocation(consB, '(); // marker-1', 0)); |
| 701 _assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY, | 757 _assertRecordedRelation( |
| 758 consA, |
| 759 IndexConstants.IS_REFERENCED_BY, |
| 702 _expectedLocation(mainElement, '(); // marker-main-1', 0)); | 760 _expectedLocation(mainElement, '(); // marker-main-1', 0)); |
| 703 // A.foo() | 761 // A.foo() |
| 704 _assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY, | 762 _assertRecordedRelation( |
| 763 consA_foo, |
| 764 IndexConstants.IS_REFERENCED_BY, |
| 705 _expectedLocation(consB_foo, '.foo(); // marker-2', '.foo'.length)); | 765 _expectedLocation(consB_foo, '.foo(); // marker-2', '.foo'.length)); |
| 706 _assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY, | 766 _assertRecordedRelation( |
| 767 consA_foo, |
| 768 IndexConstants.IS_REFERENCED_BY, |
| 707 _expectedLocation(consB_bar, '.foo; // marker-3', '.foo'.length)); | 769 _expectedLocation(consB_bar, '.foo; // marker-3', '.foo'.length)); |
| 708 _assertRecordedRelation(consA_foo, IndexConstants.IS_REFERENCED_BY, | 770 _assertRecordedRelation( |
| 771 consA_foo, |
| 772 IndexConstants.IS_REFERENCED_BY, |
| 709 _expectedLocation(mainElement, '.foo(); // marker-main-2', '.foo'.length
)); | 773 _expectedLocation(mainElement, '.foo(); // marker-main-2', '.foo'.length
)); |
| 710 } | 774 } |
| 711 | 775 |
| 712 void test_isReferencedByQualified_ConstructorElement_classTypeAlias() { | 776 void test_isReferencedByQualified_ConstructorElement_classTypeAlias() { |
| 713 _indexTestUnit(''' | 777 _indexTestUnit(''' |
| 714 class M {} | 778 class M {} |
| 715 class A implements B { | 779 class A implements B { |
| 716 A() {} | 780 A() {} |
| 717 A.named() {} | 781 A.named() {} |
| 718 } | 782 } |
| 719 class B = A with M; | 783 class B = A with M; |
| 720 main() { | 784 main() { |
| 721 new B(); // marker-main-1 | 785 new B(); // marker-main-1 |
| 722 new B.named(); // marker-main-2 | 786 new B.named(); // marker-main-2 |
| 723 } | 787 } |
| 724 '''); | 788 '''); |
| 725 // prepare elements | 789 // prepare elements |
| 726 Element mainElement = _findElement('main'); | 790 Element mainElement = findElement('main'); |
| 727 var isConstructor = (node) => node is ConstructorDeclaration; | 791 var isConstructor = (node) => node is ConstructorDeclaration; |
| 728 ConstructorElement consA = _findNodeElementAtString("A()", isConstructor); | 792 ConstructorElement consA = findNodeElementAtString("A()", isConstructor); |
| 729 ConstructorElement consA_named = _findNodeElementAtString("A.named()", | 793 ConstructorElement consA_named = |
| 730 isConstructor); | 794 findNodeElementAtString("A.named()", isConstructor); |
| 731 // verify | 795 // verify |
| 732 _assertRecordedRelation(consA, IndexConstants.IS_REFERENCED_BY, | 796 _assertRecordedRelation( |
| 797 consA, |
| 798 IndexConstants.IS_REFERENCED_BY, |
| 733 _expectedLocation(mainElement, '(); // marker-main-1', 0)); | 799 _expectedLocation(mainElement, '(); // marker-main-1', 0)); |
| 734 _assertRecordedRelation(consA_named, IndexConstants.IS_REFERENCED_BY, | 800 _assertRecordedRelation( |
| 801 consA_named, |
| 802 IndexConstants.IS_REFERENCED_BY, |
| 735 _expectedLocation(mainElement, '.named(); // marker-main-2', '.named'.le
ngth)); | 803 _expectedLocation(mainElement, '.named(); // marker-main-2', '.named'.le
ngth)); |
| 736 } | 804 } |
| 737 | 805 |
| 738 void test_isReferencedByQualified_FieldElement() { | 806 void test_isReferencedByQualified_FieldElement() { |
| 739 _indexTestUnit(''' | 807 _indexTestUnit(''' |
| 740 class A { | 808 class A { |
| 741 static var field; | 809 static var field; |
| 742 } | 810 } |
| 743 main() { | 811 main() { |
| 744 A.field = 1; | 812 A.field = 1; |
| 745 } | 813 } |
| 746 '''); | 814 '''); |
| 747 // prepare elements | 815 // prepare elements |
| 748 Element mainElement = _findElement('main'); | 816 Element mainElement = findElement('main'); |
| 749 FieldElement fieldElement = _findElement('field'); | 817 FieldElement fieldElement = findElement('field'); |
| 750 PropertyAccessorElement setterElement = fieldElement.setter; | 818 PropertyAccessorElement setterElement = fieldElement.setter; |
| 751 // verify | 819 // verify |
| 752 _assertRecordedRelation(setterElement, | 820 _assertRecordedRelation( |
| 753 IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(mainElement
, | 821 setterElement, |
| 754 'field = 1')); | 822 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 823 _expectedLocation(mainElement, 'field = 1')); |
| 755 } | 824 } |
| 756 | 825 |
| 757 void test_isReferencedByQualified_MethodElement() { | 826 void test_isReferencedByQualified_MethodElement() { |
| 758 _indexTestUnit(''' | 827 _indexTestUnit(''' |
| 759 class A { | 828 class A { |
| 760 foo() {} | 829 foo() {} |
| 761 main() { | 830 main() { |
| 762 print(this.foo); | 831 print(this.foo); |
| 763 } | 832 } |
| 764 } | 833 } |
| 765 '''); | 834 '''); |
| 766 // prepare elements | 835 // prepare elements |
| 767 Element fooElement = _findElement('foo'); | 836 Element fooElement = findElement('foo'); |
| 768 Element mainElement = _findElement('main'); | 837 Element mainElement = findElement('main'); |
| 769 // verify | 838 // verify |
| 770 _assertRecordedRelation(fooElement, | 839 _assertRecordedRelation( |
| 771 IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation(mainElement
, | 840 fooElement, |
| 772 'foo);')); | 841 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 842 _expectedLocation(mainElement, 'foo);')); |
| 773 } | 843 } |
| 774 | 844 |
| 775 void test_isReferencedByQualified_MethodElement_operator_binary() { | 845 void test_isReferencedByQualified_MethodElement_operator_binary() { |
| 776 _indexTestUnit(''' | 846 _indexTestUnit(''' |
| 777 class A { | 847 class A { |
| 778 operator +(other) => this; | 848 operator +(other) => this; |
| 779 } | 849 } |
| 780 main(A a) { | 850 main(A a) { |
| 781 print(a + 1); | 851 print(a + 1); |
| 782 a += 2; | 852 a += 2; |
| 783 ++a; | 853 ++a; |
| 784 a++; | 854 a++; |
| 785 } | 855 } |
| 786 '''); | 856 '''); |
| 787 // prepare elements | 857 // prepare elements |
| 788 Element element = _findElement('+'); | 858 Element element = findElement('+'); |
| 789 Element mainElement = _findElement('main'); | 859 Element mainElement = findElement('main'); |
| 790 // verify | 860 // verify |
| 791 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, | 861 _assertRecordedRelation( |
| 862 element, |
| 863 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 792 _expectedLocation(mainElement, '+ 1', "+".length)); | 864 _expectedLocation(mainElement, '+ 1', "+".length)); |
| 793 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, | 865 _assertRecordedRelation( |
| 866 element, |
| 867 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 794 _expectedLocation(mainElement, '+= 2', "+=".length)); | 868 _expectedLocation(mainElement, '+= 2', "+=".length)); |
| 795 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, | 869 _assertRecordedRelation( |
| 870 element, |
| 871 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 796 _expectedLocation(mainElement, '++a;', "++".length)); | 872 _expectedLocation(mainElement, '++a;', "++".length)); |
| 797 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, | 873 _assertRecordedRelation( |
| 874 element, |
| 875 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 798 _expectedLocation(mainElement, '++;', "++".length)); | 876 _expectedLocation(mainElement, '++;', "++".length)); |
| 799 } | 877 } |
| 800 | 878 |
| 801 void test_isReferencedByQualified_MethodElement_operator_index() { | 879 void test_isReferencedByQualified_MethodElement_operator_index() { |
| 802 _indexTestUnit(''' | 880 _indexTestUnit(''' |
| 803 class A { | 881 class A { |
| 804 operator [](i) => null; | 882 operator [](i) => null; |
| 805 operator []=(i, v) {} | 883 operator []=(i, v) {} |
| 806 } | 884 } |
| 807 main(A a) { | 885 main(A a) { |
| 808 print(a[0]); | 886 print(a[0]); |
| 809 a[1] = 42; | 887 a[1] = 42; |
| 810 } | 888 } |
| 811 '''); | 889 '''); |
| 812 // prepare elements | 890 // prepare elements |
| 813 MethodElement readElement = _findElement("[]"); | 891 MethodElement readElement = findElement("[]"); |
| 814 MethodElement writeElement = _findElement("[]="); | 892 MethodElement writeElement = findElement("[]="); |
| 815 Element mainElement = _findElement('main'); | 893 Element mainElement = findElement('main'); |
| 816 // verify | 894 // verify |
| 817 _assertRecordedRelation(readElement, IndexConstants.IS_INVOKED_BY_QUALIFIED, | 895 _assertRecordedRelation( |
| 896 readElement, |
| 897 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 818 _expectedLocation(mainElement, '[0]', "[".length)); | 898 _expectedLocation(mainElement, '[0]', "[".length)); |
| 819 _assertRecordedRelation(writeElement, | 899 _assertRecordedRelation( |
| 820 IndexConstants.IS_INVOKED_BY_QUALIFIED, _expectedLocation(mainElement, '
[1] =', | 900 writeElement, |
| 821 "[".length)); | 901 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 902 _expectedLocation(mainElement, '[1] =', "[".length)); |
| 822 } | 903 } |
| 823 | 904 |
| 824 void test_isReferencedByQualified_MethodElement_operator_prefix() { | 905 void test_isReferencedByQualified_MethodElement_operator_prefix() { |
| 825 _indexTestUnit(''' | 906 _indexTestUnit(''' |
| 826 class A { | 907 class A { |
| 827 A operator ~() => this; | 908 A operator ~() => this; |
| 828 } | 909 } |
| 829 main(A a) { | 910 main(A a) { |
| 830 print(~a); | 911 print(~a); |
| 831 } | 912 } |
| 832 '''); | 913 '''); |
| 833 // prepare elements | 914 // prepare elements |
| 834 MethodElement element = _findElement("~"); | 915 MethodElement element = findElement("~"); |
| 835 Element mainElement = _findElement('main'); | 916 Element mainElement = findElement('main'); |
| 836 // verify | 917 // verify |
| 837 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY_QUALIFIED, | 918 _assertRecordedRelation( |
| 919 element, |
| 920 IndexConstants.IS_INVOKED_BY_QUALIFIED, |
| 838 _expectedLocation(mainElement, '~a', "~".length)); | 921 _expectedLocation(mainElement, '~a', "~".length)); |
| 839 } | 922 } |
| 840 | 923 |
| 841 void test_isReferencedByQualified_PropertyAccessorElement_method_getter() { | 924 void test_isReferencedByQualified_PropertyAccessorElement_method_getter() { |
| 842 _indexTestUnit(''' | 925 _indexTestUnit(''' |
| 843 class A { | 926 class A { |
| 844 get foo => 42; | 927 get foo => 42; |
| 845 main() { | 928 main() { |
| 846 print(this.foo); | 929 print(this.foo); |
| 847 } | 930 } |
| 848 } | 931 } |
| 849 '''); | 932 '''); |
| 850 // prepare elements | 933 // prepare elements |
| 851 PropertyAccessorElement element = _findNodeElementAtString('foo =>'); | 934 PropertyAccessorElement element = findNodeElementAtString('foo =>'); |
| 852 Element mainElement = _findElement('main'); | 935 Element mainElement = findElement('main'); |
| 853 // verify | 936 // verify |
| 854 _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED, | 937 _assertRecordedRelation( |
| 938 element, |
| 939 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 855 _expectedLocation(mainElement, 'foo);')); | 940 _expectedLocation(mainElement, 'foo);')); |
| 856 _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null); | 941 _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null); |
| 857 } | 942 } |
| 858 | 943 |
| 859 void test_isReferencedByQualified_PropertyAccessorElement_method_setter() { | 944 void test_isReferencedByQualified_PropertyAccessorElement_method_setter() { |
| 860 _indexTestUnit(''' | 945 _indexTestUnit(''' |
| 861 class A { | 946 class A { |
| 862 set foo(x) {} | 947 set foo(x) {} |
| 863 main() { | 948 main() { |
| 864 this.foo = 42; | 949 this.foo = 42; |
| 865 } | 950 } |
| 866 } | 951 } |
| 867 '''); | 952 '''); |
| 868 // prepare elements | 953 // prepare elements |
| 869 PropertyAccessorElement element = _findNodeElementAtString('foo(x)'); | 954 PropertyAccessorElement element = findNodeElementAtString('foo(x)'); |
| 870 Element mainElement = _findElement('main'); | 955 Element mainElement = findElement('main'); |
| 871 // verify | 956 // verify |
| 872 _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY_QUALIFIED, | 957 _assertRecordedRelation( |
| 958 element, |
| 959 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 873 _expectedLocation(mainElement, 'foo = 42;')); | 960 _expectedLocation(mainElement, 'foo = 42;')); |
| 874 _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null); | 961 _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, null); |
| 875 } | 962 } |
| 876 | 963 |
| 877 void test_isReferencedByQualified_PropertyAccessorElement_topLevelField() { | 964 void test_isReferencedByQualified_PropertyAccessorElement_topLevelField() { |
| 878 addSource('/lib.dart', ''' | 965 addSource('/lib.dart', ''' |
| 879 library lib; | 966 library lib; |
| 880 var myVar; | 967 var myVar; |
| 881 '''); | 968 '''); |
| 882 _indexTestUnit(''' | 969 _indexTestUnit(''' |
| 883 import 'lib.dart' as pref; | 970 import 'lib.dart' as pref; |
| 884 main() { | 971 main() { |
| 885 pref.myVar = 1; | 972 pref.myVar = 1; |
| 886 print(pref.myVar); | 973 print(pref.myVar); |
| 887 } | 974 } |
| 888 '''); | 975 '''); |
| 889 // prepare elements | 976 // prepare elements |
| 890 Element mainElement = _findElement('main'); | 977 Element mainElement = findElement('main'); |
| 891 ImportElement importElement = testLibraryElement.imports[0]; | 978 ImportElement importElement = testLibraryElement.imports[0]; |
| 892 CompilationUnitElement impUnit = | 979 CompilationUnitElement impUnit = |
| 893 importElement.importedLibrary.definingCompilationUnit; | 980 importElement.importedLibrary.definingCompilationUnit; |
| 894 TopLevelVariableElement myVar = impUnit.topLevelVariables[0]; | 981 TopLevelVariableElement myVar = impUnit.topLevelVariables[0]; |
| 895 PropertyAccessorElement getter = myVar.getter; | 982 PropertyAccessorElement getter = myVar.getter; |
| 896 PropertyAccessorElement setter = myVar.setter; | 983 PropertyAccessorElement setter = myVar.setter; |
| 897 // verify | 984 // verify |
| 898 _assertRecordedRelation(setter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, | 985 _assertRecordedRelation( |
| 986 setter, |
| 987 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 899 _expectedLocation(mainElement, 'myVar = 1')); | 988 _expectedLocation(mainElement, 'myVar = 1')); |
| 900 _assertRecordedRelation(getter, IndexConstants.IS_REFERENCED_BY_QUALIFIED, | 989 _assertRecordedRelation( |
| 990 getter, |
| 991 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 901 _expectedLocation(mainElement, 'myVar);')); | 992 _expectedLocation(mainElement, 'myVar);')); |
| 902 } | 993 } |
| 903 | 994 |
| 904 void test_isReferencedByUnqualified_FieldElement() { | 995 void test_isReferencedByUnqualified_FieldElement() { |
| 905 _indexTestUnit(''' | 996 _indexTestUnit(''' |
| 906 class A { | 997 class A { |
| 907 var field; | 998 var field; |
| 908 main() { | 999 main() { |
| 909 field = 5; | 1000 field = 5; |
| 910 print(field); | 1001 print(field); |
| 911 } | 1002 } |
| 912 }'''); | 1003 }'''); |
| 913 // prepare elements | 1004 // prepare elements |
| 914 Element mainElement = _findElement("main"); | 1005 Element mainElement = findElement("main"); |
| 915 FieldElement fieldElement = _findElement("field"); | 1006 FieldElement fieldElement = findElement("field"); |
| 916 PropertyAccessorElement getter = fieldElement.getter; | 1007 PropertyAccessorElement getter = fieldElement.getter; |
| 917 PropertyAccessorElement setter = fieldElement.setter; | 1008 PropertyAccessorElement setter = fieldElement.setter; |
| 918 // verify | 1009 // verify |
| 919 _assertRecordedRelation(setter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, | 1010 _assertRecordedRelation( |
| 1011 setter, |
| 1012 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, |
| 920 _expectedLocation(mainElement, 'field = 5')); | 1013 _expectedLocation(mainElement, 'field = 5')); |
| 921 _assertRecordedRelation(getter, IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, | 1014 _assertRecordedRelation( |
| 1015 getter, |
| 1016 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, |
| 922 _expectedLocation(mainElement, 'field);')); | 1017 _expectedLocation(mainElement, 'field);')); |
| 923 } | 1018 } |
| 924 | 1019 |
| 925 void test_isReferencedByUnqualified_MethodElement() { | 1020 void test_isReferencedByUnqualified_MethodElement() { |
| 926 _indexTestUnit(''' | 1021 _indexTestUnit(''' |
| 927 class A { | 1022 class A { |
| 928 method() {} | 1023 method() {} |
| 929 main() { | 1024 main() { |
| 930 print(method); | 1025 print(method); |
| 931 } | 1026 } |
| 932 }'''); | 1027 }'''); |
| 933 // prepare elements | 1028 // prepare elements |
| 934 Element mainElement = _findElement("main"); | 1029 Element mainElement = findElement("main"); |
| 935 MethodElement methodElement = _findElement("method"); | 1030 MethodElement methodElement = findElement("method"); |
| 936 // verify | 1031 // verify |
| 937 _assertRecordedRelation(methodElement, | 1032 _assertRecordedRelation( |
| 938 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainEleme
nt, | 1033 methodElement, |
| 939 'method);')); | 1034 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, |
| 940 _assertNoRecordedRelation(methodElement, IndexConstants.IS_REFERENCED_BY, | 1035 _expectedLocation(mainElement, 'method);')); |
| 1036 _assertNoRecordedRelation( |
| 1037 methodElement, |
| 1038 IndexConstants.IS_REFERENCED_BY, |
| 941 null); | 1039 null); |
| 942 } | 1040 } |
| 943 | 1041 |
| 944 void test_isReferencedByUnqualified_TopLevelVariableElement() { | 1042 void test_isReferencedByUnqualified_TopLevelVariableElement() { |
| 945 _indexTestUnit(''' | 1043 _indexTestUnit(''' |
| 946 var topVariable; | 1044 var topVariable; |
| 947 main() { | 1045 main() { |
| 948 topVariable = 5; | 1046 topVariable = 5; |
| 949 print(topVariable); | 1047 print(topVariable); |
| 950 }'''); | 1048 }'''); |
| 951 // prepare elements | 1049 // prepare elements |
| 952 Element mainElement = _findElement("main"); | 1050 Element mainElement = findElement("main"); |
| 953 TopLevelVariableElement variableElement = _findElement("topVariable"); | 1051 TopLevelVariableElement variableElement = findElement("topVariable"); |
| 954 // verify | 1052 // verify |
| 955 _assertRecordedRelation(variableElement.setter, | 1053 _assertRecordedRelation( |
| 956 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainEleme
nt, | 1054 variableElement.setter, |
| 957 'topVariable = 5')); | 1055 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, |
| 958 _assertRecordedRelation(variableElement.getter, | 1056 _expectedLocation(mainElement, 'topVariable = 5')); |
| 959 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, _expectedLocation(mainEleme
nt, | 1057 _assertRecordedRelation( |
| 960 'topVariable);')); | 1058 variableElement.getter, |
| 1059 IndexConstants.IS_REFERENCED_BY_UNQUALIFIED, |
| 1060 _expectedLocation(mainElement, 'topVariable);')); |
| 961 } | 1061 } |
| 962 | 1062 |
| 963 void test_isReferencedBy_ClassElement() { | 1063 void test_isReferencedBy_ClassElement() { |
| 964 _indexTestUnit(''' | 1064 _indexTestUnit(''' |
| 965 class A { | 1065 class A { |
| 966 static var field; | 1066 static var field; |
| 967 } | 1067 } |
| 968 main(A p) { | 1068 main(A p) { |
| 969 A v; | 1069 A v; |
| 970 new A(); // 2 | 1070 new A(); // 2 |
| 971 A.field = 1; | 1071 A.field = 1; |
| 972 print(A.field); // 3 | 1072 print(A.field); // 3 |
| 973 } | 1073 } |
| 974 '''); | 1074 '''); |
| 975 // prepare elements | 1075 // prepare elements |
| 976 ClassElement aElement = _findElement("A"); | 1076 ClassElement aElement = findElement("A"); |
| 977 Element mainElement = _findElement("main"); | 1077 Element mainElement = findElement("main"); |
| 978 ParameterElement pElement = _findElement("p"); | 1078 ParameterElement pElement = findElement("p"); |
| 979 VariableElement vElement = _findElement("v"); | 1079 VariableElement vElement = findElement("v"); |
| 980 // verify | 1080 // verify |
| 981 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1081 _assertRecordedRelation( |
| 1082 aElement, |
| 1083 IndexConstants.IS_REFERENCED_BY, |
| 982 _expectedLocation(pElement, 'A p) {')); | 1084 _expectedLocation(pElement, 'A p) {')); |
| 983 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1085 _assertRecordedRelation( |
| 1086 aElement, |
| 1087 IndexConstants.IS_REFERENCED_BY, |
| 984 _expectedLocation(vElement, 'A v;')); | 1088 _expectedLocation(vElement, 'A v;')); |
| 985 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1089 _assertRecordedRelation( |
| 1090 aElement, |
| 1091 IndexConstants.IS_REFERENCED_BY, |
| 986 _expectedLocation(mainElement, 'A(); // 2')); | 1092 _expectedLocation(mainElement, 'A(); // 2')); |
| 987 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1093 _assertRecordedRelation( |
| 1094 aElement, |
| 1095 IndexConstants.IS_REFERENCED_BY, |
| 988 _expectedLocation(mainElement, 'A.field = 1;')); | 1096 _expectedLocation(mainElement, 'A.field = 1;')); |
| 989 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1097 _assertRecordedRelation( |
| 1098 aElement, |
| 1099 IndexConstants.IS_REFERENCED_BY, |
| 990 _expectedLocation(mainElement, 'A.field); // 3')); | 1100 _expectedLocation(mainElement, 'A.field); // 3')); |
| 991 } | 1101 } |
| 992 | 1102 |
| 993 void test_isReferencedBy_ClassTypeAlias() { | 1103 void test_isReferencedBy_ClassTypeAlias() { |
| 994 _indexTestUnit(''' | 1104 _indexTestUnit(''' |
| 995 class A {} | 1105 class A {} |
| 996 class B = Object with A; | 1106 class B = Object with A; |
| 997 main(B p) { | 1107 main(B p) { |
| 998 B v; | 1108 B v; |
| 999 } | 1109 } |
| 1000 '''); | 1110 '''); |
| 1001 // prepare elements | 1111 // prepare elements |
| 1002 ClassElement bElement = _findElement("B"); | 1112 ClassElement bElement = findElement("B"); |
| 1003 ParameterElement pElement = _findElement("p"); | 1113 ParameterElement pElement = findElement("p"); |
| 1004 VariableElement vElement = _findElement("v"); | 1114 VariableElement vElement = findElement("v"); |
| 1005 // verify | 1115 // verify |
| 1006 _assertRecordedRelation(bElement, IndexConstants.IS_REFERENCED_BY, | 1116 _assertRecordedRelation( |
| 1117 bElement, |
| 1118 IndexConstants.IS_REFERENCED_BY, |
| 1007 _expectedLocation(pElement, 'B p) {')); | 1119 _expectedLocation(pElement, 'B p) {')); |
| 1008 _assertRecordedRelation(bElement, IndexConstants.IS_REFERENCED_BY, | 1120 _assertRecordedRelation( |
| 1121 bElement, |
| 1122 IndexConstants.IS_REFERENCED_BY, |
| 1009 _expectedLocation(vElement, 'B v;')); | 1123 _expectedLocation(vElement, 'B v;')); |
| 1010 } | 1124 } |
| 1011 | 1125 |
| 1012 void test_isReferencedBy_CompilationUnitElement() { | 1126 void test_isReferencedBy_CompilationUnitElement() { |
| 1013 addSource('/my_unit.dart', 'part of my_lib;'); | 1127 addSource('/my_unit.dart', 'part of my_lib;'); |
| 1014 _indexTestUnit(''' | 1128 _indexTestUnit(''' |
| 1015 library my_lib; | 1129 library my_lib; |
| 1016 part 'my_unit.dart'; | 1130 part 'my_unit.dart'; |
| 1017 '''); | 1131 '''); |
| 1018 // prepare elements | 1132 // prepare elements |
| 1019 CompilationUnitElement myUnitElement = testLibraryElement.parts[0]; | 1133 CompilationUnitElement myUnitElement = testLibraryElement.parts[0]; |
| 1020 // verify | 1134 // verify |
| 1021 _assertRecordedRelation(myUnitElement, IndexConstants.IS_REFERENCED_BY, | 1135 _assertRecordedRelation( |
| 1136 myUnitElement, |
| 1137 IndexConstants.IS_REFERENCED_BY, |
| 1022 _expectedLocation(testUnitElement, "'my_unit.dart';", "'my_unit.dart'".l
ength)); | 1138 _expectedLocation(testUnitElement, "'my_unit.dart';", "'my_unit.dart'".l
ength)); |
| 1023 } | 1139 } |
| 1024 | 1140 |
| 1025 void test_isReferencedBy_ConstructorFieldInitializer() { | 1141 void test_isReferencedBy_ConstructorFieldInitializer() { |
| 1026 _indexTestUnit(''' | 1142 _indexTestUnit(''' |
| 1027 class A { | 1143 class A { |
| 1028 int field; | 1144 int field; |
| 1029 A() : field = 5; | 1145 A() : field = 5; |
| 1030 } | 1146 } |
| 1031 '''); | 1147 '''); |
| 1032 // prepare elements | 1148 // prepare elements |
| 1033 ConstructorElement constructorElement = _findNodeElementAtString("A()", | 1149 ConstructorElement constructorElement = |
| 1034 (node) => node is ConstructorDeclaration); | 1150 findNodeElementAtString("A()", (node) => node is ConstructorDeclaration)
; |
| 1035 FieldElement fieldElement = _findElement("field"); | 1151 FieldElement fieldElement = findElement("field"); |
| 1036 // verify | 1152 // verify |
| 1037 _assertRecordedRelation(fieldElement, IndexConstants.IS_REFERENCED_BY, | 1153 _assertRecordedRelation( |
| 1154 fieldElement, |
| 1155 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 1038 _expectedLocation(constructorElement, 'field = 5')); | 1156 _expectedLocation(constructorElement, 'field = 5')); |
| 1039 } | 1157 } |
| 1040 | 1158 |
| 1041 void test_isReferencedBy_FieldFormalParameterElement() { | 1159 void test_isReferencedBy_FieldFormalParameterElement() { |
| 1042 _indexTestUnit(''' | 1160 _indexTestUnit(''' |
| 1043 class A { | 1161 class A { |
| 1044 int field; | 1162 int field; |
| 1045 A(this.field); | 1163 A(this.field); |
| 1046 } | 1164 } |
| 1047 '''); | 1165 '''); |
| 1048 // prepare elements | 1166 // prepare elements |
| 1049 FieldElement fieldElement = _findElement("field"); | 1167 FieldElement fieldElement = findElement("field"); |
| 1050 Element fieldParameterElement = _findNodeElementAtString("field);"); | 1168 Element fieldParameterElement = findNodeElementAtString("field);"); |
| 1051 // verify | 1169 // verify |
| 1052 _assertRecordedRelation(fieldElement, | 1170 _assertRecordedRelation( |
| 1053 IndexConstants.IS_REFERENCED_BY_QUALIFIED, _expectedLocation( | 1171 fieldElement, |
| 1054 fieldParameterElement, 'field);')); | 1172 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 1173 _expectedLocation(fieldParameterElement, 'field);')); |
| 1174 } |
| 1175 |
| 1176 void test_isReferencedBy_TopLevelVariableElement() { |
| 1177 addSource('/lib.dart', ''' |
| 1178 library lib; |
| 1179 var V; |
| 1180 '''); |
| 1181 _indexTestUnit(''' |
| 1182 import 'lib.dart' show V; // imp |
| 1183 '''); |
| 1184 // prepare elements |
| 1185 var libElement = testLibraryElement.imports[0].importedLibrary; |
| 1186 var libUnit = libElement.definingCompilationUnit; |
| 1187 TopLevelVariableElement fieldElement = libUnit.topLevelVariables[0]; |
| 1188 // verify |
| 1189 _assertRecordedRelation( |
| 1190 fieldElement, |
| 1191 IndexConstants.IS_REFERENCED_BY_QUALIFIED, |
| 1192 _expectedLocation(testUnitElement, 'V; // imp')); |
| 1055 } | 1193 } |
| 1056 | 1194 |
| 1057 void test_isReferencedBy_FunctionElement() { | 1195 void test_isReferencedBy_FunctionElement() { |
| 1058 _indexTestUnit(''' | 1196 _indexTestUnit(''' |
| 1059 foo() {} | 1197 foo() {} |
| 1060 main() { | 1198 main() { |
| 1061 print(foo); | 1199 print(foo); |
| 1062 print(foo()); | 1200 print(foo()); |
| 1063 } | 1201 } |
| 1064 '''); | 1202 '''); |
| 1065 // prepare elements | 1203 // prepare elements |
| 1066 FunctionElement element = _findElement("foo"); | 1204 FunctionElement element = findElement("foo"); |
| 1067 Element mainElement = _findElement("main"); | 1205 Element mainElement = findElement("main"); |
| 1068 // "referenced" here | 1206 // "referenced" here |
| 1069 _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, | 1207 _assertRecordedRelation( |
| 1208 element, |
| 1209 IndexConstants.IS_REFERENCED_BY, |
| 1070 _expectedLocation(mainElement, 'foo);')); | 1210 _expectedLocation(mainElement, 'foo);')); |
| 1071 // only "invoked", but not "referenced" | 1211 // only "invoked", but not "referenced" |
| 1072 { | 1212 { |
| 1073 _assertRecordedRelation(element, IndexConstants.IS_INVOKED_BY, | 1213 _assertRecordedRelation( |
| 1214 element, |
| 1215 IndexConstants.IS_INVOKED_BY, |
| 1074 _expectedLocation(mainElement, 'foo());')); | 1216 _expectedLocation(mainElement, 'foo());')); |
| 1075 _assertNoRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, | 1217 _assertNoRecordedRelation( |
| 1218 element, |
| 1219 IndexConstants.IS_REFERENCED_BY, |
| 1076 _expectedLocation(mainElement, 'foo());')); | 1220 _expectedLocation(mainElement, 'foo());')); |
| 1077 } | 1221 } |
| 1078 } | 1222 } |
| 1079 | 1223 |
| 1080 void test_isReferencedBy_FunctionTypeAliasElement() { | 1224 void test_isReferencedBy_FunctionTypeAliasElement() { |
| 1081 _indexTestUnit(''' | 1225 _indexTestUnit(''' |
| 1082 typedef A(); | 1226 typedef A(); |
| 1083 main(A p) { | 1227 main(A p) { |
| 1084 } | 1228 } |
| 1085 '''); | 1229 '''); |
| 1086 // prepare elements | 1230 // prepare elements |
| 1087 Element aElement = _findElement('A'); | 1231 Element aElement = findElement('A'); |
| 1088 Element pElement = _findElement('p'); | 1232 Element pElement = findElement('p'); |
| 1089 // verify | 1233 // verify |
| 1090 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1234 _assertRecordedRelation( |
| 1235 aElement, |
| 1236 IndexConstants.IS_REFERENCED_BY, |
| 1091 _expectedLocation(pElement, 'A p) {')); | 1237 _expectedLocation(pElement, 'A p) {')); |
| 1092 } | 1238 } |
| 1093 | 1239 |
| 1094 void test_isReferencedBy_ImportElement_noPrefix() { | 1240 void test_isReferencedBy_ImportElement_noPrefix() { |
| 1095 addSource('/lib.dart', ''' | 1241 addSource('/lib.dart', ''' |
| 1096 library lib; | 1242 library lib; |
| 1097 var myVar; | 1243 var myVar; |
| 1098 myFunction() {} | 1244 myFunction() {} |
| 1099 myToHide() {} | 1245 myToHide() {} |
| 1100 '''); | 1246 '''); |
| 1101 _indexTestUnit(''' | 1247 _indexTestUnit(''' |
| 1102 import 'lib.dart' show myVar, myFunction hide myToHide; | 1248 import 'lib.dart' show myVar, myFunction hide myToHide; |
| 1103 main() { | 1249 main() { |
| 1104 myVar = 1; | 1250 myVar = 1; |
| 1105 myFunction(); | 1251 myFunction(); |
| 1106 print(0); | 1252 print(0); |
| 1107 } | 1253 } |
| 1108 '''); | 1254 '''); |
| 1109 // prepare elements | 1255 // prepare elements |
| 1110 ImportElement importElement = testLibraryElement.imports[0]; | 1256 ImportElement importElement = testLibraryElement.imports[0]; |
| 1111 Element mainElement = _findElement('main'); | 1257 Element mainElement = findElement('main'); |
| 1112 // verify | 1258 // verify |
| 1113 _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1259 _assertRecordedRelation( |
| 1260 importElement, |
| 1261 IndexConstants.IS_REFERENCED_BY, |
| 1114 _expectedLocation(mainElement, 'myVar = 1;', 0)); | 1262 _expectedLocation(mainElement, 'myVar = 1;', 0)); |
| 1115 _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1263 _assertRecordedRelation( |
| 1264 importElement, |
| 1265 IndexConstants.IS_REFERENCED_BY, |
| 1116 _expectedLocation(mainElement, 'myFunction();', 0)); | 1266 _expectedLocation(mainElement, 'myFunction();', 0)); |
| 1117 _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1267 _assertNoRecordedRelation( |
| 1268 importElement, |
| 1269 IndexConstants.IS_REFERENCED_BY, |
| 1118 _expectedLocation(mainElement, 'print(0);', 0)); | 1270 _expectedLocation(mainElement, 'print(0);', 0)); |
| 1119 // no references from import combinators | 1271 // no references from import combinators |
| 1120 _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1272 _assertNoRecordedRelation( |
| 1273 importElement, |
| 1274 IndexConstants.IS_REFERENCED_BY, |
| 1121 _expectedLocation(testUnitElement, 'myVar, ', 0)); | 1275 _expectedLocation(testUnitElement, 'myVar, ', 0)); |
| 1122 _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1276 _assertNoRecordedRelation( |
| 1277 importElement, |
| 1278 IndexConstants.IS_REFERENCED_BY, |
| 1123 _expectedLocation(testUnitElement, 'myFunction hide', 0)); | 1279 _expectedLocation(testUnitElement, 'myFunction hide', 0)); |
| 1124 _assertNoRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1280 _assertNoRecordedRelation( |
| 1281 importElement, |
| 1282 IndexConstants.IS_REFERENCED_BY, |
| 1125 _expectedLocation(testUnitElement, 'myToHide;', 0)); | 1283 _expectedLocation(testUnitElement, 'myToHide;', 0)); |
| 1126 } | 1284 } |
| 1127 | 1285 |
| 1128 void test_isReferencedBy_ImportElement_withPrefix() { | 1286 void test_isReferencedBy_ImportElement_withPrefix() { |
| 1129 addSource('/libA.dart', ''' | 1287 addSource('/libA.dart', ''' |
| 1130 library libA; | 1288 library libA; |
| 1131 var myVar; | 1289 var myVar; |
| 1132 '''); | 1290 '''); |
| 1133 addSource('/libB.dart', ''' | 1291 addSource('/libB.dart', ''' |
| 1134 library libB; | 1292 library libB; |
| 1135 class MyClass {} | 1293 class MyClass {} |
| 1136 '''); | 1294 '''); |
| 1137 _indexTestUnit(''' | 1295 _indexTestUnit(''' |
| 1138 import 'libA.dart' as pref; | 1296 import 'libA.dart' as pref; |
| 1139 import 'libB.dart' as pref; | 1297 import 'libB.dart' as pref; |
| 1140 main() { | 1298 main() { |
| 1141 pref.myVar = 1; | 1299 pref.myVar = 1; |
| 1142 new pref.MyClass(); | 1300 new pref.MyClass(); |
| 1143 } | 1301 } |
| 1144 '''); | 1302 '''); |
| 1145 // prepare elements | 1303 // prepare elements |
| 1146 ImportElement importElementA = testLibraryElement.imports[0]; | 1304 ImportElement importElementA = testLibraryElement.imports[0]; |
| 1147 ImportElement importElementB = testLibraryElement.imports[1]; | 1305 ImportElement importElementB = testLibraryElement.imports[1]; |
| 1148 Element mainElement = _findElement('main'); | 1306 Element mainElement = findElement('main'); |
| 1149 // verify | 1307 // verify |
| 1150 _assertRecordedRelation(importElementA, IndexConstants.IS_REFERENCED_BY, | 1308 _assertRecordedRelation( |
| 1309 importElementA, |
| 1310 IndexConstants.IS_REFERENCED_BY, |
| 1151 _expectedLocation(mainElement, 'pref.myVar = 1;', 'pref.'.length)); | 1311 _expectedLocation(mainElement, 'pref.myVar = 1;', 'pref.'.length)); |
| 1152 _assertRecordedRelation(importElementB, IndexConstants.IS_REFERENCED_BY, | 1312 _assertRecordedRelation( |
| 1313 importElementB, |
| 1314 IndexConstants.IS_REFERENCED_BY, |
| 1153 _expectedLocation(mainElement, 'pref.MyClass();', 'pref.'.length)); | 1315 _expectedLocation(mainElement, 'pref.MyClass();', 'pref.'.length)); |
| 1154 } | 1316 } |
| 1155 | 1317 |
| 1156 void test_isReferencedBy_ImportElement_withPrefix_combinators() { | 1318 void test_isReferencedBy_ImportElement_withPrefix_combinators() { |
| 1157 addSource('/lib.dart', ''' | 1319 addSource('/lib.dart', ''' |
| 1158 library lib; | 1320 library lib; |
| 1159 class A {} | 1321 class A {} |
| 1160 class B {} | 1322 class B {} |
| 1161 '''); | 1323 '''); |
| 1162 _indexTestUnit(''' | 1324 _indexTestUnit(''' |
| 1163 import 'lib.dart' as pref show A; | 1325 import 'lib.dart' as pref show A; |
| 1164 import 'lib.dart' as pref show B; | 1326 import 'lib.dart' as pref show B; |
| 1165 import 'lib.dart'; | 1327 import 'lib.dart'; |
| 1166 import 'lib.dart' as otherPrefix; | 1328 import 'lib.dart' as otherPrefix; |
| 1167 main() { | 1329 main() { |
| 1168 new pref.A(); | 1330 new pref.A(); |
| 1169 new pref.B(); | 1331 new pref.B(); |
| 1170 } | 1332 } |
| 1171 '''); | 1333 '''); |
| 1172 // prepare elements | 1334 // prepare elements |
| 1173 ImportElement importElementA = testLibraryElement.imports[0]; | 1335 ImportElement importElementA = testLibraryElement.imports[0]; |
| 1174 ImportElement importElementB = testLibraryElement.imports[1]; | 1336 ImportElement importElementB = testLibraryElement.imports[1]; |
| 1175 Element mainElement = _findElement('main'); | 1337 Element mainElement = findElement('main'); |
| 1176 // verify | 1338 // verify |
| 1177 _assertRecordedRelation(importElementA, IndexConstants.IS_REFERENCED_BY, | 1339 _assertRecordedRelation( |
| 1340 importElementA, |
| 1341 IndexConstants.IS_REFERENCED_BY, |
| 1178 _expectedLocation(mainElement, 'pref.A();', 'pref.'.length)); | 1342 _expectedLocation(mainElement, 'pref.A();', 'pref.'.length)); |
| 1179 _assertRecordedRelation(importElementB, IndexConstants.IS_REFERENCED_BY, | 1343 _assertRecordedRelation( |
| 1344 importElementB, |
| 1345 IndexConstants.IS_REFERENCED_BY, |
| 1180 _expectedLocation(mainElement, 'pref.B();', 'pref.'.length)); | 1346 _expectedLocation(mainElement, 'pref.B();', 'pref.'.length)); |
| 1181 } | 1347 } |
| 1182 | 1348 |
| 1183 void test_isReferencedBy_ImportElement_withPrefix_invocation() { | 1349 void test_isReferencedBy_ImportElement_withPrefix_invocation() { |
| 1184 addSource('/lib.dart', ''' | 1350 addSource('/lib.dart', ''' |
| 1185 library lib; | 1351 library lib; |
| 1186 myFunc() {} | 1352 myFunc() {} |
| 1187 '''); | 1353 '''); |
| 1188 _indexTestUnit(''' | 1354 _indexTestUnit(''' |
| 1189 import 'lib.dart' as pref; | 1355 import 'lib.dart' as pref; |
| 1190 main() { | 1356 main() { |
| 1191 pref.myFunc(); | 1357 pref.myFunc(); |
| 1192 } | 1358 } |
| 1193 '''); | 1359 '''); |
| 1194 // prepare elements | 1360 // prepare elements |
| 1195 ImportElement importElement = testLibraryElement.imports[0]; | 1361 ImportElement importElement = testLibraryElement.imports[0]; |
| 1196 Element mainElement = _findElement('main'); | 1362 Element mainElement = findElement('main'); |
| 1197 // verify | 1363 // verify |
| 1198 _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1364 _assertRecordedRelation( |
| 1365 importElement, |
| 1366 IndexConstants.IS_REFERENCED_BY, |
| 1199 _expectedLocation(mainElement, 'pref.myFunc();', 'pref.'.length)); | 1367 _expectedLocation(mainElement, 'pref.myFunc();', 'pref.'.length)); |
| 1200 } | 1368 } |
| 1201 | 1369 |
| 1202 void test_isReferencedBy_ImportElement_withPrefix_oneCandidate() { | 1370 void test_isReferencedBy_ImportElement_withPrefix_oneCandidate() { |
| 1203 addSource('/lib.dart', ''' | 1371 addSource('/lib.dart', ''' |
| 1204 library lib; | 1372 library lib; |
| 1205 class A {} | 1373 class A {} |
| 1206 class B {} | 1374 class B {} |
| 1207 '''); | 1375 '''); |
| 1208 _indexTestUnit(''' | 1376 _indexTestUnit(''' |
| 1209 import 'lib.dart' as pref show A; | 1377 import 'lib.dart' as pref show A; |
| 1210 main() { | 1378 main() { |
| 1211 new pref.A(); | 1379 new pref.A(); |
| 1212 } | 1380 } |
| 1213 '''); | 1381 '''); |
| 1214 // prepare elements | 1382 // prepare elements |
| 1215 ImportElement importElement = testLibraryElement.imports[0]; | 1383 ImportElement importElement = testLibraryElement.imports[0]; |
| 1216 Element mainElement = _findElement('main'); | 1384 Element mainElement = findElement('main'); |
| 1217 // verify | 1385 // verify |
| 1218 _assertRecordedRelation(importElement, IndexConstants.IS_REFERENCED_BY, | 1386 _assertRecordedRelation( |
| 1387 importElement, |
| 1388 IndexConstants.IS_REFERENCED_BY, |
| 1219 _expectedLocation(mainElement, 'pref.A();', 'pref.'.length)); | 1389 _expectedLocation(mainElement, 'pref.A();', 'pref.'.length)); |
| 1220 } | 1390 } |
| 1221 | 1391 |
| 1222 void test_isReferencedBy_ImportElement_withPrefix_unresolvedElement() { | 1392 void test_isReferencedBy_ImportElement_withPrefix_unresolvedElement() { |
| 1223 verifyNoTestUnitErrors = false; | 1393 verifyNoTestUnitErrors = false; |
| 1224 addSource('/lib.dart', ''' | 1394 addSource('/lib.dart', ''' |
| 1225 library lib; | 1395 library lib; |
| 1226 '''); | 1396 '''); |
| 1227 _indexTestUnit(''' | 1397 _indexTestUnit(''' |
| 1228 import 'lib.dart' as pref; | 1398 import 'lib.dart' as pref; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1253 | 1423 |
| 1254 void test_isReferencedBy_LabelElement() { | 1424 void test_isReferencedBy_LabelElement() { |
| 1255 _indexTestUnit(''' | 1425 _indexTestUnit(''' |
| 1256 main() { | 1426 main() { |
| 1257 L: while (true) { | 1427 L: while (true) { |
| 1258 break L; | 1428 break L; |
| 1259 } | 1429 } |
| 1260 } | 1430 } |
| 1261 '''); | 1431 '''); |
| 1262 // prepare elements | 1432 // prepare elements |
| 1263 Element mainElement = _findElement('main'); | 1433 Element mainElement = findElement('main'); |
| 1264 Element element = _findElement('L'); | 1434 Element element = findElement('L'); |
| 1265 // verify | 1435 // verify |
| 1266 _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, | 1436 _assertRecordedRelation( |
| 1437 element, |
| 1438 IndexConstants.IS_REFERENCED_BY, |
| 1267 _expectedLocation(mainElement, 'L;')); | 1439 _expectedLocation(mainElement, 'L;')); |
| 1268 } | 1440 } |
| 1269 | 1441 |
| 1270 void test_isReferencedBy_LibraryElement_export() { | 1442 void test_isReferencedBy_LibraryElement_export() { |
| 1271 addSource('/lib.dart', ''' | 1443 addSource('/lib.dart', ''' |
| 1272 library lib; | 1444 library lib; |
| 1273 '''); | 1445 '''); |
| 1274 _indexTestUnit(''' | 1446 _indexTestUnit(''' |
| 1275 export 'lib.dart'; | 1447 export 'lib.dart'; |
| 1276 '''); | 1448 '''); |
| 1277 // prepare elements | 1449 // prepare elements |
| 1278 LibraryElement libElement = testLibraryElement.exportedLibraries[0]; | 1450 LibraryElement libElement = testLibraryElement.exportedLibraries[0]; |
| 1279 CompilationUnitElement libUnitElement = libElement.definingCompilationUnit; | 1451 CompilationUnitElement libUnitElement = libElement.definingCompilationUnit; |
| 1280 // verify | 1452 // verify |
| 1281 _assertRecordedRelation(libUnitElement, IndexConstants.IS_REFERENCED_BY, | 1453 _assertRecordedRelation( |
| 1454 libUnitElement, |
| 1455 IndexConstants.IS_REFERENCED_BY, |
| 1282 _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length)); | 1456 _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length)); |
| 1283 } | 1457 } |
| 1284 | 1458 |
| 1285 void test_isReferencedBy_LibraryElement_import() { | 1459 void test_isReferencedBy_LibraryElement_import() { |
| 1286 addSource('/lib.dart', ''' | 1460 addSource('/lib.dart', ''' |
| 1287 library lib; | 1461 library lib; |
| 1288 '''); | 1462 '''); |
| 1289 _indexTestUnit(''' | 1463 _indexTestUnit(''' |
| 1290 import 'lib.dart'; | 1464 import 'lib.dart'; |
| 1291 '''); | 1465 '''); |
| 1292 // prepare elements | 1466 // prepare elements |
| 1293 LibraryElement libElement = testLibraryElement.imports[0].importedLibrary; | 1467 LibraryElement libElement = testLibraryElement.imports[0].importedLibrary; |
| 1294 CompilationUnitElement libUnitElement = libElement.definingCompilationUnit; | 1468 CompilationUnitElement libUnitElement = libElement.definingCompilationUnit; |
| 1295 // verify | 1469 // verify |
| 1296 _assertRecordedRelation(libUnitElement, IndexConstants.IS_REFERENCED_BY, | 1470 _assertRecordedRelation( |
| 1471 libUnitElement, |
| 1472 IndexConstants.IS_REFERENCED_BY, |
| 1297 _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length)); | 1473 _expectedLocation(testUnitElement, "'lib.dart'", "'lib.dart'".length)); |
| 1298 } | 1474 } |
| 1299 | 1475 |
| 1300 void test_isReferencedBy_ParameterElement() { | 1476 void test_isReferencedBy_ParameterElement() { |
| 1301 _indexTestUnit(''' | 1477 _indexTestUnit(''' |
| 1302 foo({var p}) {} | 1478 foo({var p}) {} |
| 1303 main() { | 1479 main() { |
| 1304 foo(p: 1); | 1480 foo(p: 1); |
| 1305 } | 1481 } |
| 1306 '''); | 1482 '''); |
| 1307 // prepare elements | 1483 // prepare elements |
| 1308 Element mainElement = _findElement('main'); | 1484 Element mainElement = findElement('main'); |
| 1309 Element element = _findElement('p'); | 1485 Element element = findElement('p'); |
| 1310 // verify | 1486 // verify |
| 1311 _assertRecordedRelation(element, IndexConstants.IS_REFERENCED_BY, | 1487 _assertRecordedRelation( |
| 1488 element, |
| 1489 IndexConstants.IS_REFERENCED_BY, |
| 1312 _expectedLocation(mainElement, 'p: 1')); | 1490 _expectedLocation(mainElement, 'p: 1')); |
| 1313 } | 1491 } |
| 1314 | 1492 |
| 1315 void test_isReferencedBy_TypeParameterElement() { | 1493 void test_isReferencedBy_TypeParameterElement() { |
| 1316 _indexTestUnit(''' | 1494 _indexTestUnit(''' |
| 1317 class A<T> { | 1495 class A<T> { |
| 1318 T f; | 1496 T f; |
| 1319 foo(T p) { | 1497 foo(T p) { |
| 1320 T v; | 1498 T v; |
| 1321 } | 1499 } |
| 1322 } | 1500 } |
| 1323 '''); | 1501 '''); |
| 1324 // prepare elements | 1502 // prepare elements |
| 1325 Element typeParameterElement = _findElement('T'); | 1503 Element typeParameterElement = findElement('T'); |
| 1326 Element fieldElement = _findElement('f'); | 1504 Element fieldElement = findElement('f'); |
| 1327 Element parameterElement = _findElement('p'); | 1505 Element parameterElement = findElement('p'); |
| 1328 Element variableElement = _findElement('v'); | 1506 Element variableElement = findElement('v'); |
| 1329 // verify | 1507 // verify |
| 1330 _assertRecordedRelation(typeParameterElement, | 1508 _assertRecordedRelation( |
| 1331 IndexConstants.IS_REFERENCED_BY, _expectedLocation(fieldElement, 'T f'))
; | 1509 typeParameterElement, |
| 1332 _assertRecordedRelation(typeParameterElement, | 1510 IndexConstants.IS_REFERENCED_BY, |
| 1333 IndexConstants.IS_REFERENCED_BY, _expectedLocation(parameterElement, 'T
p')); | 1511 _expectedLocation(fieldElement, 'T f')); |
| 1334 _assertRecordedRelation(typeParameterElement, | 1512 _assertRecordedRelation( |
| 1335 IndexConstants.IS_REFERENCED_BY, _expectedLocation(variableElement, 'T v
')); | 1513 typeParameterElement, |
| 1514 IndexConstants.IS_REFERENCED_BY, |
| 1515 _expectedLocation(parameterElement, 'T p')); |
| 1516 _assertRecordedRelation( |
| 1517 typeParameterElement, |
| 1518 IndexConstants.IS_REFERENCED_BY, |
| 1519 _expectedLocation(variableElement, 'T v')); |
| 1336 } | 1520 } |
| 1337 | 1521 |
| 1338 /** | 1522 /** |
| 1339 * There was a bug in the AST structure, when single [Comment] was cloned and | 1523 * There was a bug in the AST structure, when single [Comment] was cloned and |
| 1340 * assigned to both [FieldDeclaration] and [VariableDeclaration]. | 1524 * assigned to both [FieldDeclaration] and [VariableDeclaration]. |
| 1341 * | 1525 * |
| 1342 * This caused duplicate indexing. | 1526 * This caused duplicate indexing. |
| 1343 * Here we test that the problem is fixed one way or another. | 1527 * Here we test that the problem is fixed one way or another. |
| 1344 */ | 1528 */ |
| 1345 void test_isReferencedBy_identifierInComment() { | 1529 void test_isReferencedBy_identifierInComment() { |
| 1346 _indexTestUnit(''' | 1530 _indexTestUnit(''' |
| 1347 class A {} | 1531 class A {} |
| 1348 /// [A] text | 1532 /// [A] text |
| 1349 var myVariable = null; | 1533 var myVariable = null; |
| 1350 '''); | 1534 '''); |
| 1351 // prepare elements | 1535 // prepare elements |
| 1352 Element aElement = _findElement('A'); | 1536 Element aElement = findElement('A'); |
| 1353 Element variableElement = _findElement('myVariable'); | 1537 Element variableElement = findElement('myVariable'); |
| 1354 // verify | 1538 // verify |
| 1355 _assertRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1539 _assertRecordedRelation( |
| 1540 aElement, |
| 1541 IndexConstants.IS_REFERENCED_BY, |
| 1356 _expectedLocation(testUnitElement, 'A] text')); | 1542 _expectedLocation(testUnitElement, 'A] text')); |
| 1357 _assertNoRecordedRelation(aElement, IndexConstants.IS_REFERENCED_BY, | 1543 _assertNoRecordedRelation( |
| 1544 aElement, |
| 1545 IndexConstants.IS_REFERENCED_BY, |
| 1358 _expectedLocation(variableElement, 'A] text')); | 1546 _expectedLocation(variableElement, 'A] text')); |
| 1359 } | 1547 } |
| 1360 | 1548 |
| 1361 void test_isReferencedBy_libraryName() { | 1549 void test_isReferencedBy_libraryName() { |
| 1362 Source libSource = addSource('/lib.dart', ''' | 1550 Source libSource = addSource('/lib.dart', ''' |
| 1363 library lib; | 1551 library lib; |
| 1364 part 'test.dart'; | 1552 part 'test.dart'; |
| 1365 '''); | 1553 '''); |
| 1366 testCode = 'part of lib;'; | 1554 testCode = 'part of lib;'; |
| 1367 testSource = addSource('/test.dart', testCode); | 1555 testSource = addSource('/test.dart', testCode); |
| 1368 testUnit = resolveDartUnit(testSource, libSource); | 1556 testUnit = resolveDartUnit(testSource, libSource); |
| 1369 testUnitElement = testUnit.element; | 1557 testUnitElement = testUnit.element; |
| 1370 testLibraryElement = testUnitElement.library; | 1558 testLibraryElement = testUnitElement.library; |
| 1371 indexDartUnit(store, context, testUnit); | 1559 indexDartUnit(store, context, testUnit); |
| 1372 // verify | 1560 // verify |
| 1373 _assertRecordedRelation(testLibraryElement, IndexConstants.IS_REFERENCED_BY, | 1561 _assertRecordedRelation( |
| 1562 testLibraryElement, |
| 1563 IndexConstants.IS_REFERENCED_BY, |
| 1374 _expectedLocation(testUnitElement, "lib;")); | 1564 _expectedLocation(testUnitElement, "lib;")); |
| 1375 } | 1565 } |
| 1376 | 1566 |
| 1377 void test_isReferencedBy_typeInVariableList() { | 1567 void test_isReferencedBy_typeInVariableList() { |
| 1378 _indexTestUnit(''' | 1568 _indexTestUnit(''' |
| 1379 class A {} | 1569 class A {} |
| 1380 A myVariable = null; | 1570 A myVariable = null; |
| 1381 '''); | 1571 '''); |
| 1382 // prepare elements | 1572 // prepare elements |
| 1383 Element classElementA = _findElement('A'); | 1573 Element classElementA = findElement('A'); |
| 1384 Element variableElement = _findElement('myVariable'); | 1574 Element variableElement = findElement('myVariable'); |
| 1385 // verify | 1575 // verify |
| 1386 _assertRecordedRelation(classElementA, IndexConstants.IS_REFERENCED_BY, | 1576 _assertRecordedRelation( |
| 1577 classElementA, |
| 1578 IndexConstants.IS_REFERENCED_BY, |
| 1387 _expectedLocation(variableElement, 'A myVariable')); | 1579 _expectedLocation(variableElement, 'A myVariable')); |
| 1388 } | 1580 } |
| 1389 | 1581 |
| 1390 void test_isWrittenBy_ParameterElement() { | 1582 void test_isWrittenBy_ParameterElement() { |
| 1391 _indexTestUnit(''' | 1583 _indexTestUnit(''' |
| 1392 main(var p) { | 1584 main(var p) { |
| 1393 p = 1; | 1585 p = 1; |
| 1394 }'''); | 1586 }'''); |
| 1395 // prepare elements | 1587 // prepare elements |
| 1396 Element mainElement = _findElement("main"); | 1588 Element mainElement = findElement("main"); |
| 1397 ParameterElement pElement = _findElement("p"); | 1589 ParameterElement pElement = findElement("p"); |
| 1398 // verify | 1590 // verify |
| 1399 _assertRecordedRelation(pElement, IndexConstants.IS_WRITTEN_BY, | 1591 _assertRecordedRelation( |
| 1592 pElement, |
| 1593 IndexConstants.IS_WRITTEN_BY, |
| 1400 _expectedLocation(mainElement, 'p = 1')); | 1594 _expectedLocation(mainElement, 'p = 1')); |
| 1401 } | 1595 } |
| 1402 | 1596 |
| 1403 void test_isWrittenBy_VariableElement() { | 1597 void test_isWrittenBy_VariableElement() { |
| 1404 _indexTestUnit(''' | 1598 _indexTestUnit(''' |
| 1405 main() { | 1599 main() { |
| 1406 var v = 0; | 1600 var v = 0; |
| 1407 v = 1; | 1601 v = 1; |
| 1408 }'''); | 1602 }'''); |
| 1409 // prepare elements | 1603 // prepare elements |
| 1410 Element mainElement = _findElement("main"); | 1604 Element mainElement = findElement("main"); |
| 1411 LocalVariableElement vElement = _findElement("v"); | 1605 LocalVariableElement vElement = findElement("v"); |
| 1412 // verify | 1606 // verify |
| 1413 _assertRecordedRelation(vElement, IndexConstants.IS_WRITTEN_BY, | 1607 _assertRecordedRelation( |
| 1608 vElement, |
| 1609 IndexConstants.IS_WRITTEN_BY, |
| 1414 _expectedLocation(mainElement, 'v = 1')); | 1610 _expectedLocation(mainElement, 'v = 1')); |
| 1415 } | 1611 } |
| 1416 | 1612 |
| 1417 void test_nameIsInvokedBy() { | 1613 void test_nameIsInvokedBy() { |
| 1418 _indexTestUnit(''' | 1614 _indexTestUnit(''' |
| 1419 class A { | 1615 class A { |
| 1420 test(x) {} | 1616 test(x) {} |
| 1421 } | 1617 } |
| 1422 main(A a, p) { | 1618 main(A a, p) { |
| 1423 a.test(1); | 1619 a.test(1); |
| 1424 p.test(2); | 1620 p.test(2); |
| 1425 }'''); | 1621 }'''); |
| 1426 // prepare elements | 1622 // prepare elements |
| 1427 Element mainElement = _findElement("main"); | 1623 Element mainElement = findElement("main"); |
| 1428 Element nameElement = new NameElement('test'); | 1624 Element nameElement = new NameElement('test'); |
| 1429 // verify | 1625 // verify |
| 1430 _assertRecordedRelation(nameElement, | 1626 _assertRecordedRelation( |
| 1431 IndexConstants.NAME_IS_INVOKED_BY_RESOLVED, _expectedLocation(mainElemen
t, | 1627 nameElement, |
| 1432 'test(1)')); | 1628 IndexConstants.NAME_IS_INVOKED_BY_RESOLVED, |
| 1433 _assertRecordedRelation(nameElement, | 1629 _expectedLocation(mainElement, 'test(1)')); |
| 1434 IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED, _expectedLocation(mainElem
ent, | 1630 _assertRecordedRelation( |
| 1435 'test(2)')); | 1631 nameElement, |
| 1436 _assertNoRecordedRelation(nameElement, | 1632 IndexConstants.NAME_IS_INVOKED_BY_UNRESOLVED, |
| 1437 IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _expectedLocation(mainElement
, | 1633 _expectedLocation(mainElement, 'test(2)')); |
| 1438 'test(2)')); | 1634 _assertNoRecordedRelation( |
| 1635 nameElement, |
| 1636 IndexConstants.NAME_IS_READ_BY_UNRESOLVED, |
| 1637 _expectedLocation(mainElement, 'test(2)')); |
| 1439 } | 1638 } |
| 1440 | 1639 |
| 1441 void test_nameIsReadBy() { | 1640 void test_nameIsReadBy() { |
| 1442 _indexTestUnit(''' | 1641 _indexTestUnit(''' |
| 1443 class A { | 1642 class A { |
| 1444 var test; | 1643 var test; |
| 1445 } | 1644 } |
| 1446 main(A a, p) { | 1645 main(A a, p) { |
| 1447 print(a.test); // a | 1646 print(a.test); // a |
| 1448 print(p.test); // p | 1647 print(p.test); // p |
| 1449 }'''); | 1648 }'''); |
| 1450 // prepare elements | 1649 // prepare elements |
| 1451 Element mainElement = _findElement("main"); | 1650 Element mainElement = findElement("main"); |
| 1452 Element nameElement = new NameElement('test'); | 1651 Element nameElement = new NameElement('test'); |
| 1453 // verify | 1652 // verify |
| 1454 _assertRecordedRelation(nameElement, | 1653 _assertRecordedRelation( |
| 1455 IndexConstants.NAME_IS_READ_BY_RESOLVED, _expectedLocation(mainElement, | 1654 nameElement, |
| 1456 'test); // a')); | 1655 IndexConstants.NAME_IS_READ_BY_RESOLVED, |
| 1457 _assertRecordedRelation(nameElement, | 1656 _expectedLocation(mainElement, 'test); // a')); |
| 1458 IndexConstants.NAME_IS_READ_BY_UNRESOLVED, _expectedLocation(mainElement
, | 1657 _assertRecordedRelation( |
| 1459 'test); // p')); | 1658 nameElement, |
| 1659 IndexConstants.NAME_IS_READ_BY_UNRESOLVED, |
| 1660 _expectedLocation(mainElement, 'test); // p')); |
| 1460 } | 1661 } |
| 1461 | 1662 |
| 1462 void test_nameIsReadWrittenBy() { | 1663 void test_nameIsReadWrittenBy() { |
| 1463 _indexTestUnit(''' | 1664 _indexTestUnit(''' |
| 1464 class A { | 1665 class A { |
| 1465 var test; | 1666 var test; |
| 1466 } | 1667 } |
| 1467 main(A a, p) { | 1668 main(A a, p) { |
| 1468 a.test += 1; | 1669 a.test += 1; |
| 1469 p.test += 2; | 1670 p.test += 2; |
| 1470 }'''); | 1671 }'''); |
| 1471 // prepare elements | 1672 // prepare elements |
| 1472 Element mainElement = _findElement("main"); | 1673 Element mainElement = findElement("main"); |
| 1473 Element nameElement = new NameElement('test'); | 1674 Element nameElement = new NameElement('test'); |
| 1474 // verify | 1675 // verify |
| 1475 _assertRecordedRelation(nameElement, | 1676 _assertRecordedRelation( |
| 1476 IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED, _expectedLocation(mainE
lement, | 1677 nameElement, |
| 1477 'test += 1')); | 1678 IndexConstants.NAME_IS_READ_WRITTEN_BY_RESOLVED, |
| 1478 _assertRecordedRelation(nameElement, | 1679 _expectedLocation(mainElement, 'test += 1')); |
| 1479 IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED, _expectedLocation( | 1680 _assertRecordedRelation( |
| 1480 mainElement, 'test += 2')); | 1681 nameElement, |
| 1682 IndexConstants.NAME_IS_READ_WRITTEN_BY_UNRESOLVED, |
| 1683 _expectedLocation(mainElement, 'test += 2')); |
| 1481 } | 1684 } |
| 1482 | 1685 |
| 1483 void test_nameIsWrittenBy() { | 1686 void test_nameIsWrittenBy() { |
| 1484 _indexTestUnit(''' | 1687 _indexTestUnit(''' |
| 1485 class A { | 1688 class A { |
| 1486 var test; | 1689 var test; |
| 1487 } | 1690 } |
| 1488 main(A a, p) { | 1691 main(A a, p) { |
| 1489 a.test = 1; | 1692 a.test = 1; |
| 1490 p.test = 2; | 1693 p.test = 2; |
| 1491 }'''); | 1694 }'''); |
| 1492 // prepare elements | 1695 // prepare elements |
| 1493 Element mainElement = _findElement("main"); | 1696 Element mainElement = findElement("main"); |
| 1494 Element nameElement = new NameElement('test'); | 1697 Element nameElement = new NameElement('test'); |
| 1495 // verify | 1698 // verify |
| 1496 _assertRecordedRelation(nameElement, | 1699 _assertRecordedRelation( |
| 1497 IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED, _expectedLocation(mainElemen
t, | 1700 nameElement, |
| 1498 'test = 1')); | 1701 IndexConstants.NAME_IS_WRITTEN_BY_RESOLVED, |
| 1499 _assertRecordedRelation(nameElement, | 1702 _expectedLocation(mainElement, 'test = 1')); |
| 1500 IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED, _expectedLocation(mainElem
ent, | 1703 _assertRecordedRelation( |
| 1501 'test = 2')); | 1704 nameElement, |
| 1705 IndexConstants.NAME_IS_WRITTEN_BY_UNRESOLVED, |
| 1706 _expectedLocation(mainElement, 'test = 2')); |
| 1502 } | 1707 } |
| 1503 | 1708 |
| 1504 void test_nullUnit() { | 1709 void test_nullUnit() { |
| 1505 indexDartUnit(store, context, null); | 1710 indexDartUnit(store, context, null); |
| 1506 } | 1711 } |
| 1507 | 1712 |
| 1508 void test_nullUnitElement() { | 1713 void test_nullUnitElement() { |
| 1509 CompilationUnit unit = new CompilationUnit(null, null, [], [], null); | 1714 CompilationUnit unit = new CompilationUnit(null, null, [], [], null); |
| 1510 indexDartUnit(store, context, unit); | 1715 indexDartUnit(store, context, unit); |
| 1511 } | 1716 } |
| 1512 | 1717 |
| 1513 void _assertDefinesTopLevelElement(Relationship relationship, | 1718 void _assertDefinesTopLevelElement(Relationship relationship, |
| 1514 ExpectedLocation expectedLocation) { | 1719 ExpectedLocation expectedLocation) { |
| 1515 _assertRecordedRelation(testLibraryElement, relationship, expectedLocation); | 1720 _assertRecordedRelation(testLibraryElement, relationship, expectedLocation); |
| 1516 _assertRecordedRelation(UniverseElement.INSTANCE, relationship, | 1721 _assertRecordedRelation( |
| 1722 UniverseElement.INSTANCE, |
| 1723 relationship, |
| 1517 expectedLocation); | 1724 expectedLocation); |
| 1518 } | 1725 } |
| 1519 | 1726 |
| 1520 void _assertNoErrorsInSource() { | |
| 1521 List<AnalysisError> errors = context.getErrors(testSource).errors; | |
| 1522 expect(errors, isEmpty); | |
| 1523 } | |
| 1524 | |
| 1525 /** | 1727 /** |
| 1526 * Asserts that [recordedRelations] has no item with the specified properties. | 1728 * Asserts that [recordedRelations] has no item with the specified properties. |
| 1527 */ | 1729 */ |
| 1528 void _assertNoRecordedRelation(Element element, Relationship relationship, | 1730 void _assertNoRecordedRelation(Element element, Relationship relationship, |
| 1529 ExpectedLocation location) { | 1731 ExpectedLocation location) { |
| 1530 for (RecordedRelation recordedRelation in recordedRelations) { | 1732 for (RecordedRelation recordedRelation in recordedRelations) { |
| 1531 if (_equalsRecordedRelation(recordedRelation, element, relationship, | 1733 if (_equalsRecordedRelation( |
| 1734 recordedRelation, |
| 1735 element, |
| 1736 relationship, |
| 1532 location)) { | 1737 location)) { |
| 1533 fail('not expected: ${recordedRelation} in\n' + recordedRelations.join( | 1738 fail( |
| 1534 '\n')); | 1739 'not expected: ${recordedRelation} in\n' + recordedRelations.join('\
n')); |
| 1535 } | 1740 } |
| 1536 } | 1741 } |
| 1537 } | 1742 } |
| 1538 | 1743 |
| 1539 /** | 1744 /** |
| 1540 * Asserts that [recordedRelations] has an item with the expected properties. | 1745 * Asserts that [recordedRelations] has an item with the expected properties. |
| 1541 */ | 1746 */ |
| 1542 Location _assertRecordedRelation(Element expectedElement, | 1747 Location _assertRecordedRelation(Element expectedElement, |
| 1543 Relationship expectedRelationship, ExpectedLocation expectedLocation) { | 1748 Relationship expectedRelationship, ExpectedLocation expectedLocation) { |
| 1544 for (RecordedRelation recordedRelation in recordedRelations) { | 1749 for (RecordedRelation recordedRelation in recordedRelations) { |
| 1545 if (_equalsRecordedRelation(recordedRelation, expectedElement, | 1750 if (_equalsRecordedRelation( |
| 1546 expectedRelationship, expectedLocation)) { | 1751 recordedRelation, |
| 1752 expectedElement, |
| 1753 expectedRelationship, |
| 1754 expectedLocation)) { |
| 1547 return recordedRelation.location; | 1755 return recordedRelation.location; |
| 1548 } | 1756 } |
| 1549 } | 1757 } |
| 1550 fail("not found\n$expectedElement $expectedRelationship " | 1758 fail( |
| 1551 "in $expectedLocation in\n" + recordedRelations.join('\n')); | 1759 "not found\n$expectedElement $expectedRelationship " "in $expectedLocati
on in\n" |
| 1760 + |
| 1761 recordedRelations.join('\n')); |
| 1552 return null; | 1762 return null; |
| 1553 } | 1763 } |
| 1554 | 1764 |
| 1555 ExpectedLocation _expectedLocation(Element element, String search, [int length | 1765 ExpectedLocation _expectedLocation(Element element, String search, [int length |
| 1556 = -1]) { | 1766 = -1]) { |
| 1557 int offset = _findOffset(search); | 1767 int offset = findOffset(search); |
| 1558 if (length == -1) { | 1768 if (length == -1) { |
| 1559 length = _getLeadingIdentifierLength(search); | 1769 length = getLeadingIdentifierLength(search); |
| 1560 } | 1770 } |
| 1561 return new ExpectedLocation(element, offset, length); | 1771 return new ExpectedLocation(element, offset, length); |
| 1562 } | 1772 } |
| 1563 | 1773 |
| 1564 Element _findElement(String name, [ElementKind kind]) { | |
| 1565 return findChildElement(testUnitElement, name, kind); | |
| 1566 } | |
| 1567 | |
| 1568 AstNode _findNodeAtOffset(int offset, [Predicate<AstNode> predicate]) { | |
| 1569 AstNode result = new NodeLocator.con1(offset).searchWithin(testUnit); | |
| 1570 if (result != null && predicate != null) { | |
| 1571 result = result.getAncestor(predicate); | |
| 1572 } | |
| 1573 return result; | |
| 1574 } | |
| 1575 | |
| 1576 AstNode _findNodeAtString(String search, [Predicate<AstNode> predicate]) { | |
| 1577 int offset = _findOffset(search); | |
| 1578 return _findNodeAtOffset(offset, predicate); | |
| 1579 } | |
| 1580 | |
| 1581 Element _findNodeElementAtString(String search, | |
| 1582 [Predicate<AstNode> predicate]) { | |
| 1583 AstNode node = _findNodeAtString(search, predicate); | |
| 1584 if (node == null) { | |
| 1585 return null; | |
| 1586 } | |
| 1587 return ElementLocator.locate(node); | |
| 1588 } | |
| 1589 | |
| 1590 int _findOffset(String search) { | |
| 1591 int offset = testCode.indexOf(search); | |
| 1592 expect(offset, isNonNegative, reason: "Not found '$search' in\n$testCode"); | |
| 1593 return offset; | |
| 1594 } | |
| 1595 | |
| 1596 void _indexTestUnit(String code) { | 1774 void _indexTestUnit(String code) { |
| 1597 testCode = code; | 1775 resolveTestUnit(code); |
| 1598 testSource = addSource('/test.dart', code); | |
| 1599 testUnit = resolveLibraryUnit(testSource); | |
| 1600 if (verifyNoTestUnitErrors) { | |
| 1601 _assertNoErrorsInSource(); | |
| 1602 } | |
| 1603 testUnitElement = testUnit.element; | |
| 1604 testLibraryElement = testUnitElement.library; | |
| 1605 indexDartUnit(store, context, testUnit); | 1776 indexDartUnit(store, context, testUnit); |
| 1606 } | 1777 } |
| 1607 } | 1778 } |
| 1608 | 1779 |
| 1609 class ExpectedLocation { | 1780 class ExpectedLocation { |
| 1610 Element element; | 1781 Element element; |
| 1611 int offset; | 1782 int offset; |
| 1612 int length; | 1783 int length; |
| 1613 | 1784 |
| 1614 ExpectedLocation(this.element, this.offset, this.length); | 1785 ExpectedLocation(this.element, this.offset, this.length); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1633 final Location location; | 1804 final Location location; |
| 1634 | 1805 |
| 1635 RecordedRelation(this.element, this.relationship, this.location); | 1806 RecordedRelation(this.element, this.relationship, this.location); |
| 1636 | 1807 |
| 1637 @override | 1808 @override |
| 1638 String toString() { | 1809 String toString() { |
| 1639 return 'RecordedRelation(element=$element; relationship=$relationship; ' | 1810 return 'RecordedRelation(element=$element; relationship=$relationship; ' |
| 1640 'location=$location)'; | 1811 'location=$location)'; |
| 1641 } | 1812 } |
| 1642 } | 1813 } |
| OLD | NEW |