Index: lib/src/dependency_graph.dart |
diff --git a/lib/src/dependency_graph.dart b/lib/src/dependency_graph.dart |
index 115525334b03b71f31fba36863c1f7288b28f83c..92c261ecf8477fc65b888dfd8188c4b4ed9703d0 100644 |
--- a/lib/src/dependency_graph.dart |
+++ b/lib/src/dependency_graph.dart |
@@ -50,9 +50,11 @@ class SourceGraph { |
var source = _context.sourceFactory.forUri(uriString); |
var extension = path.extension(uriString); |
if (extension == '.html') { |
- return new HtmlSourceNode(uri, source); |
+ return new HtmlSourceNode(uri, source, this); |
} else if (extension == '.dart' || uriString.startsWith('dart:')) { |
return new DartSourceNode(uri, source); |
+ } else if (extension == '.js') { |
+ return new JavaScriptSourceNode(uri, source); |
} else { |
assert(false); // unreachable |
} |
@@ -81,12 +83,12 @@ abstract class SourceNode { |
/// Direct dependencies in the [SourceGraph]. These include script tags for |
/// [HtmlSourceNode]s; and imports, exports and parts for [DartSourceNode]s. |
- Iterable<SourceNode> get allDeps; |
+ Iterable<SourceNode> get allDeps => const []; |
/// Like [allDeps] but excludes parts for [DartSourceNode]s. For many |
/// operations we mainly care about dependencies at the library level, so |
/// parts are excluded from this list. |
- Iterable<SourceNode> get depsWithoutParts; |
+ Iterable<SourceNode> get depsWithoutParts => const []; |
SourceNode(this.uri, this.source); |
@@ -108,19 +110,27 @@ abstract class SourceNode { |
/// A node representing an entry HTML source file. |
class HtmlSourceNode extends SourceNode { |
+ /// Javascript dependencies, included by default on any application. |
+ final runtimeDeps = new Set<JavaScriptSourceNode>(); |
+ |
/// Libraries referred to via script tags. |
Set<DartSourceNode> scripts = new Set<DartSourceNode>(); |
@override |
- Iterable<SourceNode> get allDeps => scripts; |
+ Iterable<SourceNode> get allDeps => [scripts, runtimeDeps].expand((e) => e); |
@override |
- Iterable<SourceNode> get depsWithoutParts => scripts; |
+ Iterable<SourceNode> get depsWithoutParts => allDeps; |
/// Parsed document, updated whenever [update] is invoked. |
Document document; |
- HtmlSourceNode(uri, source) : super(uri, source); |
+ HtmlSourceNode(uri, source, graph) : super(uri, source) { |
+ var prefix = 'package:dev_compiler/runtime'; |
+ runtimeDeps |
+ ..add(graph.nodeFromUri(Uri.parse('$prefix/dart_runtime.js'))) |
+ ..add(graph.nodeFromUri(Uri.parse('$prefix/harmony_feature_check.js'))); |
+ } |
void update(SourceGraph graph) { |
super.update(graph); |
@@ -257,6 +267,12 @@ class DartSourceNode extends SourceNode { |
} |
} |
+/// Represents a Javascript runtime resource from our compiler that is needed to |
+/// run an application. |
+class JavaScriptSourceNode extends SourceNode { |
+ JavaScriptSourceNode(uri, source) : super(uri, source); |
+} |
+ |
/// Updates the structure and `needsRebuild` marks in nodes of [graph] reachable |
/// from [start]. |
/// |
@@ -320,6 +336,7 @@ rebuild(SourceNode start, SourceGraph graph, bool build(SourceNode node)) { |
bool shouldBuildNode(SourceNode n) { |
if (n.needsRebuild) return true; |
if (n is HtmlSourceNode) return structureHasChanged; |
+ if (n is JavaScriptSourceNode) return false; |
return (n as DartSourceNode).imports |
.any((i) => apiChangeDetected.contains(i)); |
} |