@@ -19,7 +19,9 @@ main() {
19
19
defineReflectiveSuite (() {
20
20
defineReflectiveTests (NoTypeInfoTest );
21
21
defineReflectiveTests (PrefixedTypeInfoTest );
22
- defineReflectiveTests (SimpleTypeInfoTest );
22
+ defineReflectiveTests (SimpleNullableTypeTest );
23
+ defineReflectiveTests (SimpleNullableTypeWith1ArgumentTest );
24
+ defineReflectiveTests (SimpleTypeTest );
23
25
defineReflectiveTests (SimpleTypeWith1ArgumentTest );
24
26
defineReflectiveTests (TypeInfoTest );
25
27
defineReflectiveTests (VoidTypeInfoTest );
@@ -309,7 +311,124 @@ class PrefixedTypeInfoTest {
309
311
}
310
312
311
313
@reflectiveTest
312
- class SimpleTypeInfoTest {
314
+ class SimpleNullableTypeTest {
315
+ void test_compute () {
316
+ expectInfo (simpleNullableType, 'C?' , required : true );
317
+ expectInfo (simpleNullableType, 'C?;' , required : true );
318
+ expectInfo (simpleNullableType, 'C?(' , required : true );
319
+ expectInfo (simpleNullableType, 'C?<' , required : true );
320
+ expectInfo (simpleNullableType, 'C?=' , required : true );
321
+ expectInfo (simpleNullableType, 'C?*' , required : true );
322
+ expectInfo (simpleNullableType, 'C? do' , required : true );
323
+
324
+ expectInfo (simpleNullableType, 'C? foo' );
325
+ expectInfo (simpleNullableType, 'C? get' );
326
+ expectInfo (simpleNullableType, 'C? set' );
327
+ expectInfo (simpleNullableType, 'C? operator' );
328
+ expectInfo (simpleNullableType, 'C? this' );
329
+ expectInfo (simpleNullableType, 'C? Function' );
330
+
331
+ expectInfo (simpleNullableType, 'C? Function()' , required : false );
332
+ expectInfo (simpleNullableType, 'C? Function<T>()' , required : false );
333
+ expectInfo (simpleNullableType, 'C? Function(int)' , required : false );
334
+ expectInfo (simpleNullableType, 'C? Function<T>(int)' , required : false );
335
+ expectInfo (simpleNullableType, 'C? Function(int x)' , required : false );
336
+ expectInfo (simpleNullableType, 'C? Function<T>(int x)' , required : false );
337
+ }
338
+
339
+ void test_simpleNullableType () {
340
+ final Token start = scanString ('before C? ;' ).tokens;
341
+ final Token expectedEnd = start.next.next;
342
+
343
+ expect (simpleNullableType.skipType (start), expectedEnd);
344
+ expect (simpleNullableType.couldBeExpression, isTrue);
345
+
346
+ TypeInfoListener listener;
347
+ assertResult (Token actualEnd) {
348
+ expect (actualEnd, expectedEnd);
349
+ expect (listener.calls, [
350
+ 'handleIdentifier C typeReference' ,
351
+ 'handleNoTypeArguments ?' ,
352
+ 'handleType C ?' ,
353
+ ]);
354
+ expect (listener.errors, isNull);
355
+ }
356
+
357
+ listener = new TypeInfoListener ();
358
+ assertResult (
359
+ simpleNullableType.ensureTypeNotVoid (start, new Parser (listener)));
360
+
361
+ listener = new TypeInfoListener ();
362
+ assertResult (
363
+ simpleNullableType.ensureTypeOrVoid (start, new Parser (listener)));
364
+
365
+ listener = new TypeInfoListener ();
366
+ assertResult (
367
+ simpleNullableType.parseTypeNotVoid (start, new Parser (listener)));
368
+
369
+ listener = new TypeInfoListener ();
370
+ assertResult (simpleNullableType.parseType (start, new Parser (listener)));
371
+ }
372
+ }
373
+
374
+ @reflectiveTest
375
+ class SimpleNullableTypeWith1ArgumentTest {
376
+ void test_compute () {
377
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>?' , required : true );
378
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>?;' , required : true );
379
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>?(' , required : true );
380
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>? do' , required : true );
381
+
382
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>? foo' );
383
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>? get' );
384
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>? set' );
385
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>? operator' );
386
+ expectInfo (simpleNullableTypeWith1Argument, 'C<T>? Function' );
387
+ }
388
+
389
+ void test_gt_questionMark () {
390
+ final Token start = scanString ('before C<T>? ;' ).tokens;
391
+ final Token expectedEnd = start.next.next.next.next.next;
392
+ expect (expectedEnd.lexeme, '?' );
393
+
394
+ expect (simpleNullableTypeWith1Argument.skipType (start), expectedEnd);
395
+ expect (simpleNullableTypeWith1Argument.couldBeExpression, isFalse);
396
+
397
+ TypeInfoListener listener;
398
+ assertResult (Token actualEnd) {
399
+ expect (actualEnd, expectedEnd);
400
+ expect (listener.calls, [
401
+ 'handleIdentifier C typeReference' ,
402
+ 'beginTypeArguments <' ,
403
+ 'handleIdentifier T typeReference' ,
404
+ 'handleNoTypeArguments >' ,
405
+ 'handleType T null' ,
406
+ 'endTypeArguments 1 < >' ,
407
+ 'handleType C ?' ,
408
+ ]);
409
+ expect (listener.errors, isNull);
410
+ }
411
+
412
+ listener = new TypeInfoListener ();
413
+ assertResult (simpleNullableTypeWith1Argument.ensureTypeNotVoid (
414
+ start, new Parser (listener)));
415
+
416
+ listener = new TypeInfoListener ();
417
+ assertResult (simpleNullableTypeWith1Argument.ensureTypeOrVoid (
418
+ start, new Parser (listener)));
419
+
420
+ listener = new TypeInfoListener ();
421
+ assertResult (simpleNullableTypeWith1Argument.parseTypeNotVoid (
422
+ start, new Parser (listener)));
423
+
424
+ listener = new TypeInfoListener ();
425
+ assertResult (
426
+ simpleNullableTypeWith1Argument.parseType (start, new Parser (listener)));
427
+ }
428
+ }
429
+
430
+ @reflectiveTest
431
+ class SimpleTypeTest {
313
432
void test_compute () {
314
433
expectInfo (simpleType, 'C' , required : true );
315
434
expectInfo (simpleType, 'C;' , required : true );
@@ -336,7 +455,7 @@ class SimpleTypeInfoTest {
336
455
expectInfo (simpleType, 'C Function<T>(int x)' , required : false );
337
456
}
338
457
339
- void test_simpleTypeInfo () {
458
+ void test_simpleType () {
340
459
final Token start = scanString ('before C ;' ).tokens;
341
460
final Token expectedEnd = start.next;
342
461
@@ -818,10 +937,15 @@ class TypeInfoTest {
818
937
expectedErrors: [
819
938
error (codeExpectedType, 2 , 1 )
820
939
]);
940
+ }
821
941
942
+ void test_computeType_statements () {
822
943
// Statements that should not have a type
823
944
expectInfo (noType, 'C<T ; T>U;' , required : false );
824
945
expectInfo (noType, 'C<T && T>U;' , required : false );
946
+
947
+ expectInfo (noType, 'C? D : E;' , required : false );
948
+ expectInfo (noType, 'C? D.foo : E;' , required : false );
825
949
}
826
950
827
951
void test_computeType_nested () {
0 commit comments