| 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 /// This file declares a "shadow hierarchy" of concrete classes which extend | 5 /// This file declares a "shadow hierarchy" of concrete classes which extend |
| 6 /// the kernel class hierarchy, adding methods and fields needed by the | 6 /// the kernel class hierarchy, adding methods and fields needed by the |
| 7 /// BodyBuilder. | 7 /// BodyBuilder. |
| 8 /// | 8 /// |
| 9 /// Instances of these classes may be created using the factory methods in | 9 /// Instances of these classes may be created using the factory methods in |
| 10 /// `ast_factory.dart`. | 10 /// `ast_factory.dart`. |
| (...skipping 1934 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1945 // so that the type hierarchy will be simpler (which may speed up "is" | 1945 // so that the type hierarchy will be simpler (which may speed up "is" |
| 1946 // checks). | 1946 // checks). |
| 1947 return statement._inferStatement(this); | 1947 return statement._inferStatement(this); |
| 1948 } else { | 1948 } else { |
| 1949 // Encountered a statement type for which type inference is not yet | 1949 // Encountered a statement type for which type inference is not yet |
| 1950 // implemented, so just skip it for now. | 1950 // implemented, so just skip it for now. |
| 1951 // TODO(paulberry): once the BodyBuilder uses shadow classes for | 1951 // TODO(paulberry): once the BodyBuilder uses shadow classes for |
| 1952 // everything, this case should no longer be needed. | 1952 // everything, this case should no longer be needed. |
| 1953 } | 1953 } |
| 1954 } | 1954 } |
| 1955 | |
| 1956 /// If the given [type] is a [TypeParameterType], resolve it to its bound. | |
| 1957 DartType resolveTypeParameter(DartType type) { | |
| 1958 DartType resolveOneStep(DartType type) { | |
| 1959 if (type is TypeParameterType) { | |
| 1960 return type.bound; | |
| 1961 } else { | |
| 1962 return null; | |
| 1963 } | |
| 1964 } | |
| 1965 | |
| 1966 var resolved = resolveOneStep(type); | |
| 1967 if (resolved == null) return type; | |
| 1968 | |
| 1969 // Detect circularities using the tortoise-and-hare algorithm. | |
| 1970 type = resolved; | |
| 1971 DartType hare = resolveOneStep(type); | |
| 1972 if (hare == null) return type; | |
| 1973 while (true) { | |
| 1974 if (identical(type, hare)) { | |
| 1975 // We found a circularity. Give up and return `dynamic`. | |
| 1976 return const DynamicType(); | |
| 1977 } | |
| 1978 | |
| 1979 // Hare takes two steps | |
| 1980 var step1 = resolveOneStep(hare); | |
| 1981 if (step1 == null) return hare; | |
| 1982 var step2 = resolveOneStep(step1); | |
| 1983 if (step2 == null) return hare; | |
| 1984 hare = step2; | |
| 1985 | |
| 1986 // Tortoise takes one step | |
| 1987 type = resolveOneStep(type); | |
| 1988 } | |
| 1989 } | |
| 1990 } | 1955 } |
| 1991 | 1956 |
| 1992 /// Shadow object for [TypeLiteral]. | 1957 /// Shadow object for [TypeLiteral]. |
| 1993 class KernelTypeLiteral extends TypeLiteral implements KernelExpression { | 1958 class KernelTypeLiteral extends TypeLiteral implements KernelExpression { |
| 1994 KernelTypeLiteral(DartType type) : super(type); | 1959 KernelTypeLiteral(DartType type) : super(type); |
| 1995 | 1960 |
| 1996 @override | 1961 @override |
| 1997 void _collectDependencies(KernelDependencyCollector collector) { | 1962 void _collectDependencies(KernelDependencyCollector collector) { |
| 1998 // No inference dependencies. | 1963 // No inference dependencies. |
| 1999 } | 1964 } |
| (...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2236 } | 2201 } |
| 2237 | 2202 |
| 2238 transformChildren(v) { | 2203 transformChildren(v) { |
| 2239 return internalError("Internal error: Unsupported operation."); | 2204 return internalError("Internal error: Unsupported operation."); |
| 2240 } | 2205 } |
| 2241 | 2206 |
| 2242 visitChildren(v) { | 2207 visitChildren(v) { |
| 2243 return internalError("Internal error: Unsupported operation."); | 2208 return internalError("Internal error: Unsupported operation."); |
| 2244 } | 2209 } |
| 2245 } | 2210 } |
| OLD | NEW |