| Index: sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
 | 
| diff --git a/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart b/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
 | 
| index 36924db217846fc3f13ca595865a730687b85e27..6fd81c020881cbfd22ce4be10817e6dfeee6aeec 100644
 | 
| --- a/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
 | 
| +++ b/sdk/lib/_internal/js_runtime/lib/js_mirrors.dart
 | 
| @@ -45,6 +45,7 @@ import 'dart:_js_helper'
 | 
|          UnimplementedNoSuchMethodError,
 | 
|          createRuntimeType,
 | 
|          createUnmangledInvocationMirror,
 | 
| +        extractFunctionTypeObjectFrom,
 | 
|          getMangledTypeName,
 | 
|          getMetadata,
 | 
|          getType,
 | 
| @@ -580,7 +581,17 @@ Symbol setterSymbol(Symbol symbol) => s("${n(symbol)}=");
 | 
|  final JsMirrorSystem currentJsMirrorSystem = new JsMirrorSystem();
 | 
|  
 | 
|  InstanceMirror reflect(Object reflectee) {
 | 
| -  if (reflectee is Closure) {
 | 
| +  // TODO(sra): This test should be a quick test for something like 'is
 | 
| +  // Function', but only for classes that implement `Function` via a `call`
 | 
| +  // method. The JS form of the test could be something like
 | 
| +  //
 | 
| +  //     if (reflectee instanceof P.Object && reflectee.$isFunction) ...
 | 
| +  //
 | 
| +  // We don't currently have a way get that generated. We should ensure type
 | 
| +  // analysis can express 'not Interceptor' and recognize a negative type test
 | 
| +  // against Interceptor can be optimized to the above test. For now we have to
 | 
| +  // accept the following is compiled to an interceptor-based type check.
 | 
| +  if (reflectee is Function) {
 | 
|      return new JsClosureMirror(reflectee);
 | 
|    } else {
 | 
|      return new JsInstanceMirror(reflectee);
 | 
| @@ -2286,6 +2297,21 @@ class JsClosureMirror extends JsInstanceMirror implements ClosureMirror {
 | 
|          Function.apply(reflectee, positionalArguments, namedArguments));
 | 
|    }
 | 
|  
 | 
| +  TypeMirror get type {
 | 
| +    // Classes that implement [call] do not subclass [Closure], but only
 | 
| +    // implement [Function], so are rejected by this test.
 | 
| +    if (reflectee is Closure) {
 | 
| +      var functionRti = extractFunctionTypeObjectFrom(reflectee);
 | 
| +      if (functionRti != null) {
 | 
| +        return new JsFunctionTypeMirror(functionRti, null);
 | 
| +      }
 | 
| +    }
 | 
| +    // Use the JsInstanceMirror method to return the JsClassMirror.
 | 
| +    // TODO(sra): Should there be a TypeMirror that is both a ClassMirror and
 | 
| +    // FunctionTypeMirror?
 | 
| +    return super.type;
 | 
| +  }
 | 
| +
 | 
|    String toString() => "ClosureMirror on '${Error.safeToString(reflectee)}'";
 | 
|  
 | 
|    // TODO(ahe): Implement this method.
 | 
| @@ -2635,6 +2661,7 @@ class JsFunctionTypeMirror extends BrokenClassMirror
 | 
|    String _cachedToString;
 | 
|    TypeMirror _cachedReturnType;
 | 
|    UnmodifiableListView<ParameterMirror> _cachedParameters;
 | 
| +  Type _cachedReflectedType;
 | 
|    DeclarationMirror owner;
 | 
|  
 | 
|    JsFunctionTypeMirror(this._typeData, this.owner);
 | 
| @@ -2730,6 +2757,10 @@ class JsFunctionTypeMirror extends BrokenClassMirror
 | 
|          new UnmodifiableListView<ParameterMirror>(result);
 | 
|    }
 | 
|  
 | 
| +  bool get hasReflectedType => true;
 | 
| +  Type get reflectedType => _cachedReflectedType
 | 
| +      ??= createRuntimeType(runtimeTypeToString(_typeData));
 | 
| +
 | 
|    String _unmangleIfPreserved(String mangled) {
 | 
|      String result = unmangleGlobalNameIfPreservedAnyways(mangled);
 | 
|      if (result != null) return result;
 | 
| 
 |