anchor.diff:      return _emitConstList(elementType, elements);
     }
   
  +  JS.Expression _emitList(DartType itemType, List<JS.Expression> items) {
  +    var list = JS.ArrayInitializer(items);
  +
  +    // TODO(jmesserly): analyzer will usually infer `List<Object>` because
  +    // that is the least upper bound of the element types. So we rarely
  +    // generate a plain `List<dynamic>` anymore.
  +    if (itemType == const DynamicType()) return list;
  +
  +    // Call `new JSArray<E>.of(list)`
  +    var arrayType = InterfaceType(_jsArrayClass, [itemType]);
  +    return js.call('#.of(#)', [_emitType(arrayType), list]);
  +  }
  +
  +  JS.Expression _emitConstList(
  +      DartType elementType, List<JS.Expression> elements) {
  +    // dart.constList helper internally depends on _interceptors.JSArray.
  +    _declareBeforeUse(_jsArrayClass);
  +    return cacheConst(
  +        runtimeCall('constList([#], #)', [elements, _emitType(elementType)]));
  +  }
  +
     @override
     visitSetLiteral(SetLiteral node) {
       // TODO(markzipan): remove const check when we use front-end const eval
  
positive.code:       entries.add(visitConstant(e.value));
      }
  
      return cacheConst(runtimeCall('constMap(#, #, [#])',
          [_emitType(node.keyType), _emitType(node.valueType), entries]));
    }
  
    @override
  
negative.code: 
    @override
    visitSetConstant(node) {
      return _emitConstSet(
          node.typeArgument, node.entries.map(visitConstant).toList());
    }
  
    @override
  