anchor.diff:   *   potential target of this dynamic call.
    *
    * - In checked mode, after a type annotation, we have more
  - *   information on the type of an element (parameter, function,
  - *   local). TODO(ngeoffray): Implement this.
  + *   information on the type of a local.
    */
   class NarrowTypeInformation extends TypeInformation {
     final TypeMask typeAnnotation;
  
positive.code:     refine();
  
      compiler.log('Inferred $overallRefineCount types.');
    }
  
  
  
negative.code:     return null;
    }
  
    TypeMask potentiallyNarrowType(TypeMask mask,
                                   TypeGraphInferrerEngine inferrer) {
      Compiler compiler = inferrer.compiler;
      if (!compiler.trustTypeAnnotations && !compiler.enableTypeAssertions) {
        return mask;
      }
      if (element.isGenerativeConstructor() || element.isSetter()) return mask;
      var type = element.computeType(compiler);
      if (element.isFunction()
          || element.isGetter()
          || element.isFactoryConstructor()) {
        type = type.returnType;
      }
      return new TypeMaskSystem(compiler).narrowType(mask, type);
    }
  
    TypeMask refine(TypeGraphInferrerEngine inferrer) {
      TypeMask special = handleSpecialCases(inferrer);
      if (special != null) return potentiallyNarrowType(special, inferrer);
      return potentiallyNarrowType(
          inferrer.types.computeTypeMask(assignments), inferrer);
    }
  
    TypeMask refineOptimistic(TypeGraphInferrerEngine inferrer) {
      TypeMask special = handleSpecialCases(inferrer);
      if (special != null) return potentiallyNarrowType(special, inferrer);
      return potentiallyNarrowType(inferrer.types.computeTypeMask(
          assignments.where((e) => e.isConcrete)), inferrer);
    }
  
    String toString() => 'Element $element';
  