| OLD | NEW |
| 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/element/element.dart'; | 10 import 'package:analyzer/dart/element/element.dart'; |
| (...skipping 855 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 866 // TODO(jmesserly): this is very similar to code used for flattening futures. | 866 // TODO(jmesserly): this is very similar to code used for flattening futures. |
| 867 // The only difference is, because of a lack of TypeProvider, the other method | 867 // The only difference is, because of a lack of TypeProvider, the other method |
| 868 // has to match the Future type by its name and library. Here was are passed | 868 // has to match the Future type by its name and library. Here was are passed |
| 869 // in the correct type. | 869 // in the correct type. |
| 870 DartType mostSpecificTypeArgument(DartType type, DartType genericType) { | 870 DartType mostSpecificTypeArgument(DartType type, DartType genericType) { |
| 871 if (type is! InterfaceType) return null; | 871 if (type is! InterfaceType) return null; |
| 872 | 872 |
| 873 // Walk the superinterface hierarchy looking for [genericType]. | 873 // Walk the superinterface hierarchy looking for [genericType]. |
| 874 List<DartType> candidates = <DartType>[]; | 874 List<DartType> candidates = <DartType>[]; |
| 875 HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>(); | 875 HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>(); |
| 876 void recurse(InterfaceTypeImpl interface) { | 876 void recurse(InterfaceType interface) { |
| 877 if (interface.element == genericType.element && | 877 if (interface.element == genericType.element && |
| 878 interface.typeArguments.isNotEmpty) { | 878 interface.typeArguments.isNotEmpty) { |
| 879 candidates.add(interface.typeArguments[0]); | 879 candidates.add(interface.typeArguments[0]); |
| 880 } | 880 } |
| 881 if (visitedClasses.add(interface.element)) { | 881 if (visitedClasses.add(interface.element)) { |
| 882 if (interface.superclass != null) { | 882 if (interface.superclass != null) { |
| 883 recurse(interface.superclass); | 883 recurse(interface.superclass); |
| 884 } | 884 } |
| 885 interface.mixins.forEach(recurse); | 885 interface.mixins.forEach(recurse); |
| 886 interface.interfaces.forEach(recurse); | 886 interface.interfaces.forEach(recurse); |
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1297 } else { | 1297 } else { |
| 1298 passedOut = true; | 1298 passedOut = true; |
| 1299 } | 1299 } |
| 1300 } else if (type is FunctionType) { | 1300 } else if (type is FunctionType) { |
| 1301 _visitFunctionType(typeParam, type, paramIn); | 1301 _visitFunctionType(typeParam, type, paramIn); |
| 1302 } else if (type is InterfaceType) { | 1302 } else if (type is InterfaceType) { |
| 1303 _visitInterfaceType(typeParam, type, paramIn); | 1303 _visitInterfaceType(typeParam, type, paramIn); |
| 1304 } | 1304 } |
| 1305 } | 1305 } |
| 1306 } | 1306 } |
| OLD | NEW |