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 part of js_backend; | 5 part of js_backend; |
6 | 6 |
7 /** | 7 /** |
8 * Categorizes `noSuchMethod` implementations. | 8 * Categorizes `noSuchMethod` implementations. |
9 * | 9 * |
10 * If user code includes `noSuchMethod` implementations, type inference is | 10 * If user code includes `noSuchMethod` implementations, type inference is |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 } else if (body is Block && | 201 } else if (body is Block && |
202 !body.statements.isEmpty && | 202 !body.statements.isEmpty && |
203 body.statements.nodes.tail.isEmpty) { | 203 body.statements.nodes.tail.isEmpty) { |
204 Statement stmt = body.statements.nodes.head; | 204 Statement stmt = body.statements.nodes.head; |
205 if (stmt is Return && stmt.hasExpression) { | 205 if (stmt is Return && stmt.hasExpression) { |
206 expr = stmt.expression; | 206 expr = stmt.expression; |
207 } | 207 } |
208 } | 208 } |
209 if (expr is Send && | 209 if (expr is Send && |
210 expr.isTypeCast && | 210 expr.isTypeCast && |
| 211 expr.typeAnnotationFromIsCheckOrCast.typeName is Identifier && |
211 expr.typeAnnotationFromIsCheckOrCast.typeName.source == "dynamic") { | 212 expr.typeAnnotationFromIsCheckOrCast.typeName.source == "dynamic") { |
212 expr = expr.receiver; | 213 expr = (expr as Send).receiver; |
213 } | 214 } |
214 if (expr is Send && | 215 if (expr is Send && |
215 expr.isSuperCall && | 216 expr.isSuperCall && |
216 expr.selector is Identifier && | 217 expr.selector is Identifier && |
217 (expr.selector as Identifier).source == Identifiers.noSuchMethod_) { | 218 (expr.selector as Identifier).source == Identifiers.noSuchMethod_) { |
218 var arg = expr.arguments.head; | 219 var arg = expr.arguments.head; |
219 if (expr.arguments.tail.isEmpty && | 220 if (expr.arguments.tail.isEmpty && |
220 arg is Send && | 221 arg is Send && |
221 arg.argumentsNode == null && | 222 arg.argumentsNode == null && |
222 arg.receiver == null && | 223 arg.receiver == null && |
(...skipping 17 matching lines...) Expand all Loading... |
240 if (body.statements.nodes.head is ExpressionStatement) { | 241 if (body.statements.nodes.head is ExpressionStatement) { |
241 ExpressionStatement stmt = body.statements.nodes.head; | 242 ExpressionStatement stmt = body.statements.nodes.head; |
242 return stmt.expression is Throw; | 243 return stmt.expression is Throw; |
243 } | 244 } |
244 } | 245 } |
245 return false; | 246 return false; |
246 } | 247 } |
247 } | 248 } |
248 | 249 |
249 enum NsmCategory { DEFAULT, THROWING, NOT_APPLICABLE, OTHER, } | 250 enum NsmCategory { DEFAULT, THROWING, NOT_APPLICABLE, OTHER, } |
OLD | NEW |