| Index: pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| index 04b9a20195fcbf36e2fa20b2e7a4b68916b4672c..34a4bdc3d0dc16a81eafffa0f66325d15a8090e4 100644
|
| --- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| +++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
|
| @@ -1076,7 +1076,7 @@ class KernelMethodInvocation extends MethodInvocation
|
| // to fail. TODO(paulberry): fix this.
|
| if (inferrer.strongMode) {
|
| inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset,
|
| - 'target', new InstrumentationValueForProcedure(interfaceMember));
|
| + 'target', new InstrumentationValueForMember(interfaceMember));
|
| interfaceTarget = interfaceMember;
|
| }
|
| isOverloadedArithmeticOperator = inferrer.typeSchemaEnvironment
|
| @@ -1156,8 +1156,28 @@ class KernelPropertyGet extends PropertyGet implements KernelExpression {
|
| @override
|
| DartType _inferExpression(
|
| KernelTypeInferrer inferrer, DartType typeContext, bool typeNeeded) {
|
| - // TODO(scheglov): implement.
|
| - return typeNeeded ? const DynamicType() : null;
|
| + typeNeeded =
|
| + inferrer.listener.propertyGetEnter(this, typeContext) || typeNeeded;
|
| + // First infer the receiver so we can look up the getter that was invoked.
|
| + var receiverType = inferrer.inferExpression(receiver, null, true);
|
| + Member interfaceMember;
|
| + if (receiverType is InterfaceType) {
|
| + interfaceMember = inferrer.classHierarchy
|
| + .getInterfaceMember(receiverType.classNode, name);
|
| + // Our non-strong golden files currently don't include interface targets,
|
| + // so we can't store the interface target without causing tests to fail.
|
| + // TODO(paulberry): fix this.
|
| + if (inferrer.strongMode) {
|
| + inferrer.instrumentation?.record(Uri.parse(inferrer.uri), fileOffset,
|
| + 'target', new InstrumentationValueForMember(interfaceMember));
|
| + interfaceTarget = interfaceMember;
|
| + }
|
| + }
|
| + var inferredType =
|
| + inferrer.getCalleeType(interfaceMember, receiverType, name);
|
| + // TODO(paulberry): Infer tear-off type arguments if appropriate.
|
| + inferrer.listener.propertyGetExit(this, inferredType);
|
| + return typeNeeded ? inferredType : null;
|
| }
|
| }
|
|
|
| @@ -1888,10 +1908,6 @@ class KernelYieldStatement extends YieldStatement implements KernelStatement {
|
| }
|
|
|
| class _UnfinishedCascade extends Expression {
|
| - getStaticType(types) {
|
| - return internalError("Internal error: Unsupported operation.");
|
| - }
|
| -
|
| accept(v) {
|
| return internalError("Internal error: Unsupported operation.");
|
| }
|
| @@ -1900,11 +1916,15 @@ class _UnfinishedCascade extends Expression {
|
| return internalError("Internal error: Unsupported operation.");
|
| }
|
|
|
| - visitChildren(v) {
|
| + getStaticType(types) {
|
| return internalError("Internal error: Unsupported operation.");
|
| }
|
|
|
| transformChildren(v) {
|
| return internalError("Internal error: Unsupported operation.");
|
| }
|
| +
|
| + visitChildren(v) {
|
| + return internalError("Internal error: Unsupported operation.");
|
| + }
|
| }
|
|
|