Dependencies: teach the Driver about the new member-based dependencies.

If file A extends a common type (say, Dictionary), but only adds new members,
other files using Dictionary don't need to be recompiled if they definitively
don't use those members. That should be working now.

Swift SVN r30286
This commit is contained in:
Jordan Rose
2015-07-16 23:36:33 +00:00
parent 806aac2611
commit 2ad0ffd6e4
8 changed files with 203 additions and 15 deletions

View File

@@ -20,6 +20,10 @@ TEST(DependencyGraph, BasicLoad) {
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(i++, "depends-dynamic-lookup: [k, l]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(i++, "provides-member: [[m, mm], [n, nn]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(i++, "depends-member: [[o, oo], [p, pp]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(i++, "depends-external: [/foo, /bar]"),
LoadResult::UpToDate);
@@ -115,6 +119,31 @@ TEST(DependencyGraph, IndependentDepKinds2) {
EXPECT_TRUE(graph.isMarked(1));
}
TEST(DependencyGraph, IndependentMembers) {
DependencyGraph<uintptr_t> graph;
EXPECT_EQ(graph.loadFromString(0, "provides-member: [[a,aa]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(1, "depends-member: [[a,bb]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(2, "depends-member: [[a,\"\"]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(3, "depends-member: [[b,aa]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(4, "depends-member: [[b,bb]]"),
LoadResult::UpToDate);
SmallVector<uintptr_t, 4> marked;
graph.markTransitive(marked, 0);
EXPECT_EQ(0u, marked.size());
EXPECT_TRUE(graph.isMarked(0));
EXPECT_FALSE(graph.isMarked(1));
EXPECT_FALSE(graph.isMarked(2));
EXPECT_FALSE(graph.isMarked(3));
EXPECT_FALSE(graph.isMarked(4));
}
TEST(DependencyGraph, SimpleDependent) {
DependencyGraph<uintptr_t> graph;
@@ -285,6 +314,32 @@ TEST(DependencyGraph, SimpleDependent6) {
}
TEST(DependencyGraph, SimpleDependentMember) {
DependencyGraph<uintptr_t> graph;
EXPECT_EQ(graph.loadFromString(0,
"provides-member: [[a,aa], [b,bb], [c,cc]]"),
LoadResult::UpToDate);
EXPECT_EQ(graph.loadFromString(1,
"depends-member: [[x, xx], [b,bb], [z,zz]]"),
LoadResult::UpToDate);
SmallVector<uintptr_t, 4> marked;
graph.markTransitive(marked, 0);
EXPECT_EQ(1u, marked.size());
EXPECT_EQ(1u, marked.front());
EXPECT_TRUE(graph.isMarked(0));
EXPECT_TRUE(graph.isMarked(1));
marked.clear();
graph.markTransitive(marked, 0);
EXPECT_EQ(0u, marked.size());
EXPECT_TRUE(graph.isMarked(0));
EXPECT_TRUE(graph.isMarked(1));
}
template <typename Range, typename T>
static bool contains(const Range &range, const T &value) {
return std::find(std::begin(range),std::end(range),value) != std::end(range);