diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java index 7d3c535fcd9b..23f00c23ff45 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/JavaContentEntryEditor.java @@ -19,8 +19,6 @@ import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.ContentEntry; import com.intellij.openapi.roots.ExcludeFolder; import com.intellij.openapi.roots.SourceFolder; -import com.intellij.openapi.util.io.FileUtil; -import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -55,7 +53,7 @@ public abstract class JavaContentEntryEditor extends ContentEntryEditor { @Override protected ExcludeFolder doAddExcludeFolder(@NotNull final VirtualFile file) { - final boolean isCompilerOutput = isCompilerOutput(file); + final boolean isCompilerOutput = isCompilerOutput(file.getUrl()); if (isCompilerOutput) { myCompilerExtension.setExcludeOutput(true); return null; @@ -64,32 +62,26 @@ public abstract class JavaContentEntryEditor extends ContentEntryEditor { } @Override - protected void doRemoveExcludeFolder(@NotNull final ExcludeFolder excludeFolder) { - final VirtualFile file = excludeFolder.getFile(); - if (file != null) { - if (isCompilerOutput(file)) { - myCompilerExtension.setExcludeOutput(false); - } + protected void doRemoveExcludeFolder(@NotNull final String excludeRootUrl) { + if (isCompilerOutput(excludeRootUrl)) { + myCompilerExtension.setExcludeOutput(false); } - super.doRemoveExcludeFolder(excludeFolder); + super.doRemoveExcludeFolder(excludeRootUrl); } - private boolean isCompilerOutput(@NotNull final VirtualFile file) { - final VirtualFile compilerOutputPath = myCompilerExtension.getCompilerOutputPath(); - if (file.equals(compilerOutputPath)) { + private boolean isCompilerOutput(@NotNull final String fileUrl) { + if (fileUrl.equals(myCompilerExtension.getCompilerOutputUrl())) { return true; } - final VirtualFile compilerOutputPathForTests = myCompilerExtension.getCompilerOutputPathForTests(); - if (file.equals(compilerOutputPathForTests)) { + if (fileUrl.equals(myCompilerExtension.getCompilerOutputUrlForTests())) { return true; } - final String path = file.getPath(); if (myCompilerExtension.isCompilerOutputPathInherited()) { final ProjectStructureConfigurable instance = ProjectStructureConfigurable.getInstance(getModel().getModule().getProject()); - final String compilerOutput = VfsUtil.urlToPath(instance.getProjectConfig().getCompilerOutputUrl()); - if (FileUtil.pathsEqual(compilerOutput, path)) { + final String compilerOutputUrl = instance.getProjectConfig().getCompilerOutputUrl(); + if (fileUrl.equals(compilerOutputUrl)) { return true; } } diff --git a/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java b/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java index f880d36a6b19..adbacfcd38ce 100644 --- a/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java +++ b/java/java-impl/src/com/intellij/openapi/roots/impl/ExcludeCompilerOutputPolicy.java @@ -25,6 +25,7 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.openapi.util.io.FileUtil; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -78,14 +79,12 @@ public class ExcludeCompilerOutputPolicy implements DirectoryIndexExcludePolicy return VirtualFilePointer.EMPTY_ARRAY; } if (extension.isCompilerOutputPathInherited()) { - result.add(CompilerProjectExtension.getInstance(myProject).getCompilerOutputPointer()); + ContainerUtil.addIfNotNull(result, CompilerProjectExtension.getInstance(myProject).getCompilerOutputPointer()); } else { if (!extension.isExcludeOutput()) return VirtualFilePointer.EMPTY_ARRAY; - final VirtualFilePointer outputPath = extension.getCompilerOutputPointer(); - if (outputPath != null) result.add(outputPath); - final VirtualFilePointer outputPathForTests = extension.getCompilerOutputForTestsPointer(); - if (outputPathForTests != null) result.add(outputPathForTests); + ContainerUtil.addIfNotNull(result, extension.getCompilerOutputPointer()); + ContainerUtil.addIfNotNull(result, extension.getCompilerOutputForTestsPointer()); } return result.isEmpty() ? VirtualFilePointer.EMPTY_ARRAY : result.toArray(new VirtualFilePointer[result.size()]); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java index d9eec89d63f2..a90b068cd3d8 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java @@ -129,8 +129,8 @@ public class ContentRootDataService implements ProjectDataService excludeFolders = ContainerUtilRt.newArrayList(entry.getExcludeFolders()); for(final ExcludeFolder excludeFolder : excludeFolders) { final String path = VirtualFileManager.extractPath(excludeFolder.getUrl()); - if(!(excludeFolder instanceof ExcludedOutputFolder) && !retainedContentFolders.contains(path)) { - entry.removeExcludeFolder(excludeFolder); + if (!retainedContentFolders.contains(path)) { + entry.removeExcludeFolder(excludeFolder); } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java index ffaae86f11d6..0ce56f9172c0 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/DirectoryIndexImpl.java @@ -1429,20 +1429,20 @@ public class DirectoryIndexImpl extends DirectoryIndex { VirtualFile contentRoot = contentEntry.getFile(); if (!(contentRoot instanceof NewVirtualFile)) continue; - ExcludeFolder[] excludeRoots = contentEntry.getExcludeFolders(); - for (ExcludeFolder excludeRoot : excludeRoots) { + for (VirtualFile excludeRoot : contentEntry.getExcludeFolderFiles()) { // Output paths should be excluded (if marked as such) regardless if they're under corresponding module's content root - VirtualFile excludeRootFile = excludeRoot.getFile(); - if (excludeRootFile instanceof NewVirtualFile) { + if (excludeRoot instanceof NewVirtualFile) { if (!FileUtil.startsWith(contentRoot.getUrl(), excludeRoot.getUrl())) { - if (isExcludeRootForModule(module, excludeRootFile)) { - putForFileAndAllAncestors((NewVirtualFile)excludeRootFile, excludeRoot.getUrl()); + if (isExcludeRootForModule(module, excludeRoot)) { + putForFileAndAllAncestors((NewVirtualFile)excludeRoot, excludeRoot.getUrl()); } - myProjectExcludeRoots.add(((NewVirtualFile)excludeRootFile).getId()); + myProjectExcludeRoots.add(((NewVirtualFile)excludeRoot).getId()); } } - putForFileAndAllAncestors((NewVirtualFile)contentRoot, excludeRoot.getUrl()); + } + for (String url : contentEntry.getExcludeFolderUrls()) { + putForFileAndAllAncestors((NewVirtualFile)contentRoot, url); } } } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java b/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java index 31a2cbd3e918..ceed40285cbe 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/impl/RootIndex.java @@ -72,12 +72,7 @@ class RootIndex { for (ContentEntry contentEntry : contentEntries) { // Init excluded roots - for (ExcludeFolder excludeRoot : contentEntry.getExcludeFolders()) { - final VirtualFile excludeRootFile = excludeRoot.getFile(); - if (excludeRootFile != null) { - myProjectExcludedRoots.add(excludeRootFile); - } - } + Collections.addAll(myProjectExcludedRoots, contentEntry.getExcludeFolderFiles()); // Init module sources SourceFolder[] sourceFolders = contentEntry.getSourceFolders(); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java index adb11273b870..dda1790e4fe6 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditor.java @@ -57,7 +57,7 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb void sourceFolderAdded(@NotNull ContentEntryEditor editor, SourceFolder folder); void sourceFolderRemoved(@NotNull ContentEntryEditor editor, VirtualFile file); void folderExcluded(@NotNull ContentEntryEditor editor, VirtualFile file); - void folderIncluded(@NotNull ContentEntryEditor editor, VirtualFile file); + void folderIncluded(@NotNull ContentEntryEditor editor, String fileUrl); void navigationRequested(@NotNull ContentEntryEditor editor, VirtualFile file); void sourceRootPropertiesChanged(@NotNull ContentEntryEditor editor, @NotNull SourceFolder folder); } @@ -138,7 +138,7 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb update(); } else if (folder instanceof ExcludeFolder) { - removeExcludeFolder((ExcludeFolder)folder); + removeExcludeFolder(folder.getUrl()); update(); } @@ -261,20 +261,20 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb return contentEntry != null ? contentEntry.addExcludeFolder(file) : null; } - public void removeExcludeFolder(@NotNull final ExcludeFolder excludeFolder) { + public void removeExcludeFolder(@NotNull final String excludeRootUrl) { try { - doRemoveExcludeFolder(excludeFolder); + doRemoveExcludeFolder(excludeRootUrl); } finally { - myEventDispatcher.getMulticaster().folderIncluded(this, excludeFolder.getFile()); + myEventDispatcher.getMulticaster().folderIncluded(this, excludeRootUrl); update(); } } - protected void doRemoveExcludeFolder(@NotNull final ExcludeFolder excludeFolder) { - if (!excludeFolder.isSynthetic()) { - final ContentEntry contentEntry = getContentEntry(); - if (contentEntry != null) contentEntry.removeExcludeFolder(excludeFolder); + protected void doRemoveExcludeFolder(@NotNull final String excludeRootUrl) { + final ContentEntry contentEntry = getContentEntry(); + if (contentEntry != null) { + contentEntry.removeExcludeFolder(excludeRootUrl); } } @@ -284,41 +284,19 @@ public abstract class ContentEntryEditor implements ContentRootPanel.ActionCallb return folder != null ? folder.getRootType() : null; } - public boolean isExcluded(@NotNull final VirtualFile file) { - return getExcludeFolder(file) != null; - } - - public boolean isUnderExcludedDirectory(@NotNull final VirtualFile file) { + public boolean isExcludedOrUnderExcludedDirectory(@NotNull final VirtualFile file) { final ContentEntry contentEntry = getContentEntry(); if (contentEntry == null) { return false; } for (VirtualFile excludedDir : contentEntry.getExcludeFolderFiles()) { - if (VfsUtilCore.isAncestor(excludedDir, file, true)) { + if (VfsUtilCore.isAncestor(excludedDir, file, false)) { return true; } } return false; } - @Nullable - public ExcludeFolder getExcludeFolder(@NotNull final VirtualFile file) { - final ContentEntry contentEntry = getContentEntry(); - if (contentEntry == null) { - return null; - } - for (final ExcludeFolder excludeFolder : contentEntry.getExcludeFolders()) { - final VirtualFile f = excludeFolder.getFile(); - if (f == null) { - continue; - } - if (f.equals(file)) { - return excludeFolder; - } - } - return null; - } - @Nullable public SourceFolder getSourceFolder(@NotNull final VirtualFile file) { final ContentEntry contentEntry = getContentEntry(); diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditorListenerAdapter.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditorListenerAdapter.java index 2b4b9b98c0d2..5ddcdc57a7fb 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditorListenerAdapter.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryEditorListenerAdapter.java @@ -47,7 +47,7 @@ public class ContentEntryEditorListenerAdapter implements ContentEntryEditor.Con } @Override - public void folderIncluded(@NotNull ContentEntryEditor editor, VirtualFile file) { + public void folderIncluded(@NotNull ContentEntryEditor editor, String fileUrl) { } @Override diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryTreeEditor.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryTreeEditor.java index 9a3cddabfad1..76dc610f88aa 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryTreeEditor.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentEntryTreeEditor.java @@ -264,7 +264,7 @@ public class ContentEntryTreeEditor { } @Override - public void folderIncluded(@NotNull ContentEntryEditor editor, VirtualFile file) { + public void folderIncluded(@NotNull ContentEntryEditor editor, String fileUrl) { update(); } diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java index 561dae206abb..ad21db81d8a3 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/ContentRootPanel.java @@ -100,7 +100,6 @@ public abstract class ContentRootPanel extends JPanel { } protected void addFolderGroupComponents() { - final List excluded = new ArrayList(); final SourceFolder[] sourceFolders = getContentEntry().getSourceFolders(); MultiMap, SourceFolder> folderByType = new MultiMap, SourceFolder>(); for (SourceFolder folder : sourceFolders) { @@ -108,18 +107,12 @@ public abstract class ContentRootPanel extends JPanel { continue; } final VirtualFile folderFile = folder.getFile(); - if (folderFile != null && (isExcluded(folderFile) || isUnderExcludedDirectory(folderFile))) { + if (folderFile != null && isExcludedOrUnderExcludedDirectory(folderFile)) { continue; } folderByType.putValue(folder.getRootType(), folder); } - for (final ExcludeFolder excludeFolder : getContentEntry().getExcludeFolders()) { - if (!excludeFolder.isSynthetic()) { - excluded.add(excludeFolder); - } - } - Insets insets = new Insets(0, 0, 10, 0); GridBagConstraints constraints = new GridBagConstraints(0, GridBagConstraints.RELATIVE, 1, 1, 1.0, 0.0, GridBagConstraints.NORTH, GridBagConstraints.HORIZONTAL, insets, 0, 0); for (ModuleSourceRootEditHandler editor : myModuleSourceRootEditHandlers) { @@ -127,13 +120,15 @@ public abstract class ContentRootPanel extends JPanel { if (folders.isEmpty()) continue; ContentFolder[] foldersArray = folders.toArray(new ContentFolder[folders.size()]); - final JComponent sourcesComponent = createFolderGroupComponent(editor.getRootsGroupTitle(), foldersArray, editor.getRootsGroupColor(), editor); + final JComponent sourcesComponent = createFolderGroupComponent(editor.getRootsGroupTitle(), foldersArray, editor.getRootsGroupColor(), + editor); add(sourcesComponent, constraints); } - if (!excluded.isEmpty()) { - final JComponent excludedComponent = createFolderGroupComponent(ProjectBundle.message("module.paths.excluded.group"), excluded.toArray(new ContentFolder[excluded.size()]), EXCLUDED_COLOR, - null); + ExcludeFolder[] excluded = getContentEntry().getExcludeFolders(); + if (excluded.length > 0) { + final JComponent excludedComponent = createFolderGroupComponent(ProjectBundle.message("module.paths.excluded.group"), excluded, + EXCLUDED_COLOR, null); this.add(excludedComponent, constraints); } } @@ -262,41 +257,19 @@ public abstract class ContentRootPanel extends JPanel { }); } - public boolean isExcluded(VirtualFile file) { - return getExcludeFolder(file) != null; - } - - public boolean isUnderExcludedDirectory(final VirtualFile file) { + public boolean isExcludedOrUnderExcludedDirectory(final VirtualFile file) { final ContentEntry contentEntry = getContentEntry(); if (contentEntry == null) { return false; } for (VirtualFile excludedDir : contentEntry.getExcludeFolderFiles()) { - if (VfsUtilCore.isAncestor(excludedDir, file, true)) { + if (VfsUtilCore.isAncestor(excludedDir, file, false)) { return true; } } return false; } - @Nullable - public ExcludeFolder getExcludeFolder(VirtualFile file) { - final ContentEntry contentEntry = getContentEntry(); - if (contentEntry == null) { - return null; - } - for (final ExcludeFolder excludeFolder : contentEntry.getExcludeFolders()) { - final VirtualFile f = excludeFolder.getFile(); - if (f == null) { - continue; - } - if (f.equals(file)) { - return excludeFolder; - } - } - return null; - } - protected static String toRelativeDisplayPath(String url, String ancestorUrl) { if (!StringUtil.endsWithChar(ancestorUrl, '/')) { ancestorUrl += "/"; diff --git a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/actions/ToggleExcludedStateAction.java b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/actions/ToggleExcludedStateAction.java index 82bd90e7cec1..d165443a911a 100644 --- a/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/actions/ToggleExcludedStateAction.java +++ b/platform/lang-impl/src/com/intellij/openapi/roots/ui/configuration/actions/ToggleExcludedStateAction.java @@ -20,7 +20,6 @@ import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.Presentation; import com.intellij.openapi.project.ProjectBundle; -import com.intellij.openapi.roots.ExcludeFolder; import com.intellij.openapi.roots.ui.configuration.ContentEntryEditor; import com.intellij.openapi.roots.ui.configuration.ContentEntryTreeEditor; import com.intellij.openapi.vfs.VirtualFile; @@ -48,8 +47,7 @@ public class ToggleExcludedStateAction extends ContentEntryEditingAction { final VirtualFile[] selectedFiles = getSelectedFiles(); if (selectedFiles.length == 0) return false; - final ContentEntryEditor editor = myEntryTreeEditor.getContentEntryEditor(); - return editor.isExcluded(selectedFiles[0]) || editor.isUnderExcludedDirectory(selectedFiles[0]); + return myEntryTreeEditor.getContentEntryEditor().isExcludedOrUnderExcludedDirectory(selectedFiles[0]); } @Override @@ -57,17 +55,15 @@ public class ToggleExcludedStateAction extends ContentEntryEditingAction { final VirtualFile[] selectedFiles = getSelectedFiles(); assert selectedFiles.length != 0; + ContentEntryEditor contentEntryEditor = myEntryTreeEditor.getContentEntryEditor(); for (VirtualFile selectedFile : selectedFiles) { - final ExcludeFolder excludeFolder = myEntryTreeEditor.getContentEntryEditor().getExcludeFolder(selectedFile); if (isSelected) { - if (excludeFolder == null) { // not excluded yet - myEntryTreeEditor.getContentEntryEditor().addExcludeFolder(selectedFile); + if (!contentEntryEditor.isExcludedOrUnderExcludedDirectory(selectedFile)) { // not excluded yet + contentEntryEditor.addExcludeFolder(selectedFile); } } else { - if (excludeFolder != null) { - myEntryTreeEditor.getContentEntryEditor().removeExcludeFolder(excludeFolder); - } + contentEntryEditor.removeExcludeFolder(selectedFile.getUrl()); } } } diff --git a/platform/projectModel-api/src/com/intellij/openapi/roots/ContentEntry.java b/platform/projectModel-api/src/com/intellij/openapi/roots/ContentEntry.java index 5b607556eb54..9adf1d599abd 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/roots/ContentEntry.java +++ b/platform/projectModel-api/src/com/intellij/openapi/roots/ContentEntry.java @@ -84,17 +84,23 @@ public interface ContentEntry extends Synthetic { VirtualFile[] getSourceFolderFiles(); /** - * Returns the list of excluded roots under this content root. + * Returns the list of excluded roots configured under this content root. The result doesn't include synthetic excludes like the module output. * * @return list of this ContentEntry {@link com.intellij.openapi.roots.ExcludeFolder}s */ @NotNull ExcludeFolder[] getExcludeFolders(); + /** + * @return list of URLs for all excluded roots under this content root including synthetic excludes like the module output + */ + @NotNull + List getExcludeFolderUrls(); + /** * Returns the list of directories for valid excluded roots under this content root. * - * @return list of all valid exclude roots. + * @return list of all valid exclude roots including synthetic excludes like the module output */ @NotNull VirtualFile[] getExcludeFolderFiles(); diff --git a/platform/projectModel-api/src/com/intellij/openapi/roots/ExcludedOutputFolder.java b/platform/projectModel-api/src/com/intellij/openapi/roots/ExcludedOutputFolder.java index a78e0f6efdd3..9b189251430e 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/roots/ExcludedOutputFolder.java +++ b/platform/projectModel-api/src/com/intellij/openapi/roots/ExcludedOutputFolder.java @@ -17,6 +17,9 @@ package com.intellij.openapi.roots; /** * @author dsl + * + * @deprecated {@link ContentEntry#getExcludeFolders()} don't return synthetic entries for excluded outputs any more. + * Use {@link ContentEntry#getExcludeFolderFiles()} to get all excluded roots */ public interface ExcludedOutputFolder extends ExcludeFolder { } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ContentEntryImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ContentEntryImpl.java index 8e3b9bed8d75..6d2837475607 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ContentEntryImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ContentEntryImpl.java @@ -33,10 +33,10 @@ import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; import com.intellij.util.ArrayUtil; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import org.jdom.Element; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.JpsElementFactory; import org.jetbrains.jps.model.java.JavaSourceRootType; @@ -149,35 +149,35 @@ public class ContentEntryImpl extends RootModelComponentBase implements ContentE @Override public ExcludeFolder[] getExcludeFolders() { //assert !isDisposed(); - final ArrayList result = new ArrayList(myExcludeFolders); - for (DirectoryIndexExcludePolicy excludePolicy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, getRootModel().getProject())) { - final VirtualFilePointer[] files = excludePolicy.getExcludeRootsForModule(getRootModel()); - for (VirtualFilePointer file : files) { - addExcludeForOutputPath(file, result); - } - } - return result.toArray(new ExcludeFolder[result.size()]); + return myExcludeFolders.toArray(new ExcludeFolder[myExcludeFolders.size()]); } - private void addExcludeForOutputPath(@Nullable final VirtualFilePointer outputPath, @NotNull ArrayList result) { - if (outputPath == null) return; - final VirtualFile outputPathFile = outputPath.getFile(); - final VirtualFile file = myRoot.getFile(); - if (outputPathFile != null && file != null /* TODO: ??? && VfsUtil.isAncestor(file, outputPathFile, false) */) { - result.add(new ExcludedOutputFolderImpl(this, outputPath)); + @NotNull + @Override + public List getExcludeFolderUrls() { + List excluded = new ArrayList(); + for (ExcludeFolder folder : myExcludeFolders) { + excluded.add(folder.getUrl()); } + for (DirectoryIndexExcludePolicy excludePolicy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, getRootModel().getProject())) { + for (VirtualFilePointer pointer : excludePolicy.getExcludeRootsForModule(getRootModel())) { + excluded.add(pointer.getUrl()); + } + } + return excluded; } @Override @NotNull public VirtualFile[] getExcludeFolderFiles() { assert !isDisposed(); - final ExcludeFolder[] excludeFolders = getExcludeFolders(); ArrayList result = new ArrayList(); - for (ExcludeFolder excludeFolder : excludeFolders) { - final VirtualFile file = excludeFolder.getFile(); - if (file != null) { - result.add(file); + for (ExcludeFolder excludeFolder : getExcludeFolders()) { + ContainerUtil.addIfNotNull(result, excludeFolder.getFile()); + } + for (DirectoryIndexExcludePolicy excludePolicy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, getRootModel().getProject())) { + for (VirtualFilePointer pointer : excludePolicy.getExcludeRootsForModule(getRootModel())) { + ContainerUtil.addIfNotNull(result, pointer.getFile()); } } return VfsUtilCore.toVirtualFileArray(result); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ExcludedOutputFolderImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ExcludedOutputFolderImpl.java deleted file mode 100644 index 4ca36a43df33..000000000000 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/ExcludedOutputFolderImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright 2000-2009 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.intellij.openapi.roots.impl; - -import com.intellij.openapi.roots.ContentEntry; -import com.intellij.openapi.roots.ContentFolder; -import com.intellij.openapi.roots.ExcludedOutputFolder; -import com.intellij.openapi.vfs.pointers.VirtualFilePointer; -import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; - -/** - * @author dsl - */ -public class ExcludedOutputFolderImpl extends ContentFolderBaseImpl implements ExcludedOutputFolder, ClonableContentFolder { - ExcludedOutputFolderImpl(ContentEntryImpl contentEntry, VirtualFilePointer outputPath) { - super(outputPath, contentEntry); - } - - @Override - public boolean isSynthetic() { - return true; - } - - @Override - public ContentFolder cloneFolder(final ContentEntry contentEntry) { - return new ExcludedOutputFolderImpl((ContentEntryImpl)contentEntry, VirtualFilePointerManager.getInstance().create(getUrl(), getRootModel().getModule(), null)); - } - - @Override - public int compareTo(ContentFolderBaseImpl folder) { - if (!(folder instanceof ExcludedOutputFolderImpl)) return -1; - return super.compareTo(folder); - } -} diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelBase.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelBase.java index e74a1bb9c420..106cb6016028 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelBase.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/impl/RootModelBase.java @@ -64,10 +64,7 @@ public abstract class RootModelBase implements ModuleRootModel { public String[] getExcludeRootUrls() { final List result = new SmartList(); for (ContentEntry contentEntry : getContent()) { - final ExcludeFolder[] excludeFolders = contentEntry.getExcludeFolders(); - for (ExcludeFolder excludeFolder : excludeFolders) { - result.add(excludeFolder.getUrl()); - } + result.addAll(contentEntry.getExcludeFolderUrls()); } return ArrayUtil.toStringArray(result); } @@ -77,13 +74,7 @@ public abstract class RootModelBase implements ModuleRootModel { public VirtualFile[] getExcludeRoots() { final List result = new SmartList(); for (ContentEntry contentEntry : getContent()) { - final ExcludeFolder[] excludeFolders = contentEntry.getExcludeFolders(); - for (ExcludeFolder excludeFolder : excludeFolders) { - final VirtualFile file = excludeFolder.getFile(); - if (file != null) { - result.add(file); - } - } + Collections.addAll(result, contentEntry.getExcludeFolderFiles()); } return VfsUtilCore.toVirtualFileArray(result); } diff --git a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java index f8d3750a2cb1..84ab4ffc247e 100644 --- a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java +++ b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsContentEntry.java @@ -30,8 +30,8 @@ import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.openapi.vfs.pointers.VirtualFilePointerManager; import com.intellij.project.model.impl.module.JpsRootModel; import com.intellij.util.SmartList; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.model.JpsElement; import org.jetbrains.jps.model.java.JavaSourceRootProperties; import org.jetbrains.jps.model.java.JavaSourceRootType; @@ -129,33 +129,38 @@ public class JpsContentEntry implements ContentEntry, Disposable { @NotNull @Override public ExcludeFolder[] getExcludeFolders() { - final ArrayList result = new ArrayList(myExcludeFolders); - for (DirectoryIndexExcludePolicy excludePolicy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, - myRootModel.getProject())) { - final VirtualFilePointer[] files = excludePolicy.getExcludeRootsForModule(myRootModel); - for (VirtualFilePointer file : files) { - addExcludeForOutputPath(file, result); - } - } - if (myRootModel.isExcludeExplodedDirectory()) { - addExcludeForOutputPath(myRootModel.myExplodedDirectoryPointer, result); - } - return result.toArray(new ExcludeFolder[result.size()]); + return myExcludeFolders.toArray(new ExcludeFolder[myExcludeFolders.size()]); } - private void addExcludeForOutputPath(@Nullable final VirtualFilePointer outputPath, @NotNull ArrayList result) { - if (outputPath == null) return; - final VirtualFile outputPathFile = outputPath.getFile(); - final VirtualFile file = myRoot.getFile(); - if (outputPathFile != null && file != null && VfsUtilCore.isAncestor(file, outputPathFile, false)) { - result.add(new JpsExcludeOutputFolder(outputPath.getUrl(), this)); + @NotNull + @Override + public List getExcludeFolderUrls() { + List excluded = new ArrayList(); + for (JpsExcludeFolder folder : myExcludeFolders) { + excluded.add(folder.getUrl()); } + for (DirectoryIndexExcludePolicy excludePolicy : Extensions + .getExtensions(DirectoryIndexExcludePolicy.EP_NAME, myRootModel.getProject())) { + for (VirtualFilePointer pointer : excludePolicy.getExcludeRootsForModule(myRootModel)) { + excluded.add(pointer.getUrl()); + } + } + return excluded; } @NotNull @Override public VirtualFile[] getExcludeFolderFiles() { - return getFiles(getExcludeFolders()); + List excluded = new ArrayList(); + for (JpsExcludeFolder folder : myExcludeFolders) { + ContainerUtil.addIfNotNull(excluded, folder.getFile()); + } + for (DirectoryIndexExcludePolicy excludePolicy : Extensions.getExtensions(DirectoryIndexExcludePolicy.EP_NAME, myRootModel.getProject())) { + for (VirtualFilePointer pointer : excludePolicy.getExcludeRootsForModule(myRootModel)) { + ContainerUtil.addIfNotNull(excluded, pointer.getFile()); + } + } + return VfsUtilCore.toVirtualFileArray(excluded); } @NotNull diff --git a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsExcludeOutputFolder.java b/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsExcludeOutputFolder.java deleted file mode 100644 index 262c413fd4cc..000000000000 --- a/platform/projectModel-impl/src/com/intellij/project/model/impl/module/content/JpsExcludeOutputFolder.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2000-2012 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.project.model.impl.module.content; - -import com.intellij.openapi.roots.ExcludedOutputFolder; - -/** - * @author nik - */ -public class JpsExcludeOutputFolder extends JpsContentFolderBase implements ExcludedOutputFolder { - public JpsExcludeOutputFolder(String url, JpsContentEntry contentEntry) { - super(url, contentEntry); - } - - @Override - public boolean isSynthetic() { - return true; - } -} diff --git a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java index ce03200ad98d..865d7c2a66c9 100644 --- a/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java +++ b/plugins/eclipse/src/org/jetbrains/idea/eclipse/conversion/IdeaSpecificSettings.java @@ -22,7 +22,6 @@ package org.jetbrains.idea.eclipse.conversion; import com.intellij.openapi.components.PathMacroManager; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.extensions.Extensions; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.module.ModuleUtilCore; @@ -30,8 +29,6 @@ import com.intellij.openapi.project.Project; import com.intellij.openapi.projectRoots.ProjectJdkTable; import com.intellij.openapi.projectRoots.Sdk; import com.intellij.openapi.roots.*; -import com.intellij.openapi.roots.impl.DirectoryIndexExcludePolicy; -import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; import com.intellij.openapi.util.Comparing; @@ -43,7 +40,6 @@ import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; -import com.intellij.openapi.vfs.pointers.VirtualFilePointer; import com.intellij.pom.java.LanguageLevel; import org.jdom.Element; import org.jdom.JDOMException; @@ -310,17 +306,9 @@ public class IdeaSpecificSettings extends AbstractIdeaSpecificSettings