| 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.search.element_references; | 5 library test.search.element_references; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/src/computer/element.dart'; | 9 import 'package:analysis_server/src/computer/element.dart'; |
| 10 import 'package:analysis_server/src/constants.dart'; | 10 import 'package:analysis_server/src/constants.dart'; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 groupSep = ' | '; | 23 groupSep = ' | '; |
| 24 group('findElementReferences', () { | 24 group('findElementReferences', () { |
| 25 runReflectiveTests(ElementReferencesTest); | 25 runReflectiveTests(ElementReferencesTest); |
| 26 }); | 26 }); |
| 27 } | 27 } |
| 28 | 28 |
| 29 | 29 |
| 30 @ReflectiveTestCase() | 30 @ReflectiveTestCase() |
| 31 class ElementReferencesTest extends AbstractAnalysisTest { | 31 class ElementReferencesTest extends AbstractAnalysisTest { |
| 32 String searchId; | 32 String searchId; |
| 33 Element searchElement; |
| 33 bool searchDone = false; | 34 bool searchDone = false; |
| 34 List<SearchResult> results = <SearchResult>[]; | 35 List<SearchResult> results = <SearchResult>[]; |
| 35 SearchResult result; | 36 SearchResult result; |
| 36 | 37 |
| 37 void assertHasResult(SearchResultKind kind, String search, [int length]) { | 38 void assertHasResult(SearchResultKind kind, String search, [int length]) { |
| 38 int offset = findOffset(search); | 39 int offset = findOffset(search); |
| 39 if (length == null) { | 40 if (length == null) { |
| 40 length = findIdentifierLength(search); | 41 length = findIdentifierLength(search); |
| 41 } | 42 } |
| 42 findResult(kind, testFile, offset, length, true); | 43 findResult(kind, testFile, offset, length, true); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 57 | 58 |
| 58 Future findElementReferences(String search, bool includePotential) { | 59 Future findElementReferences(String search, bool includePotential) { |
| 59 int offset = findOffset(search); | 60 int offset = findOffset(search); |
| 60 return waitForTasksFinished().then((_) { | 61 return waitForTasksFinished().then((_) { |
| 61 Request request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES); | 62 Request request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES); |
| 62 request.setParameter(FILE, testFile); | 63 request.setParameter(FILE, testFile); |
| 63 request.setParameter(OFFSET, offset); | 64 request.setParameter(OFFSET, offset); |
| 64 request.setParameter(INCLUDE_POTENTIAL, includePotential); | 65 request.setParameter(INCLUDE_POTENTIAL, includePotential); |
| 65 Response response = handleSuccessfulRequest(request); | 66 Response response = handleSuccessfulRequest(request); |
| 66 searchId = response.getResult(ID); | 67 searchId = response.getResult(ID); |
| 68 searchElement = response.getResult(ELEMENT); |
| 67 results.clear(); | 69 results.clear(); |
| 68 return _waitForSearchResults(); | 70 return _waitForSearchResults(); |
| 69 }); | 71 }); |
| 70 } | 72 } |
| 71 | 73 |
| 72 void findResult(SearchResultKind kind, String file, int offset, int length, | 74 void findResult(SearchResultKind kind, String file, int offset, int length, |
| 73 bool expected) { | 75 bool expected) { |
| 74 for (SearchResult result in results) { | 76 for (SearchResult result in results) { |
| 75 Location location = result.location; | 77 Location location = result.location; |
| 76 if (result.kind == kind && | 78 if (result.kind == kind && |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 addTestFile(''' | 122 addTestFile(''' |
| 121 class A { | 123 class A { |
| 122 A.named(p); | 124 A.named(p); |
| 123 } | 125 } |
| 124 main() { | 126 main() { |
| 125 new A.named(1); | 127 new A.named(1); |
| 126 new A.named(2); | 128 new A.named(2); |
| 127 } | 129 } |
| 128 '''); | 130 '''); |
| 129 return findElementReferences('named(p)', false).then((_) { | 131 return findElementReferences('named(p)', false).then((_) { |
| 132 expect(searchElement.kind, ElementKind.CONSTRUCTOR); |
| 130 assertHasResult(SearchResultKind.REFERENCE, '.named(1)', 6); | 133 assertHasResult(SearchResultKind.REFERENCE, '.named(1)', 6); |
| 131 assertHasResult(SearchResultKind.REFERENCE, '.named(2)', 6); | 134 assertHasResult(SearchResultKind.REFERENCE, '.named(2)', 6); |
| 132 }); | 135 }); |
| 133 } | 136 } |
| 134 | 137 |
| 135 test_constructor_unamed() { | 138 test_constructor_unamed() { |
| 136 addTestFile(''' | 139 addTestFile(''' |
| 137 class A { | 140 class A { |
| 138 A(p); | 141 A(p); |
| 139 } | 142 } |
| 140 main() { | 143 main() { |
| 141 new A(1); | 144 new A(1); |
| 142 new A(2); | 145 new A(2); |
| 143 } | 146 } |
| 144 '''); | 147 '''); |
| 145 return findElementReferences('A(p)', false).then((_) { | 148 return findElementReferences('A(p)', false).then((_) { |
| 149 expect(searchElement.kind, ElementKind.CONSTRUCTOR); |
| 146 assertHasResult(SearchResultKind.REFERENCE, '(1)', 0); | 150 assertHasResult(SearchResultKind.REFERENCE, '(1)', 0); |
| 147 assertHasResult(SearchResultKind.REFERENCE, '(2)', 0); | 151 assertHasResult(SearchResultKind.REFERENCE, '(2)', 0); |
| 148 }); | 152 }); |
| 149 } | 153 } |
| 150 | 154 |
| 151 test_field_explicit() { | 155 test_field_explicit() { |
| 152 addTestFile(''' | 156 addTestFile(''' |
| 153 class A { | 157 class A { |
| 154 var fff; // declaration | 158 var fff; // declaration |
| 155 A(this.fff); // in constructor | 159 A(this.fff); // in constructor |
| 156 m() { | 160 m() { |
| 157 fff = 2; | 161 fff = 2; |
| 158 fff += 3; | 162 fff += 3; |
| 159 print(fff); // in m() | 163 print(fff); // in m() |
| 160 fff(); // in m() | 164 fff(); // in m() |
| 161 } | 165 } |
| 162 } | 166 } |
| 163 main(A a) { | 167 main(A a) { |
| 164 a.fff = 20; | 168 a.fff = 20; |
| 165 a.fff += 30; | 169 a.fff += 30; |
| 166 print(a.fff); // in main() | 170 print(a.fff); // in main() |
| 167 a.fff(); // in main() | 171 a.fff(); // in main() |
| 168 } | 172 } |
| 169 '''); | 173 '''); |
| 170 return findElementReferences('fff; // declaration', false).then((_) { | 174 return findElementReferences('fff; // declaration', false).then((_) { |
| 175 expect(searchElement.kind, ElementKind.FIELD); |
| 171 expect(results, hasLength(10)); | 176 expect(results, hasLength(10)); |
| 172 assertHasResult(SearchResultKind.DECLARATION, 'fff; // declaration'); | 177 assertHasResult(SearchResultKind.DECLARATION, 'fff; // declaration'); |
| 173 assertHasResult(SearchResultKind.REFERENCE, 'fff); // in constructor'); | 178 assertHasResult(SearchResultKind.REFERENCE, 'fff); // in constructor'); |
| 174 // m() | 179 // m() |
| 175 assertHasResult(SearchResultKind.WRITE, 'fff = 2;'); | 180 assertHasResult(SearchResultKind.WRITE, 'fff = 2;'); |
| 176 assertHasResult(SearchResultKind.WRITE, 'fff += 3;'); | 181 assertHasResult(SearchResultKind.WRITE, 'fff += 3;'); |
| 177 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); | 182 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); |
| 178 assertHasResult(SearchResultKind.INVOCATION, 'fff(); // in m()'); | 183 assertHasResult(SearchResultKind.INVOCATION, 'fff(); // in m()'); |
| 179 // main() | 184 // main() |
| 180 assertHasResult(SearchResultKind.WRITE, 'fff = 20;'); | 185 assertHasResult(SearchResultKind.WRITE, 'fff = 20;'); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 193 print(fff); // in m() | 198 print(fff); // in m() |
| 194 fff = 1; | 199 fff = 1; |
| 195 } | 200 } |
| 196 } | 201 } |
| 197 main(A a) { | 202 main(A a) { |
| 198 print(a.fff); // in main() | 203 print(a.fff); // in main() |
| 199 a.fff = 10; | 204 a.fff = 10; |
| 200 } | 205 } |
| 201 '''); | 206 '''); |
| 202 var forGetter = findElementReferences('fff =>', false).then((_) { | 207 var forGetter = findElementReferences('fff =>', false).then((_) { |
| 208 expect(searchElement.kind, ElementKind.FIELD); |
| 203 expect(results, hasLength(4)); | 209 expect(results, hasLength(4)); |
| 204 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); | 210 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); |
| 205 assertHasResult(SearchResultKind.WRITE, 'fff = 1;'); | 211 assertHasResult(SearchResultKind.WRITE, 'fff = 1;'); |
| 206 assertHasResult(SearchResultKind.READ, 'fff); // in main()'); | 212 assertHasResult(SearchResultKind.READ, 'fff); // in main()'); |
| 207 assertHasResult(SearchResultKind.WRITE, 'fff = 10;'); | 213 assertHasResult(SearchResultKind.WRITE, 'fff = 10;'); |
| 208 }); | 214 }); |
| 209 var forSetter = findElementReferences('fff(x) {}', false).then((_) { | 215 var forSetter = findElementReferences('fff(x) {}', false).then((_) { |
| 210 expect(results, hasLength(4)); | 216 expect(results, hasLength(4)); |
| 211 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); | 217 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); |
| 212 assertHasResult(SearchResultKind.WRITE, 'fff = 1;'); | 218 assertHasResult(SearchResultKind.WRITE, 'fff = 1;'); |
| 213 assertHasResult(SearchResultKind.READ, 'fff); // in main()'); | 219 assertHasResult(SearchResultKind.READ, 'fff); // in main()'); |
| 214 assertHasResult(SearchResultKind.WRITE, 'fff = 10;'); | 220 assertHasResult(SearchResultKind.WRITE, 'fff = 10;'); |
| 215 }); | 221 }); |
| 216 return Future.wait([forGetter, forSetter]); | 222 return Future.wait([forGetter, forSetter]); |
| 217 } | 223 } |
| 218 | 224 |
| 219 test_field_inFormalParameter() { | 225 test_field_inFormalParameter() { |
| 220 addTestFile(''' | 226 addTestFile(''' |
| 221 class A { | 227 class A { |
| 222 var fff; // declaration | 228 var fff; // declaration |
| 223 A(this.fff); // in constructor | 229 A(this.fff); // in constructor |
| 224 m() { | 230 m() { |
| 225 fff = 2; | 231 fff = 2; |
| 226 print(fff); // in m() | 232 print(fff); // in m() |
| 227 } | 233 } |
| 228 } | 234 } |
| 229 '''); | 235 '''); |
| 230 return findElementReferences('fff); // in constructor', false).then((_) { | 236 return findElementReferences('fff); // in constructor', false).then((_) { |
| 237 expect(searchElement.kind, ElementKind.FIELD); |
| 231 expect(results, hasLength(4)); | 238 expect(results, hasLength(4)); |
| 232 assertHasResult(SearchResultKind.DECLARATION, 'fff; // declaration'); | 239 assertHasResult(SearchResultKind.DECLARATION, 'fff; // declaration'); |
| 233 assertHasResult(SearchResultKind.REFERENCE, 'fff); // in constructor'); | 240 assertHasResult(SearchResultKind.REFERENCE, 'fff); // in constructor'); |
| 234 assertHasResult(SearchResultKind.WRITE, 'fff = 2;'); | 241 assertHasResult(SearchResultKind.WRITE, 'fff = 2;'); |
| 235 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); | 242 assertHasResult(SearchResultKind.READ, 'fff); // in m()'); |
| 236 }); | 243 }); |
| 237 } | 244 } |
| 238 | 245 |
| 239 test_function() { | 246 test_function() { |
| 240 addTestFile(''' | 247 addTestFile(''' |
| 241 fff(p) {} | 248 fff(p) {} |
| 242 main() { | 249 main() { |
| 243 fff(1); | 250 fff(1); |
| 244 print(fff); | 251 print(fff); |
| 245 } | 252 } |
| 246 '''); | 253 '''); |
| 247 return findElementReferences('fff(p) {}', false).then((_) { | 254 return findElementReferences('fff(p) {}', false).then((_) { |
| 255 expect(searchElement.kind, ElementKind.FUNCTION); |
| 248 expect(results, hasLength(2)); | 256 expect(results, hasLength(2)); |
| 249 assertHasResult(SearchResultKind.INVOCATION, 'fff(1)'); | 257 assertHasResult(SearchResultKind.INVOCATION, 'fff(1)'); |
| 250 assertHasResult(SearchResultKind.REFERENCE, 'fff);'); | 258 assertHasResult(SearchResultKind.REFERENCE, 'fff);'); |
| 251 }); | 259 }); |
| 252 } | 260 } |
| 253 | 261 |
| 254 test_hierarchy_field_explicit() { | 262 test_hierarchy_field_explicit() { |
| 255 addTestFile(''' | 263 addTestFile(''' |
| 256 class A { | 264 class A { |
| 257 int fff; // in A | 265 int fff; // in A |
| 258 } | 266 } |
| 259 class B extends A { | 267 class B extends A { |
| 260 int fff; // in B | 268 int fff; // in B |
| 261 } | 269 } |
| 262 class C extends B { | 270 class C extends B { |
| 263 int fff; // in C | 271 int fff; // in C |
| 264 } | 272 } |
| 265 main(A a, B b, C c) { | 273 main(A a, B b, C c) { |
| 266 a.fff = 10; | 274 a.fff = 10; |
| 267 b.fff = 20; | 275 b.fff = 20; |
| 268 c.fff = 30; | 276 c.fff = 30; |
| 269 } | 277 } |
| 270 '''); | 278 '''); |
| 271 return findElementReferences('fff; // in B', false).then((_) { | 279 return findElementReferences('fff; // in B', false).then((_) { |
| 280 expect(searchElement.kind, ElementKind.FIELD); |
| 272 assertHasResult(SearchResultKind.DECLARATION, 'fff; // in A'); | 281 assertHasResult(SearchResultKind.DECLARATION, 'fff; // in A'); |
| 273 assertHasResult(SearchResultKind.DECLARATION, 'fff; // in B'); | 282 assertHasResult(SearchResultKind.DECLARATION, 'fff; // in B'); |
| 274 assertHasResult(SearchResultKind.DECLARATION, 'fff; // in C'); | 283 assertHasResult(SearchResultKind.DECLARATION, 'fff; // in C'); |
| 275 assertHasResult(SearchResultKind.WRITE, 'fff = 10;'); | 284 assertHasResult(SearchResultKind.WRITE, 'fff = 10;'); |
| 276 assertHasResult(SearchResultKind.WRITE, 'fff = 20;'); | 285 assertHasResult(SearchResultKind.WRITE, 'fff = 20;'); |
| 277 assertHasResult(SearchResultKind.WRITE, 'fff = 30;'); | 286 assertHasResult(SearchResultKind.WRITE, 'fff = 30;'); |
| 278 }); | 287 }); |
| 279 } | 288 } |
| 280 | 289 |
| 281 test_hierarchy_method() { | 290 test_hierarchy_method() { |
| 282 addTestFile(''' | 291 addTestFile(''' |
| 283 class A { | 292 class A { |
| 284 mmm() {} // in A | 293 mmm() {} // in A |
| 285 } | 294 } |
| 286 class B extends A { | 295 class B extends A { |
| 287 mmm() {} // in B | 296 mmm() {} // in B |
| 288 } | 297 } |
| 289 class C extends B { | 298 class C extends B { |
| 290 mmm() {} // in C | 299 mmm() {} // in C |
| 291 } | 300 } |
| 292 main(A a, B b, C c) { | 301 main(A a, B b, C c) { |
| 293 a.mmm(10); | 302 a.mmm(10); |
| 294 b.mmm(20); | 303 b.mmm(20); |
| 295 c.mmm(30); | 304 c.mmm(30); |
| 296 } | 305 } |
| 297 '''); | 306 '''); |
| 298 return findElementReferences('mmm() {} // in B', false).then((_) { | 307 return findElementReferences('mmm() {} // in B', false).then((_) { |
| 308 expect(searchElement.kind, ElementKind.METHOD); |
| 299 assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)'); | 309 assertHasResult(SearchResultKind.INVOCATION, 'mmm(10)'); |
| 300 assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)'); | 310 assertHasResult(SearchResultKind.INVOCATION, 'mmm(20)'); |
| 301 assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)'); | 311 assertHasResult(SearchResultKind.INVOCATION, 'mmm(30)'); |
| 302 }); | 312 }); |
| 303 } | 313 } |
| 304 | 314 |
| 305 test_localVariable() { | 315 test_localVariable() { |
| 306 addTestFile(''' | 316 addTestFile(''' |
| 307 main() { | 317 main() { |
| 308 var vvv = 1; | 318 var vvv = 1; |
| 309 print(vvv); | 319 print(vvv); |
| 310 vvv += 3; | 320 vvv += 3; |
| 311 vvv = 2; | 321 vvv = 2; |
| 312 vvv(); | 322 vvv(); |
| 313 } | 323 } |
| 314 '''); | 324 '''); |
| 315 return findElementReferences('vvv = 1', false).then((_) { | 325 return findElementReferences('vvv = 1', false).then((_) { |
| 326 expect(searchElement.kind, ElementKind.LOCAL_VARIABLE); |
| 316 expect(results, hasLength(5)); | 327 expect(results, hasLength(5)); |
| 317 assertHasResult(SearchResultKind.DECLARATION, 'vvv = 1'); | 328 assertHasResult(SearchResultKind.DECLARATION, 'vvv = 1'); |
| 318 assertHasResult(SearchResultKind.READ, 'vvv);'); | 329 assertHasResult(SearchResultKind.READ, 'vvv);'); |
| 319 assertHasResult(SearchResultKind.READ_WRITE, 'vvv += 3'); | 330 assertHasResult(SearchResultKind.READ_WRITE, 'vvv += 3'); |
| 320 assertHasResult(SearchResultKind.WRITE, 'vvv = 2'); | 331 assertHasResult(SearchResultKind.WRITE, 'vvv = 2'); |
| 321 assertHasResult(SearchResultKind.INVOCATION, 'vvv();'); | 332 assertHasResult(SearchResultKind.INVOCATION, 'vvv();'); |
| 322 }); | 333 }); |
| 323 } | 334 } |
| 324 | 335 |
| 325 test_method() { | 336 test_method() { |
| 326 addTestFile(''' | 337 addTestFile(''' |
| 327 class A { | 338 class A { |
| 328 mmm(p) {} | 339 mmm(p) {} |
| 329 m() { | 340 m() { |
| 330 mmm(1); | 341 mmm(1); |
| 331 print(mmm); // in m() | 342 print(mmm); // in m() |
| 332 } | 343 } |
| 333 } | 344 } |
| 334 main(A a) { | 345 main(A a) { |
| 335 a.mmm(10); | 346 a.mmm(10); |
| 336 print(a.mmm); // in main() | 347 print(a.mmm); // in main() |
| 337 } | 348 } |
| 338 '''); | 349 '''); |
| 339 return findElementReferences('mmm(p) {}', false).then((_) { | 350 return findElementReferences('mmm(p) {}', false).then((_) { |
| 351 expect(searchElement.kind, ElementKind.METHOD); |
| 340 expect(results, hasLength(4)); | 352 expect(results, hasLength(4)); |
| 341 assertHasResult(SearchResultKind.INVOCATION, 'mmm(1);'); | 353 assertHasResult(SearchResultKind.INVOCATION, 'mmm(1);'); |
| 342 assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in m()'); | 354 assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in m()'); |
| 343 assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);'); | 355 assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);'); |
| 344 assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in main()'); | 356 assertHasResult(SearchResultKind.REFERENCE, 'mmm); // in main()'); |
| 345 }); | 357 }); |
| 346 } | 358 } |
| 347 | 359 |
| 348 test_method_propagatedType() { | 360 test_method_propagatedType() { |
| 349 addTestFile(''' | 361 addTestFile(''' |
| 350 class A { | 362 class A { |
| 351 mmm(p) {} | 363 mmm(p) {} |
| 352 } | 364 } |
| 353 main() { | 365 main() { |
| 354 var a = new A(); | 366 var a = new A(); |
| 355 a.mmm(10); | 367 a.mmm(10); |
| 356 print(a.mmm); | 368 print(a.mmm); |
| 357 } | 369 } |
| 358 '''); | 370 '''); |
| 359 return findElementReferences('mmm(p) {}', false).then((_) { | 371 return findElementReferences('mmm(p) {}', false).then((_) { |
| 372 expect(searchElement.kind, ElementKind.METHOD); |
| 360 expect(results, hasLength(2)); | 373 expect(results, hasLength(2)); |
| 361 assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);'); | 374 assertHasResult(SearchResultKind.INVOCATION, 'mmm(10);'); |
| 362 assertHasResult(SearchResultKind.REFERENCE, 'mmm);'); | 375 assertHasResult(SearchResultKind.REFERENCE, 'mmm);'); |
| 363 }); | 376 }); |
| 364 } | 377 } |
| 365 | 378 |
| 366 test_oneUnit_twoLibraries() { | 379 test_oneUnit_twoLibraries() { |
| 367 var pathA = '/project/bin/libA.dart'; | 380 var pathA = '/project/bin/libA.dart'; |
| 368 var pathB = '/project/bin/libB.dart'; | 381 var pathB = '/project/bin/libB.dart'; |
| 369 var codeA = ''' | 382 var codeA = ''' |
| (...skipping 10 matching lines...) Expand all Loading... |
| 380 fff(2); | 393 fff(2); |
| 381 } | 394 } |
| 382 '''; | 395 '''; |
| 383 addFile(pathA, codeA); | 396 addFile(pathA, codeA); |
| 384 addFile(pathB, codeB); | 397 addFile(pathB, codeB); |
| 385 addTestFile(''' | 398 addTestFile(''' |
| 386 part of lib; | 399 part of lib; |
| 387 fff(p) {} | 400 fff(p) {} |
| 388 '''); | 401 '''); |
| 389 return findElementReferences('fff(p) {}', false).then((_) { | 402 return findElementReferences('fff(p) {}', false).then((_) { |
| 403 expect(searchElement.kind, ElementKind.FUNCTION); |
| 390 expect(results, hasLength(2)); | 404 expect(results, hasLength(2)); |
| 391 findResult( | 405 findResult( |
| 392 SearchResultKind.INVOCATION, | 406 SearchResultKind.INVOCATION, |
| 393 pathA, | 407 pathA, |
| 394 codeA.indexOf('fff(1)'), | 408 codeA.indexOf('fff(1)'), |
| 395 3, | 409 3, |
| 396 true); | 410 true); |
| 397 findResult( | 411 findResult( |
| 398 SearchResultKind.INVOCATION, | 412 SearchResultKind.INVOCATION, |
| 399 pathB, | 413 pathB, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 419 test_parameter() { | 433 test_parameter() { |
| 420 addTestFile(''' | 434 addTestFile(''' |
| 421 main(ppp) { | 435 main(ppp) { |
| 422 print(ppp); | 436 print(ppp); |
| 423 ppp += 3; | 437 ppp += 3; |
| 424 ppp = 2; | 438 ppp = 2; |
| 425 ppp(); | 439 ppp(); |
| 426 } | 440 } |
| 427 '''); | 441 '''); |
| 428 return findElementReferences('ppp) {', false).then((_) { | 442 return findElementReferences('ppp) {', false).then((_) { |
| 443 expect(searchElement.kind, ElementKind.PARAMETER); |
| 429 expect(results, hasLength(5)); | 444 expect(results, hasLength(5)); |
| 430 assertHasResult(SearchResultKind.DECLARATION, 'ppp) {'); | 445 assertHasResult(SearchResultKind.DECLARATION, 'ppp) {'); |
| 431 assertHasResult(SearchResultKind.READ, 'ppp);'); | 446 assertHasResult(SearchResultKind.READ, 'ppp);'); |
| 432 assertHasResult(SearchResultKind.READ_WRITE, 'ppp += 3'); | 447 assertHasResult(SearchResultKind.READ_WRITE, 'ppp += 3'); |
| 433 assertHasResult(SearchResultKind.WRITE, 'ppp = 2'); | 448 assertHasResult(SearchResultKind.WRITE, 'ppp = 2'); |
| 434 assertHasResult(SearchResultKind.INVOCATION, 'ppp();'); | 449 assertHasResult(SearchResultKind.INVOCATION, 'ppp();'); |
| 435 }); | 450 }); |
| 436 } | 451 } |
| 437 | 452 |
| 438 test_path_inConstructor_named() { | 453 test_path_inConstructor_named() { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 addTestFile(''' | 579 addTestFile(''' |
| 565 var vvv = 1; | 580 var vvv = 1; |
| 566 main() { | 581 main() { |
| 567 print(vvv); | 582 print(vvv); |
| 568 vvv += 3; | 583 vvv += 3; |
| 569 vvv = 2; | 584 vvv = 2; |
| 570 vvv(); | 585 vvv(); |
| 571 } | 586 } |
| 572 '''); | 587 '''); |
| 573 return findElementReferences('vvv = 1', false).then((_) { | 588 return findElementReferences('vvv = 1', false).then((_) { |
| 589 expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE); |
| 574 expect(results, hasLength(5)); | 590 expect(results, hasLength(5)); |
| 575 assertHasResult(SearchResultKind.DECLARATION, 'vvv = 1;'); | 591 assertHasResult(SearchResultKind.DECLARATION, 'vvv = 1;'); |
| 576 assertHasResult(SearchResultKind.READ, 'vvv);'); | 592 assertHasResult(SearchResultKind.READ, 'vvv);'); |
| 577 assertHasResult(SearchResultKind.WRITE, 'vvv += 3'); | 593 assertHasResult(SearchResultKind.WRITE, 'vvv += 3'); |
| 578 assertHasResult(SearchResultKind.WRITE, 'vvv = 2'); | 594 assertHasResult(SearchResultKind.WRITE, 'vvv = 2'); |
| 579 assertHasResult(SearchResultKind.INVOCATION, 'vvv();'); | 595 assertHasResult(SearchResultKind.INVOCATION, 'vvv();'); |
| 580 }); | 596 }); |
| 581 } | 597 } |
| 582 | 598 |
| 583 test_topLevelVariable_implicit() { | 599 test_topLevelVariable_implicit() { |
| 584 addTestFile(''' | 600 addTestFile(''' |
| 585 get vvv => null; | 601 get vvv => null; |
| 586 set vvv(x) {} | 602 set vvv(x) {} |
| 587 main() { | 603 main() { |
| 588 print(vvv); | 604 print(vvv); |
| 589 vvv = 1; | 605 vvv = 1; |
| 590 } | 606 } |
| 591 '''); | 607 '''); |
| 592 var forGetter = findElementReferences('vvv =>', false).then((_) { | 608 var forGetter = findElementReferences('vvv =>', false).then((_) { |
| 609 expect(searchElement.kind, ElementKind.TOP_LEVEL_VARIABLE); |
| 593 expect(results, hasLength(2)); | 610 expect(results, hasLength(2)); |
| 594 assertHasResult(SearchResultKind.READ, 'vvv);'); | 611 assertHasResult(SearchResultKind.READ, 'vvv);'); |
| 595 assertHasResult(SearchResultKind.WRITE, 'vvv = 1;'); | 612 assertHasResult(SearchResultKind.WRITE, 'vvv = 1;'); |
| 596 }); | 613 }); |
| 597 var forSetter = findElementReferences('vvv(x) {}', false).then((_) { | 614 var forSetter = findElementReferences('vvv(x) {}', false).then((_) { |
| 598 expect(results, hasLength(2)); | 615 expect(results, hasLength(2)); |
| 599 assertHasResult(SearchResultKind.READ, 'vvv);'); | 616 assertHasResult(SearchResultKind.READ, 'vvv);'); |
| 600 assertHasResult(SearchResultKind.WRITE, 'vvv = 1;'); | 617 assertHasResult(SearchResultKind.WRITE, 'vvv = 1;'); |
| 601 }); | 618 }); |
| 602 return Future.wait([forGetter, forSetter]); | 619 return Future.wait([forGetter, forSetter]); |
| 603 } | 620 } |
| 604 | 621 |
| 605 test_typeReference_class() { | 622 test_typeReference_class() { |
| 606 addTestFile(''' | 623 addTestFile(''' |
| 607 main() { | 624 main() { |
| 608 int a = 1; | 625 int a = 1; |
| 609 int b = 2; | 626 int b = 2; |
| 610 } | 627 } |
| 611 '''); | 628 '''); |
| 612 return findElementReferences('int a', false).then((_) { | 629 return findElementReferences('int a', false).then((_) { |
| 630 expect(searchElement.kind, ElementKind.CLASS); |
| 613 assertHasResult(SearchResultKind.REFERENCE, 'int a'); | 631 assertHasResult(SearchResultKind.REFERENCE, 'int a'); |
| 614 assertHasResult(SearchResultKind.REFERENCE, 'int b'); | 632 assertHasResult(SearchResultKind.REFERENCE, 'int b'); |
| 615 }); | 633 }); |
| 616 } | 634 } |
| 617 | 635 |
| 618 test_typeReference_functionType() { | 636 test_typeReference_functionType() { |
| 619 addTestFile(''' | 637 addTestFile(''' |
| 620 typedef F(); | 638 typedef F(); |
| 621 main(F f) { | 639 main(F f) { |
| 622 } | 640 } |
| 623 '''); | 641 '''); |
| 624 return findElementReferences('F()', false).then((_) { | 642 return findElementReferences('F()', false).then((_) { |
| 643 expect(searchElement.kind, ElementKind.FUNCTION_TYPE_ALIAS); |
| 625 expect(results, hasLength(1)); | 644 expect(results, hasLength(1)); |
| 626 assertHasResult(SearchResultKind.REFERENCE, 'F f'); | 645 assertHasResult(SearchResultKind.REFERENCE, 'F f'); |
| 627 }); | 646 }); |
| 628 } | 647 } |
| 629 | 648 |
| 630 test_typeReference_typeVariable() { | 649 test_typeReference_typeVariable() { |
| 631 addTestFile(''' | 650 addTestFile(''' |
| 632 class A<T> { | 651 class A<T> { |
| 633 T f; | 652 T f; |
| 634 T m() => null; | 653 T m() => null; |
| 635 } | 654 } |
| 636 '''); | 655 '''); |
| 637 return findElementReferences('T> {', false).then((_) { | 656 return findElementReferences('T> {', false).then((_) { |
| 657 expect(searchElement.kind, ElementKind.TYPE_PARAMETER); |
| 638 expect(results, hasLength(2)); | 658 expect(results, hasLength(2)); |
| 639 assertHasResult(SearchResultKind.REFERENCE, 'T f;'); | 659 assertHasResult(SearchResultKind.REFERENCE, 'T f;'); |
| 640 assertHasResult(SearchResultKind.REFERENCE, 'T m()'); | 660 assertHasResult(SearchResultKind.REFERENCE, 'T m()'); |
| 641 }); | 661 }); |
| 642 } | 662 } |
| 643 | 663 |
| 644 Future _waitForSearchResults() { | 664 Future _waitForSearchResults() { |
| 645 if (searchDone) { | 665 if (searchDone) { |
| 646 return new Future.value(); | 666 return new Future.value(); |
| 647 } | 667 } |
| 648 return new Future.delayed(Duration.ZERO, _waitForSearchResults); | 668 return new Future.delayed(Duration.ZERO, _waitForSearchResults); |
| 649 } | 669 } |
| 650 } | 670 } |
| OLD | NEW |