Chromium Code Reviews| Index: lib/src/compiler/code_generator.dart |
| diff --git a/lib/src/compiler/code_generator.dart b/lib/src/compiler/code_generator.dart |
| index 08c9ec69fa886a0f748f852245ae2a8a439c4c57..68bc198548b687bcacbaeb1ed47cf78703f69232 100644 |
| --- a/lib/src/compiler/code_generator.dart |
| +++ b/lib/src/compiler/code_generator.dart |
| @@ -23,7 +23,6 @@ import 'package:analyzer/src/summary/summarize_elements.dart' |
| show PackageBundleAssembler; |
| import 'package:analyzer/src/task/strong/ast_properties.dart' |
| show isDynamicInvoke, setIsDynamicInvoke; |
| -import 'package:source_maps/source_maps.dart'; |
| import 'package:path/path.dart' show separator; |
| import '../closure/closure_annotator.dart' show ClosureAnnotator; |
| @@ -31,7 +30,7 @@ import '../js_ast/js_ast.dart' as JS; |
| import '../js_ast/js_ast.dart' show js; |
| import 'ast_builder.dart' show AstBuilder; |
| import 'compiler.dart' |
| - show BuildUnit, CompilerOptions, JSModuleFile, ModuleFormat; |
| + show BuildUnit, CompilerOptions, JSModuleFile; |
| import 'element_helpers.dart'; |
| import 'element_loader.dart' show ElementLoader; |
| import 'extension_types.dart' show ExtensionTypeSet; |
| @@ -40,12 +39,10 @@ import 'js_interop.dart'; |
| import 'js_metalet.dart' as JS; |
| import 'js_names.dart' as JS; |
| import 'js_typeref_codegen.dart' show JsTypeRefCodegen; |
| -import 'module_builder.dart' |
| - show LegacyModuleBuilder, NodeModuleBuilder, pathToJSIdentifier; |
| +import 'module_builder.dart' show pathToJSIdentifier; |
| import 'nullable_type_inference.dart' show NullableTypeInference; |
| import 'reify_coercions.dart' show CoercionReifier; |
| import 'side_effect_analysis.dart' show ConstFieldVisitor, isStateless; |
| -import 'source_map_printer.dart' show SourceMapPrintingContext; |
| import 'type_utilities.dart'; |
| class CodeGenerator extends GeneralizingAstVisitor |
| @@ -173,46 +170,21 @@ class CodeGenerator extends GeneralizingAstVisitor |
| _libraryRoot = '$_libraryRoot${separator}'; |
| } |
| - var jsTree = _emitModule(compilationUnits); |
| - var codeAndSourceMap = _writeJSText(unit, jsTree); |
| + var module = _emitModule(compilationUnits); |
| + var dartApiSummary = _summarizeModule(compilationUnits); |
| - List<int> summary; |
| - if (options.summarizeApi) { |
| - var assembler = new PackageBundleAssembler(); |
| - compilationUnits |
| - .map((u) => u.element.library) |
| - .toSet() |
| - .forEach(assembler.serializeLibraryElement); |
| - summary = assembler.assemble().toBuffer(); |
| - } |
| - |
| - return new JSModuleFile( |
| - unit.name, errors, codeAndSourceMap.e0, codeAndSourceMap.e1, summary); |
| + return new JSModuleFile(unit.name, errors, options, module, dartApiSummary); |
| } |
| - Tuple2<String, Map> _writeJSText(BuildUnit unit, JS.Program jsTree) { |
| - var opts = new JS.JavaScriptPrintingOptions( |
| - emitTypes: options.closure, |
| - allowKeywordsInProperties: true, |
| - allowSingleLineIfStatements: true); |
| - JS.SimpleJavaScriptPrintingContext printer; |
| - SourceMapBuilder sourceMap; |
| - if (options.sourceMap) { |
| - var sourceMapContext = new SourceMapPrintingContext(); |
| - sourceMap = sourceMapContext.sourceMap; |
| - printer = sourceMapContext; |
| - } else { |
| - printer = new JS.SimpleJavaScriptPrintingContext(); |
| - } |
| - |
| - jsTree.accept(new JS.Printer(opts, printer, |
| - localNamer: new JS.TemporaryNamer(jsTree))); |
| + List<int> _summarizeModule(List<CompilationUnit> compilationUnits) { |
| + if (!options.summarizeApi) return null; |
| - if (options.sourceMap && options.sourceMapComment) { |
| - printer.emit('\n//# sourceMappingURL=${unit.name}.js.map\n'); |
| - } |
| - |
| - return new Tuple2(printer.getText(), sourceMap?.build(unit.name + '.js')); |
| + var assembler = new PackageBundleAssembler(); |
| + compilationUnits |
| + .map((u) => u.element.library) |
| + .toSet() |
| + .forEach(assembler.serializeLibraryElement); |
| + return assembler.assemble().toBuffer(); |
| } |
| JS.Program _emitModule(List<CompilationUnit> compilationUnits) { |
| @@ -284,18 +256,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| _copyAndFlattenBlocks(items, _moduleItems); |
| // Build the module. |
| - var module = new JS.Program(items, name: _buildUnit.name); |
| - |
| - // Optional: lower module format. Otherwise just return it. |
| - switch (options.moduleFormat) { |
| - case ModuleFormat.legacy: |
| - return new LegacyModuleBuilder().build(module); |
| - case ModuleFormat.node: |
| - return new NodeModuleBuilder().build(module); |
| - case ModuleFormat.es6: |
| - return module; |
| - } |
| - return null; // unreachable. It is here to suppress a bogus Analyzer message |
| + return new JS.Program(items, name: _buildUnit.name); |
| } |
| List<String> _getJSName(Element e) { |
| @@ -1750,6 +1711,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var e = js.call('() => #', o); |
| return new JS.Property(_propertyName(name), e); |
| } |
| + |
| var sigFields = <JS.Property>[]; |
| if (!tCtors.isEmpty) sigFields.add(build('constructors', tCtors)); |
| if (!tMethods.isEmpty) sigFields.add(build('methods', tMethods)); |
| @@ -3262,8 +3224,12 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var vars = <JS.MetaLetVariable, JS.Expression>{}; |
| var l = _visit(_bindValue(vars, 'l', target)); |
| jsTarget = new JS.MetaLet(vars, [ |
| - js.call('(#[(#[dart._extensionType]) ? dartx[#] : #])', |
| - [l, l, memberName, memberName,]) |
| + js.call('(#[(#[dart._extensionType]) ? dartx[#] : #])', [ |
| + l, |
| + l, |
| + memberName, |
| + memberName, |
| + ]) |
| ]); |
| if (typeArgs != null) jsTarget = new JS.Call(jsTarget, typeArgs); |
| return new JS.Call(jsTarget, args); |
| @@ -3806,6 +3772,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var args = _visit(argumentList) as List<JS.Expression>; |
| return isFactory ? new JS.Call(ctor, args) : new JS.New(ctor, args); |
| } |
| + |
| if (element != null && _isObjectLiteral(element.enclosingElement)) { |
| return _emitObjectLiteral(argumentList); |
| } |
| @@ -4047,6 +4014,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| return null; |
| } |
| + |
| if (expr is SimpleIdentifier) { |
| return finishIdentifier(expr); |
| } else if (expr is PrefixedIdentifier && !expr.isDeferred) { |
| @@ -4134,6 +4102,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| if (value != null) return value.bitLength; |
| return MAX; |
| } |
| + |
| return bitWidth(expr, 0) < 32; |
| } |
| @@ -4924,6 +4893,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| var name = js.string(node.components.join('.'), "'"); |
| return js.call('#.new(#)', [_emitType(types.symbolType), name]); |
| } |
| + |
| return _emitConst(emitSymbol); |
| } |
| @@ -4952,6 +4922,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| return list; |
| } |
| + |
| if (isConst) return _cacheConst(emitList); |
| return emitList(); |
| } |
| @@ -4990,6 +4961,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| return js.call('dart.map(#, #)', [mapArguments, types]); |
| } |
| + |
| if (node.constKeyword != null) return _emitConst(emitMap); |
| return emitMap(); |
| } |
| @@ -5066,6 +5038,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| JS.Expression finish(JS.Expression result) { |
| return annotate(result, node); |
| } |
| + |
| if (node is PrefixExpression && node.operator.lexeme == '!') { |
| return finish(js.call('!#', _visitTest(node.operand))); |
| } |
| @@ -5077,6 +5050,7 @@ class CodeGenerator extends GeneralizingAstVisitor |
| return finish(js.call(code, |
| [_visitTest(node.leftOperand), _visitTest(node.rightOperand)])); |
| } |
| + |
| var op = node.operator.type.lexeme; |
| if (op == '&&') return shortCircuit('# && #'); |
| if (op == '||') return shortCircuit('# || #'); |
| @@ -5294,8 +5268,17 @@ class CodeGenerator extends GeneralizingAstVisitor |
| /// within the file. |
| /// |
| /// If the value is null, the entire file is whitelisted. |
| + /// |
| + // TODO(jmesserly): why is this here, and what can we do to remove it? |
| + // |
| + // Hard coded lists are completely unnecessary -- if a feature is needed, |
| + // metadata, type system features, or command line options is the right way to |
| + // express it. |
| + // |
| + // As it is this is completely unsound and unmaintainable. |
| + // |
|
nweiz
2016/08/24 23:33:26
Nit: unnecessary newline.
Jennifer Messerly
2016/08/25 16:21:39
there are not enough newlines to contain my rage a
|
| static Map<String, List<String>> _uncheckedWhitelist = { |
| - 'dom_renderer.dart': ['moveNodesAfterSibling',], |
| + 'dom_renderer.dart': ['moveNodesAfterSibling'], |
| 'template_ref.dart': ['createEmbeddedView'], |
| 'ng_class.dart': ['_applyIterableChanges'], |
| 'ng_for.dart': ['_bulkRemove', '_bulkInsert'], |
| @@ -5335,7 +5318,8 @@ class CodeGenerator extends GeneralizingAstVisitor |
| } |
| } |
| -/// Choose a canonical name from the library element. |
| +/// Choose a canonical name from the [library] element. |
| +/// |
| /// This never uses the library's name (the identifier in the `library` |
| /// declaration) as it doesn't have any meaningful rules enforced. |
| String jsLibraryName(String libraryRoot, LibraryElement library) { |