diff options
Diffstat (limited to 'platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java')
-rw-r--r-- | platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java | 226 |
1 files changed, 28 insertions, 198 deletions
diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java index dfff4973a5a6..87448a584a23 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/DirectoryInfo.java @@ -18,229 +18,59 @@ package com.intellij.openapi.roots.impl; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.roots.OrderRootType; -import com.intellij.openapi.roots.RootPolicy; -import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.BitUtil; -import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; -import java.util.Arrays; -import java.util.Collections; -import java.util.Comparator; import java.util.List; public abstract class DirectoryInfo { - public static final int MAX_ROOT_TYPE_ID = (1 << (Byte.SIZE - 2)) - 1; - private final Module module; // module to which content it belongs or null - private final VirtualFile libraryClassRoot; // class root in library - private final VirtualFile contentRoot; - private final VirtualFile sourceRoot; - - private static final byte MODULE_SOURCE_FLAG = 1; // set if files in this directory belongs to sources of the module (if field 'module' is not null) - private static final byte LIBRARY_SOURCE_FLAG = 2; // set if it's a directory with sources of some library - private final byte sourceRootTypeData;//two least significant bits are used for MODULE_SOURCE_FLAG and LIBRARY_SOURCE_FLAG, the remaining bits store module root type id (source/tests/resources/...) - - DirectoryInfo(Module module, - VirtualFile contentRoot, - VirtualFile sourceRoot, - VirtualFile libraryClassRoot, - byte sourceRootTypeData) { - this.module = module; - this.libraryClassRoot = libraryClassRoot; - this.contentRoot = contentRoot; - this.sourceRoot = sourceRoot; - this.sourceRootTypeData = sourceRootTypeData; - } + /** + * @return {@code true} if located under project content or library roots and not excluded or ignored + */ + public abstract boolean isInProject(); - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + /** + * @return {@code true} if located under ignored directory + */ + public abstract boolean isIgnored(); - DirectoryInfo info = (DirectoryInfo)o; + /** + * @return {@code true} if located project content, output or library root but excluded from the project + */ + public abstract boolean isExcluded(); - return sourceRootTypeData == info.sourceRootTypeData && - Comparing.equal(contentRoot, info.contentRoot) && - Comparing.equal(libraryClassRoot, info.libraryClassRoot) && - Comparing.equal(module, info.module) && - Arrays.equals(getOrderEntries(), info.getOrderEntries()) && - Comparing.equal(sourceRoot, info.sourceRoot); - } + public abstract boolean isInModuleSource(); - @Override - public int hashCode() { - int result = module != null ? module.hashCode() : 0; - result = 31 * result + (libraryClassRoot != null ? libraryClassRoot.hashCode() : 0); - result = 31 * result + (contentRoot != null ? contentRoot.hashCode() : 0); - result = 31 * result + (sourceRoot != null ? sourceRoot.hashCode() : 0); - result = 31 * result + (int)sourceRootTypeData; - return result; - } - - @SuppressWarnings({"HardCodedStringLiteral"}) - public String toString() { - return "DirectoryInfo{" + - "module=" + getModule() + - ", isInModuleSource=" + isInModuleSource() + - ", rootTypeId=" + getSourceRootTypeId() + - ", isInLibrarySource=" + isInLibrarySource() + - ", libraryClassRoot=" + getLibraryClassRoot() + - ", contentRoot=" + getContentRoot() + - ", sourceRoot=" + getSourceRoot() + - ", orderEntries=" + Arrays.toString(getOrderEntries()) + - "}"; - } - - @NotNull - public abstract OrderEntry[] getOrderEntries(); + public abstract boolean isInLibrarySource(); @Nullable - OrderEntry findOrderEntryWithOwnerModule(@NotNull Module ownerModule) { - OrderEntry[] entries = getOrderEntries(); - if (entries.length < 10) { - for (OrderEntry entry : entries) { - if (entry.getOwnerModule() == ownerModule) return entry; - } - return null; - } - int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), BY_OWNER_MODULE); - return index < 0 ? null : entries[index]; - } + public abstract VirtualFile getSourceRoot(); - @NotNull - List<OrderEntry> findAllOrderEntriesWithOwnerModule(@NotNull Module ownerModule) { - OrderEntry[] entries = getOrderEntries(); - if (entries.length == 1) { - OrderEntry entry = entries[0]; - return entry.getOwnerModule() == ownerModule ? Arrays.asList(entries) : Collections.<OrderEntry>emptyList(); - } - int index = Arrays.binarySearch(entries, createFakeOrderEntry(ownerModule), BY_OWNER_MODULE); - if (index < 0) { - return Collections.emptyList(); - } - int firstIndex = index; - while (firstIndex-1 >= 0 && entries[firstIndex-1].getOwnerModule() == ownerModule) { - firstIndex--; - } - int lastIndex = index+1; - while (lastIndex < entries.length && entries[lastIndex].getOwnerModule() == ownerModule) { - lastIndex++; - } - - OrderEntry[] subArray = new OrderEntry[lastIndex - firstIndex]; - System.arraycopy(entries, firstIndex, subArray, 0, lastIndex - firstIndex); - - return Arrays.asList(subArray); - } + public abstract int getSourceRootTypeId(); - @NotNull - private static OrderEntry createFakeOrderEntry(@NotNull final Module ownerModule) { - return new OrderEntry() { - @NotNull - @Override - public VirtualFile[] getFiles(OrderRootType type) { - throw new IncorrectOperationException(); - } - - @NotNull - @Override - public String[] getUrls(OrderRootType rootType) { - throw new IncorrectOperationException(); - } - - @NotNull - @Override - public String getPresentableName() { - throw new IncorrectOperationException(); - } - - @Override - public boolean isValid() { - throw new IncorrectOperationException(); - } - - @NotNull - @Override - public Module getOwnerModule() { - return ownerModule; - } - - @Override - public <R> R accept(RootPolicy<R> policy, @Nullable R initialValue) { - throw new IncorrectOperationException(); - } - - @Override - public int compareTo(@NotNull OrderEntry o) { - throw new IncorrectOperationException(); - } - - @Override - public boolean isSynthetic() { - throw new IncorrectOperationException(); - } - }; + public boolean hasLibraryClassRoot() { + return getLibraryClassRoot() != null; } - public static final Comparator<OrderEntry> BY_OWNER_MODULE = new Comparator<OrderEntry>() { - @Override - public int compare(OrderEntry o1, OrderEntry o2) { - String name1 = o1.getOwnerModule().getName(); - String name2 = o2.getOwnerModule().getName(); - return name1.compareTo(name2); - } - }; + public abstract VirtualFile getLibraryClassRoot(); @Nullable - public VirtualFile getSourceRoot() { - return sourceRoot; - } - - public VirtualFile getLibraryClassRoot() { - return libraryClassRoot; - } - - public boolean hasLibraryClassRoot() { - return getLibraryClassRoot() != null; - } + public abstract VirtualFile getContentRoot(); @Nullable - public VirtualFile getContentRoot() { - return contentRoot; - } + public abstract Module getModule(); - public boolean isInModuleSource() { - return BitUtil.isSet(sourceRootTypeData, MODULE_SOURCE_FLAG); - } + @NotNull + public abstract OrderEntry[] getOrderEntries(); - public boolean isInLibrarySource() { - return BitUtil.isSet(sourceRootTypeData, LIBRARY_SOURCE_FLAG); - } + @Nullable + abstract OrderEntry findOrderEntryWithOwnerModule(@NotNull Module ownerModule); - public Module getModule() { - return module; - } + @NotNull + abstract List<OrderEntry> findAllOrderEntriesWithOwnerModule(@NotNull Module ownerModule); @TestOnly - void assertConsistency() { - OrderEntry[] entries = getOrderEntries(); - for (int i=1; i<entries.length; i++) { - assert BY_OWNER_MODULE.compare(entries[i-1], entries[i]) <= 0; - } - } - - public int getSourceRootTypeId() { - return sourceRootTypeData >> 2; - } - - public static int createSourceRootTypeData(boolean isInModuleSources, boolean isInLibrarySource, int moduleSourceRootTypeId) { - if (moduleSourceRootTypeId > MAX_ROOT_TYPE_ID) { - throw new IllegalArgumentException("Module source root type id " + moduleSourceRootTypeId + " exceeds the maximum allowable value (" + MAX_ROOT_TYPE_ID + ")"); - } - return (isInModuleSources ? MODULE_SOURCE_FLAG : 0) | (isInLibrarySource ? LIBRARY_SOURCE_FLAG : 0) | moduleSourceRootTypeId << 2; - } + abstract void assertConsistency(); } |