| Index: pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
|
| diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
|
| index 209d104f01b961f187a2d9f1f444fb6f659af093..0212336df6582da43697e5fb8b06c2cfec880812 100644
|
| --- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
|
| +++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
|
| @@ -42,6 +42,7 @@ import '../../js_backend/backend.dart'
|
| import '../../js_backend/backend_usage.dart';
|
| import '../../js_backend/constant_handler_javascript.dart'
|
| show JavaScriptConstantCompiler;
|
| +import '../../js_backend/custom_elements_analysis.dart';
|
| import '../../js_backend/namer.dart' show Namer, StringBackedName;
|
| import '../../js_backend/native_data.dart';
|
| import '../../js_backend/interceptor_data.dart';
|
| @@ -73,9 +74,9 @@ part 'registry.dart';
|
| /// emitted more easily by the individual emitters.
|
| class ProgramBuilder {
|
| final Compiler _compiler;
|
| - final Namer namer;
|
| + final Namer _namer;
|
| final CodeEmitterTask _task;
|
| - final ClosedWorld closedWorld;
|
| + final ClosedWorld _closedWorld;
|
|
|
| /// Contains the collected information the program builder used to build
|
| /// the model.
|
| @@ -89,13 +90,13 @@ class ProgramBuilder {
|
| /// True if the program should store function types in the metadata.
|
| bool _storeFunctionTypesInMetadata = false;
|
|
|
| - ProgramBuilder(Compiler compiler, Namer namer, this._task, Emitter emitter,
|
| + ProgramBuilder(Compiler compiler, Namer _namer, this._task, Emitter emitter,
|
| ClosedWorld closedWorld, Set<ClassElement> rtiNeededClasses)
|
| : this._compiler = compiler,
|
| - this.namer = namer,
|
| - this.closedWorld = closedWorld,
|
| + this._namer = _namer,
|
| + this._closedWorld = closedWorld,
|
| this.collector = new Collector(
|
| - compiler, namer, closedWorld, rtiNeededClasses, emitter),
|
| + compiler, _namer, closedWorld, rtiNeededClasses, emitter),
|
| this._registry = new Registry(compiler);
|
|
|
| JavaScriptBackend get _backend => _compiler.backend;
|
| @@ -106,7 +107,6 @@ class ProgramBuilder {
|
| CompilerOptions get _options => _compiler.options;
|
| NativeCodegenEnqueuer get _nativeCodegenEnqueuer =>
|
| _backend.nativeCodegenEnqueuer;
|
| - Namer get _namer => _backend.namer;
|
| BackendUsage get _backendUsage => _backend.backendUsage;
|
| CodeEmitterTask get _emitter => _backend.emitter;
|
| JavaScriptConstantCompiler get _constantHandler => _backend.constants;
|
| @@ -118,6 +118,8 @@ class ProgramBuilder {
|
| RuntimeTypesEncoder get _rtiEncoder => _backend.rtiEncoder;
|
| OneShotInterceptorData get _oneShotInterceptorData =>
|
| _backend.oneShotInterceptorData;
|
| + CustomElementsCodegenAnalysis get _customElementsCodegenAnalysis =>
|
| + _backend.customElementsCodegenAnalysis;
|
|
|
| /// Mapping from [ClassElement] to constructed [Class]. We need this to
|
| /// update the superclass in the [Class].
|
| @@ -240,8 +242,19 @@ class ProgramBuilder {
|
| }
|
|
|
| js.Expression _buildTypeToInterceptorMap() {
|
| - InterceptorStubGenerator stubGenerator =
|
| - new InterceptorStubGenerator(_compiler, namer, _backend, closedWorld);
|
| + InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
|
| + _options,
|
| + _commonElements,
|
| + _emitter,
|
| + _nativeCodegenEnqueuer,
|
| + _constantHandler,
|
| + _namer,
|
| + _nativeData,
|
| + _interceptorData,
|
| + _oneShotInterceptorData,
|
| + _customElementsCodegenAnalysis,
|
| + _worldBuilder,
|
| + _closedWorld);
|
| return stubGenerator.generateTypeToInterceptorMap();
|
| }
|
|
|
| @@ -302,10 +315,10 @@ class ProgramBuilder {
|
| _constantHandler.getConstantValue(element.constant);
|
| // TODO(zarah): The holder should not be registered during building of
|
| // a static field.
|
| - _registry.registerHolder(namer.globalObjectForConstant(initialValue),
|
| + _registry.registerHolder(_namer.globalObjectForConstant(initialValue),
|
| isConstantsHolder: true);
|
| js.Expression code = _task.emitter.constantReference(initialValue);
|
| - js.Name name = namer.globalPropertyName(element);
|
| + js.Name name = _namer.globalPropertyName(element);
|
| bool isFinal = false;
|
| bool isLazy = false;
|
|
|
| @@ -338,7 +351,7 @@ class ProgramBuilder {
|
| // before code generation.
|
| if (code == null) return null;
|
|
|
| - js.Name name = namer.globalPropertyName(element);
|
| + js.Name name = _namer.globalPropertyName(element);
|
| bool isFinal = element.isFinal;
|
| bool isLazy = true;
|
| // TODO(floitsch): we shouldn't update the registry in the middle of
|
| @@ -360,7 +373,7 @@ class ProgramBuilder {
|
|
|
| void _addJsInteropStubs(LibrariesMap librariesMap) {
|
| if (_classes.containsKey(_commonElements.objectClass)) {
|
| - var toStringInvocation = namer.invocationName(Selectors.toString_);
|
| + var toStringInvocation = _namer.invocationName(Selectors.toString_);
|
| // TODO(jacobr): register toString as used so that it is always accessible
|
| // from JavaScript.
|
| _classes[_commonElements.objectClass].callStubs.add(_buildStubMethod(
|
| @@ -388,7 +401,7 @@ class ProgramBuilder {
|
| _worldBuilder.getterInvocationsByName(member.name);
|
| if (selectors != null && !selectors.isEmpty) {
|
| for (var selector in selectors.keys) {
|
| - var stubName = namer.invocationName(selector);
|
| + var stubName = _namer.invocationName(selector);
|
| if (stubNames.add(stubName.key)) {
|
| interceptorClass.callStubs.add(_buildStubMethod(stubName,
|
| js.js('function(obj) { return obj.# }', [jsName]),
|
| @@ -402,7 +415,7 @@ class ProgramBuilder {
|
| var selectors =
|
| _worldBuilder.setterInvocationsByName(member.name);
|
| if (selectors != null && !selectors.isEmpty) {
|
| - var stubName = namer.setterForElement(member);
|
| + var stubName = _namer.setterForElement(member);
|
| if (stubNames.add(stubName.key)) {
|
| interceptorClass.callStubs.add(_buildStubMethod(stubName,
|
| js.js('function(obj, v) { return obj.# = v }', [jsName]),
|
| @@ -467,7 +480,7 @@ class ProgramBuilder {
|
| if (selector.namedArgumentCount > 0) continue;
|
| if (argumentCount < minArgs) continue;
|
| if (argumentCount > maxArgs) continue;
|
| - var stubName = namer.invocationName(selector);
|
| + var stubName = _namer.invocationName(selector);
|
| if (!stubNames.add(stubName.key)) continue;
|
| var parameters =
|
| new List<String>.generate(argumentCount, (i) => 'p$i');
|
| @@ -537,10 +550,10 @@ class ProgramBuilder {
|
| List<StubMethod> callStubs = <StubMethod>[];
|
|
|
| ClassStubGenerator classStubGenerator = new ClassStubGenerator(
|
| - namer, _backend, _worldBuilder, closedWorld,
|
| + _namer, _backend, _worldBuilder, _closedWorld,
|
| enableMinification: _options.enableMinification);
|
| RuntimeTypeGenerator runtimeTypeGenerator =
|
| - new RuntimeTypeGenerator(_compiler, _task, namer);
|
| + new RuntimeTypeGenerator(_compiler, _task, _namer);
|
|
|
| void visitMember(ClassElement enclosing, MemberElement member) {
|
| assert(invariant(element, member.isDeclaration));
|
| @@ -584,7 +597,7 @@ class ProgramBuilder {
|
| if (element == _commonElements.closureClass) {
|
| // We add a special getter here to allow for tearing off a closure from
|
| // itself.
|
| - js.Name name = namer.getterForMember(Names.call);
|
| + js.Name name = _namer.getterForMember(Names.call);
|
| js.Fun function = js.js('function() { return this; }');
|
| callStubs.add(_buildStubMethod(name, function));
|
| }
|
| @@ -624,7 +637,7 @@ class ProgramBuilder {
|
| FieldElement element = field.element;
|
| js.Expression code = _backend.generatedCode[element];
|
| assert(code != null);
|
| - js.Name name = namer.deriveSetterName(field.accessorName);
|
| + js.Name name = _namer.deriveSetterName(field.accessorName);
|
| checkedSetters.add(_buildStubMethod(name, code, element: element));
|
| }
|
| }
|
| @@ -634,8 +647,8 @@ class ProgramBuilder {
|
| });
|
| }
|
|
|
| - js.Name name = namer.className(element);
|
| - String holderName = namer.globalObjectFor(element);
|
| + js.Name name = _namer.className(element);
|
| + String holderName = _namer.globalObjectFor(element);
|
| // TODO(floitsch): we shouldn't update the registry in the middle of
|
| // building a class.
|
| Holder holder = _registry.registerHolder(holderName);
|
| @@ -692,7 +705,7 @@ class ProgramBuilder {
|
|
|
| bool _methodCanBeApplied(FunctionElement method) {
|
| return _backendUsage.isFunctionApplyUsed &&
|
| - closedWorld.getMightBePassedToApply(method);
|
| + _closedWorld.getMightBePassedToApply(method);
|
| }
|
|
|
| /* Map | List */ _computeParameterDefaultValues(FunctionSignature signature) {
|
| @@ -717,7 +730,7 @@ class ProgramBuilder {
|
|
|
| DartMethod _buildMethod(MethodElement element) {
|
| assert(element.isDeclaration);
|
| - js.Name name = namer.methodPropertyName(element);
|
| + js.Name name = _namer.methodPropertyName(element);
|
| js.Expression code = _backend.generatedCode[element];
|
|
|
| // TODO(kasperl): Figure out under which conditions code is null.
|
| @@ -732,7 +745,7 @@ class ProgramBuilder {
|
| bool canBeApplied = _methodCanBeApplied(element);
|
|
|
| js.Name aliasName = _superMemberData.isAliasedSuperMember(element)
|
| - ? namer.aliasedSuperMemberPropertyName(element)
|
| + ? _namer.aliasedSuperMemberPropertyName(element)
|
| : null;
|
|
|
| if (isNotApplyTarget) {
|
| @@ -743,11 +756,11 @@ class ProgramBuilder {
|
| isClosureCallMethod = true;
|
| } else {
|
| // Careful with operators.
|
| - canTearOff = _worldBuilder.hasInvokedGetter(element, closedWorld) ||
|
| + canTearOff = _worldBuilder.hasInvokedGetter(element, _closedWorld) ||
|
| (canBeReflected && !element.isOperator);
|
| assert(canTearOff ||
|
| !_worldBuilder.methodsNeedingSuperGetter.contains(element));
|
| - tearOffName = namer.getterForElement(element);
|
| + tearOffName = _namer.getterForElement(element);
|
| }
|
| }
|
|
|
| @@ -761,7 +774,7 @@ class ProgramBuilder {
|
| if (canTearOff) {
|
| Selector callSelector =
|
| new Selector.fromElement(element).toCallSelector();
|
| - callName = namer.invocationName(callSelector);
|
| + callName = _namer.invocationName(callSelector);
|
| }
|
|
|
| ResolutionDartType memberType;
|
| @@ -820,7 +833,7 @@ class ProgramBuilder {
|
| if (!_methodNeedsStubs(element)) return const <ParameterStubMethod>[];
|
|
|
| ParameterStubGenerator generator =
|
| - new ParameterStubGenerator(_compiler, namer, _backend, closedWorld);
|
| + new ParameterStubGenerator(_compiler, _namer, _backend, _closedWorld);
|
| return generator.generateParameterStubs(element, canTearOff: canTearOff);
|
| }
|
|
|
| @@ -849,11 +862,22 @@ class ProgramBuilder {
|
| }
|
|
|
| Iterable<StaticStubMethod> _generateGetInterceptorMethods() {
|
| - InterceptorStubGenerator stubGenerator =
|
| - new InterceptorStubGenerator(_compiler, namer, _backend, closedWorld);
|
| + InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
|
| + _options,
|
| + _commonElements,
|
| + _emitter,
|
| + _nativeCodegenEnqueuer,
|
| + _constantHandler,
|
| + _namer,
|
| + _nativeData,
|
| + _interceptorData,
|
| + _oneShotInterceptorData,
|
| + _customElementsCodegenAnalysis,
|
| + _worldBuilder,
|
| + _closedWorld);
|
|
|
| String holderName =
|
| - namer.globalObjectForLibrary(_commonElements.interceptorsLibrary);
|
| + _namer.globalObjectForLibrary(_commonElements.interceptorsLibrary);
|
| // TODO(floitsch): we shouldn't update the registry in the middle of
|
| // generating the interceptor methods.
|
| Holder holder = _registry.registerHolder(holderName);
|
| @@ -871,7 +895,7 @@ class ProgramBuilder {
|
| List<Field> _buildFields(Element holder,
|
| {bool visitStatics, bool isHolderInterceptedClass: false}) {
|
| List<Field> fields = <Field>[];
|
| - new FieldVisitor(_compiler, namer, closedWorld)
|
| + new FieldVisitor(_compiler, _namer, _closedWorld)
|
| .visitFields(holder, visitStatics, (FieldElement field,
|
| js.Name name,
|
| js.Name accessorName,
|
| @@ -917,11 +941,22 @@ class ProgramBuilder {
|
| }
|
|
|
| Iterable<StaticStubMethod> _generateOneShotInterceptors() {
|
| - InterceptorStubGenerator stubGenerator =
|
| - new InterceptorStubGenerator(_compiler, namer, _backend, closedWorld);
|
| + InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
|
| + _options,
|
| + _commonElements,
|
| + _emitter,
|
| + _nativeCodegenEnqueuer,
|
| + _constantHandler,
|
| + _namer,
|
| + _nativeData,
|
| + _interceptorData,
|
| + _oneShotInterceptorData,
|
| + _customElementsCodegenAnalysis,
|
| + _worldBuilder,
|
| + _closedWorld);
|
|
|
| String holderName =
|
| - namer.globalObjectForLibrary(_commonElements.interceptorsLibrary);
|
| + _namer.globalObjectForLibrary(_commonElements.interceptorsLibrary);
|
| // TODO(floitsch): we shouldn't update the registry in the middle of
|
| // generating the interceptor methods.
|
| Holder holder = _registry.registerHolder(holderName);
|
| @@ -934,8 +969,8 @@ class ProgramBuilder {
|
| }
|
|
|
| StaticDartMethod _buildStaticMethod(MethodElement element) {
|
| - js.Name name = namer.methodPropertyName(element);
|
| - String holder = namer.globalObjectFor(element);
|
| + js.Name name = _namer.methodPropertyName(element);
|
| + String holder = _namer.globalObjectFor(element);
|
| js.Expression code = _backend.generatedCode[element];
|
|
|
| bool isApplyTarget = !element.isConstructor && !element.isAccessor;
|
| @@ -947,13 +982,13 @@ class ProgramBuilder {
|
| _worldBuilder.staticFunctionsNeedingGetter.contains(element));
|
|
|
| js.Name tearOffName =
|
| - needsTearOff ? namer.staticClosureName(element) : null;
|
| + needsTearOff ? _namer.staticClosureName(element) : null;
|
|
|
| js.Name callName = null;
|
| if (needsTearOff) {
|
| Selector callSelector =
|
| new Selector.fromElement(element).toCallSelector();
|
| - callName = namer.invocationName(callSelector);
|
| + callName = _namer.invocationName(callSelector);
|
| }
|
| js.Expression functionType;
|
| ResolutionDartType type = element.type;
|
| @@ -991,8 +1026,8 @@ class ProgramBuilder {
|
| for (ConstantValue constantValue in constantValues) {
|
| _registry.registerConstant(outputUnit, constantValue);
|
| assert(!_constants.containsKey(constantValue));
|
| - js.Name name = namer.constantName(constantValue);
|
| - String constantObject = namer.globalObjectForConstant(constantValue);
|
| + js.Name name = _namer.constantName(constantValue);
|
| + String constantObject = _namer.globalObjectForConstant(constantValue);
|
| Holder holder =
|
| _registry.registerHolder(constantObject, isConstantsHolder: true);
|
| Constant constant = new Constant(name, holder, constantValue);
|
| @@ -1001,7 +1036,7 @@ class ProgramBuilder {
|
| }
|
|
|
| Holder _registerStaticStateHolder() {
|
| - return _registry.registerHolder(namer.staticStateHolder,
|
| + return _registry.registerHolder(_namer.staticStateHolder,
|
| isStaticStateHolder: true);
|
| }
|
| }
|
|
|