From 16bc90277a9acc086f2dfd41e063bb5cd4ea5ed3 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Mon, 5 Oct 2009 18:34:29 +0400 Subject: [PATCH] if resource patterns list changes, rescan sources and mark for compilation newly found resources --- .../impl/TranslatingCompilerFilesMonitor.java | 137 +++++++++--------- .../options/CompilerUIConfigurable.java | 4 + 2 files changed, 75 insertions(+), 66 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java index 65c0c7739ce1..e86a75fcb5d9 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/TranslatingCompilerFilesMonitor.java @@ -932,6 +932,76 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } } + public void scanSourcesForCompilableFiles(final Project project) { + final int projectId = getProjectId(project); + synchronized (myInitializationLock) { + myInitInProgress.add(projectId); + myInitializationLock.notifyAll(); + } + StartupManager.getInstance(project).runWhenProjectIsInitialized(new Runnable() { + public void run() { + new Task.Backgroundable(project, CompilerBundle.message("compiler.initial.scanning.progress.text"), false) { + public void run(@NotNull final ProgressIndicator indicator) { + try { + final IntermediateOutputCompiler[] compilers = + CompilerManager.getInstance(project).getCompilers(IntermediateOutputCompiler.class); + + final Set intermediateRoots = new HashSet(); + if (compilers.length > 0) { + final Module[] modules = ModuleManager.getInstance(project).getModules(); + for (IntermediateOutputCompiler compiler : compilers) { + for (Module module : modules) { + final VirtualFile outputRoot = LocalFileSystem.getInstance().refreshAndFindFileByPath(CompilerPaths.getGenerationOutputPath(compiler, module, false)); + if (outputRoot != null) { + intermediateRoots.add(outputRoot); + } + final VirtualFile testsOutputRoot = LocalFileSystem.getInstance().refreshAndFindFileByPath(CompilerPaths.getGenerationOutputPath(compiler, module, true)); + if (testsOutputRoot != null) { + intermediateRoots.add(testsOutputRoot); + } + } + } + } + + final List projectRoots = Arrays.asList(ProjectRootManager.getInstance(project).getContentSourceRoots()); + final int totalRootsCount = projectRoots.size() + intermediateRoots.size(); + scanSourceContent(project, projectRoots, totalRootsCount, true); + + if (!intermediateRoots.isEmpty()) { + final FileProcessor processor = new FileProcessor() { + public void execute(final VirtualFile file) { + if (!isMarkedForRecompilation(projectId, getFileId(file))) { + final SourceFileInfo srcInfo = loadSourceInfo(file); + if (srcInfo == null || srcInfo.getTimestamp(projectId) != file.getTimeStamp()) { + addSourceForRecompilation(projectId, file, srcInfo); + } + } + } + }; + int processed = projectRoots.size(); + for (VirtualFile root : intermediateRoots) { + indicator.setText2(root.getPresentableUrl()); + indicator.setFraction(++processed / (double)totalRootsCount); + processRecursively(root, false, processor); + } + } + + markOldOutputRoots(project, buildOutputRootsLayout(project)); + } + finally { + synchronized (myInitializationLock) { + if (myInitInProgress.remove(projectId)) { + myInitializationLock.notifyAll(); + } + } + } + } + }.queue(); + } + }); + } + + private class MyProjectManagerListener extends ProjectManagerAdapter { final Map myConnections = new HashMap(); @@ -975,72 +1045,7 @@ public class TranslatingCompilerFilesMonitor implements ApplicationComponent { } }); - final int projectId = getProjectId(project); - synchronized (myInitializationLock) { - myInitInProgress.add(projectId); - myInitializationLock.notifyAll(); - } - StartupManager.getInstance(project).runWhenProjectIsInitialized(new Runnable() { - public void run() { - new Task.Backgroundable(project, CompilerBundle.message("compiler.initial.scanning.progress.text"), false) { - public void run(@NotNull final ProgressIndicator indicator) { - try { - final IntermediateOutputCompiler[] compilers = - CompilerManager.getInstance(project).getCompilers(IntermediateOutputCompiler.class); - - final Set intermediateRoots = new HashSet(); - if (compilers.length > 0) { - final Module[] modules = ModuleManager.getInstance(project).getModules(); - for (IntermediateOutputCompiler compiler : compilers) { - for (Module module : modules) { - final VirtualFile outputRoot = LocalFileSystem.getInstance().refreshAndFindFileByPath(CompilerPaths.getGenerationOutputPath(compiler, module, false)); - if (outputRoot != null) { - intermediateRoots.add(outputRoot); - } - final VirtualFile testsOutputRoot = LocalFileSystem.getInstance().refreshAndFindFileByPath(CompilerPaths.getGenerationOutputPath(compiler, module, true)); - if (testsOutputRoot != null) { - intermediateRoots.add(testsOutputRoot); - } - } - } - } - - final List projectRoots = Arrays.asList(ProjectRootManager.getInstance(project).getContentSourceRoots()); - final int totalRootsCount = projectRoots.size() + intermediateRoots.size(); - scanSourceContent(project, projectRoots, totalRootsCount, true); - - if (!intermediateRoots.isEmpty()) { - final FileProcessor processor = new FileProcessor() { - public void execute(final VirtualFile file) { - if (!isMarkedForRecompilation(projectId, getFileId(file))) { - final SourceFileInfo srcInfo = loadSourceInfo(file); - if (srcInfo == null || srcInfo.getTimestamp(projectId) != file.getTimeStamp()) { - addSourceForRecompilation(projectId, file, srcInfo); - } - } - } - }; - int processed = projectRoots.size(); - for (VirtualFile root : intermediateRoots) { - indicator.setText2(root.getPresentableUrl()); - indicator.setFraction(++processed / (double)totalRootsCount); - processRecursively(root, false, processor); - } - } - - markOldOutputRoots(project, buildOutputRootsLayout(project)); - } - finally { - synchronized (myInitializationLock) { - if (myInitInProgress.remove(projectId)) { - myInitializationLock.notifyAll(); - } - } - } - } - }.queue(); - } - }); + scanSourcesForCompilableFiles(project); } public void projectClosed(final Project project) { diff --git a/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java b/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java index dfdcfb4e07e7..f04af555a076 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/CompilerUIConfigurable.java @@ -4,6 +4,7 @@ import com.intellij.compiler.CompilerConfiguration; import com.intellij.compiler.CompilerConfigurationImpl; import com.intellij.compiler.CompilerWorkspaceConfiguration; import com.intellij.compiler.MalformedPatternException; +import com.intellij.compiler.impl.TranslatingCompilerFilesMonitor; import com.intellij.openapi.compiler.CompilerBundle; import com.intellij.openapi.options.Configurable; import com.intellij.openapi.options.ConfigurationException; @@ -87,6 +88,9 @@ public class CompilerUIConfigurable implements Configurable { applyResourcePatterns(extensionString, (CompilerConfigurationImpl)CompilerConfiguration.getInstance(myProject)); configuration.DEPLOY_AFTER_MAKE = getSelectedDeploymentOption(); + + // this will schedule for compilation all files that might become compilable after resource patterns' changing + TranslatingCompilerFilesMonitor.getInstance().scanSourcesForCompilableFiles(myProject); } private static void applyResourcePatterns(String extensionString, final CompilerConfigurationImpl configuration)