OLD | NEW |
---|---|
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of dart2js.js_emitter; | 5 part of dart2js.js_emitter; |
6 | 6 |
7 /** | 7 /** |
8 * Generates the code for all used classes in the program. Static fields (even | 8 * Generates the code for all used classes in the program. Static fields (even |
9 * in classes) are ignored, since they can be treated as non-class elements. | 9 * in classes) are ignored, since they can be treated as non-class elements. |
10 * | 10 * |
(...skipping 1511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1522 | 1522 |
1523 emitMain(mainBuffer); | 1523 emitMain(mainBuffer); |
1524 jsAst.FunctionDeclaration precompiledFunctionAst = | 1524 jsAst.FunctionDeclaration precompiledFunctionAst = |
1525 buildPrecompiledFunction(); | 1525 buildPrecompiledFunction(); |
1526 emitInitFunction(mainBuffer); | 1526 emitInitFunction(mainBuffer); |
1527 if (!compiler.deferredLoadTask.splitProgram) { | 1527 if (!compiler.deferredLoadTask.splitProgram) { |
1528 mainBuffer.add('})()\n'); | 1528 mainBuffer.add('})()\n'); |
1529 } else { | 1529 } else { |
1530 mainBuffer.add('\n'); | 1530 mainBuffer.add('\n'); |
1531 } | 1531 } |
1532 compiler.assembledCode = mainBuffer.getText(); | 1532 String assembledCode = mainBuffer.getText(); |
1533 outputSourceMap(compiler.assembledCode, ''); | 1533 if (generateSourceMap) { |
1534 outputSourceMap(assembledCode, mainBuffer, '', | |
1535 compiler.sourceMapUri, compiler.outputUri); | |
1536 assembledCode += | |
floitsch
2014/03/07 10:27:24
It seems more efficient if we don't have to create
Johnni Winther
2014/03/07 12:38:48
Done.
| |
1537 generateSourceMapTag(compiler.sourceMapUri, compiler.outputUri); | |
1538 } | |
1539 compiler.outputProvider('', 'js') | |
1540 ..add(assembledCode) | |
1541 ..close(); | |
1542 compiler.assembledCode = assembledCode; | |
1534 | 1543 |
1535 mainBuffer.write( | 1544 mainBuffer.write( |
1536 jsAst.prettyPrint( | 1545 jsAst.prettyPrint( |
1537 precompiledFunctionAst, compiler, | 1546 precompiledFunctionAst, compiler, |
1538 allowVariableMinification: false).getText()); | 1547 allowVariableMinification: false).getText()); |
1539 | 1548 |
1540 compiler.outputProvider('', 'precompiled.js') | 1549 compiler.outputProvider('', 'precompiled.js') |
1541 ..add(mainBuffer.getText()) | 1550 ..add(mainBuffer.getText()) |
1542 ..close(); | 1551 ..close(); |
1543 | 1552 |
1544 emitDeferredCode(); | 1553 emitDeferredCode(); |
1545 | 1554 |
1546 }); | 1555 }); |
1547 return compiler.assembledCode; | 1556 return compiler.assembledCode; |
1548 } | 1557 } |
1549 | 1558 |
1559 String generateSourceMapTag(Uri sourceMapUri, Uri fileUri) { | |
1560 if (sourceMapUri != null && fileUri != null) { | |
1561 // Using # is the new proposed standard. @ caused problems in Internet | |
1562 // Explorer due to "Conditional Compilation Statements" in JScript, | |
1563 // see: | |
1564 // http://msdn.microsoft.com/en-us/library/7kx09ct1(v=vs.80).aspx | |
1565 // About source maps, see: | |
1566 // https://docs.google.com/a/google.com/document/d/1U1RGAehQwRypUTovF1KRlp iOFze0b-_2gc6fAH0KY0k/edit | |
1567 // TODO(http://dartbug.com/11914): Remove @ line. | |
floitsch
2014/03/07 10:27:24
I just tried with Chrome beta, and at least there
Johnni Winther
2014/03/07 12:38:48
Will do it in a separate CL.
| |
1568 String sourceMapFileName = relativize(fileUri, sourceMapUri, false); | |
1569 return ''' | |
1570 | |
1571 //# sourceMappingURL=$sourceMapFileName | |
1572 //@ sourceMappingURL=$sourceMapFileName | |
1573 '''; | |
1574 } | |
1575 return ''; | |
1576 } | |
1577 | |
1550 ClassBuilder getElementDescriptorForOutputUnit(Element element, | 1578 ClassBuilder getElementDescriptorForOutputUnit(Element element, |
1551 OutputUnit outputUnit) { | 1579 OutputUnit outputUnit) { |
1552 Map<OutputUnit, ClassBuilder> descriptors = | 1580 Map<OutputUnit, ClassBuilder> descriptors = |
1553 elementDescriptors.putIfAbsent( | 1581 elementDescriptors.putIfAbsent( |
1554 element, () => new Map<OutputUnit, ClassBuilder>()); | 1582 element, () => new Map<OutputUnit, ClassBuilder>()); |
1555 return descriptors.putIfAbsent(outputUnit, | 1583 return descriptors.putIfAbsent(outputUnit, |
1556 () => new ClassBuilder(namer)); | 1584 () => new ClassBuilder(namer)); |
1557 } | 1585 } |
1558 | 1586 |
1559 ClassBuilder getElementDecriptor(Element element) { | 1587 ClassBuilder getElementDecriptor(Element element) { |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1616 classesCollector = oldClassesCollector; | 1644 classesCollector = oldClassesCollector; |
1617 | 1645 |
1618 typeTestEmitter.emitRuntimeTypeSupport(buffer, outputUnit); | 1646 typeTestEmitter.emitRuntimeTypeSupport(buffer, outputUnit); |
1619 | 1647 |
1620 emitCompileTimeConstants(buffer, outputUnit); | 1648 emitCompileTimeConstants(buffer, outputUnit); |
1621 | 1649 |
1622 String code = buffer.getText(); | 1650 String code = buffer.getText(); |
1623 compiler.outputProvider(outputUnit.name, 'js') | 1651 compiler.outputProvider(outputUnit.name, 'js') |
1624 ..add(code) | 1652 ..add(code) |
1625 ..close(); | 1653 ..close(); |
1626 outputSourceMap(compiler.assembledCode, outputUnit.name); | 1654 |
1655 // TODO(johnniwinther): Support source maps for deferred code. | |
1627 } | 1656 } |
1628 } | 1657 } |
1629 | 1658 |
1630 String buildGeneratedBy() { | 1659 String buildGeneratedBy() { |
1631 var suffix = ''; | 1660 var suffix = ''; |
1632 if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}'; | 1661 if (compiler.hasBuildId) suffix = ' version: ${compiler.buildId}'; |
1633 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n'; | 1662 return '// Generated by dart2js, the Dart to JavaScript compiler$suffix.\n'; |
1634 } | 1663 } |
1635 | 1664 |
1636 String buildSourceMap(CodeBuffer buffer, SourceFile compiledFile) { | 1665 String buildSourceMap(CodeBuffer buffer, |
floitsch
2014/03/07 10:27:24
If buildSourceMap is not used anywhere else I woul
Johnni Winther
2014/03/07 12:38:48
Done.
| |
1666 SourceFile compiledFile, | |
1667 [Uri sourceMapUri, Uri fileUri]) { | |
1637 SourceMapBuilder sourceMapBuilder = | 1668 SourceMapBuilder sourceMapBuilder = |
1638 new SourceMapBuilder(compiler.sourceMapUri); | 1669 new SourceMapBuilder(sourceMapUri, fileUri); |
1639 buffer.forEachSourceLocation(sourceMapBuilder.addMapping); | 1670 buffer.forEachSourceLocation(sourceMapBuilder.addMapping); |
1640 return sourceMapBuilder.build(compiledFile); | 1671 return sourceMapBuilder.build(compiledFile); |
1641 } | 1672 } |
1642 | 1673 |
1643 void outputSourceMap(String code, String name) { | 1674 void outputSourceMap(String code, CodeBuffer buffer, String name, |
1675 [Uri sourceMapUri, Uri fileUri]) { | |
1644 if (!generateSourceMap) return; | 1676 if (!generateSourceMap) return; |
1645 // Create a source file for the compilation output. This allows using | 1677 // Create a source file for the compilation output. This allows using |
1646 // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder]. | 1678 // [:getLine:] to transform offsets to line numbers in [SourceMapBuilder]. |
1647 SourceFile compiledFile = | 1679 SourceFile compiledFile = |
1648 new StringSourceFile(null, compiler.assembledCode); | 1680 new StringSourceFile(null, code); |
1649 String sourceMap = buildSourceMap(mainBuffer, compiledFile); | 1681 String sourceMap = buildSourceMap(mainBuffer, compiledFile, |
1682 sourceMapUri, fileUri); | |
1650 compiler.outputProvider(name, 'js.map') | 1683 compiler.outputProvider(name, 'js.map') |
1651 ..add(sourceMap) | 1684 ..add(sourceMap) |
1652 ..close(); | 1685 ..close(); |
1653 } | 1686 } |
1654 | 1687 |
1655 void registerReadTypeVariable(TypeVariableElement element) { | 1688 void registerReadTypeVariable(TypeVariableElement element) { |
1656 readTypeVariables.add(element); | 1689 readTypeVariables.add(element); |
1657 } | 1690 } |
1658 } | 1691 } |
OLD | NEW |