| 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.analysis.notification.overrides; | 5 library test.analysis.notification.overrides; |
| 6 | 6 |
| 7 import 'dart:async'; | 7 import 'dart:async'; |
| 8 | 8 |
| 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; | 9 import 'package:analysis_server/plugin/protocol/protocol.dart'; |
| 10 import 'package:analysis_server/src/constants.dart'; | 10 import 'package:analysis_server/src/constants.dart'; |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 overridesList = params.overrides; | 114 overridesList = params.overrides; |
| 115 } | 115 } |
| 116 } | 116 } |
| 117 } | 117 } |
| 118 | 118 |
| 119 void setUp() { | 119 void setUp() { |
| 120 super.setUp(); | 120 super.setUp(); |
| 121 createProject(); | 121 createProject(); |
| 122 } | 122 } |
| 123 | 123 |
| 124 test_afterAnalysis() { | 124 test_afterAnalysis() async { |
| 125 addTestFile(''' | 125 addTestFile(''' |
| 126 class A { | 126 class A { |
| 127 m() {} // in A | 127 m() {} // in A |
| 128 } | 128 } |
| 129 class B implements A { | 129 class B implements A { |
| 130 m() {} // in B | 130 m() {} // in B |
| 131 } | 131 } |
| 132 '''); | 132 '''); |
| 133 return waitForTasksFinished().then((_) { | 133 await waitForTasksFinished(); |
| 134 return prepareOverrides().then((_) { | 134 await prepareOverrides(); |
| 135 assertHasOverride('m() {} // in B'); | 135 assertHasOverride('m() {} // in B'); |
| 136 assertNoSuperMember(); | 136 assertNoSuperMember(); |
| 137 assertHasInterfaceMember('m() {} // in A'); | 137 assertHasInterfaceMember('m() {} // in A'); |
| 138 }); | |
| 139 }); | |
| 140 } | 138 } |
| 141 | 139 |
| 142 test_definedInInterface_ofInterface() { | 140 test_definedInInterface_ofInterface() async { |
| 143 addTestFile(''' | 141 addTestFile(''' |
| 144 class A { | 142 class A { |
| 145 m() {} // in A | 143 m() {} // in A |
| 146 } | 144 } |
| 147 class B implements A {} | 145 class B implements A {} |
| 148 class C implements B { | 146 class C implements B { |
| 149 m() {} // in C | 147 m() {} // in C |
| 150 } | 148 } |
| 151 '''); | 149 '''); |
| 152 return prepareOverrides().then((_) { | 150 await prepareOverrides(); |
| 153 assertHasOverride('m() {} // in C'); | 151 assertHasOverride('m() {} // in C'); |
| 154 assertNoSuperMember(); | 152 assertNoSuperMember(); |
| 155 assertHasInterfaceMember('m() {} // in A'); | 153 assertHasInterfaceMember('m() {} // in A'); |
| 156 }); | |
| 157 } | 154 } |
| 158 | 155 |
| 159 test_definedInInterface_ofSuper() { | 156 test_definedInInterface_ofSuper() async { |
| 160 addTestFile(''' | 157 addTestFile(''' |
| 161 class A { | 158 class A { |
| 162 m() {} // in A | 159 m() {} // in A |
| 163 } | 160 } |
| 164 class B implements A {} | 161 class B implements A {} |
| 165 class C extends B { | 162 class C extends B { |
| 166 m() {} // in C | 163 m() {} // in C |
| 167 } | 164 } |
| 168 '''); | 165 '''); |
| 169 return prepareOverrides().then((_) { | 166 await prepareOverrides(); |
| 170 assertHasOverride('m() {} // in C'); | 167 assertHasOverride('m() {} // in C'); |
| 171 assertNoSuperMember(); | 168 assertNoSuperMember(); |
| 172 assertHasInterfaceMember('m() {} // in A'); | 169 assertHasInterfaceMember('m() {} // in A'); |
| 173 }); | |
| 174 } | 170 } |
| 175 | 171 |
| 176 test_interface_method_direct_multiple() { | 172 test_interface_method_direct_multiple() async { |
| 177 addTestFile(''' | 173 addTestFile(''' |
| 178 class IA { | 174 class IA { |
| 179 m() {} // in IA | 175 m() {} // in IA |
| 180 } | 176 } |
| 181 class IB { | 177 class IB { |
| 182 m() {} // in IB | 178 m() {} // in IB |
| 183 } | 179 } |
| 184 class A implements IA, IB { | 180 class A implements IA, IB { |
| 185 m() {} // in A | 181 m() {} // in A |
| 186 } | 182 } |
| 187 '''); | 183 '''); |
| 188 return prepareOverrides().then((_) { | 184 await prepareOverrides(); |
| 189 assertHasOverride('m() {} // in A'); | 185 assertHasOverride('m() {} // in A'); |
| 190 assertNoSuperMember(); | 186 assertNoSuperMember(); |
| 191 assertHasInterfaceMember('m() {} // in IA'); | 187 assertHasInterfaceMember('m() {} // in IA'); |
| 192 assertHasInterfaceMember('m() {} // in IB'); | 188 assertHasInterfaceMember('m() {} // in IB'); |
| 193 }); | |
| 194 } | 189 } |
| 195 | 190 |
| 196 test_interface_method_direct_single() { | 191 test_interface_method_direct_single() async { |
| 197 addTestFile(''' | 192 addTestFile(''' |
| 198 class A { | 193 class A { |
| 199 m() {} // in A | 194 m() {} // in A |
| 200 } | 195 } |
| 201 class B implements A { | 196 class B implements A { |
| 202 m() {} // in B | 197 m() {} // in B |
| 203 } | 198 } |
| 204 '''); | 199 '''); |
| 205 return prepareOverrides().then((_) { | 200 await prepareOverrides(); |
| 206 assertHasOverride('m() {} // in B'); | 201 assertHasOverride('m() {} // in B'); |
| 207 assertNoSuperMember(); | 202 assertNoSuperMember(); |
| 208 assertHasInterfaceMember('m() {} // in A'); | 203 assertHasInterfaceMember('m() {} // in A'); |
| 209 }); | |
| 210 } | 204 } |
| 211 | 205 |
| 212 test_interface_method_indirect_single() { | 206 test_interface_method_indirect_single() async { |
| 213 addTestFile(''' | 207 addTestFile(''' |
| 214 class A { | 208 class A { |
| 215 m() {} // in A | 209 m() {} // in A |
| 216 } | 210 } |
| 217 class B extends A { | 211 class B extends A { |
| 218 } | 212 } |
| 219 class C implements B { | 213 class C implements B { |
| 220 m() {} // in C | 214 m() {} // in C |
| 221 } | 215 } |
| 222 '''); | 216 '''); |
| 223 return prepareOverrides().then((_) { | 217 await prepareOverrides(); |
| 224 assertHasOverride('m() {} // in C'); | 218 assertHasOverride('m() {} // in C'); |
| 225 assertNoSuperMember(); | 219 assertNoSuperMember(); |
| 226 assertHasInterfaceMember('m() {} // in A'); | 220 assertHasInterfaceMember('m() {} // in A'); |
| 227 }); | |
| 228 } | 221 } |
| 229 | 222 |
| 230 test_interface_stopWhenFound() { | 223 test_interface_stopWhenFound() async { |
| 231 addTestFile(''' | 224 addTestFile(''' |
| 232 class A { | 225 class A { |
| 233 m() {} // in A | 226 m() {} // in A |
| 234 } | 227 } |
| 235 class B extends A { | 228 class B extends A { |
| 236 m() {} // in B | 229 m() {} // in B |
| 237 } | 230 } |
| 238 class C implements B { | 231 class C implements B { |
| 239 m() {} // in C | 232 m() {} // in C |
| 240 } | 233 } |
| 241 '''); | 234 '''); |
| 242 return prepareOverrides().then((_) { | 235 await prepareOverrides(); |
| 243 assertHasOverride('m() {} // in C'); | 236 assertHasOverride('m() {} // in C'); |
| 244 expect(override.interfaceMembers, hasLength(1)); | 237 expect(override.interfaceMembers, hasLength(1)); |
| 245 assertHasInterfaceMember('m() {} // in B'); | 238 assertHasInterfaceMember('m() {} // in B'); |
| 246 }); | |
| 247 } | 239 } |
| 248 | 240 |
| 249 test_mix_sameMethod() { | 241 test_mix_sameMethod() async { |
| 250 addTestFile(''' | 242 addTestFile(''' |
| 251 class A { | 243 class A { |
| 252 m() {} // in A | 244 m() {} // in A |
| 253 } | 245 } |
| 254 abstract class B extends A { | 246 abstract class B extends A { |
| 255 } | 247 } |
| 256 class C extends A implements A { | 248 class C extends A implements A { |
| 257 m() {} // in C | 249 m() {} // in C |
| 258 } | 250 } |
| 259 '''); | 251 '''); |
| 260 return prepareOverrides().then((_) { | 252 await prepareOverrides(); |
| 261 assertHasOverride('m() {} // in C'); | 253 assertHasOverride('m() {} // in C'); |
| 262 assertHasSuperElement('m() {} // in A'); | 254 assertHasSuperElement('m() {} // in A'); |
| 263 assertNoInterfaceMembers(); | 255 assertNoInterfaceMembers(); |
| 264 }); | |
| 265 } | 256 } |
| 266 | 257 |
| 267 test_mix_sameMethod_Object_hashCode() { | 258 test_mix_sameMethod_Object_hashCode() async { |
| 268 addTestFile(''' | 259 addTestFile(''' |
| 269 class A {} | 260 class A {} |
| 270 abstract class B {} | 261 abstract class B {} |
| 271 class C extends A implements A { | 262 class C extends A implements A { |
| 272 int get hashCode => 42; | 263 int get hashCode => 42; |
| 273 } | 264 } |
| 274 '''); | 265 '''); |
| 275 return prepareOverrides().then((_) { | 266 await prepareOverrides(); |
| 276 assertHasOverride('hashCode => 42;'); | 267 assertHasOverride('hashCode => 42;'); |
| 277 expect(override.superclassMember, isNotNull); | 268 expect(override.superclassMember, isNotNull); |
| 278 expect(override.interfaceMembers, isNull); | 269 expect(override.interfaceMembers, isNull); |
| 279 }); | |
| 280 } | 270 } |
| 281 | 271 |
| 282 test_staticMembers() { | 272 test_staticMembers() async { |
| 283 addTestFile(''' | 273 addTestFile(''' |
| 284 class A { | 274 class A { |
| 285 static int F = 0; | 275 static int F = 0; |
| 286 static void M() {} | 276 static void M() {} |
| 287 static int get G => 0; | 277 static int get G => 0; |
| 288 static void set S(int v) {} | 278 static void set S(int v) {} |
| 289 } | 279 } |
| 290 class B extends A { | 280 class B extends A { |
| 291 static int F = 0; | 281 static int F = 0; |
| 292 static void M() {} | 282 static void M() {} |
| 293 static int get G => 0; | 283 static int get G => 0; |
| 294 static void set S(int v) {} | 284 static void set S(int v) {} |
| 295 } | 285 } |
| 296 '''); | 286 '''); |
| 297 return prepareOverrides().then((_) { | 287 await prepareOverrides(); |
| 298 expect(overridesList, isEmpty); | 288 expect(overridesList, isEmpty); |
| 299 }); | |
| 300 } | 289 } |
| 301 | 290 |
| 302 test_super_fieldByField() { | 291 test_super_fieldByField() async { |
| 303 addTestFile(''' | 292 addTestFile(''' |
| 304 class A { | 293 class A { |
| 305 int fff; // in A | 294 int fff; // in A |
| 306 } | 295 } |
| 307 class B extends A { | 296 class B extends A { |
| 308 int fff; // in B | 297 int fff; // in B |
| 309 } | 298 } |
| 310 '''); | 299 '''); |
| 311 return prepareOverrides().then((_) { | 300 await prepareOverrides(); |
| 312 assertHasOverride('fff; // in B'); | 301 assertHasOverride('fff; // in B'); |
| 313 assertHasSuperElement('fff; // in A'); | 302 assertHasSuperElement('fff; // in A'); |
| 314 assertNoInterfaceMembers(); | 303 assertNoInterfaceMembers(); |
| 315 }); | |
| 316 } | 304 } |
| 317 | 305 |
| 318 test_super_fieldByGetter() { | 306 test_super_fieldByGetter() async { |
| 319 addTestFile(''' | 307 addTestFile(''' |
| 320 class A { | 308 class A { |
| 321 int fff; // in A | 309 int fff; // in A |
| 322 } | 310 } |
| 323 class B extends A { | 311 class B extends A { |
| 324 get fff => 0; // in B | 312 get fff => 0; // in B |
| 325 } | 313 } |
| 326 '''); | 314 '''); |
| 327 return prepareOverrides().then((_) { | 315 await prepareOverrides(); |
| 328 assertHasOverride('fff => 0; // in B'); | 316 assertHasOverride('fff => 0; // in B'); |
| 329 assertHasSuperElement('fff; // in A'); | 317 assertHasSuperElement('fff; // in A'); |
| 330 assertNoInterfaceMembers(); | 318 assertNoInterfaceMembers(); |
| 331 }); | |
| 332 } | 319 } |
| 333 | 320 |
| 334 test_super_fieldByMethod() { | 321 test_super_fieldByMethod() async { |
| 335 addTestFile(''' | 322 addTestFile(''' |
| 336 class A { | 323 class A { |
| 337 int fff; // in A | 324 int fff; // in A |
| 338 } | 325 } |
| 339 class B extends A { | 326 class B extends A { |
| 340 fff() {} // in B | 327 fff() {} // in B |
| 341 } | 328 } |
| 342 '''); | 329 '''); |
| 343 return prepareOverrides().then((_) { | 330 await prepareOverrides(); |
| 344 assertHasOverride('fff() {} // in B'); | 331 assertHasOverride('fff() {} // in B'); |
| 345 assertHasSuperElement('fff; // in A'); | 332 assertHasSuperElement('fff; // in A'); |
| 346 assertNoInterfaceMembers(); | 333 assertNoInterfaceMembers(); |
| 347 }); | |
| 348 } | 334 } |
| 349 | 335 |
| 350 test_super_fieldBySetter() { | 336 test_super_fieldBySetter() async { |
| 351 addTestFile(''' | 337 addTestFile(''' |
| 352 class A { | 338 class A { |
| 353 int fff; // in A | 339 int fff; // in A |
| 354 } | 340 } |
| 355 class B extends A { | 341 class B extends A { |
| 356 set fff(x) {} // in B | 342 set fff(x) {} // in B |
| 357 } | 343 } |
| 358 '''); | 344 '''); |
| 359 return prepareOverrides().then((_) { | 345 await prepareOverrides(); |
| 360 assertHasOverride('fff(x) {} // in B'); | 346 assertHasOverride('fff(x) {} // in B'); |
| 361 assertHasSuperElement('fff; // in A'); | 347 assertHasSuperElement('fff; // in A'); |
| 362 assertNoInterfaceMembers(); | 348 assertNoInterfaceMembers(); |
| 363 }); | |
| 364 } | 349 } |
| 365 | 350 |
| 366 test_super_getterByField() { | 351 test_super_getterByField() async { |
| 367 addTestFile(''' | 352 addTestFile(''' |
| 368 class A { | 353 class A { |
| 369 get fff => 0; // in A | 354 get fff => 0; // in A |
| 370 set fff(x) {} // in A | 355 set fff(x) {} // in A |
| 371 } | 356 } |
| 372 class B extends A { | 357 class B extends A { |
| 373 int fff; // in B | 358 int fff; // in B |
| 374 } | 359 } |
| 375 '''); | 360 '''); |
| 376 return prepareOverrides().then((_) { | 361 await prepareOverrides(); |
| 377 assertHasOverride('fff; // in B'); | 362 assertHasOverride('fff; // in B'); |
| 378 assertHasSuperElement('fff => 0; // in A'); | 363 assertHasSuperElement('fff => 0; // in A'); |
| 379 assertNoInterfaceMembers(); | 364 assertNoInterfaceMembers(); |
| 380 }); | |
| 381 } | 365 } |
| 382 | 366 |
| 383 test_super_getterByGetter() { | 367 test_super_getterByGetter() async { |
| 384 addTestFile(''' | 368 addTestFile(''' |
| 385 class A { | 369 class A { |
| 386 get fff => 0; // in A | 370 get fff => 0; // in A |
| 387 } | 371 } |
| 388 class B extends A { | 372 class B extends A { |
| 389 get fff => 0; // in B | 373 get fff => 0; // in B |
| 390 } | 374 } |
| 391 '''); | 375 '''); |
| 392 return prepareOverrides().then((_) { | 376 await prepareOverrides(); |
| 393 assertHasOverride('fff => 0; // in B'); | 377 assertHasOverride('fff => 0; // in B'); |
| 394 assertHasSuperElement('fff => 0; // in A'); | 378 assertHasSuperElement('fff => 0; // in A'); |
| 395 assertNoInterfaceMembers(); | 379 assertNoInterfaceMembers(); |
| 396 }); | |
| 397 } | 380 } |
| 398 | 381 |
| 399 test_super_method_direct() { | 382 test_super_method_direct() async { |
| 400 addTestFile(''' | 383 addTestFile(''' |
| 401 class A { | 384 class A { |
| 402 m() {} // in A | 385 m() {} // in A |
| 403 } | 386 } |
| 404 class B extends A { | 387 class B extends A { |
| 405 m() {} // in B | 388 m() {} // in B |
| 406 } | 389 } |
| 407 '''); | 390 '''); |
| 408 return prepareOverrides().then((_) { | 391 await prepareOverrides(); |
| 409 assertHasOverride('m() {} // in B'); | 392 assertHasOverride('m() {} // in B'); |
| 410 assertHasSuperElement('m() {} // in A'); | 393 assertHasSuperElement('m() {} // in A'); |
| 411 assertNoInterfaceMembers(); | 394 assertNoInterfaceMembers(); |
| 412 }); | |
| 413 } | 395 } |
| 414 | 396 |
| 415 test_super_method_indirect() { | 397 test_super_method_indirect() async { |
| 416 addTestFile(''' | 398 addTestFile(''' |
| 417 class A { | 399 class A { |
| 418 m() {} // in A | 400 m() {} // in A |
| 419 } | 401 } |
| 420 class B extends A { | 402 class B extends A { |
| 421 } | 403 } |
| 422 class C extends B { | 404 class C extends B { |
| 423 m() {} // in C | 405 m() {} // in C |
| 424 } | 406 } |
| 425 '''); | 407 '''); |
| 426 return prepareOverrides().then((_) { | 408 await prepareOverrides(); |
| 427 assertHasOverride('m() {} // in C'); | 409 assertHasOverride('m() {} // in C'); |
| 428 assertHasSuperElement('m() {} // in A'); | 410 assertHasSuperElement('m() {} // in A'); |
| 429 assertNoInterfaceMembers(); | 411 assertNoInterfaceMembers(); |
| 430 }); | |
| 431 } | 412 } |
| 432 | 413 |
| 433 test_super_method_superTypeCycle() { | 414 test_super_method_superTypeCycle() async { |
| 434 addTestFile(''' | 415 addTestFile(''' |
| 435 class A extends B { | 416 class A extends B { |
| 436 m() {} // in A | 417 m() {} // in A |
| 437 } | 418 } |
| 438 class B extends A { | 419 class B extends A { |
| 439 m() {} // in B | 420 m() {} // in B |
| 440 } | 421 } |
| 441 '''); | 422 '''); |
| 442 return prepareOverrides().then((_) { | 423 await prepareOverrides(); |
| 443 // must finish | 424 // must finish |
| 444 }); | |
| 445 } | 425 } |
| 446 | 426 |
| 447 test_super_setterBySetter() { | 427 test_super_setterBySetter() async { |
| 448 addTestFile(''' | 428 addTestFile(''' |
| 449 class A { | 429 class A { |
| 450 set fff(x) {} // in A | 430 set fff(x) {} // in A |
| 451 } | 431 } |
| 452 class B extends A { | 432 class B extends A { |
| 453 set fff(x) {} // in B | 433 set fff(x) {} // in B |
| 454 } | 434 } |
| 455 '''); | 435 '''); |
| 456 return prepareOverrides().then((_) { | 436 await prepareOverrides(); |
| 457 assertHasOverride('fff(x) {} // in B'); | 437 assertHasOverride('fff(x) {} // in B'); |
| 458 assertHasSuperElement('fff(x) {} // in A'); | 438 assertHasSuperElement('fff(x) {} // in A'); |
| 459 assertNoInterfaceMembers(); | 439 assertNoInterfaceMembers(); |
| 460 }); | |
| 461 } | 440 } |
| 462 } | 441 } |
| OLD | NEW |