| Index: pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
|
| index e9b22edb2ebd8bbe56615652bd25d1089ffa1b3e..ad1dc41bf01b76302e11d9ede58eb08958bfef3a 100644
|
| --- a/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
|
| +++ b/pkg/front_end/lib/src/fasta/type_inference/type_inferrer.dart
|
| @@ -869,6 +869,29 @@ abstract class TypeInferrerImpl extends TypeInferrer {
|
| if (interfaceMember is Procedure) {
|
| isOverloadedArithmeticOperator = typeSchemaEnvironment
|
| .isOverloadedArithmeticOperatorAndType(interfaceMember, receiverType);
|
| + if (instrumentation != null) {
|
| + var semiTypedArguments = <String>[];
|
| + var function = interfaceMember.function;
|
| + var positionalParameters = function.positionalParameters;
|
| + for (int i = 0; i < positionalParameters.length; i++) {
|
| + if (_isFormalSemiSafe(positionalParameters[i])) {
|
| + semiTypedArguments.add(i.toString());
|
| + }
|
| + }
|
| + for (var formal in function.namedParameters) {
|
| + if (_isFormalSemiSafe(formal)) {
|
| + semiTypedArguments.add(formal.name);
|
| + }
|
| + }
|
| + if (semiTypedArguments.isNotEmpty) {
|
| + instrumentation.record(
|
| + Uri.parse(uri),
|
| + arguments.fileOffset,
|
| + 'checkCall',
|
| + new InstrumentationValueLiteral(
|
| + 'interface(semiTyped:${semiTypedArguments.join(',')})'));
|
| + }
|
| + }
|
| }
|
| var calleeType = getCalleeFunctionType(
|
| interfaceMember, receiverType, methodName, !isImplicitCall);
|
| @@ -1059,4 +1082,13 @@ abstract class TypeInferrerImpl extends TypeInferrer {
|
| callback(namedExpression.name, namedExpression.value);
|
| }
|
| }
|
| +
|
| + /// Determines if the given formal parameter is semi-safe.
|
| + ///
|
| + /// Eventually this information will be stored in the kernel representation,
|
| + /// so this method will no longer be needed. TODO(paulberry): remove this
|
| + /// when it's appropriate to do so.
|
| + bool _isFormalSemiSafe(VariableDeclaration formal) {
|
| + return formal is KernelVariableDeclaration && formal.isSemiSafe;
|
| + }
|
| }
|
|
|