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: 
    @override
    visitSetConstant(node) {
      // Set literals are currently desugared in the frontend.
      // Implement this method before flipping the supportsSetLiterals flag
      // in DevCompilerTarget to true.
      return cacheConst(runtimeCall('constSet(#, [#])', [
        _emitType(node.typeArgument),
        node.entries.map(visitConstant).toList()
      ]));
    }
  
    @override
  
negative.code:       return js.call(
            '#.from([#])', [setType, _visitExpressionList(node.expressions)]);
      }
      return _emitConstSet(
          node.typeArgument, _visitExpressionList(node.expressions));
    }
  
    JS.Expression _emitConstSet(
        DartType elementType, List<JS.Expression> elements) {
      return cacheConst(
          runtimeCall('constSet(#, [#])', [_emitType(elementType), elements]));
    }
  
    @override
  