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 import 'package:kernel/ast.dart' as ir; | 5 import 'package:kernel/ast.dart' as ir; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/names.dart'; | 8 import '../common/names.dart'; |
9 import '../constants/constructors.dart'; | 9 import '../constants/constructors.dart'; |
10 import '../constants/expressions.dart'; | 10 import '../constants/expressions.dart'; |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
135 | 135 |
136 /// Compute the kind of foreign helper function called by [node], if any. | 136 /// Compute the kind of foreign helper function called by [node], if any. |
137 ForeignKind getForeignKind(ir.StaticInvocation node); | 137 ForeignKind getForeignKind(ir.StaticInvocation node); |
138 | 138 |
139 /// Computes the [InterfaceType] referenced by a call to the | 139 /// Computes the [InterfaceType] referenced by a call to the |
140 /// [JS_INTERCEPTOR_CONSTANT] function, if any. | 140 /// [JS_INTERCEPTOR_CONSTANT] function, if any. |
141 InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node); | 141 InterfaceType getInterfaceTypeForJsInterceptorCall(ir.StaticInvocation node); |
142 | 142 |
143 /// Computes the [ConstantValue] for the constant [expression]. | 143 /// Computes the [ConstantValue] for the constant [expression]. |
144 ConstantValue getConstantValue(ir.Expression expression); | 144 ConstantValue getConstantValue(ir.Expression expression); |
| 145 |
| 146 /// Returns the `noSuchMethod` [FunctionEntity] call from a |
| 147 /// `super.noSuchMethod` invocation within [cls]. |
| 148 FunctionEntity getSuperNoSuchMethod(ClassEntity cls); |
145 } | 149 } |
146 | 150 |
147 /// Kinds of foreign functions. | 151 /// Kinds of foreign functions. |
148 enum ForeignKind { | 152 enum ForeignKind { |
149 JS, | 153 JS, |
150 JS_BUILTIN, | 154 JS_BUILTIN, |
151 JS_EMBEDDED_GLOBAL, | 155 JS_EMBEDDED_GLOBAL, |
152 JS_INTERCEPTOR_CONSTANT, | 156 JS_INTERCEPTOR_CONSTANT, |
153 NONE, | 157 NONE, |
154 } | 158 } |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 /// Computes the native behavior for calling [procedure]. | 469 /// Computes the native behavior for calling [procedure]. |
466 // TODO(johnniwinther): Cache this for later use. | 470 // TODO(johnniwinther): Cache this for later use. |
467 native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure, | 471 native.NativeBehavior getNativeBehaviorForMethod(ir.Procedure procedure, |
468 {bool isJsInterop}) { | 472 {bool isJsInterop}) { |
469 DartType type = getFunctionType(procedure.function); | 473 DartType type = getFunctionType(procedure.function); |
470 List<ConstantValue> metadata = getMetadata(procedure.annotations); | 474 List<ConstantValue> metadata = getMetadata(procedure.annotations); |
471 return nativeBehaviorBuilder.buildMethodBehavior( | 475 return nativeBehaviorBuilder.buildMethodBehavior( |
472 type, metadata, typeLookup(resolveAsRaw: false), | 476 type, metadata, typeLookup(resolveAsRaw: false), |
473 isJsInterop: isJsInterop); | 477 isJsInterop: isJsInterop); |
474 } | 478 } |
| 479 |
| 480 @override |
| 481 FunctionEntity getSuperNoSuchMethod(ClassEntity cls) { |
| 482 while (cls != null) { |
| 483 cls = elementEnvironment.getSuperClass(cls); |
| 484 MemberEntity member = |
| 485 elementEnvironment.lookupClassMember(cls, Identifiers.noSuchMethod_); |
| 486 if (member != null) { |
| 487 if (member.isFunction) { |
| 488 FunctionEntity function = member; |
| 489 if (function.parameterStructure.positionalParameters >= 1) { |
| 490 return function; |
| 491 } |
| 492 } |
| 493 // If [member] is not a valid `noSuchMethod` the target is |
| 494 // `Object.superNoSuchMethod`. |
| 495 break; |
| 496 } |
| 497 } |
| 498 FunctionEntity function = elementEnvironment.lookupClassMember( |
| 499 commonElements.objectClass, Identifiers.noSuchMethod_); |
| 500 assert(invariant(cls, function != null, |
| 501 message: "No super noSuchMethod found for class $cls.")); |
| 502 return function; |
| 503 } |
475 } | 504 } |
476 | 505 |
477 /// Visitor that converts string literals and concatenations of string literals | 506 /// Visitor that converts string literals and concatenations of string literals |
478 /// into the string value. | 507 /// into the string value. |
479 class Stringifier extends ir.ExpressionVisitor<String> { | 508 class Stringifier extends ir.ExpressionVisitor<String> { |
480 @override | 509 @override |
481 String visitStringLiteral(ir.StringLiteral node) => node.value; | 510 String visitStringLiteral(ir.StringLiteral node) => node.value; |
482 | 511 |
483 @override | 512 @override |
484 String visitStringConcatenation(ir.StringConcatenation node) { | 513 String visitStringConcatenation(ir.StringConcatenation node) { |
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
842 } | 871 } |
843 if (isRedirecting) { | 872 if (isRedirecting) { |
844 return new RedirectingGenerativeConstantConstructor( | 873 return new RedirectingGenerativeConstantConstructor( |
845 defaultValues, superConstructorInvocation); | 874 defaultValues, superConstructorInvocation); |
846 } else { | 875 } else { |
847 return new GenerativeConstantConstructor( | 876 return new GenerativeConstantConstructor( |
848 type, defaultValues, fieldMap, superConstructorInvocation); | 877 type, defaultValues, fieldMap, superConstructorInvocation); |
849 } | 878 } |
850 } | 879 } |
851 } | 880 } |
OLD | NEW |