| Index: pkg/compiler/lib/src/js_emitter/model.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
|
| index 7141627ffbcdb07c6338f0ec8095d10c166043e9..c7adf76ca18c3a2bca505c1b59d64ac268a253ea 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/model.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/model.dart
|
| @@ -4,18 +4,11 @@
|
|
|
| library dart2js.new_js_emitter.model;
|
|
|
| -import '../constants/values.dart' show
|
| - ConstantValue;
|
| -import '../deferred_load.dart' show
|
| - OutputUnit;
|
| -import '../elements/elements.dart' show
|
| - Element;
|
| -import '../js/js.dart' as js show
|
| - Expression,
|
| - Literal,
|
| - Name,
|
| - Statement,
|
| - TokenFinalizer;
|
| +import '../constants/values.dart' show ConstantValue;
|
| +import '../deferred_load.dart' show OutputUnit;
|
| +import '../elements/elements.dart' show Element;
|
| +import '../js/js.dart' as js
|
| + show Expression, Literal, Name, Statement, TokenFinalizer;
|
|
|
| import 'js_emitter.dart' show MetadataCollector;
|
|
|
| @@ -25,8 +18,10 @@ class Program {
|
| final bool outputContainsConstantList;
|
| final bool needsNativeSupport;
|
| final bool hasIsolateSupport;
|
| +
|
| /// A map from load id to the list of fragments that need to be loaded.
|
| final Map<String, List<Fragment>> loadMap;
|
| +
|
| /// A map from names to strings.
|
| ///
|
| /// This map is needed to support `const Symbol` expressions;
|
| @@ -41,16 +36,11 @@ class Program {
|
| final MetadataCollector _metadataCollector;
|
| final Iterable<js.TokenFinalizer> finalizers;
|
|
|
| - Program(this.fragments,
|
| - this.holders,
|
| - this.loadMap,
|
| - this.symbolsMap,
|
| - this.typeToInterceptorMap,
|
| - this._metadataCollector,
|
| - this.finalizers,
|
| - {this.needsNativeSupport,
|
| - this.outputContainsConstantList,
|
| - this.hasIsolateSupport}) {
|
| + Program(this.fragments, this.holders, this.loadMap, this.symbolsMap,
|
| + this.typeToInterceptorMap, this._metadataCollector, this.finalizers,
|
| + {this.needsNativeSupport,
|
| + this.outputContainsConstantList,
|
| + this.hasIsolateSupport}) {
|
| assert(needsNativeSupport != null);
|
| assert(outputContainsConstantList != null);
|
| assert(hasIsolateSupport != null);
|
| @@ -121,12 +111,13 @@ abstract class Fragment {
|
| /// Output file name without extension.
|
| final String outputFileName;
|
|
|
| - Fragment(this.outputUnit,
|
| - this.outputFileName,
|
| - this.libraries,
|
| - this.staticNonFinalFields,
|
| - this.staticLazilyInitializedFields,
|
| - this.constants);
|
| + Fragment(
|
| + this.outputUnit,
|
| + this.outputFileName,
|
| + this.libraries,
|
| + this.staticNonFinalFields,
|
| + this.staticLazilyInitializedFields,
|
| + this.constants);
|
|
|
| bool get isMainFragment;
|
| }
|
| @@ -140,19 +131,16 @@ abstract class Fragment {
|
| class MainFragment extends Fragment {
|
| final js.Statement invokeMain;
|
|
|
| - MainFragment(OutputUnit outputUnit,
|
| - String outputFileName,
|
| - this.invokeMain,
|
| - List<Library> libraries,
|
| - List<StaticField> staticNonFinalFields,
|
| - List<StaticField> staticLazilyInitializedFields,
|
| - List<Constant> constants)
|
| - : super(outputUnit,
|
| - outputFileName,
|
| - libraries,
|
| - staticNonFinalFields,
|
| - staticLazilyInitializedFields,
|
| - constants);
|
| + MainFragment(
|
| + OutputUnit outputUnit,
|
| + String outputFileName,
|
| + this.invokeMain,
|
| + List<Library> libraries,
|
| + List<StaticField> staticNonFinalFields,
|
| + List<StaticField> staticLazilyInitializedFields,
|
| + List<Constant> constants)
|
| + : super(outputUnit, outputFileName, libraries, staticNonFinalFields,
|
| + staticLazilyInitializedFields, constants);
|
|
|
| bool get isMainFragment => true;
|
| }
|
| @@ -163,19 +151,16 @@ class MainFragment extends Fragment {
|
| class DeferredFragment extends Fragment {
|
| final String name;
|
|
|
| - DeferredFragment(OutputUnit outputUnit,
|
| - String outputFileName,
|
| - this.name,
|
| - List<Library> libraries,
|
| - List<StaticField> staticNonFinalFields,
|
| - List<StaticField> staticLazilyInitializedFields,
|
| - List<Constant> constants)
|
| - : super(outputUnit,
|
| - outputFileName,
|
| - libraries,
|
| - staticNonFinalFields,
|
| - staticLazilyInitializedFields,
|
| - constants);
|
| + DeferredFragment(
|
| + OutputUnit outputUnit,
|
| + String outputFileName,
|
| + this.name,
|
| + List<Library> libraries,
|
| + List<StaticField> staticNonFinalFields,
|
| + List<StaticField> staticLazilyInitializedFields,
|
| + List<Constant> constants)
|
| + : super(outputUnit, outputFileName, libraries, staticNonFinalFields,
|
| + staticLazilyInitializedFields, constants);
|
|
|
| bool get isMainFragment => false;
|
| }
|
| @@ -204,7 +189,7 @@ class Library implements FieldContainer {
|
| final List<Field> staticFieldsForReflection;
|
|
|
| Library(this.element, this.uri, this.statics, this.classes,
|
| - this.staticFieldsForReflection);
|
| + this.staticFieldsForReflection);
|
| }
|
|
|
| class StaticField {
|
| @@ -220,9 +205,8 @@ class StaticField {
|
| final bool isFinal;
|
| final bool isLazy;
|
|
|
| - StaticField(this.element,
|
| - this.name, this.holder, this.code,
|
| - this.isFinal, this.isLazy);
|
| + StaticField(this.element, this.name, this.holder, this.code, this.isFinal,
|
| + this.isLazy);
|
| }
|
|
|
| class Class implements FieldContainer {
|
| @@ -267,19 +251,22 @@ class Class implements FieldContainer {
|
| /// Native extensions. See [NativeEmitter.prepareNativeClasses].
|
| List<Class> nativeExtensions;
|
|
|
| - Class(this.element, this.name, this.holder,
|
| - this.methods,
|
| - this.fields,
|
| - this.staticFieldsForReflection,
|
| - this.callStubs,
|
| - this.typeVariableReaderStubs,
|
| - this.noSuchMethodStubs,
|
| - this.checkedSetters,
|
| - this.isChecks,
|
| - this.functionTypeIndex,
|
| - {this.onlyForRti,
|
| - this.isDirectlyInstantiated,
|
| - this.isNative}) {
|
| + Class(
|
| + this.element,
|
| + this.name,
|
| + this.holder,
|
| + this.methods,
|
| + this.fields,
|
| + this.staticFieldsForReflection,
|
| + this.callStubs,
|
| + this.typeVariableReaderStubs,
|
| + this.noSuchMethodStubs,
|
| + this.checkedSetters,
|
| + this.isChecks,
|
| + this.functionTypeIndex,
|
| + {this.onlyForRti,
|
| + this.isDirectlyInstantiated,
|
| + this.isNative}) {
|
| assert(onlyForRti != null);
|
| assert(isDirectlyInstantiated != null);
|
| assert(isNative != null);
|
| @@ -292,40 +279,44 @@ class Class implements FieldContainer {
|
| _superclass = superclass;
|
| }
|
|
|
| - js.Name get superclassName
|
| - => superclass == null ? null : superclass.name;
|
| + js.Name get superclassName => superclass == null ? null : superclass.name;
|
|
|
| - int get superclassHolderIndex
|
| - => (superclass == null) ? 0 : superclass.holder.index;
|
| + int get superclassHolderIndex =>
|
| + (superclass == null) ? 0 : superclass.holder.index;
|
| }
|
|
|
| class MixinApplication extends Class {
|
| Class _mixinClass;
|
|
|
| - MixinApplication(Element element, js.Name name, Holder holder,
|
| - List<Field> instanceFields,
|
| - List<Field> staticFieldsForReflection,
|
| - List<StubMethod> callStubs,
|
| - List<StubMethod> typeVariableReaderStubs,
|
| - List<StubMethod> checkedSetters,
|
| - List<StubMethod> isChecks,
|
| - js.Expression functionTypeIndex,
|
| - {bool onlyForRti,
|
| - bool isDirectlyInstantiated})
|
| - : super(element,
|
| - name, holder,
|
| - const <Method>[],
|
| - instanceFields,
|
| - staticFieldsForReflection,
|
| - callStubs,
|
| - typeVariableReaderStubs,
|
| - const <StubMethod>[],
|
| - checkedSetters,
|
| - isChecks,
|
| - functionTypeIndex,
|
| - onlyForRti: onlyForRti,
|
| - isDirectlyInstantiated: isDirectlyInstantiated,
|
| - isNative: false);
|
| + MixinApplication(
|
| + Element element,
|
| + js.Name name,
|
| + Holder holder,
|
| + List<Field> instanceFields,
|
| + List<Field> staticFieldsForReflection,
|
| + List<StubMethod> callStubs,
|
| + List<StubMethod> typeVariableReaderStubs,
|
| + List<StubMethod> checkedSetters,
|
| + List<StubMethod> isChecks,
|
| + js.Expression functionTypeIndex,
|
| + {bool onlyForRti,
|
| + bool isDirectlyInstantiated})
|
| + : super(
|
| + element,
|
| + name,
|
| + holder,
|
| + const <Method>[],
|
| + instanceFields,
|
| + staticFieldsForReflection,
|
| + callStubs,
|
| + typeVariableReaderStubs,
|
| + const <StubMethod>[],
|
| + checkedSetters,
|
| + isChecks,
|
| + functionTypeIndex,
|
| + onlyForRti: onlyForRti,
|
| + isDirectlyInstantiated: isDirectlyInstantiated,
|
| + isNative: false);
|
|
|
| bool get isMixinApplication => true;
|
| Class get mixinClass => _mixinClass;
|
| @@ -362,9 +353,8 @@ class Field {
|
| final bool needsCheckedSetter;
|
|
|
| // TODO(floitsch): support renamed fields.
|
| - Field(this.element, this.name, this.accessorName,
|
| - this.getterFlags, this.setterFlags,
|
| - this.needsCheckedSetter);
|
| + Field(this.element, this.name, this.accessorName, this.getterFlags,
|
| + this.setterFlags, this.needsCheckedSetter);
|
|
|
| bool get needsGetter => getterFlags != 0;
|
| bool get needsUncheckedSetter => setterFlags != 0;
|
| @@ -383,6 +373,7 @@ abstract class Method {
|
| /// The element should only be used during the transition to the new model.
|
| /// Uses indicate missing information in the model.
|
| final Element element;
|
| +
|
| /// The name of the method. If the method is a [ParameterStubMethod] for a
|
| /// static function, then the name can be `null`. In that case, only the
|
| /// [ParameterStubMethod.callName] should be used.
|
| @@ -418,17 +409,21 @@ abstract class DartMethod extends Method {
|
| final js.Name callName;
|
|
|
| DartMethod(Element element, js.Name name, js.Expression code,
|
| - this.parameterStubs, this.callName,
|
| - {this.needsTearOff, this.tearOffName, this.canBeApplied,
|
| - this.canBeReflected, this.requiredParameterCount,
|
| - this.optionalParameterDefaultValues, this.functionType})
|
| + this.parameterStubs, this.callName,
|
| + {this.needsTearOff,
|
| + this.tearOffName,
|
| + this.canBeApplied,
|
| + this.canBeReflected,
|
| + this.requiredParameterCount,
|
| + this.optionalParameterDefaultValues,
|
| + this.functionType})
|
| : super(element, name, code) {
|
| assert(needsTearOff != null);
|
| assert(!needsTearOff || tearOffName != null);
|
| assert(canBeApplied != null);
|
| assert(canBeReflected != null);
|
| assert((!canBeReflected && !canBeApplied) ||
|
| - (requiredParameterCount != null &&
|
| + (requiredParameterCount != null &&
|
| optionalParameterDefaultValues != null));
|
| }
|
|
|
| @@ -447,27 +442,25 @@ class InstanceMethod extends DartMethod {
|
| /// functions that can be torn off.
|
| final bool isClosureCallMethod;
|
|
|
| -
|
| InstanceMethod(Element element, js.Name name, js.Expression code,
|
| - List<ParameterStubMethod> parameterStubs,
|
| - js.Name callName,
|
| - {bool needsTearOff,
|
| - js.Name tearOffName,
|
| - this.aliasName,
|
| - bool canBeApplied,
|
| - bool canBeReflected,
|
| - int requiredParameterCount,
|
| - /* List | Map */ optionalParameterDefaultValues,
|
| - this.isClosureCallMethod,
|
| - js.Expression functionType})
|
| + List<ParameterStubMethod> parameterStubs, js.Name callName,
|
| + {bool needsTearOff,
|
| + js.Name tearOffName,
|
| + this.aliasName,
|
| + bool canBeApplied,
|
| + bool canBeReflected,
|
| + int requiredParameterCount,
|
| + /* List | Map */ optionalParameterDefaultValues,
|
| + this.isClosureCallMethod,
|
| + js.Expression functionType})
|
| : super(element, name, code, parameterStubs, callName,
|
| - needsTearOff: needsTearOff,
|
| - tearOffName: tearOffName,
|
| - canBeApplied: canBeApplied,
|
| - canBeReflected: canBeReflected,
|
| - requiredParameterCount: requiredParameterCount,
|
| - optionalParameterDefaultValues: optionalParameterDefaultValues,
|
| - functionType: functionType) {
|
| + needsTearOff: needsTearOff,
|
| + tearOffName: tearOffName,
|
| + canBeApplied: canBeApplied,
|
| + canBeReflected: canBeReflected,
|
| + requiredParameterCount: requiredParameterCount,
|
| + optionalParameterDefaultValues: optionalParameterDefaultValues,
|
| + functionType: functionType) {
|
| assert(isClosureCallMethod != null);
|
| }
|
|
|
| @@ -478,8 +471,7 @@ class InstanceMethod extends DartMethod {
|
| /// to a method in the original Dart program. Examples are getter and setter
|
| /// stubs and stubs to dispatch calls to methods with optional parameters.
|
| class StubMethod extends Method {
|
| - StubMethod(js.Name name, js.Expression code,
|
| - {Element element})
|
| + StubMethod(js.Name name, js.Expression code, {Element element})
|
| : super(element, name, code);
|
| }
|
|
|
| @@ -511,22 +503,28 @@ abstract class StaticMethod implements Method {
|
| class StaticDartMethod extends DartMethod implements StaticMethod {
|
| final Holder holder;
|
|
|
| - StaticDartMethod(Element element, js.Name name, this.holder,
|
| - js.Expression code, List<ParameterStubMethod> parameterStubs,
|
| - js.Name callName,
|
| - {bool needsTearOff, js.Name tearOffName,
|
| - bool canBeApplied, bool canBeReflected,
|
| - int requiredParameterCount,
|
| - /* List | Map */ optionalParameterDefaultValues,
|
| - js.Expression functionType})
|
| + StaticDartMethod(
|
| + Element element,
|
| + js.Name name,
|
| + this.holder,
|
| + js.Expression code,
|
| + List<ParameterStubMethod> parameterStubs,
|
| + js.Name callName,
|
| + {bool needsTearOff,
|
| + js.Name tearOffName,
|
| + bool canBeApplied,
|
| + bool canBeReflected,
|
| + int requiredParameterCount,
|
| + /* List | Map */ optionalParameterDefaultValues,
|
| + js.Expression functionType})
|
| : super(element, name, code, parameterStubs, callName,
|
| - needsTearOff: needsTearOff,
|
| - tearOffName : tearOffName,
|
| - canBeApplied : canBeApplied,
|
| - canBeReflected : canBeReflected,
|
| - requiredParameterCount: requiredParameterCount,
|
| - optionalParameterDefaultValues: optionalParameterDefaultValues,
|
| - functionType: functionType);
|
| + needsTearOff: needsTearOff,
|
| + tearOffName: tearOffName,
|
| + canBeApplied: canBeApplied,
|
| + canBeReflected: canBeReflected,
|
| + requiredParameterCount: requiredParameterCount,
|
| + optionalParameterDefaultValues: optionalParameterDefaultValues,
|
| + functionType: functionType);
|
|
|
| bool get isStatic => true;
|
| }
|
|
|