dart / co19 / 71951f8d687c6e7400bc9e5605301d2ef3fafa5b / . / LanguageFeatures / Set-literals / type_inference_A07_t01.dart

/* | |

* Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file | |

* for details. All rights reserved. Use of this source code is governed by a | |

* BSD-style license that can be found in the LICENSE file. | |

*/ | |

/** | |

* @assertion To infer the type of element: | |

* ... | |

* If element is a spreadElement with expression e1: | |

* | |

* If P is ? then let S be the inferred type of e1 in context ?: | |

* | |

* If S is a non-Null subtype of Iterable<Object>, then the inferred set element | |

* type of element is T where T is the type such that Iterable<T> is a | |

* superinterface of S (the result of constraint matching for X using the | |

* constraint S <: Iterable<X>). | |

* | |

* @description Checks that if S is a non-Null subtype of Iterable<Object?>, | |

* then the inferred set element type of element is T where T is the type such | |

* that Iterable<T> is a superinterface of S | |

* @author sgrekhov@unipro.ru | |

* @static-warning | |

*/ | |

import "../../Utils/expect.dart"; | |

void test1<T extends Iterable<num>>(T t) { | |

var s1 = {...t}; | |

var s2 = {...?t}; | |

Expect.isTrue(s1 is Set<num>); | |

Expect.isFalse(s1 is Set<int>); | |

Expect.isTrue(s2 is Set<num>); | |

Expect.isFalse(s2 is Set<int>); | |

} | |

void test2<T extends Iterable<Object>>(T t) { | |

var s1 = {...t}; | |

var s2 = {...?t}; | |

Expect.isTrue(s1 is Set<Object>); | |

Expect.isFalse(s1 is Set<num>); | |

Expect.isTrue(s2 is Set<Object>); | |

Expect.isFalse(s2 is Set<num>); | |

} | |

main() { | |

int x = 2; | |

test1([1, x, 3, 4]); | |

test2([1.0, 2.0, x, 4]); | |

} |