| OLD | NEW |
| 1 // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2017, 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 import 'dart:async'; | 5 import 'dart:async'; |
| 6 | 6 |
| 7 import 'package:analyzer/dart/element/element.dart'; | 7 import 'package:analyzer/dart/element/element.dart'; |
| 8 import 'package:analyzer/src/dart/analysis/driver.dart'; | 8 import 'package:analyzer/src/dart/analysis/driver.dart'; |
| 9 import 'package:test_reflective_loader/test_reflective_loader.dart'; | 9 import 'package:test_reflective_loader/test_reflective_loader.dart'; |
| 10 | 10 |
| 11 import '../dart/analysis/base.dart'; | 11 import '../dart/analysis/base.dart'; |
| 12 import 'element_text.dart'; | 12 import 'element_text.dart'; |
| 13 | 13 |
| 14 main() { | 14 main() { |
| 15 defineReflectiveSuite(() { | 15 defineReflectiveSuite(() { |
| 16 defineReflectiveTests(TopLevelInferenceTest); | 16 defineReflectiveTests(TopLevelInferenceTest); |
| 17 // defineReflectiveTests(ApplyCheckElementTextReplacements); | 17 // defineReflectiveTests(ApplyCheckElementTextReplacements); |
| 18 }); | 18 }); |
| 19 } | 19 } |
| 20 | 20 |
| 21 @reflectiveTest | 21 @reflectiveTest |
| 22 class ApplyCheckElementTextReplacements { | 22 class ApplyCheckElementTextReplacements { |
| 23 test_applyReplacements() { | 23 test_applyReplacements() { |
| 24 applyCheckElementTextReplacements(); | 24 applyCheckElementTextReplacements(); |
| 25 } | 25 } |
| 26 } | 26 } |
| 27 | 27 |
| 28 @reflectiveTest | 28 @reflectiveTest |
| 29 class TopLevelInferenceTest extends BaseAnalysisDriverTest { | 29 class TopLevelInferenceTest extends BaseAnalysisDriverTest { |
| 30 void addFile(String path, String code) { |
| 31 provider.newFile(_p(path), code); |
| 32 } |
| 33 |
| 30 test_initializer_as() async { | 34 test_initializer_as() async { |
| 31 var library = await _encodeDecodeLibrary(r''' | 35 var library = await _encodeDecodeLibrary(r''' |
| 32 var V = 1 as num; | 36 var V = 1 as num; |
| 33 '''); | 37 '''); |
| 34 checkElementText( | 38 checkElementText( |
| 35 library, | 39 library, |
| 36 r''' | 40 r''' |
| 37 num V; | 41 num V; |
| 38 '''); | 42 '''); |
| 39 } | 43 } |
| 40 | 44 |
| 41 @failingTest | |
| 42 test_initializer_assignment() async { | |
| 43 var library = await _encodeDecodeLibrary(r''' | |
| 44 var a = 1; | |
| 45 var b = a = 2; | |
| 46 var c = a += 2; | |
| 47 '''); | |
| 48 // TODO(scheglov) test for inference failure error | |
| 49 checkElementText( | |
| 50 library, | |
| 51 r''' | |
| 52 int a; | |
| 53 dynamic b; | |
| 54 dynamic c; | |
| 55 '''); | |
| 56 } | |
| 57 | |
| 58 test_initializer_await() async { | 45 test_initializer_await() async { |
| 59 var library = await _encodeDecodeLibrary(r''' | 46 var library = await _encodeDecodeLibrary(r''' |
| 60 import 'dart:async'; | 47 import 'dart:async'; |
| 61 int fValue() => 42; | 48 int fValue() => 42; |
| 62 Future<int> fFuture() async => 42; | 49 Future<int> fFuture() async => 42; |
| 63 var uValue = () async => await fValue(); | 50 var uValue = () async => await fValue(); |
| 64 var uFuture = () async => await fFuture(); | 51 var uFuture = () async => await fFuture(); |
| 65 '''); | 52 '''); |
| 66 checkElementText( | 53 checkElementText( |
| 67 library, | 54 library, |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 120 var library = await _encodeDecodeLibrary(r''' | 107 var library = await _encodeDecodeLibrary(r''' |
| 121 var V = true ? 1 : 2.3; | 108 var V = true ? 1 : 2.3; |
| 122 '''); | 109 '''); |
| 123 checkElementText( | 110 checkElementText( |
| 124 library, | 111 library, |
| 125 r''' | 112 r''' |
| 126 num V; | 113 num V; |
| 127 '''); | 114 '''); |
| 128 } | 115 } |
| 129 | 116 |
| 117 test_initializer_error_assign() async { |
| 118 var library = await _encodeDecodeLibrary(r''' |
| 119 var a = 1; |
| 120 var t1 = (a = 2); |
| 121 var t2 = (a += 2); |
| 122 '''); |
| 123 // TODO(scheglov) test for inference failure error |
| 124 checkElementText( |
| 125 library, |
| 126 r''' |
| 127 int a; |
| 128 dynamic t1; |
| 129 dynamic t2; |
| 130 '''); |
| 131 } |
| 132 |
| 133 test_initializer_error_assign_prefixed() async { |
| 134 var library = await _encodeDecodeLibrary(r''' |
| 135 class A { |
| 136 int f; |
| 137 } |
| 138 var a = new A(); |
| 139 var t1 = (a.f = 1); |
| 140 var t2 = (a.f += 2); |
| 141 '''); |
| 142 // TODO(scheglov) test for inference failure error |
| 143 checkElementText( |
| 144 library, |
| 145 r''' |
| 146 class A { |
| 147 int f; |
| 148 } |
| 149 A a; |
| 150 dynamic t1; |
| 151 dynamic t2; |
| 152 '''); |
| 153 } |
| 154 |
| 155 test_initializer_error_assign_prefixed_viaInterface() async { |
| 156 var library = await _encodeDecodeLibrary(r''' |
| 157 class I { |
| 158 int f; |
| 159 } |
| 160 abstract class C implements I {} |
| 161 C c; |
| 162 var t1 = (c.f = 1); |
| 163 var t2 = (c.f += 2); |
| 164 '''); |
| 165 // TODO(scheglov) test for inference failure error |
| 166 checkElementText( |
| 167 library, |
| 168 r''' |
| 169 class I { |
| 170 int f; |
| 171 } |
| 172 abstract class C implements I { |
| 173 } |
| 174 C c; |
| 175 dynamic t1; |
| 176 dynamic t2; |
| 177 '''); |
| 178 } |
| 179 |
| 180 test_initializer_error_assign_viaInterface() async { |
| 181 var library = await _encodeDecodeLibrary(r''' |
| 182 class I { |
| 183 int f; |
| 184 } |
| 185 abstract class C implements I {} |
| 186 C getC() => null; |
| 187 var t1 = (getC().f = 1); |
| 188 var t2 = (getC().f += 2); |
| 189 '''); |
| 190 // TODO(scheglov) test for inference failure error |
| 191 checkElementText( |
| 192 library, |
| 193 r''' |
| 194 class I { |
| 195 int f; |
| 196 } |
| 197 abstract class C implements I { |
| 198 } |
| 199 dynamic t1; |
| 200 dynamic t2; |
| 201 C getC() {} |
| 202 '''); |
| 203 } |
| 204 |
| 205 /** |
| 206 * A simple or qualified identifier referring to a top level function, static |
| 207 * variable, field, getter; or a static class variable, static getter or |
| 208 * method; or an instance method; has the inferred type of the identifier. |
| 209 * |
| 210 * Note: specifically, references to instance fields and instance getters are |
| 211 * disallowed here. |
| 212 */ |
| 213 test_initializer_error_classField_useInstanceGetter() async { |
| 214 var library = await _encodeDecodeLibrary(r''' |
| 215 class A { |
| 216 int f = 1; |
| 217 } |
| 218 class B { |
| 219 A a; |
| 220 } |
| 221 class C { |
| 222 B b; |
| 223 } |
| 224 class X { |
| 225 A a = new A(); |
| 226 B b = new B(); |
| 227 C c = new C(); |
| 228 var t01 = a.f; |
| 229 var t02 = b.a.f; |
| 230 var t03 = c.b.a.f; |
| 231 var t11 = new A().f; |
| 232 var t12 = new B().a.f; |
| 233 var t13 = new C().b.a.f; |
| 234 var t21 = newA().f; |
| 235 var t22 = newB().a.f; |
| 236 var t23 = newC().b.a.f; |
| 237 } |
| 238 A newA() => new A(); |
| 239 B newB() => new B(); |
| 240 C newC() => new C(); |
| 241 '''); |
| 242 // TODO(scheglov) test for inference failure error |
| 243 checkElementText( |
| 244 library, |
| 245 r''' |
| 246 class A { |
| 247 int f; |
| 248 } |
| 249 class B { |
| 250 A a; |
| 251 } |
| 252 class C { |
| 253 B b; |
| 254 } |
| 255 class X { |
| 256 A a; |
| 257 B b; |
| 258 C c; |
| 259 dynamic t01; |
| 260 dynamic t02; |
| 261 dynamic t03; |
| 262 dynamic t11; |
| 263 dynamic t12; |
| 264 dynamic t13; |
| 265 dynamic t21; |
| 266 dynamic t22; |
| 267 dynamic t23; |
| 268 } |
| 269 A newA() {} |
| 270 B newB() {} |
| 271 C newC() {} |
| 272 '''); |
| 273 } |
| 274 |
| 275 test_initializer_error_extractProperty() async { |
| 276 var library = await _encodeDecodeLibrary(r''' |
| 277 class C { |
| 278 bool b; |
| 279 } |
| 280 C f() => null; |
| 281 var x = f().b; |
| 282 '''); |
| 283 // TODO(scheglov) test for inference failure error |
| 284 checkElementText( |
| 285 library, |
| 286 r''' |
| 287 class C { |
| 288 bool b; |
| 289 } |
| 290 dynamic x; |
| 291 C f() {} |
| 292 '''); |
| 293 } |
| 294 |
| 295 test_initializer_error_extractProperty_inOtherLibraryCycle() async { |
| 296 addFile( |
| 297 '/a.dart', |
| 298 r''' |
| 299 import 'b.dart'; |
| 300 var x = new C().f; |
| 301 '''); |
| 302 addFile( |
| 303 '/b.dart', |
| 304 r''' |
| 305 class C { |
| 306 var f = 0; |
| 307 } |
| 308 '''); |
| 309 var library = await _encodeDecodeLibrary(r''' |
| 310 import 'a.dart'; |
| 311 var t1 = x; |
| 312 '''); |
| 313 checkElementText( |
| 314 library, |
| 315 r''' |
| 316 import 'a.dart'; |
| 317 dynamic t1; |
| 318 '''); |
| 319 } |
| 320 |
| 321 test_initializer_error_extractProperty_inStaticField() async { |
| 322 var library = await _encodeDecodeLibrary(r''' |
| 323 class A { |
| 324 int f; |
| 325 } |
| 326 class B { |
| 327 static var t = new A().f; |
| 328 } |
| 329 '''); |
| 330 // TODO(scheglov) test for inference failure error |
| 331 checkElementText( |
| 332 library, |
| 333 r''' |
| 334 class A { |
| 335 int f; |
| 336 } |
| 337 class B { |
| 338 static dynamic t; |
| 339 } |
| 340 '''); |
| 341 } |
| 342 |
| 343 test_initializer_error_extractProperty_prefixedIdentifier() async { |
| 344 var library = await _encodeDecodeLibrary(r''' |
| 345 class C { |
| 346 bool b; |
| 347 } |
| 348 C c; |
| 349 var x = c.b; |
| 350 '''); |
| 351 // TODO(scheglov) test for inference failure error |
| 352 checkElementText( |
| 353 library, |
| 354 r''' |
| 355 class C { |
| 356 bool b; |
| 357 } |
| 358 C c; |
| 359 dynamic x; |
| 360 '''); |
| 361 } |
| 362 |
| 363 test_initializer_error_extractProperty_prefixedIdentifier_viaInterface() async
{ |
| 364 var library = await _encodeDecodeLibrary(r''' |
| 365 class I { |
| 366 bool b; |
| 367 } |
| 368 abstract class C implements I {} |
| 369 C c; |
| 370 var x = c.b; |
| 371 '''); |
| 372 // TODO(scheglov) test for inference failure error |
| 373 checkElementText( |
| 374 library, |
| 375 r''' |
| 376 class I { |
| 377 bool b; |
| 378 } |
| 379 abstract class C implements I { |
| 380 } |
| 381 C c; |
| 382 dynamic x; |
| 383 '''); |
| 384 } |
| 385 |
| 386 test_initializer_error_extractProperty_viaInterface() async { |
| 387 var library = await _encodeDecodeLibrary(r''' |
| 388 class I { |
| 389 bool b; |
| 390 } |
| 391 abstract class C implements I {} |
| 392 C f() => null; |
| 393 var x = f().b; |
| 394 '''); |
| 395 // TODO(scheglov) test for inference failure error |
| 396 checkElementText( |
| 397 library, |
| 398 r''' |
| 399 class I { |
| 400 bool b; |
| 401 } |
| 402 abstract class C implements I { |
| 403 } |
| 404 dynamic x; |
| 405 C f() {} |
| 406 '''); |
| 407 } |
| 408 |
| 409 test_initializer_error_instanceGetterOfObject() async { |
| 410 var library = await _encodeDecodeLibrary(r''' |
| 411 dynamic f() => null; |
| 412 var s = f().toString(); |
| 413 var h = f().hashCode; |
| 414 '''); |
| 415 // TODO(scheglov) test for inference failure error |
| 416 checkElementText( |
| 417 library, |
| 418 r''' |
| 419 String s; |
| 420 dynamic h; |
| 421 dynamic f() {} |
| 422 '''); |
| 423 } |
| 424 |
| 425 test_initializer_error_instanceGetterOfObject_prefixed() async { |
| 426 var library = await _encodeDecodeLibrary(r''' |
| 427 dynamic d; |
| 428 var s = d.toString(); |
| 429 var h = d.hashCode; |
| 430 '''); |
| 431 // TODO(scheglov) test for inference failure error |
| 432 checkElementText( |
| 433 library, |
| 434 r''' |
| 435 dynamic d; |
| 436 String s; |
| 437 dynamic h; |
| 438 '''); |
| 439 } |
| 440 |
| 441 test_initializer_error_referenceToFieldOfStaticField() async { |
| 442 var library = await _encodeDecodeLibrary(r''' |
| 443 class C { |
| 444 static D d; |
| 445 } |
| 446 class D { |
| 447 int i; |
| 448 } |
| 449 final x = C.d.i; |
| 450 '''); |
| 451 // TODO(scheglov) test for inference failure error |
| 452 checkElementText( |
| 453 library, |
| 454 r''' |
| 455 class C { |
| 456 static D d; |
| 457 } |
| 458 class D { |
| 459 int i; |
| 460 } |
| 461 final dynamic x; |
| 462 '''); |
| 463 } |
| 464 |
| 465 test_initializer_error_referenceToFieldOfStaticGetter() async { |
| 466 var library = await _encodeDecodeLibrary(r''' |
| 467 class C { |
| 468 static D get d => null; |
| 469 } |
| 470 class D { |
| 471 int i; |
| 472 } |
| 473 var x = C.d.i; |
| 474 '''); |
| 475 // TODO(scheglov) test for inference failure error |
| 476 checkElementText( |
| 477 library, |
| 478 r''' |
| 479 class C { |
| 480 static D get d {} |
| 481 } |
| 482 class D { |
| 483 int i; |
| 484 } |
| 485 dynamic x; |
| 486 '''); |
| 487 } |
| 488 |
| 130 test_initializer_functionExpression() async { | 489 test_initializer_functionExpression() async { |
| 131 var library = await _encodeDecodeLibrary(r''' | 490 var library = await _encodeDecodeLibrary(r''' |
| 132 import 'dart:async'; | 491 import 'dart:async'; |
| 133 var vFuture = new Future<int>(42); | 492 var vFuture = new Future<int>(42); |
| 134 var v_noParameters_inferredReturnType = () => 42; | 493 var v_noParameters_inferredReturnType = () => 42; |
| 135 var v_hasParameter_withType_inferredReturnType = (String a) => 42; | 494 var v_hasParameter_withType_inferredReturnType = (String a) => 42; |
| 136 var v_hasParameter_withType_returnParameter = (String a) => a; | 495 var v_hasParameter_withType_returnParameter = (String a) => a; |
| 137 var v_async_returnValue = () async => 42; | 496 var v_async_returnValue = () async => 42; |
| 138 var v_async_returnFuture = () async => vFuture; | 497 var v_async_returnFuture = () async => vFuture; |
| 139 '''); | 498 '''); |
| (...skipping 727 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 867 /** | 1226 /** |
| 868 * A getter, setter or field which overrides/implements only a getter is | 1227 * A getter, setter or field which overrides/implements only a getter is |
| 869 * inferred to have the type taken from the overridden getter result type. | 1228 * inferred to have the type taken from the overridden getter result type. |
| 870 * | 1229 * |
| 871 * Note that overriding a field is addressed via the implicit induced | 1230 * Note that overriding a field is addressed via the implicit induced |
| 872 * getter/setter pair (or just getter in the case of a final field). | 1231 * getter/setter pair (or just getter in the case of a final field). |
| 873 * | 1232 * |
| 874 * A field with no annotated type that does not override anything has the | 1233 * A field with no annotated type that does not override anything has the |
| 875 * type inferred from its initializer. | 1234 * type inferred from its initializer. |
| 876 */ | 1235 */ |
| 877 @failingTest | |
| 878 test_instanceField_preferOverride() async { | 1236 test_instanceField_preferOverride() async { |
| 879 var library = await _encodeDecodeLibrary(r''' | 1237 var library = await _encodeDecodeLibrary(r''' |
| 880 abstract class A { | 1238 abstract class A { |
| 881 num x; | 1239 num x; |
| 882 var y = 2; | 1240 var y = 2; |
| 883 } | 1241 } |
| 884 class B implements A { | 1242 class B implements A { |
| 885 var x = 1; | 1243 var x = 1; |
| 886 var y = 2; | 1244 var y = 2; |
| 887 var z = 3; | 1245 var z = 3; |
| (...skipping 611 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1499 | 1857 |
| 1500 Future<LibraryElement> _encodeDecodeLibrary(String text) async { | 1858 Future<LibraryElement> _encodeDecodeLibrary(String text) async { |
| 1501 String path = _p('/test.dart'); | 1859 String path = _p('/test.dart'); |
| 1502 provider.newFile(path, text); | 1860 provider.newFile(path, text); |
| 1503 UnitElementResult result = await driver.getUnitElement(path); | 1861 UnitElementResult result = await driver.getUnitElement(path); |
| 1504 return result.element.library; | 1862 return result.element.library; |
| 1505 } | 1863 } |
| 1506 | 1864 |
| 1507 String _p(String path) => provider.convertPath(path); | 1865 String _p(String path) => provider.convertPath(path); |
| 1508 } | 1866 } |
| OLD | NEW |