| Index: sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
|
| diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
|
| index 3888d0917ab32ba3ff9a9c792f292f9001cdc207..7113389e597380d4f76f9d82e59430ff10ccef80 100644
|
| --- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
|
| +++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
|
| @@ -55,8 +55,6 @@ class CodeEmitterTask extends CompilerTask {
|
| // TODO(ngeoffray): remove this field.
|
| Set<ClassElement> instantiatedClasses;
|
|
|
| - List<TypedefElement> typedefsNeededForReflection;
|
| -
|
| JavaScriptBackend get backend => compiler.backend;
|
| TypeVariableHandler get typeVariableHandler => backend.typeVariableHandler;
|
|
|
| @@ -65,12 +63,9 @@ class CodeEmitterTask extends CompilerTask {
|
| String get n => compiler.enableMinification ? "" : "\n";
|
| String get N => compiler.enableMinification ? "\n" : ";\n";
|
|
|
| - CodeBuffer getBuffer(OutputUnit outputUnit) {
|
| - return outputBuffers.putIfAbsent(outputUnit, () => new CodeBuffer());
|
| - }
|
| -
|
| CodeBuffer get mainBuffer {
|
| - return getBuffer(compiler.deferredLoadTask.mainOutputUnit);
|
| + return outputBuffers.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
|
| + () => new CodeBuffer());
|
| }
|
|
|
| /**
|
| @@ -755,8 +750,6 @@ class CodeEmitterTask extends CompilerTask {
|
| ClassElement cls = element;
|
| if (cls.isUnnamedMixinApplication) return null;
|
| return cls.name;
|
| - } else if (element.isTypedef) {
|
| - return element.name;
|
| }
|
| throw compiler.internalError(element,
|
| 'Do not know how to reflect on this $element.');
|
| @@ -866,7 +859,7 @@ class CodeEmitterTask extends CompilerTask {
|
| for (Element element in Elements.sortedByPosition(elements)) {
|
| ClassBuilder builder = new ClassBuilder(namer);
|
| containerBuilder.addMember(element, builder);
|
| - getElementDescriptor(element).properties.addAll(builder.properties);
|
| + getElementDecriptor(element).properties.addAll(builder.properties);
|
| }
|
| }
|
|
|
| @@ -1152,15 +1145,10 @@ class CodeEmitterTask extends CompilerTask {
|
| }
|
| }
|
|
|
| - /// Compute all the classes and typedefs that must be emitted.
|
| - void computeNeededDeclarations() {
|
| - // Compute needed typedefs.
|
| - typedefsNeededForReflection = Elements.sortedByPosition(
|
| - compiler.world.allTypedefs
|
| - .where(backend.isAccessibleByReflection)
|
| - .toList());
|
| -
|
| - // Compute needed classes.
|
| + /**
|
| + * Compute all the classes that must be emitted.
|
| + */
|
| + void computeNeededClasses() {
|
| instantiatedClasses =
|
| compiler.codegenWorld.instantiatedClasses.where(computeClassFilter())
|
| .toSet();
|
| @@ -1315,17 +1303,21 @@ class CodeEmitterTask extends CompilerTask {
|
| if (uri.scheme == 'file' && compiler.outputUri != null) {
|
| uri = relativize(compiler.outputUri, library.canonicalUri, false);
|
| }
|
| - Map<OutputUnit, ClassBuilder> descriptors = elementDescriptors[library];
|
| + Map<OutputUnit, ClassBuilder> descriptors =
|
| + elementDescriptors[library];
|
|
|
| for (OutputUnit outputUnit in compiler.deferredLoadTask.allOutputUnits) {
|
| - if (!descriptors.containsKey(outputUnit)) continue;
|
| -
|
| - ClassBuilder descriptor = descriptors[outputUnit];
|
| + ClassBuilder descriptor =
|
| + descriptors.putIfAbsent(outputUnit, () => new ClassBuilder(namer));
|
| + if (descriptor.properties.isEmpty) continue;
|
| + bool isDeferred =
|
| + outputUnit != compiler.deferredLoadTask.mainOutputUnit;
|
| jsAst.Fun metadata = metadataEmitter.buildMetadataFunction(library);
|
|
|
| - jsAst.ObjectInitializer initializers = descriptor.toObjectInitializer();
|
| - CodeBuffer outputBuffer = getBuffer(outputUnit);
|
| -
|
| + jsAst.ObjectInitializer initializers =
|
| + descriptor.toObjectInitializer();
|
| + CodeBuffer outputBuffer =
|
| + outputBuffers.putIfAbsent(outputUnit, () => new CodeBuffer());
|
| int sizeBefore = outputBuffer.length;
|
| outputBuffers[outputUnit]
|
| ..write('["${library.getLibraryName()}",$_')
|
| @@ -1351,7 +1343,7 @@ class CodeEmitterTask extends CompilerTask {
|
| // 'is$' method.
|
| typeTestEmitter.computeRequiredTypeChecks();
|
|
|
| - computeNeededDeclarations();
|
| + computeNeededClasses();
|
|
|
| mainBuffer.add(buildGeneratedBy());
|
| addComment(HOOKS_API_USAGE, mainBuffer);
|
| @@ -1386,8 +1378,7 @@ class CodeEmitterTask extends CompilerTask {
|
| // Only output the classesCollector if we actually have any classes.
|
| if (!(nativeClasses.isEmpty &&
|
| compiler.codegenWorld.staticFunctionsNeedingGetter.isEmpty &&
|
| - outputClassLists.values.every((classList) => classList.isEmpty) &&
|
| - typedefsNeededForReflection.isEmpty)) {
|
| + outputClassLists.values.every((classList) => classList.isEmpty))) {
|
| // Shorten the code by using "$$" as temporary.
|
| classesCollector = r"$$";
|
| mainBuffer.add('var $classesCollector$_=$_{}$N$n');
|
| @@ -1411,7 +1402,7 @@ class CodeEmitterTask extends CompilerTask {
|
| // Might create methodClosures.
|
| for (List<ClassElement> outputClassList in outputClassLists.values) {
|
| for (ClassElement element in outputClassList) {
|
| - generateClass(element, getElementDescriptor(element));
|
| + generateClass(element, getElementDecriptor(element));
|
| }
|
| }
|
|
|
| @@ -1431,8 +1422,6 @@ class CodeEmitterTask extends CompilerTask {
|
| mainBuffer.write(';');
|
| }
|
|
|
| - // TODO(karlklose): document what kinds of fields this loop adds to the
|
| - // library class builder.
|
| for (Element element in elementDescriptors.keys) {
|
| // TODO(ahe): Should iterate over all libraries. Otherwise, we will
|
| // not see libraries that only have fields.
|
| @@ -1448,28 +1437,6 @@ class CodeEmitterTask extends CompilerTask {
|
| }
|
| }
|
|
|
| - // Emit all required typedef declarations into the main output unit.
|
| - // TODO(karlklose): unify required classes and typedefs to declarations
|
| - // and have builders for each kind.
|
| - for (TypedefElement typedef in typedefsNeededForReflection) {
|
| - OutputUnit mainUnit = compiler.deferredLoadTask.mainOutputUnit;
|
| - LibraryElement library = typedef.library;
|
| - // TODO(karlklose): add a TypedefBuilder and move this code there.
|
| - DartType type = typedef.alias;
|
| - int typeIndex = metadataEmitter.reifyType(type);
|
| - String typeReference =
|
| - encoding.encodeTypedefFieldDescriptor(typeIndex);
|
| - jsAst.Property descriptor = new jsAst.Property(
|
| - js.string(namer.classDescriptorProperty),
|
| - js.string(typeReference));
|
| - jsAst.Node declaration = new jsAst.ObjectInitializer([descriptor]);
|
| - String mangledName = namer.getNameX(typedef);
|
| - String reflectionName = getReflectionName(typedef, mangledName);
|
| - getElementDescriptorForOutputUnit(library, mainUnit)
|
| - ..addProperty(mangledName, declaration)
|
| - ..addProperty("+$reflectionName", js.string(''));
|
| - }
|
| -
|
| if (!mangledFieldNames.isEmpty) {
|
| var keys = mangledFieldNames.keys.toList();
|
| keys.sort();
|
| @@ -1722,7 +1689,7 @@ class CodeEmitterTask extends CompilerTask {
|
| () => new ClassBuilder(namer));
|
| }
|
|
|
| - ClassBuilder getElementDescriptor(Element element) {
|
| + ClassBuilder getElementDecriptor(Element element) {
|
| Element owner = element.library;
|
| if (!element.isTopLevel && !element.isNative) {
|
| // For static (not top level) elements, record their code in a buffer
|
|
|