| Index: pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| index fccfb8042bee4f2fb745432b3d309880a72bc3d1..8f0f26b169853be4fbcac6fef2ff4efa52a5a480 100644
|
| --- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| +++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
|
| @@ -454,7 +454,8 @@ abstract class InferrerEngine<T, V extends TypeSystem>
|
| bool isNativeElement(Element element) {
|
| if (element.isNative) return true;
|
| return element.isClassMember
|
| - && element.enclosingClass.isNative
|
| + && (element.enclosingClass.isNative
|
| + || element.enclosingClass.isJsInterop)
|
| && element.isField;
|
| }
|
|
|
| @@ -1610,6 +1611,9 @@ class SimpleTypeInferrerVisitor<T>
|
| // we have to forward the call to the effective target of the
|
| // factory.
|
| if (element.isFactoryConstructor) {
|
| +
|
| + if (element.isJsInterop) return types.dynamicType;
|
| +
|
| // TODO(herhut): Remove the while loop once effectiveTarget forwards to
|
| // patches.
|
| while (element.isFactoryConstructor) {
|
| @@ -1621,6 +1625,7 @@ class SimpleTypeInferrerVisitor<T>
|
| if (compiler.backend.isForeign(element)) {
|
| return handleForeignSend(node, element);
|
| }
|
| +
|
| Selector selector = elements.getSelector(node);
|
| TypeMask mask = elements.getTypeMask(node);
|
| // In erroneous code the number of arguments in the selector might not
|
| @@ -2094,7 +2099,9 @@ class SimpleTypeInferrerVisitor<T>
|
| assert(!element.isFactoryConstructor ||
|
| !(element as ConstructorElement).isRedirectingFactory);
|
| // Erroneous elements may be unresolved, for example missing getters.
|
| +
|
| if (Elements.isUnresolved(element)) return types.dynamicType;
|
| +
|
| // TODO(herhut): should we follow redirecting constructors here? We would
|
| // need to pay attention if the constructor is pointing to an erroneous
|
| // element.
|
| @@ -2124,6 +2131,7 @@ class SimpleTypeInferrerVisitor<T>
|
| ast.Node receiver = send.receiver;
|
| if (receiver != null) {
|
| Element element = elements[receiver];
|
| +
|
| if (Elements.isLocal(element) && !capturedVariables.contains(element)) {
|
| T refinedType = types.refineReceiver(
|
| selector, mask, receiverType, send.isConditional);
|
|
|