| Index: pkg/analyzer/lib/src/summary/link.dart | 
| diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart | 
| index 45ed6052f23dd395ea90284512418c906bcf63d6..fe9d6b13ee2fbd1448acd9fe5e3d78d2a017add0 100644 | 
| --- a/pkg/analyzer/lib/src/summary/link.dart | 
| +++ b/pkg/analyzer/lib/src/summary/link.dart | 
| @@ -1356,11 +1356,9 @@ class CompilationUnitElementInBuildUnit extends CompilationUnitElementForLink { | 
| void link() { | 
| if (library._linker.strongMode) { | 
| new InstanceMemberInferrer( | 
| -              enclosingElement._linker.typeProvider, | 
| -              (clazz) => (clazz.library as LibraryElementInBuildUnit) | 
| -                  .inheritanceManager, | 
| -              new Set<FieldElement>()) | 
| -          .inferCompilationUnit(this); | 
| +          enclosingElement._linker.typeProvider, | 
| +          (clazz) => (clazz.library as LibraryElementInBuildUnit) | 
| +              .inheritanceManager).inferCompilationUnit(this); | 
| for (TopLevelVariableElementForLink variable in topLevelVariables) { | 
| variable.link(this); | 
| } | 
| @@ -2130,20 +2128,10 @@ class ExprTypeComputer { | 
| stack.add(DynamicTypeImpl.instance); | 
| break; | 
| case UnlinkedExprOperation.pushReference: | 
| -          try { | 
| -            _doPushReference(); | 
| -          } on _InferenceFailedError { | 
| -            errorKind = TopLevelInferenceErrorKind.instanceGetter; | 
| -            return DynamicTypeImpl.instance; | 
| -          } | 
| +          _doPushReference(); | 
| break; | 
| case UnlinkedExprOperation.extractProperty: | 
| -          try { | 
| -            _doExtractProperty(); | 
| -          } on _InferenceFailedError { | 
| -            errorKind = TopLevelInferenceErrorKind.instanceGetter; | 
| -            return DynamicTypeImpl.instance; | 
| -          } | 
| +          _doExtractProperty(); | 
| break; | 
| case UnlinkedExprOperation.invokeConstructor: | 
| _doInvokeConstructor(); | 
| @@ -2226,10 +2214,14 @@ class ExprTypeComputer { | 
| _doConditional(); | 
| break; | 
| case UnlinkedExprOperation.assignToIndex: | 
| +          _doAssignToIndex(); | 
| +          break; | 
| case UnlinkedExprOperation.assignToProperty: | 
| +          _doAssignToProperty(); | 
| +          break; | 
| case UnlinkedExprOperation.assignToRef: | 
| -          errorKind = TopLevelInferenceErrorKind.assignment; | 
| -          return DynamicTypeImpl.instance; | 
| +          _doAssignToRef(); | 
| +          break; | 
| case UnlinkedExprOperation.await: | 
| _doAwait(); | 
| break; | 
| @@ -2237,12 +2229,7 @@ class ExprTypeComputer { | 
| _doExtractIndex(); | 
| break; | 
| case UnlinkedExprOperation.invokeMethodRef: | 
| -          try { | 
| -            _doInvokeMethodRef(); | 
| -          } on _InferenceFailedError { | 
| -            errorKind = TopLevelInferenceErrorKind.instanceGetter; | 
| -            return DynamicTypeImpl.instance; | 
| -          } | 
| +          _doInvokeMethodRef(); | 
| break; | 
| case UnlinkedExprOperation.invokeMethod: | 
| _doInvokeMethod(); | 
| @@ -2311,6 +2298,38 @@ class ExprTypeComputer { | 
| stack.add(DynamicTypeImpl.instance); | 
| } | 
|  | 
| +  void _doAssignment() { | 
| +    UnlinkedExprAssignOperator operator = | 
| +        unlinkedConst.assignmentOperators[assignmentOperatorPtr++]; | 
| +    if (isIncrementOrDecrement(operator)) { | 
| +      _doIncrementOrDecrement(operator); | 
| +      return; | 
| +    } | 
| +    if (operator == UnlinkedExprAssignOperator.assign) { | 
| +      stack.removeLast(); | 
| +      return; // type is on the stack | 
| +    } | 
| +    TokenType binaryOperator = _convertAssignOperatorToTokenType(operator); | 
| +    _computeBinaryExpressionType(binaryOperator); | 
| +  } | 
| + | 
| +  void _doAssignToIndex() { | 
| +    _doExtractIndex(); | 
| +    _doAssignment(); | 
| +  } | 
| + | 
| +  void _doAssignToProperty() { | 
| +    _doExtractProperty(); | 
| +    _doAssignment(); | 
| +  } | 
| + | 
| +  void _doAssignToRef() { | 
| +    EntityRef ref = _getNextRef(); | 
| +    ReferenceableElementForLink element = unit.resolveRef(ref.reference); | 
| +    stack.add(element.asStaticType); | 
| +    _doAssignment(); | 
| +  } | 
| + | 
| void _doAwait() { | 
| DartType type = stack.removeLast(); | 
| DartType typeArgument = type?.flattenFutures(linker.typeSystem); | 
| @@ -2353,7 +2372,6 @@ class ExprTypeComputer { | 
| ExecutableElement element = target | 
| .lookUpInheritedGetterOrMethod(propertyName, library: library); | 
| if (element != null) { | 
| -          _throwIfInstanceFieldOrAccessor(element); | 
| if (element is PropertyAccessorElement) { | 
| return element.returnType; | 
| } else { | 
| @@ -2374,6 +2392,26 @@ class ExprTypeComputer { | 
| stack.add(type); | 
| } | 
|  | 
| +  void _doIncrementOrDecrement(UnlinkedExprAssignOperator operator) { | 
| +    switch (operator) { | 
| +      case UnlinkedExprAssignOperator.prefixDecrement: | 
| +        stack.add(typeProvider.intType); | 
| +        _computeBinaryExpressionType(TokenType.MINUS); | 
| +        return; | 
| +      case UnlinkedExprAssignOperator.prefixIncrement: | 
| +        stack.add(typeProvider.intType); | 
| +        _computeBinaryExpressionType(TokenType.PLUS); | 
| +        return; | 
| +      case UnlinkedExprAssignOperator.postfixDecrement: | 
| +      case UnlinkedExprAssignOperator.postfixIncrement: | 
| +        return; // Return the operand type | 
| +      default: | 
| +        stack.removeLast(); | 
| +        stack.add(DynamicTypeImpl.instance); | 
| +        return; | 
| +    } | 
| +  } | 
| + | 
| void _doInvokeConstructor() { | 
| int numNamed = unlinkedConst.ints[intPtr++]; | 
| int numPositional = unlinkedConst.ints[intPtr++]; | 
| @@ -2468,7 +2506,6 @@ class ExprTypeComputer { | 
| List<DartType> positionalArgTypes = _popList(numPositional); | 
| EntityRef ref = _getNextRef(); | 
| ReferenceableElementForLink element = unit.resolveRef(ref.reference); | 
| -    _throwIfInstanceFieldOrAccessor(element); | 
| List<DartType> typeArguments = _getTypeArguments(); | 
| stack.add(() { | 
| DartType rawType = element.asStaticType; | 
| @@ -2542,7 +2579,6 @@ class ExprTypeComputer { | 
| // function-typed parameters. | 
| assert(ref.implicitFunctionTypeIndices.isEmpty); | 
| ReferenceableElementForLink element = unit.resolveRef(ref.reference); | 
| -      _throwIfInstanceFieldOrAccessor(element); | 
| stack.add(element.asStaticType); | 
| } | 
| } | 
| @@ -2693,14 +2729,45 @@ class ExprTypeComputer { | 
| stack.add(DynamicTypeImpl.instance); | 
| } | 
|  | 
| -  void _throwIfInstanceFieldOrAccessor(Object element) { | 
| -    if (element is NonstaticMemberElementForLink && | 
| -            element.hasInstanceGetterReference || | 
| -        element is FieldElement && !element.isStatic || | 
| -        element is PropertyAccessorElement && !element.isStatic) { | 
| -      throw new _InferenceFailedError( | 
| -          'Instance fields cannot be used for type inference.'); | 
| +  static TokenType _convertAssignOperatorToTokenType( | 
| +      UnlinkedExprAssignOperator o) { | 
| +    switch (o) { | 
| +      case UnlinkedExprAssignOperator.assign: | 
| +        return null; | 
| +      case UnlinkedExprAssignOperator.ifNull: | 
| +        return TokenType.QUESTION_QUESTION; | 
| +      case UnlinkedExprAssignOperator.multiply: | 
| +        return TokenType.STAR; | 
| +      case UnlinkedExprAssignOperator.divide: | 
| +        return TokenType.SLASH; | 
| +      case UnlinkedExprAssignOperator.floorDivide: | 
| +        return TokenType.TILDE_SLASH; | 
| +      case UnlinkedExprAssignOperator.modulo: | 
| +        return TokenType.PERCENT; | 
| +      case UnlinkedExprAssignOperator.plus: | 
| +        return TokenType.PLUS; | 
| +      case UnlinkedExprAssignOperator.minus: | 
| +        return TokenType.MINUS; | 
| +      case UnlinkedExprAssignOperator.shiftLeft: | 
| +        return TokenType.LT_LT; | 
| +      case UnlinkedExprAssignOperator.shiftRight: | 
| +        return TokenType.GT_GT; | 
| +      case UnlinkedExprAssignOperator.bitAnd: | 
| +        return TokenType.AMPERSAND; | 
| +      case UnlinkedExprAssignOperator.bitXor: | 
| +        return TokenType.CARET; | 
| +      case UnlinkedExprAssignOperator.bitOr: | 
| +        return TokenType.BAR; | 
| +      case UnlinkedExprAssignOperator.prefixIncrement: | 
| +        return TokenType.PLUS_PLUS; | 
| +      case UnlinkedExprAssignOperator.prefixDecrement: | 
| +        return TokenType.MINUS_MINUS; | 
| +      case UnlinkedExprAssignOperator.postfixIncrement: | 
| +        return TokenType.PLUS_PLUS; | 
| +      case UnlinkedExprAssignOperator.postfixDecrement: | 
| +        return TokenType.MINUS_MINUS; | 
| } | 
| +    return null; | 
| } | 
| } | 
|  | 
| @@ -4173,22 +4240,6 @@ class NonstaticMemberElementForLink extends Object | 
| @override | 
| TypeInferenceNode get asTypeInferenceNode => _target.asTypeInferenceNode; | 
|  | 
| -  /** | 
| -   * Return `true` if this element is an instance getter, or its target | 
| -   * is an instance getter (recursively). | 
| -   */ | 
| -  bool get hasInstanceGetterReference { | 
| -    ExecutableElement element = asExecutableElement; | 
| -    if (element is PropertyAccessorElement) { | 
| -      return !element.isStatic; | 
| -    } | 
| -    ReferenceableElementForLink target = _target; | 
| -    if (target is NonstaticMemberElementForLink) { | 
| -      return target.hasInstanceGetterReference; | 
| -    } | 
| -    return false; | 
| -  } | 
| - | 
| @override | 
| ReferenceableElementForLink getContainedName(String name) { | 
| return new NonstaticMemberElementForLink(_library, this, name); | 
| @@ -5031,9 +5082,14 @@ class TypeInferenceNode extends Node<TypeInferenceNode> { | 
| intPtr++; | 
| break; | 
| case UnlinkedExprOperation.assignToRef: | 
| -          // TODO(paulberry): if this reference refers to a variable, should it | 
| -          // be considered a type inference dependency? | 
| -          refPtr++; | 
| +          EntityRef ref = unlinkedConst.references[refPtr++]; | 
| +          // TODO(paulberry): cache these resolved references for | 
| +          // later use by evaluate(). | 
| +          TypeInferenceNode dependency = | 
| +              compilationUnit.resolveRef(ref.reference).asTypeInferenceNode; | 
| +          if (dependency != null) { | 
| +            dependencies.add(dependency); | 
| +          } | 
| break; | 
| case UnlinkedExprOperation.invokeMethodRef: | 
| EntityRef ref = unlinkedConst.references[refPtr++]; | 
| @@ -5453,12 +5509,3 @@ abstract class VariableElementForLink | 
| @override | 
| String toString() => '$enclosingElement.$name'; | 
| } | 
| - | 
| -/** | 
| - * This exception is thrown when [ExprTypeComputer] cannot inference the type. | 
| - */ | 
| -class _InferenceFailedError { | 
| -  final String message; | 
| - | 
| -  _InferenceFailedError(this.message); | 
| -} | 
|  |