| // Copyright (c) 2017, 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. | |
| part of dart2js.kernel.element_map; | |
| class KernelNoSuchMethodResolver implements NoSuchMethodResolver { | |
| final KernelToElementMapImpl elementMap; | |
| KernelNoSuchMethodResolver(this.elementMap); | |
| ElementEnvironment get _elementEnvironment => elementMap.elementEnvironment; | |
| CommonElements get _commonElements => elementMap.commonElements; | |
| @override | |
| bool hasForwardingSyntax(KFunction method) { | |
| ir.Procedure node = elementMap._lookupProcedure(method); | |
| if (node.function.positionalParameters.isEmpty) return false; | |
| ir.VariableDeclaration firstParameter = | |
| node.function.positionalParameters.first; | |
| ir.Statement body = node.function.body; | |
| ir.Expression expr; | |
| if (body is ir.Block && body.statements.isNotEmpty) { | |
| ir.Block block = body; | |
| body = block.statements.first; | |
| } | |
| if (body is ir.ReturnStatement) { | |
| expr = body.expression; | |
| } | |
| if (expr is ir.AsExpression && | |
| elementMap.getDartType(expr.type) == _commonElements.dynamicType) { | |
| ir.AsExpression asExpression = expr; | |
| expr = asExpression.operand; | |
| } | |
| if (expr is ir.SuperMethodInvocation && | |
| expr.name.name == Identifiers.noSuchMethod_) { | |
| ir.Arguments arguments = expr.arguments; | |
| if (arguments.positional.length == 1 && | |
| arguments.named.isEmpty && | |
| arguments.positional.first is ir.VariableGet) { | |
| ir.VariableGet get = arguments.positional.first; | |
| return get.variable == firstParameter; | |
| } | |
| } | |
| return false; | |
| } | |
| @override | |
| bool hasThrowingSyntax(KFunction method) { | |
| ir.Procedure node = elementMap._lookupProcedure(method); | |
| ir.Statement body = node.function.body; | |
| if (body is ir.Block && body.statements.isNotEmpty) { | |
| ir.Block block = body; | |
| body = block.statements.first; | |
| } | |
| ir.Expression expr; | |
| if (body is ir.ReturnStatement) { | |
| expr = body.expression; | |
| } else if (body is ir.ExpressionStatement) { | |
| expr = body.expression; | |
| } | |
| return expr is ir.Throw; | |
| } | |
| @override | |
| FunctionEntity getSuperNoSuchMethod(FunctionEntity method) { | |
| return elementMap.getSuperNoSuchMethod(method.enclosingClass); | |
| } | |
| } |