Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2047)

Side by Side Diff: pkg/analyzer/lib/src/generated/type_system.dart

Issue 2288393002: Simplify the bailout test for generic inference (Closed)
Patch Set: Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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 analyzer.src.generated.type_system; 5 library analyzer.src.generated.type_system;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import 'dart:math' as math; 8 import 'dart:math' as math;
9 9
10 import 'package:analyzer/dart/ast/token.dart' show TokenType; 10 import 'package:analyzer/dart/ast/token.dart' show TokenType;
(...skipping 1408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1419 // we choose the upper bound as being the most useful. 1419 // we choose the upper bound as being the most useful.
1420 // 1420 //
1421 // Otherwise we choose the more precise lower bound. 1421 // Otherwise we choose the more precise lower bound.
1422 _TypeParameterVariance variance = 1422 _TypeParameterVariance variance =
1423 new _TypeParameterVariance.from(typeParam, fnType.returnType); 1423 new _TypeParameterVariance.from(typeParam, fnType.returnType);
1424 1424
1425 _TypeParameterBound bound = _bounds[typeParam]; 1425 _TypeParameterBound bound = _bounds[typeParam];
1426 inferredTypes[i] = 1426 inferredTypes[i] =
1427 variance.passedIn || bound.lower.isBottom ? bound.upper : bound.lower; 1427 variance.passedIn || bound.lower.isBottom ? bound.upper : bound.lower;
1428 1428
1429 // See if the constraints on the type variable are satisfied. 1429 // See if the bounds can be satisfied.
1430 // 1430 if (bound.upper.isBottom ||
1431 // If not, bail out of the analysis, unless a partial solution was 1431 !_typeSystem.isSubtypeOf(bound.lower, bound.upper)) {
1432 // requested. If we are willing to accept a partial solution, fall back to
1433 // the known upper bound (if any) or `dynamic` for this unsolvable type
1434 // variable.
1435 if (inferredTypes[i].isBottom ||
1436 !isSubtypeOf(inferredTypes[i],
1437 bound.upper.substitute2(inferredTypes, fnTypeParams)) ||
1438 !isSubtypeOf(bound.lower.substitute2(inferredTypes, fnTypeParams),
1439 inferredTypes[i])) {
1440 // Inference failed. Bail. 1432 // Inference failed. Bail.
1441 return null; 1433 return null;
1442 } 1434 }
1443 } 1435 }
1444 1436
1445 // Return the instantiated type. 1437 // Return the instantiated type.
1446 return fnType.instantiate(inferredTypes); 1438 return fnType.instantiate(inferredTypes);
1447 } 1439 }
1448 1440
1449 @override 1441 @override
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
1689 } 1681 }
1690 1682
1691 bool _isBottom(DartType t, {bool dynamicIsBottom: false}) { 1683 bool _isBottom(DartType t, {bool dynamicIsBottom: false}) {
1692 return (t.isDynamic && dynamicIsBottom) || t.isBottom; 1684 return (t.isDynamic && dynamicIsBottom) || t.isBottom;
1693 } 1685 }
1694 1686
1695 bool _isTop(DartType t, {bool dynamicIsBottom: false}) { 1687 bool _isTop(DartType t, {bool dynamicIsBottom: false}) {
1696 // TODO(leafp): Document the rules in play here 1688 // TODO(leafp): Document the rules in play here
1697 return (t.isDynamic && !dynamicIsBottom) || t.isObject; 1689 return (t.isDynamic && !dynamicIsBottom) || t.isObject;
1698 } 1690 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698