| Index: pkg/compiler/lib/src/js_backend/constant_emitter.dart
|
| diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
|
| index 9498a41a6349525de20789bce11ae014a9007200..f0dfe8380d53b8c3f68e0a8006d25d9bff7f7200 100644
|
| --- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
|
| +++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
|
| @@ -3,14 +3,16 @@
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| import '../common.dart';
|
| -import '../compiler.dart' show Compiler;
|
| +import '../common_elements.dart';
|
| import '../constants/values.dart';
|
| import '../elements/resolution_types.dart';
|
| import '../elements/elements.dart';
|
| import '../io/code_output.dart';
|
| import '../js/js.dart' as jsAst;
|
| import '../js/js.dart' show js;
|
| -import 'backend.dart';
|
| +import '../js_emitter/code_emitter_task.dart';
|
| +import '../options.dart';
|
| +import 'js_backend.dart';
|
| import 'constant_system_javascript.dart';
|
| import 'namer.dart';
|
|
|
| @@ -31,8 +33,12 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| static final RegExp COMMENT_RE =
|
| new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''', multiLine: true);
|
|
|
| - final Compiler compiler;
|
| - final Namer namer;
|
| + final CompilerOptions _options;
|
| + final CommonElements _commonElements;
|
| + final RuntimeTypesNeed _rtiNeed;
|
| + final RuntimeTypesEncoder _rtiEncoder;
|
| + final Namer _namer;
|
| + final CodeEmitterTask _task;
|
| final _ConstantReferenceGenerator constantReferenceGenerator;
|
| final _ConstantListGenerator makeConstantList;
|
|
|
| @@ -42,12 +48,16 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| * can be inlined.
|
| */
|
| ConstantEmitter(
|
| - this.compiler,
|
| - this.namer,
|
| - jsAst.Expression this.constantReferenceGenerator(ConstantValue constant),
|
| + this._options,
|
| + this._commonElements,
|
| + this._rtiNeed,
|
| + this._rtiEncoder,
|
| + this._namer,
|
| + this._task,
|
| + this.constantReferenceGenerator,
|
| this.makeConstantList);
|
|
|
| - DiagnosticReporter get reporter => compiler.reporter;
|
| + Emitter get _emitter => _task.emitter;
|
|
|
| /**
|
| * Constructs a literal expression that evaluates to the constant. Uses a
|
| @@ -64,9 +74,8 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
|
|
| @override
|
| jsAst.Expression visitFunction(FunctionConstantValue constant, [_]) {
|
| - reporter.internalError(NO_LOCATION_SPANNABLE,
|
| + throw new SpannableAssertionFailure(NO_LOCATION_SPANNABLE,
|
| "The function constant does not need specific JS code.");
|
| - return null;
|
| }
|
|
|
| @override
|
| @@ -117,7 +126,7 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| // digits are lost anyway.
|
| String representation = primitiveValue.toString();
|
| String alternative = null;
|
| - int cutoff = compiler.options.enableMinification ? 10000 : 1e10.toInt();
|
| + int cutoff = _options.enableMinification ? 10000 : 1e10.toInt();
|
| if (primitiveValue.abs() >= cutoff) {
|
| alternative = _shortenExponentialRepresentation(
|
| primitiveValue.toStringAsExponential());
|
| @@ -145,7 +154,7 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
|
|
| @override
|
| jsAst.Expression visitBool(BoolConstantValue constant, [_]) {
|
| - if (compiler.options.enableMinification) {
|
| + if (_options.enableMinification) {
|
| if (constant.isTrue) {
|
| // Use !0 for true.
|
| return js("!0");
|
| @@ -233,7 +242,7 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
|
| arguments.add(jsGeneralMap());
|
| } else {
|
| - reporter.internalError(
|
| + throw new SpannableAssertionFailure(
|
| field,
|
| "Compiler has unexpected field ${field.name} for "
|
| "${className}.");
|
| @@ -246,39 +255,35 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| emittedArgumentCount != 4) ||
|
| (className == JavaScriptMapConstant.DART_GENERAL_CLASS &&
|
| emittedArgumentCount != 1)) {
|
| - reporter.internalError(classElement,
|
| + throw new SpannableAssertionFailure(classElement,
|
| "Compiler and ${className} disagree on number of fields.");
|
| }
|
|
|
| - if (backend.rtiNeed.classNeedsRtiField(classElement)) {
|
| + if (_rtiNeed.classNeedsRtiField(classElement)) {
|
| arguments.add(_reifiedTypeArguments(constant.type));
|
| }
|
|
|
| - jsAst.Expression constructor =
|
| - backend.emitter.constructorAccess(classElement);
|
| + jsAst.Expression constructor = _emitter.constructorAccess(classElement);
|
| jsAst.Expression value = new jsAst.New(constructor, arguments);
|
| return value;
|
| }
|
|
|
| - JavaScriptBackend get backend => compiler.backend;
|
| -
|
| jsAst.PropertyAccess getHelperProperty(MethodElement helper) {
|
| - return backend.emitter.staticFunctionAccess(helper);
|
| + return _emitter.staticFunctionAccess(helper);
|
| }
|
|
|
| @override
|
| jsAst.Expression visitType(TypeConstantValue constant, [_]) {
|
| ResolutionDartType type = constant.representedType;
|
| - jsAst.Name typeName = namer.runtimeTypeName(type.element);
|
| - return new jsAst.Call(
|
| - getHelperProperty(backend.commonElements.createRuntimeType),
|
| + jsAst.Name typeName = _namer.runtimeTypeName(type.element);
|
| + return new jsAst.Call(getHelperProperty(_commonElements.createRuntimeType),
|
| [js.quoteName(typeName)]);
|
| }
|
|
|
| @override
|
| jsAst.Expression visitInterceptor(InterceptorConstantValue constant, [_]) {
|
| ClassElement interceptorClass = constant.cls;
|
| - return backend.emitter.interceptorPrototypeAccess(interceptorClass);
|
| + return _task.interceptorPrototypeAccess(interceptorClass);
|
| }
|
|
|
| @override
|
| @@ -291,27 +296,26 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| case SyntheticConstantKind.NAME:
|
| return constant.payload;
|
| default:
|
| - reporter.internalError(NO_LOCATION_SPANNABLE,
|
| + throw new SpannableAssertionFailure(NO_LOCATION_SPANNABLE,
|
| "Unexpected DummyConstantKind ${constant.kind}");
|
| - return null;
|
| }
|
| }
|
|
|
| @override
|
| jsAst.Expression visitConstructed(ConstructedConstantValue constant, [_]) {
|
| ClassElement element = constant.type.element;
|
| - if (backend.isForeign(element) && element.name == 'JS_CONST') {
|
| + if (element == _commonElements.jsConstClass) {
|
| StringConstantValue str = constant.fields.values.single;
|
| String value = str.primitiveValue;
|
| return new jsAst.LiteralExpression(stripComments(value));
|
| }
|
| jsAst.Expression constructor =
|
| - backend.emitter.constructorAccess(constant.type.element);
|
| + _emitter.constructorAccess(constant.type.element);
|
| List<jsAst.Expression> fields = <jsAst.Expression>[];
|
| element.forEachInstanceField((_, FieldElement field) {
|
| fields.add(constantReferenceGenerator(constant.fields[field]));
|
| }, includeSuperAndInjectedMembers: true);
|
| - if (backend.rtiNeed.classNeedsRtiField(constant.type.element)) {
|
| + if (_rtiNeed.classNeedsRtiField(constant.type.element)) {
|
| fields.add(_reifiedTypeArguments(constant.type));
|
| }
|
| jsAst.New instantiation = new jsAst.New(constructor, fields);
|
| @@ -326,9 +330,9 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
| ResolutionInterfaceType type, jsAst.Expression value) {
|
| if (type is ResolutionInterfaceType &&
|
| !type.treatAsRaw &&
|
| - backend.rtiNeed.classNeedsRti(type.element)) {
|
| + _rtiNeed.classNeedsRti(type.element)) {
|
| return new jsAst.Call(
|
| - getHelperProperty(backend.commonElements.setRuntimeTypeInfo),
|
| + getHelperProperty(_commonElements.setRuntimeTypeInfo),
|
| [value, _reifiedTypeArguments(type)]);
|
| }
|
| return value;
|
| @@ -336,18 +340,16 @@ class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
|
|
|
| jsAst.Expression _reifiedTypeArguments(ResolutionInterfaceType type) {
|
| jsAst.Expression unexpected(ResolutionTypeVariableType variable) {
|
| - reporter.internalError(
|
| + throw new SpannableAssertionFailure(
|
| NO_LOCATION_SPANNABLE,
|
| "Unexpected type variable '${variable.getStringAsDeclared(null)}'"
|
| " in constant type '${type.getStringAsDeclared(null)}'");
|
| - return null;
|
| }
|
|
|
| List<jsAst.Expression> arguments = <jsAst.Expression>[];
|
| - RuntimeTypesEncoder rtiEncoder = backend.rtiEncoder;
|
| for (ResolutionDartType argument in type.typeArguments) {
|
| - arguments.add(rtiEncoder.getTypeRepresentation(
|
| - backend.emitter.emitter, argument, unexpected));
|
| + arguments.add(
|
| + _rtiEncoder.getTypeRepresentation(_emitter, argument, unexpected));
|
| }
|
| return new jsAst.ArrayInitializer(arguments);
|
| }
|
|
|