| Index: pkg/compiler/lib/src/js_backend/namer.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
|
| index 5fff9cf2e4d099167ba5dc0867012606877e9806..1bac3f30410efdf86a75dedb9365eee24ef9f2d9 100644
|
| --- a/pkg/compiler/lib/src/js_backend/namer.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/namer.dart
|
| @@ -19,7 +19,6 @@ import '../elements/entities.dart';
|
| import '../elements/resolution_types.dart';
|
| import '../elements/types.dart';
|
| import '../js/js.dart' as jsAst;
|
| -import '../js/js.dart' show js;
|
| import '../tree/tree.dart';
|
| import '../universe/call_structure.dart' show CallStructure;
|
| import '../universe/selector.dart' show Selector, SelectorKind;
|
| @@ -30,6 +29,7 @@ import '../world.dart' show ClosedWorld;
|
| import 'backend.dart';
|
| import 'backend_helpers.dart';
|
| import 'constant_system_javascript.dart';
|
| +import 'native_data.dart';
|
|
|
| part 'field_naming_mixin.dart';
|
| part 'frequency_namer.dart';
|
| @@ -485,9 +485,10 @@ class Namer {
|
| static final RegExp IDENTIFIER = new RegExp(r'^[A-Za-z_$][A-Za-z0-9_$]*$');
|
| static final RegExp NON_IDENTIFIER_CHAR = new RegExp(r'[^A-Za-z_0-9$]');
|
|
|
| - final JavaScriptBackend backend;
|
| - final ClosedWorld closedWorld;
|
| - final CodegenWorldBuilder codegenWorldBuilder;
|
| + final BackendHelpers _helpers;
|
| + final NativeData _nativeData;
|
| + final ClosedWorld _closedWorld;
|
| + final CodegenWorldBuilder _codegenWorldBuilder;
|
|
|
| RuntimeTypesEncoder _rtiEncoder;
|
| RuntimeTypesEncoder get rtiEncoder {
|
| @@ -557,21 +558,15 @@ class Namer {
|
| final Map<LibraryElement, String> _libraryKeys =
|
| new HashMap<LibraryElement, String>();
|
|
|
| - Namer(JavaScriptBackend backend, this.closedWorld,
|
| - CodegenWorldBuilder codegenWorldBuilder)
|
| - : this.backend = backend,
|
| - this.codegenWorldBuilder = codegenWorldBuilder {
|
| + Namer(this._helpers, this._nativeData, this._closedWorld,
|
| + this._codegenWorldBuilder) {
|
| _literalAsyncPrefix = new StringBackedName(asyncPrefix);
|
| _literalGetterPrefix = new StringBackedName(getterPrefix);
|
| _literalSetterPrefix = new StringBackedName(setterPrefix);
|
| _literalLazyGetterPrefix = new StringBackedName(lazyGetterPrefix);
|
| }
|
|
|
| - BackendHelpers get helpers => backend.helpers;
|
| -
|
| - DiagnosticReporter get reporter => backend.reporter;
|
| -
|
| - CommonElements get commonElements => closedWorld.commonElements;
|
| + CommonElements get _commonElements => _closedWorld.commonElements;
|
|
|
| String get deferredTypesName => 'deferredTypes';
|
| String get isolateName => 'Isolate';
|
| @@ -644,20 +639,19 @@ class Namer {
|
| case JsGetName.FUNCTION_TYPE_NAMED_PARAMETERS_TAG:
|
| return asName(functionTypeNamedParametersTag);
|
| case JsGetName.IS_INDEXABLE_FIELD_NAME:
|
| - return operatorIs(helpers.jsIndexingBehaviorInterface);
|
| + return operatorIs(_helpers.jsIndexingBehaviorInterface);
|
| case JsGetName.NULL_CLASS_TYPE_NAME:
|
| - ClassElement nullClass = commonElements.nullClass;
|
| + ClassElement nullClass = _commonElements.nullClass;
|
| return runtimeTypeName(nullClass);
|
| case JsGetName.OBJECT_CLASS_TYPE_NAME:
|
| - ClassElement objectClass = commonElements.objectClass;
|
| + ClassElement objectClass = _commonElements.objectClass;
|
| return runtimeTypeName(objectClass);
|
| case JsGetName.FUNCTION_CLASS_TYPE_NAME:
|
| - ClassElement functionClass = commonElements.functionClass;
|
| + ClassElement functionClass = _commonElements.functionClass;
|
| return runtimeTypeName(functionClass);
|
| default:
|
| - reporter.reportErrorMessage(node, MessageKind.GENERIC,
|
| - {'text': 'Error: Namer has no name for "$name".'});
|
| - return asName('BROKEN');
|
| + throw new SpannableAssertionFailure(
|
| + node, 'Error: Namer has no name for "$name".');
|
| }
|
| }
|
|
|
| @@ -690,10 +684,10 @@ class Namer {
|
| String constantLongName(ConstantValue constant) {
|
| String longName = constantLongNames[constant];
|
| if (longName == null) {
|
| - _constantHasher ??= new ConstantCanonicalHasher(
|
| - rtiEncoder, reporter, codegenWorldBuilder);
|
| + _constantHasher ??=
|
| + new ConstantCanonicalHasher(rtiEncoder, _codegenWorldBuilder);
|
| longName = new ConstantNamingVisitor(
|
| - rtiEncoder, reporter, codegenWorldBuilder, _constantHasher)
|
| + rtiEncoder, _codegenWorldBuilder, _constantHasher)
|
| .getName(constant);
|
| constantLongNames[constant] = longName;
|
| }
|
| @@ -778,11 +772,9 @@ class Namer {
|
| }
|
|
|
| String _jsNameHelper(Element e) {
|
| - String jsInteropName = backend.nativeData.getJsInteropName(e);
|
| + String jsInteropName = _nativeData.getJsInteropName(e);
|
| if (jsInteropName != null && jsInteropName.isNotEmpty) return jsInteropName;
|
| - return e.isLibrary
|
| - ? 'self'
|
| - : backend.nativeData.getUnescapedJSInteropName(e.name);
|
| + return e.isLibrary ? 'self' : _nativeData.getUnescapedJSInteropName(e.name);
|
| }
|
|
|
| /// Returns a JavaScript path specifying the context in which
|
| @@ -796,7 +788,7 @@ class Namer {
|
| }
|
|
|
| String _fixedBackendPath(Element element) {
|
| - if (!backend.nativeData.isJsInterop(element)) return null;
|
| + if (!_nativeData.isJsInterop(element)) return null;
|
| if (element.isInstanceMember) return 'this';
|
| if (element.isConstructor) return _fixedBackendPath(element.enclosingClass);
|
| if (element.isLibrary) return 'self';
|
| @@ -878,9 +870,8 @@ class Namer {
|
| return disambiguatedName; // Methods other than call are not annotated.
|
|
|
| default:
|
| - reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
|
| + throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
|
| 'Unexpected selector kind: ${selector.kind}');
|
| - return null;
|
| }
|
| }
|
|
|
| @@ -935,9 +926,8 @@ class Namer {
|
| jsAst.Name instanceFieldPropertyName(FieldElement element) {
|
| ClassElement enclosingClass = element.enclosingClass;
|
|
|
| - if (backend.nativeData.hasFixedBackendName(element)) {
|
| - return new StringBackedName(
|
| - backend.nativeData.getFixedBackendName(element));
|
| + if (_nativeData.hasFixedBackendName(element)) {
|
| + return new StringBackedName(_nativeData.getFixedBackendName(element));
|
| }
|
|
|
| // Some elements, like e.g. instances of BoxFieldElement are special.
|
| @@ -960,7 +950,7 @@ class Namer {
|
| // mangle the field names of classes extending native classes.
|
| // Methods on such classes are stored on the interceptor, not the instance,
|
| // so only fields have the potential to clash with a native property name.
|
| - if (closedWorld.isUsedAsMixin(enclosingClass) ||
|
| + if (_closedWorld.isUsedAsMixin(enclosingClass) ||
|
| _isShadowingSuperField(element) ||
|
| _isUserClassExtendingNative(enclosingClass)) {
|
| String proposeName() => '${enclosingClass.name}_${element.name}';
|
| @@ -979,8 +969,8 @@ class Namer {
|
|
|
| /// True if [class_] is a non-native class that inherits from a native class.
|
| bool _isUserClassExtendingNative(ClassElement class_) {
|
| - return !backend.nativeData.isNativeClass(class_) &&
|
| - backend.nativeData.isNativeOrExtendsNative(class_.superclass);
|
| + return !_nativeData.isNativeClass(class_) &&
|
| + _nativeData.isNativeOrExtendsNative(class_.superclass);
|
| }
|
|
|
| /// Annotated name for the setter of [element].
|
| @@ -1358,24 +1348,24 @@ class Namer {
|
|
|
| String suffixForGetInterceptor(Iterable<ClassEntity> classes) {
|
| String abbreviate(ClassElement cls) {
|
| - if (cls == commonElements.objectClass) return "o";
|
| - if (cls == helpers.jsStringClass) return "s";
|
| - if (cls == helpers.jsArrayClass) return "a";
|
| - if (cls == helpers.jsDoubleClass) return "d";
|
| - if (cls == helpers.jsIntClass) return "i";
|
| - if (cls == helpers.jsNumberClass) return "n";
|
| - if (cls == helpers.jsNullClass) return "u";
|
| - if (cls == helpers.jsBoolClass) return "b";
|
| - if (cls == helpers.jsInterceptorClass) return "I";
|
| + if (cls == _commonElements.objectClass) return "o";
|
| + if (cls == _helpers.jsStringClass) return "s";
|
| + if (cls == _helpers.jsArrayClass) return "a";
|
| + if (cls == _helpers.jsDoubleClass) return "d";
|
| + if (cls == _helpers.jsIntClass) return "i";
|
| + if (cls == _helpers.jsNumberClass) return "n";
|
| + if (cls == _helpers.jsNullClass) return "u";
|
| + if (cls == _helpers.jsBoolClass) return "b";
|
| + if (cls == _helpers.jsInterceptorClass) return "I";
|
| return cls.name;
|
| }
|
|
|
| List<String> names = classes
|
| - .where((cls) => !backend.nativeData.isNativeOrExtendsNative(cls))
|
| + .where((cls) => !_nativeData.isNativeOrExtendsNative(cls))
|
| .map(abbreviate)
|
| .toList();
|
| // There is one dispatch mechanism for all native classes.
|
| - if (classes.any((cls) => backend.nativeData.isNativeOrExtendsNative(cls))) {
|
| + if (classes.any((cls) => _nativeData.isNativeOrExtendsNative(cls))) {
|
| names.add("x");
|
| }
|
| // Sort the names of the classes after abbreviating them to ensure
|
| @@ -1386,8 +1376,8 @@ class Namer {
|
|
|
| /// Property name used for `getInterceptor` or one of its specializations.
|
| jsAst.Name nameForGetInterceptor(Iterable<ClassEntity> classes) {
|
| - MethodElement getInterceptor = helpers.getInterceptorMethod;
|
| - if (classes.contains(helpers.jsInterceptorClass)) {
|
| + MethodElement getInterceptor = _helpers.getInterceptorMethod;
|
| + if (classes.contains(_helpers.jsInterceptorClass)) {
|
| // If the base Interceptor class is in the set of intercepted classes, we
|
| // need to go through the generic getInterceptorMethod, since any subclass
|
| // of the base Interceptor could match.
|
| @@ -1409,7 +1399,7 @@ class Namer {
|
| // other global names.
|
| jsAst.Name root = invocationName(selector);
|
|
|
| - if (classes.contains(helpers.jsInterceptorClass)) {
|
| + if (classes.contains(_helpers.jsInterceptorClass)) {
|
| // If the base Interceptor class is in the set of intercepted classes,
|
| // this is the most general specialization which uses the generic
|
| // getInterceptor method.
|
| @@ -1529,7 +1519,7 @@ class Namer {
|
|
|
| /// Returns the [reservedGlobalObjectNames] for [library].
|
| String globalObjectForLibrary(LibraryElement library) {
|
| - if (library == helpers.interceptorsLibrary) return 'J';
|
| + if (library == _helpers.interceptorsLibrary) return 'J';
|
| if (library.isInternalLibrary) return 'H';
|
| if (library.isPlatformLibrary) {
|
| if ('${library.canonicalUri}' == 'dart:html') return 'W';
|
| @@ -1749,7 +1739,6 @@ class ConstantNamingVisitor implements ConstantValueVisitor {
|
| static const DEFAULT_TAG_LENGTH = 3;
|
|
|
| final RuntimeTypesEncoder rtiEncoder;
|
| - final DiagnosticReporter reporter;
|
| final CodegenWorldBuilder codegenWorldBuilder;
|
| final ConstantCanonicalHasher hasher;
|
|
|
| @@ -1758,8 +1747,7 @@ class ConstantNamingVisitor implements ConstantValueVisitor {
|
| List<String> fragments = <String>[];
|
| int length = 0;
|
|
|
| - ConstantNamingVisitor(
|
| - this.rtiEncoder, this.reporter, this.codegenWorldBuilder, this.hasher);
|
| + ConstantNamingVisitor(this.rtiEncoder, this.codegenWorldBuilder, this.hasher);
|
|
|
| String getName(ConstantValue constant) {
|
| _visit(constant);
|
| @@ -1930,7 +1918,7 @@ class ConstantNamingVisitor implements ConstantValueVisitor {
|
| add('name');
|
| break;
|
| default:
|
| - reporter.internalError(
|
| + throw new SpannableAssertionFailure(
|
| CURRENT_ELEMENT_SPANNABLE, "Unexpected SyntheticConstantValue");
|
| }
|
| }
|
| @@ -1953,13 +1941,11 @@ class ConstantCanonicalHasher implements ConstantValueVisitor<int, Null> {
|
| static const _MASK = 0x1fffffff;
|
| static const _UINT32_LIMIT = 4 * 1024 * 1024 * 1024;
|
|
|
| - final DiagnosticReporter reporter;
|
| final RuntimeTypesEncoder rtiEncoder;
|
| final CodegenWorldBuilder codegenWorldBuilder;
|
| final Map<ConstantValue, int> hashes = new Map<ConstantValue, int>();
|
|
|
| - ConstantCanonicalHasher(
|
| - this.rtiEncoder, this.reporter, this.codegenWorldBuilder);
|
| + ConstantCanonicalHasher(this.rtiEncoder, this.codegenWorldBuilder);
|
|
|
| int getHash(ConstantValue constant) => _visit(constant);
|
|
|
| @@ -2047,11 +2033,10 @@ class ConstantCanonicalHasher implements ConstantValueVisitor<int, Null> {
|
| // resolve to integer indexes, they're always part of a larger constant.
|
| return 0;
|
| default:
|
| - reporter.internalError(
|
| + throw new SpannableAssertionFailure(
|
| NO_LOCATION_SPANNABLE,
|
| 'SyntheticConstantValue should never be named and '
|
| 'never be subconstant');
|
| - return 0;
|
| }
|
| }
|
|
|
|
|