| Index: pkg/compiler/lib/src/native/enqueue.dart
|
| diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
|
| index c41e7929aff75b52c6f55239b4e621b88a9fc81a..e8c41a11a57aa2077761b3f7f8e769a2c312338a 100644
|
| --- a/pkg/compiler/lib/src/native/enqueue.dart
|
| +++ b/pkg/compiler/lib/src/native/enqueue.dart
|
| @@ -16,6 +16,7 @@ import '../elements/types.dart';
|
| import '../js_backend/backend_helpers.dart' show BackendHelpers;
|
| import '../js_backend/backend_usage.dart' show BackendUsageBuilder;
|
| import '../js_backend/js_backend.dart';
|
| +import '../js_backend/native_data.dart' show NativeClassDataBuilder;
|
| import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
|
| import 'package:front_end/src/fasta/scanner.dart' show BeginGroupToken, Token;
|
| import 'package:front_end/src/fasta/scanner.dart' as Tokens show EOF_TOKEN;
|
| @@ -41,18 +42,6 @@ class NativeEnqueuer {
|
| void registerNativeBehavior(
|
| WorldImpactBuilder impactBuilder, NativeBehavior nativeBehavior, cause) {}
|
|
|
| - // TODO(johnniwinther): Move [handleFieldAnnotations] and
|
| - // [handleMethodAnnotations] to [JavaScriptBackend] or [NativeData].
|
| - // TODO(johnniwinther): Change the return type to 'bool' and rename them to
|
| - // something like `computeNativeField`.
|
| - /// Process the potentially native [field]. Adds information from metadata
|
| - /// attributes.
|
| - void handleFieldAnnotations(Element field) {}
|
| -
|
| - /// Process the potentially native [method]. Adds information from metadata
|
| - /// attributes.
|
| - void handleMethodAnnotations(Element method) {}
|
| -
|
| /// Returns whether native classes are being used.
|
| bool get hasInstantiatedNativeClasses => false;
|
|
|
| @@ -61,8 +50,6 @@ class NativeEnqueuer {
|
| }
|
|
|
| abstract class NativeEnqueuerBase implements NativeEnqueuer {
|
| - static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
|
| -
|
| /// The set of all native classes. Each native class is in [nativeClasses]
|
| /// and exactly one of [unusedClasses] and [registeredClasses].
|
| final Set<ClassElement> _nativeClasses = new Set<ClassElement>();
|
| @@ -253,37 +240,6 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer {
|
| });
|
| }
|
|
|
| - /// Returns the JSName annotation string or `null` if no JSName annotation is
|
| - /// present.
|
| - String findJsNameFromAnnotation(Element element) {
|
| - String name = null;
|
| - ClassElement annotationClass = backend.helpers.annotationJSNameClass;
|
| - for (MetadataAnnotation annotation in element.implementation.metadata) {
|
| - annotation.ensureResolved(resolution);
|
| - ConstantValue value =
|
| - compiler.constants.getConstantValue(annotation.constant);
|
| - if (!value.isConstructedObject) continue;
|
| - ConstructedConstantValue constructedObject = value;
|
| - if (constructedObject.type.element != annotationClass) continue;
|
| -
|
| - Iterable<ConstantValue> fields = constructedObject.fields.values;
|
| - // TODO(sra): Better validation of the constant.
|
| - if (fields.length != 1 || fields.single is! StringConstantValue) {
|
| - reporter.internalError(
|
| - annotation, 'Annotations needs one string: ${annotation}');
|
| - }
|
| - StringConstantValue specStringConstant = fields.single;
|
| - String specString = specStringConstant.toDartString().slowToString();
|
| - if (name == null) {
|
| - name = specString;
|
| - } else {
|
| - reporter.internalError(
|
| - annotation, 'Too many JSName annotations: ${annotation}');
|
| - }
|
| - }
|
| - return name;
|
| - }
|
| -
|
| /// Register [classes] as natively instantiated in [impactBuilder].
|
| void _registerTypeUses(
|
| WorldImpactBuilder impactBuilder, Set<ClassElement> classes, cause) {
|
| @@ -300,84 +256,6 @@ abstract class NativeEnqueuerBase implements NativeEnqueuer {
|
| }
|
| }
|
|
|
| - void handleFieldAnnotations(Element element) {
|
| - if (compiler.serialization.isDeserialized(element)) {
|
| - return;
|
| - }
|
| - if (element.isInstanceMember &&
|
| - backend.nativeClassData.isNativeClass(element.enclosingClass)) {
|
| - // Exclude non-instance (static) fields - they are not really native and
|
| - // are compiled as isolate globals. Access of a property of a constructor
|
| - // function or a non-method property in the prototype chain, must be coded
|
| - // using a JS-call.
|
| - _setNativeName(element);
|
| - }
|
| - }
|
| -
|
| - void handleMethodAnnotations(Element method) {
|
| - if (compiler.serialization.isDeserialized(method)) {
|
| - return;
|
| - }
|
| - if (isNativeMethod(method)) {
|
| - if (method.isStatic) {
|
| - _setNativeNameForStaticMethod(method);
|
| - } else {
|
| - _setNativeName(method);
|
| - }
|
| - }
|
| - }
|
| -
|
| - /// Sets the native name of [element], either from an annotation, or
|
| - /// defaulting to the Dart name.
|
| - void _setNativeName(MemberElement element) {
|
| - String name = findJsNameFromAnnotation(element);
|
| - if (name == null) name = element.name;
|
| - backend.nativeClassDataBuilder.setNativeMemberName(element, name);
|
| - }
|
| -
|
| - /// Sets the native name of the static native method [element], using the
|
| - /// following rules:
|
| - /// 1. If [element] has a @JSName annotation that is an identifier, qualify
|
| - /// that identifier to the @Native name of the enclosing class
|
| - /// 2. If [element] has a @JSName annotation that is not an identifier,
|
| - /// use the declared @JSName as the expression
|
| - /// 3. If [element] does not have a @JSName annotation, qualify the name of
|
| - /// the method with the @Native name of the enclosing class.
|
| - void _setNativeNameForStaticMethod(MethodElement element) {
|
| - String name = findJsNameFromAnnotation(element);
|
| - if (name == null) name = element.name;
|
| - if (isIdentifier(name)) {
|
| - List<String> nativeNames = backend.nativeClassDataBuilder
|
| - .getNativeTagsOfClassRaw(element.enclosingClass);
|
| - if (nativeNames.length != 1) {
|
| - reporter.internalError(
|
| - element,
|
| - 'Unable to determine a native name for the enclosing class, '
|
| - 'options: $nativeNames');
|
| - }
|
| - backend.nativeClassDataBuilder
|
| - .setNativeMemberName(element, '${nativeNames[0]}.$name');
|
| - } else {
|
| - backend.nativeClassDataBuilder.setNativeMemberName(element, name);
|
| - }
|
| - }
|
| -
|
| - bool isIdentifier(String s) => _identifier.hasMatch(s);
|
| -
|
| - bool isNativeMethod(FunctionElementX element) {
|
| - if (!backend.canLibraryUseNative(element.library)) return false;
|
| - // Native method?
|
| - return reporter.withCurrentElement(element, () {
|
| - Node node = element.parseNode(resolution.parsingContext);
|
| - if (node is! FunctionExpression) return false;
|
| - FunctionExpression functionExpression = node;
|
| - node = functionExpression.body;
|
| - Token token = node.getBeginToken();
|
| - if (identical(token.stringValue, 'native')) return true;
|
| - return false;
|
| - });
|
| - }
|
| -
|
| void registerNativeBehavior(
|
| WorldImpactBuilder impactBuilder, NativeBehavior nativeBehavior, cause) {
|
| _processNativeBehavior(impactBuilder, nativeBehavior, cause);
|
| @@ -489,7 +367,7 @@ class NativeResolutionEnqueuer extends NativeEnqueuerBase {
|
| super.processNativeClass(classElement);
|
|
|
| // Js Interop interfaces do not have tags.
|
| - if (backend.nativeData.isJsInterop(classElement)) return;
|
| + if (backend.nativeData.isJsInteropClass(classElement)) return;
|
| // Since we map from dispatch tags to classes, a dispatch tag must be used
|
| // on only one native class.
|
| for (String tag in backend.nativeData.getNativeTagsOfClass(classElement)) {
|
|
|