RootIndex: ensure transitive dependents end up in order entries cache

This commit is contained in:
peter
2013-10-25 22:05:36 +02:00
parent 2248228fa4
commit b7f6cd2ee4
3 changed files with 28 additions and 12 deletions
@@ -159,7 +159,7 @@ public class DirectoryIndexTest extends IdeaTestCase {
PsiTestUtil.addExcludedRoot(myModule2, myExcludeDir);
ModuleRootModificationUtil.addModuleLibrary(myModule2, "lib",
singletonList(myLibClsDir.getUrl()), singletonList(myLibSrcDir.getUrl()),
Arrays.asList(myExcludedLibClsDir.getUrl(), myExcludedLibSrcDir.getUrl()), DependencyScope.COMPILE);
Arrays.asList(myExcludedLibClsDir.getUrl(), myExcludedLibSrcDir.getUrl()), DependencyScope.COMPILE, true);
}
// fill roots of module3
@@ -204,8 +204,8 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfo(myTestResDir, myModule, false, false, "", JavaResourceRootType.TEST_RESOURCE, myModule);
checkInfo(myLibDir, myModule, false, false, null, null);
checkInfo(myLibSrcDir, myModule, false, true, "", null, myModule2);
checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2);
checkInfo(myLibSrcDir, myModule, false, true, "", null, myModule2, myModule3);
checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2, myModule3);
checkInfo(myModule2Dir, myModule2, false, false, null, null);
checkInfo(mySrcDir2, myModule2, false, false, "", JavaSourceRootType.SOURCE, myModule2, myModule3);
@@ -503,9 +503,11 @@ public class DirectoryIndexTest extends IdeaTestCase {
checkInfo(myModule1Dir, myModule, true, false, "", null, myModule);
checkInfo(mySrcDir1, myModule, true, false, "", JavaSourceRootType.SOURCE, myModule);
//todo this looks strange and inconsistent: the same library classes and sources have different order entries
checkInfo(myLibDir, myModule, true, false, "lib", null, myModule);
checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2);
checkInfo(myLibSrcDir, myModule, true, true, "", null, myModule);
checkInfo(myLibClsDir, myModule, true, false, "", null, myModule2, myModule3);
checkInfo(myLibSrcDir, myModule, true, true, "", null, myModule, myModule3);
checkInfo(myResDir, myModule, true, false, "", JavaResourceRootType.RESOURCE, myModule);
}
@@ -117,8 +117,9 @@ class RootIndex {
}
}
else if (orderEntry instanceof ModuleSourceOrderEntry) {
for (VirtualFile sourceRoot : ((ModuleSourceOrderEntry)orderEntry).getRootModel().getSourceRoots()) {
depEntries.putValue(sourceRoot, orderEntry);
final VirtualFile[] sourceRoots = ((ModuleSourceOrderEntry)orderEntry).getRootModel().getSourceRoots();
for (VirtualFile sourceRoot : sourceRoots) {
fillMapWithOrderEntries(sourceRoot, Arrays.asList(orderEntry), orderEntry.getOwnerModule(), null, null);
}
}
else if (orderEntry instanceof LibraryOrSdkOrderEntry) {
@@ -164,13 +165,13 @@ class RootIndex {
// fill ordered entries
for (Map.Entry<VirtualFile, Collection<OrderEntry>> mapEntry : depEntries.entrySet()) {
fillMapWithOrderEntries(mapEntry.getKey(), mapEntry.getValue(), null, null);
fillMapWithOrderEntries(mapEntry.getKey(), mapEntry.getValue(), null, null, null);
}
for (Map.Entry<VirtualFile, Collection<OrderEntry>> mapEntry : libClassRootEntries.entrySet()) {
fillMapWithOrderEntries(mapEntry.getKey(), mapEntry.getValue(), mapEntry.getKey(), null);
fillMapWithOrderEntries(mapEntry.getKey(), mapEntry.getValue(), null, mapEntry.getKey(), null);
}
for (Map.Entry<VirtualFile, Collection<OrderEntry>> mapEntry : libSourceRootEntries.entrySet()) {
fillMapWithOrderEntries(mapEntry.getKey(), mapEntry.getValue(), null, mapEntry.getKey());
fillMapWithOrderEntries(mapEntry.getKey(), mapEntry.getValue(), null, null, mapEntry.getKey());
}
mergeWithParentInfos();
@@ -261,6 +262,7 @@ class RootIndex {
private void fillMapWithOrderEntries(final VirtualFile root,
@NotNull final Collection<OrderEntry> orderEntries,
@Nullable final Module module,
@Nullable final VirtualFile libraryClassRoot,
@Nullable final VirtualFile librarySourceRoot) {
@@ -273,7 +275,10 @@ class RootIndex {
DirectoryInfo info = myRoots.get(root);
if (info == null) return;
if (libraryClassRoot != null) {
if (module != null) {
if (info.getModule() != module) return;
if (!info.isInModuleSource()) return;
} else if (libraryClassRoot != null) {
if (info.getLibraryClassRoot() != libraryClassRoot) return;
if (info.isInModuleSource()) return;
} else if (librarySourceRoot != null) {
@@ -285,7 +290,7 @@ class RootIndex {
OrderEntry[] orderEntriesArray = orderEntries.toArray(new OrderEntry[orderEntries.size()]);
Arrays.sort(orderEntriesArray, DirectoryInfo.BY_OWNER_MODULE);
myRoots.put(root, info.withInternedEntries(orderEntriesArray));
myRoots.put(root, info.withInternedEntries(info.calcNewOrderEntries(orderEntriesArray, null, info.getOrderEntries())));
}
@NotNull
@@ -49,6 +49,14 @@ public class ModuleRootModificationUtil {
final List<String> sourceRoots,
final List<String> excludedRoots,
final DependencyScope scope) {
addModuleLibrary(module, libName, classesRoots, sourceRoots, excludedRoots, scope, false);
}
public static void addModuleLibrary(final Module module, final String libName,
final List<String> classesRoots,
final List<String> sourceRoots,
final List<String> excludedRoots,
final DependencyScope scope,
final boolean exported) {
updateModel(module, new Consumer<ModifiableRootModel>() {
@Override
public void consume(final ModifiableRootModel model) {
@@ -68,6 +76,7 @@ public class ModuleRootModificationUtil {
LibraryOrderEntry entry = model.findLibraryOrderEntry(library);
assert entry != null : library;
entry.setScope(scope);
entry.setExported(exported);
doWriteAction(new Runnable() {
@Override