| Index: pkg/compiler/lib/src/js_backend/native_data.dart
 | 
| diff --git a/pkg/compiler/lib/src/js_backend/native_data.dart b/pkg/compiler/lib/src/js_backend/native_data.dart
 | 
| index 268eb3f79eb4c62732e558613dbd620dbc547a28..d71fa17d72562b881cfa116af510c11fcebffc12 100644
 | 
| --- a/pkg/compiler/lib/src/js_backend/native_data.dart
 | 
| +++ b/pkg/compiler/lib/src/js_backend/native_data.dart
 | 
| @@ -16,9 +16,11 @@ import '../elements/elements.dart'
 | 
|  import '../elements/entities.dart';
 | 
|  import '../native/behavior.dart' show NativeBehavior;
 | 
|  
 | 
| -/// Additional element information for native classes and methods and js-interop
 | 
| -/// methods.
 | 
| -abstract class NativeData {
 | 
| +/// Basic information for native classes and methods and js-interop
 | 
| +/// classes.
 | 
| +///
 | 
| +/// This information is computed during loading using [NativeClassDataBuilder].
 | 
| +abstract class NativeClassData {
 | 
|    /// Returns `true` if [cls] corresponds to a native JavaScript class.
 | 
|    ///
 | 
|    /// A class is marked as native either through the `@Native(...)` annotation
 | 
| @@ -26,6 +28,9 @@ abstract class NativeData {
 | 
|    /// mechanism allowed for user libraries.
 | 
|    bool isNativeClass(ClassEntity element);
 | 
|  
 | 
| +  /// Returns `true` if [element] or any of its superclasses is native.
 | 
| +  bool isNativeOrExtendsNative(ClassElement element);
 | 
| +
 | 
|    /// Returns `true` if [element] corresponds to a native JavaScript member.
 | 
|    ///
 | 
|    /// A member is marked as native either through the native mechanism
 | 
| @@ -34,8 +39,23 @@ abstract class NativeData {
 | 
|    /// libraries.
 | 
|    bool isNativeMember(MemberEntity element);
 | 
|  
 | 
| -  /// Returns `true` if [element] or any of its superclasses is native.
 | 
| -  bool isNativeOrExtendsNative(ClassElement element);
 | 
| +  /// Returns `true` if [element] is a JsInterop class.
 | 
| +  bool isJsInteropClass(ClassElement element);
 | 
| +}
 | 
| +
 | 
| +/// Additional element information for native classes and methods and js-interop
 | 
| +/// methods.
 | 
| +///
 | 
| +/// This information is computed during resolution using [NativeDataBuilder].
 | 
| +abstract class NativeData extends NativeClassData {
 | 
| +  /// Returns the [NativeBehavior] for calling the native [method].
 | 
| +  NativeBehavior getNativeMethodBehavior(MethodElement method);
 | 
| +
 | 
| +  /// Returns the [NativeBehavior] for reading from the native [field].
 | 
| +  NativeBehavior getNativeFieldLoadBehavior(FieldElement field);
 | 
| +
 | 
| +  /// Returns the [NativeBehavior] for writing to the native [field].
 | 
| +  NativeBehavior getNativeFieldStoreBehavior(FieldElement field);
 | 
|  
 | 
|    /// Returns `true` if the name of [element] is fixed for the generated
 | 
|    /// JavaScript.
 | 
| @@ -51,21 +71,9 @@ abstract class NativeData {
 | 
|    /// Returns `true` if [cls] has a `!nonleaf` tag word.
 | 
|    bool hasNativeTagsForcedNonLeaf(ClassElement cls);
 | 
|  
 | 
| -  /// Returns the [NativeBehavior] for calling the native [method].
 | 
| -  NativeBehavior getNativeMethodBehavior(MethodElement method);
 | 
| -
 | 
| -  /// Returns the [NativeBehavior] for reading from the native [field].
 | 
| -  NativeBehavior getNativeFieldLoadBehavior(FieldElement field);
 | 
| -
 | 
| -  /// Returns the [NativeBehavior] for writing to the native [field].
 | 
| -  NativeBehavior getNativeFieldStoreBehavior(FieldElement field);
 | 
| -
 | 
|    /// Returns `true` if [element] is part of JsInterop.
 | 
|    bool isJsInterop(Element element);
 | 
|  
 | 
| -  /// Returns `true` if [element] is a JsInterop class.
 | 
| -  bool isJsInteropClass(ClassElement element);
 | 
| -
 | 
|    /// Returns `true` if [element] is a JsInterop method.
 | 
|    bool isJsInteropMethod(MethodElement element);
 | 
|  
 | 
| @@ -77,7 +85,7 @@ abstract class NativeData {
 | 
|    String getUnescapedJSInteropName(String name);
 | 
|  }
 | 
|  
 | 
| -abstract class NativeDataBuilder {
 | 
| +abstract class NativeClassDataBuilder {
 | 
|    /// Sets the native tag info for [cls].
 | 
|    ///
 | 
|    /// The tag info string contains comma-separated 'words' which are either
 | 
| @@ -92,6 +100,15 @@ abstract class NativeDataBuilder {
 | 
|    /// [element] in the generated JavaScript.
 | 
|    void setNativeMemberName(MemberElement element, String name);
 | 
|  
 | 
| +  /// Returns [element] as an explicit part of JsInterop. The js interop name is
 | 
| +  /// expected to be computed later.
 | 
| +  void markAsJsInterop(Element element);
 | 
| +
 | 
| +  /// Sets the explicit js interop [name] for [element].
 | 
| +  void setJsInteropName(Element element, String name);
 | 
| +}
 | 
| +
 | 
| +abstract class NativeDataBuilder {
 | 
|    /// Registers the [behavior] for calling the native [method].
 | 
|    void setNativeMethodBehavior(MethodElement method, NativeBehavior behavior);
 | 
|  
 | 
| @@ -100,16 +117,10 @@ abstract class NativeDataBuilder {
 | 
|  
 | 
|    /// Registers the [behavior] for writing to the native [field].
 | 
|    void setNativeFieldStoreBehavior(FieldElement field, NativeBehavior behavior);
 | 
| -
 | 
| -  /// Returns [element] as an explicit part of JsInterop. The js interop name is
 | 
| -  /// expected to be computed later.
 | 
| -  void markAsJsInterop(Element element);
 | 
| -
 | 
| -  /// Sets the explicit js interop [name] for [element].
 | 
| -  void setJsInteropName(Element element, String name);
 | 
|  }
 | 
|  
 | 
| -class NativeDataImpl implements NativeData, NativeDataBuilder {
 | 
| +class NativeDataImpl
 | 
| +    implements NativeData, NativeDataBuilder, NativeClassDataBuilder {
 | 
|    /// The JavaScript names for elements implemented via typed JavaScript
 | 
|    /// interop.
 | 
|    Map<Element, String> jsInteropNames = <Element, String>{};
 | 
| 
 |