Chromium Code Reviews| 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 /// Tracks the shape of the import/export graph and dependencies between files. | 5 /// Tracks the shape of the import/export graph and dependencies between files. |
| 6 library dev_compiler.src.dependency_graph; | 6 library dev_compiler.src.dependency_graph; |
| 7 | 7 |
| 8 import 'dart:collection' show HashSet, HashMap; | 8 import 'dart:collection' show HashSet, HashMap; |
| 9 | 9 |
| 10 import 'package:analyzer/analyzer.dart' show parseDirectives; | 10 import 'package:analyzer/analyzer.dart' show parseDirectives; |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 195 var newScripts = new Set<DartSourceNode>(); | 195 var newScripts = new Set<DartSourceNode>(); |
| 196 var tags = document.querySelectorAll('script[type="application/dart"]'); | 196 var tags = document.querySelectorAll('script[type="application/dart"]'); |
| 197 for (var script in tags) { | 197 for (var script in tags) { |
| 198 var src = script.attributes['src']; | 198 var src = script.attributes['src']; |
| 199 if (src == null) { | 199 if (src == null) { |
| 200 _reportError(graph, 'inlined script tags not supported at this time ' | 200 _reportError(graph, 'inlined script tags not supported at this time ' |
| 201 '(see https://github.com/dart-lang/dart-dev-compiler/issues/54).', | 201 '(see https://github.com/dart-lang/dart-dev-compiler/issues/54).', |
| 202 script); | 202 script); |
| 203 continue; | 203 continue; |
| 204 } | 204 } |
| 205 var node = graph.nodeFromUri(uri.resolve(src)); | 205 DartSourceNode node = graph.nodeFromUri(uri.resolve(src)); |
| 206 if (node == null || !node.source.exists()) { | 206 if (node == null || !node.source.exists()) { |
| 207 _reportError(graph, 'Script file $src not found', script); | 207 _reportError(graph, 'Script file $src not found', script); |
| 208 } | 208 } |
| 209 if (node != null) newScripts.add(node); | 209 if (node != null) newScripts.add(node); |
| 210 } | 210 } |
| 211 | 211 |
| 212 if (!_same(newScripts, scripts)) { | 212 if (!_same(newScripts, scripts)) { |
| 213 structureChanged = true; | 213 structureChanged = true; |
| 214 scripts = newScripts; | 214 scripts = newScripts; |
| 215 } | 215 } |
| 216 | 216 |
| 217 // TODO(jmesserly): simplify the design here. Ideally we wouldn't need | 217 // TODO(jmesserly): simplify the design here. Ideally we wouldn't need |
| 218 // to track user-defined CSS, images, etc. Also we don't have a clear | 218 // to track user-defined CSS, images, etc. Also we don't have a clear |
| 219 // way to distinguish runtime injected resources, like messages.css, from | 219 // way to distinguish runtime injected resources, like messages.css, from |
| 220 // user-defined files. | 220 // user-defined files. |
| 221 htmlResourceNodes.clear(); | 221 htmlResourceNodes.clear(); |
| 222 var newResources = new Set<SourceNode>(); | 222 var newResources = new Set<SourceNode>(); |
| 223 for (var resource in graph.resources) { | 223 for (var resource in graph.resources) { |
| 224 newResources.add(graph.nodeFromUri(uri.resolve(resource))); | 224 newResources.add(graph.nodeFromUri(uri.resolve(resource))); |
| 225 } | 225 } |
| 226 for (var tag in document.querySelectorAll('link[rel="stylesheet"]')) { | 226 for (var tag in document.querySelectorAll('link[rel="stylesheet"]')) { |
| 227 var res = graph.nodeFromUri(uri.resolve(tag.attributes['href'])); | 227 ResourceSourceNode res = |
| 228 graph.nodeFromUri(uri.resolve(tag.attributes['href'])); | |
|
Leaf
2015/07/22 22:29:15
Is there a rationale behind using the T v = e patt
Jennifer Messerly
2015/07/22 22:35:52
I have no idea ... the messages seemed inconsisten
| |
| 228 htmlResourceNodes[tag] = res; | 229 htmlResourceNodes[tag] = res; |
| 229 newResources.add(res); | 230 newResources.add(res); |
| 230 } | 231 } |
| 231 for (var tag in document.querySelectorAll('img[src]')) { | 232 for (var tag in document.querySelectorAll('img[src]')) { |
| 232 var res = graph.nodeFromUri(uri.resolve(tag.attributes['src'])); | 233 ResourceSourceNode res = |
| 234 graph.nodeFromUri(uri.resolve(tag.attributes['src'])); | |
| 233 htmlResourceNodes[tag] = res; | 235 htmlResourceNodes[tag] = res; |
| 234 newResources.add(res); | 236 newResources.add(res); |
| 235 } | 237 } |
| 236 if (!_same(newResources, resources)) { | 238 if (!_same(newResources, resources)) { |
| 237 structureChanged = true; | 239 structureChanged = true; |
| 238 resources = newResources; | 240 resources = newResources; |
| 239 } | 241 } |
| 240 } | 242 } |
| 241 } | 243 } |
| 242 | 244 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 309 | 311 |
| 310 var directiveUri = (d as UriBasedDirective).uri; | 312 var directiveUri = (d as UriBasedDirective).uri; |
| 311 | 313 |
| 312 // `dart:core` and other similar URLs only contain a name, but it is | 314 // `dart:core` and other similar URLs only contain a name, but it is |
| 313 // meant to be a folder when resolving relative paths from it. | 315 // meant to be a folder when resolving relative paths from it. |
| 314 var targetUri = uri.scheme == 'dart' && uri.pathSegments.length == 1 | 316 var targetUri = uri.scheme == 'dart' && uri.pathSegments.length == 1 |
| 315 ? Uri.parse('$uri/').resolve(directiveUri.stringValue) | 317 ? Uri.parse('$uri/').resolve(directiveUri.stringValue) |
| 316 : uri.resolve(directiveUri.stringValue); | 318 : uri.resolve(directiveUri.stringValue); |
| 317 var target = | 319 var target = |
| 318 ParseDartTask.resolveDirective(graph._context, _source, d, null); | 320 ParseDartTask.resolveDirective(graph._context, _source, d, null); |
| 319 var node = graph.nodes.putIfAbsent( | 321 DartSourceNode node = graph.nodes.putIfAbsent( |
| 320 targetUri, () => new DartSourceNode(graph, targetUri, target)); | 322 targetUri, () => new DartSourceNode(graph, targetUri, target)); |
| 321 //var node = graph.nodeFromUri(targetUri); | 323 //var node = graph.nodeFromUri(targetUri); |
| 322 if (node._source == null || !node._source.exists()) { | 324 if (node._source == null || !node._source.exists()) { |
| 323 _reportError(graph, 'File $targetUri not found', d); | 325 _reportError(graph, 'File $targetUri not found', d); |
| 324 } | 326 } |
| 325 | 327 |
| 326 if (d is ImportDirective) { | 328 if (d is ImportDirective) { |
| 327 newImports.add(node); | 329 newImports.add(node); |
| 328 } else if (d is ExportDirective) { | 330 } else if (d is ExportDirective) { |
| 329 newExports.add(node); | 331 newExports.add(node); |
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 500 var deps = includeParts ? node.allDeps : node.depsWithoutParts; | 502 var deps = includeParts ? node.allDeps : node.depsWithoutParts; |
| 501 deps.forEach(helper); | 503 deps.forEach(helper); |
| 502 action(node); | 504 action(node); |
| 503 } | 505 } |
| 504 helper(start); | 506 helper(start); |
| 505 } | 507 } |
| 506 | 508 |
| 507 bool _same(Set a, Set b) => a.length == b.length && a.containsAll(b); | 509 bool _same(Set a, Set b) => a.length == b.length && a.containsAll(b); |
| 508 | 510 |
| 509 final _log = new Logger('dev_compiler.dependency_graph'); | 511 final _log = new Logger('dev_compiler.dependency_graph'); |
| OLD | NEW |