OLD | NEW |
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 /// Development server that compiles Dart to JS on the fly. | 5 /// Development server that compiles Dart to JS on the fly. |
6 | 6 |
7 import 'dart:async'; | 7 import 'dart:async'; |
8 import 'dart:convert'; | 8 import 'dart:convert'; |
9 import 'dart:io'; | 9 import 'dart:io'; |
10 | 10 |
(...skipping 18 matching lines...) Expand all Loading... |
29 import '../info.dart' | 29 import '../info.dart' |
30 show AnalyzerMessage, CheckerResults, LibraryInfo, LibraryUnit; | 30 show AnalyzerMessage, CheckerResults, LibraryInfo, LibraryUnit; |
31 import '../options.dart'; | 31 import '../options.dart'; |
32 import '../report.dart'; | 32 import '../report.dart'; |
33 import '../utils.dart'; | 33 import '../utils.dart'; |
34 | 34 |
35 import 'dependency_graph.dart'; | 35 import 'dependency_graph.dart'; |
36 | 36 |
37 /// Encapsulates the logic when the compiler is run as a development server. | 37 /// Encapsulates the logic when the compiler is run as a development server. |
38 class ServerCompiler extends AbstractCompiler { | 38 class ServerCompiler extends AbstractCompiler { |
39 final SourceNode _entryNode; | 39 SourceNode _entryNode; |
40 List<LibraryInfo> _libraries = <LibraryInfo>[]; | 40 List<LibraryInfo> _libraries = <LibraryInfo>[]; |
41 final _generators = <CodeGenerator>[]; | 41 final _generators = <CodeGenerator>[]; |
42 bool _hashing; | 42 bool _hashing; |
43 bool _failure = false; | 43 bool _failure = false; |
44 | 44 |
45 factory ServerCompiler(AnalysisContext context, CompilerOptions options, | 45 factory ServerCompiler(AnalysisContext context, CompilerOptions options, |
46 {AnalysisErrorListener reporter}) { | 46 {AnalysisErrorListener reporter}) { |
47 var srcOpts = options.sourceOptions; | 47 var srcOpts = options.sourceOptions; |
48 var inputFile = options.inputs[0]; | 48 var inputFiles = options.inputs; |
49 var inputUri = | 49 var inputUris = inputFiles.map((String inputFile) => |
50 inputFile.startsWith('dart:') || inputFile.startsWith('package:') | 50 inputFile.startsWith('dart:') || inputFile.startsWith('package:') |
51 ? Uri.parse(inputFile) | 51 ? Uri.parse(inputFile) |
52 : new Uri.file(path.absolute(srcOpts.useImplicitHtml | 52 : new Uri.file(path.absolute(srcOpts.useImplicitHtml |
53 ? SourceResolverOptions.implicitHtmlFile | 53 ? SourceResolverOptions.implicitHtmlFile |
54 : inputFile)); | 54 : inputFile))); |
55 var graph = new SourceGraph(context, reporter, options); | 55 var graph = new SourceGraph(context, reporter, options); |
56 var entryNode = graph.nodeFromUri(inputUri); | 56 var entryNodes = inputUris.map((inputUri) => graph.nodeFromUri(inputUri)); |
57 | 57 |
58 return new ServerCompiler._(context, options, reporter, entryNode); | 58 return new ServerCompiler._(context, options, reporter, graph, entryNodes); |
59 } | 59 } |
60 | 60 |
61 ServerCompiler._(AnalysisContext context, CompilerOptions options, | 61 ServerCompiler._( |
62 AnalysisErrorListener reporter, this._entryNode) | 62 AnalysisContext context, |
| 63 CompilerOptions options, |
| 64 AnalysisErrorListener reporter, |
| 65 SourceGraph graph, |
| 66 List<SourceNode> entryNodes) |
63 : super(context, options, reporter) { | 67 : super(context, options, reporter) { |
| 68 _entryNode = entryNodes.length == 1 |
| 69 ? entryNodes.first |
| 70 : new EntryNode(graph, new Uri.file(inputBaseDir), entryNodes); |
| 71 |
64 if (outputDir != null) { | 72 if (outputDir != null) { |
65 _generators.add(new JSGenerator(this)); | 73 _generators.add(new JSGenerator(this)); |
66 } | 74 } |
67 // TODO(sigmund): refactor to support hashing of the dart output? | 75 // TODO(sigmund): refactor to support hashing of the dart output? |
68 _hashing = options.enableHashing && _generators.length == 1; | 76 _hashing = options.enableHashing && _generators.length == 1; |
69 } | 77 } |
70 | 78 |
71 Uri get entryPointUri => _entryNode.uri; | |
72 | |
73 CheckerResults run() { | 79 CheckerResults run() { |
74 var clock = new Stopwatch()..start(); | 80 var clock = new Stopwatch()..start(); |
75 | 81 |
76 // TODO(sigmund): we are missing a couple failures here. The | 82 // TODO(sigmund): we are missing a couple failures here. The |
77 // dependency_graph now detects broken imports or unsupported features | 83 // dependency_graph now detects broken imports or unsupported features |
78 // like more than one script tag (see .severe messages in | 84 // like more than one script tag (see .severe messages in |
79 // dependency_graph.dart). Such failures should be reported back | 85 // dependency_graph.dart). Such failures should be reported back |
80 // here so we can mark failure=true in the CheckerResults. | 86 // here so we can mark failure=true in the CheckerResults. |
81 rebuild(_entryNode, _buildSource); | 87 rebuild(_entryNode, _buildSource); |
82 _dumpInfoIfRequested(); | 88 _dumpInfoIfRequested(); |
(...skipping 22 matching lines...) Expand all Loading... |
105 } | 111 } |
106 | 112 |
107 void _buildHtmlFile(HtmlSourceNode node) { | 113 void _buildHtmlFile(HtmlSourceNode node) { |
108 if (outputDir == null) return; | 114 if (outputDir == null) return; |
109 var output = generateEntryHtml(node, this); | 115 var output = generateEntryHtml(node, this); |
110 if (output == null) { | 116 if (output == null) { |
111 _failure = true; | 117 _failure = true; |
112 return; | 118 return; |
113 } | 119 } |
114 | 120 |
115 var filename = path.basename(node.uri.path); | 121 var filepath = |
116 String outputFile = path.join(outputDir, filename); | 122 resourceOutputPath(node.uri, _entryNode.uri, options.runtimeDir); |
117 new File(outputFile).writeAsStringSync(output); | 123 String outputFile = path.join(outputDir, filepath); |
| 124 new File(outputFile) |
| 125 ..createSync(recursive: true) |
| 126 ..writeAsStringSync(output); |
118 } | 127 } |
119 | 128 |
120 void _buildResourceFile(ResourceSourceNode node) { | 129 void _buildResourceFile(ResourceSourceNode node) { |
121 // ResourceSourceNodes files that just need to be copied over to the output | 130 // ResourceSourceNodes files that just need to be copied over to the output |
122 // location. These can be external dependencies or pieces of the | 131 // location. These can be external dependencies or pieces of the |
123 // dev_compiler runtime. | 132 // dev_compiler runtime. |
124 if (outputDir == null) return; | 133 if (outputDir == null) return; |
125 var filepath = | 134 var filepath = |
126 resourceOutputPath(node.uri, _entryNode.uri, options.runtimeDir); | 135 resourceOutputPath(node.uri, _entryNode.uri, options.runtimeDir); |
127 assert(filepath != null); | 136 assert(filepath != null); |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
322 Source resolveAbsolute(Uri uri, [Uri actualUri]) { | 331 Source resolveAbsolute(Uri uri, [Uri actualUri]) { |
323 var src = resolver.resolveAbsolute(uri, actualUri); | 332 var src = resolver.resolveAbsolute(uri, actualUri); |
324 return src.exists() ? src : null; | 333 return src.exists() ? src : null; |
325 } | 334 } |
326 | 335 |
327 Uri restoreAbsolute(Source source) => resolver.restoreAbsolute(source); | 336 Uri restoreAbsolute(Source source) => resolver.restoreAbsolute(source); |
328 } | 337 } |
329 | 338 |
330 final _log = new Logger('dev_compiler.src.server'); | 339 final _log = new Logger('dev_compiler.src.server'); |
331 final _earlyErrorResult = new CheckerResults(const [], true); | 340 final _earlyErrorResult = new CheckerResults(const [], true); |
OLD | NEW |