From 96e777e996fd287c8372ab66feb5ce22c5ad3c9d Mon Sep 17 00:00:00 2001 From: nik Date: Thu, 24 Jan 2013 10:47:51 +0400 Subject: [PATCH] external build: accept only compilable files by file filter for ModuleBuildTarget --- .../java/JavaSourceRootDescriptor.java | 4 ++- .../jps/incremental/BuilderRegistry.java | 33 +++++++++++++++++++ .../jps/incremental/ModuleLevelBuilder.java | 10 ++++++ .../ClassProcessingBuilder.java | 7 ++++ .../jps/incremental/java/JavaBuilder.java | 12 +++++-- .../jps/incremental/groovy/GroovyBuilder.java | 9 ++++- .../compiler/FormsBindingManager.java | 10 +++--- .../jps/uiDesigner/compiler/FormsBuilder.java | 8 ++--- .../compiler/FormsInstrumenter.java | 5 +++ 9 files changed, 85 insertions(+), 13 deletions(-) diff --git a/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java b/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java index 9b234d5d0f41..6964b09c14e1 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java +++ b/jps/jps-builders/src/org/jetbrains/jps/builders/java/JavaSourceRootDescriptor.java @@ -18,6 +18,7 @@ package org.jetbrains.jps.builders.java; import com.intellij.openapi.util.io.FileUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.builders.BuildRootDescriptor; +import org.jetbrains.jps.incremental.BuilderRegistry; import org.jetbrains.jps.incremental.ModuleBuildTarget; import org.jetbrains.jps.model.java.JpsJavaExtensionService; import org.jetbrains.jps.model.java.compiler.JpsCompilerExcludes; @@ -93,10 +94,11 @@ public class JavaSourceRootDescriptor extends BuildRootDescriptor { @Override public FileFilter createFileFilter() { final JpsCompilerExcludes excludes = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(target.getModule().getProject()).getCompilerExcludes(); + final FileFilter baseFilter = BuilderRegistry.getInstance().getModuleBuilderFileFilter(); return new FileFilter() { @Override public boolean accept(File file) { - return !excludes.isExcluded(file); + return baseFilter.accept(file) && !excludes.isExcluded(file); } }; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java index 218a1013bcf2..7b2436ee58ac 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/BuilderRegistry.java @@ -16,10 +16,16 @@ package org.jetbrains.jps.incremental; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.util.io.FileUtil; +import com.intellij.openapi.util.io.FileUtilRt; +import gnu.trove.THashSet; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jps.builders.BuildTargetType; import org.jetbrains.jps.service.JpsServiceManager; +import java.io.File; +import java.io.FileFilter; import java.util.*; /** @@ -34,6 +40,7 @@ public class BuilderRegistry { private final Map> myModuleLevelBuilders = new HashMap>(); private final List> myTargetBuilders = new ArrayList>(); private final Map> myTargetTypes = new LinkedHashMap>(); + private final FileFilter myModuleBuilderFileFilter; public static BuilderRegistry getInstance() { return Holder.ourInstance; @@ -44,10 +51,19 @@ public class BuilderRegistry { myModuleLevelBuilders.put(category, new ArrayList()); } + Set compilableFileExtensions = new THashSet(FileUtil.PATH_HASHING_STRATEGY); for (BuilderService service : JpsServiceManager.getInstance().getExtensions(BuilderService.class)) { myTargetBuilders.addAll(service.createBuilders()); final List moduleLevelBuilders = service.createModuleLevelBuilders(); for (ModuleLevelBuilder builder : moduleLevelBuilders) { + List extensions = builder.getCompilableFileExtensions(); + if (extensions == null) { + LOG.info(builder.getClass().getName() + " builder returns 'null' from 'getCompilableFileExtensions' method so files for module-level builders won't be filtered"); + compilableFileExtensions = null; + } + else if (compilableFileExtensions != null) { + compilableFileExtensions.addAll(extensions); + } myModuleLevelBuilders.get(builder.getCategory()).add(builder); } for (BuildTargetType type : service.getTargetTypes()) { @@ -58,6 +74,18 @@ public class BuilderRegistry { } } } + if (compilableFileExtensions == null) { + myModuleBuilderFileFilter = FileUtilRt.ALL_FILES; + } + else { + final Set finalCompilableFileExtensions = compilableFileExtensions; + myModuleBuilderFileFilter = new FileFilter() { + @Override + public boolean accept(File file) { + return finalCompilableFileExtensions.contains(FileUtilRt.getExtension(file.getName())); + } + }; + } } @Nullable @@ -65,6 +93,11 @@ public class BuilderRegistry { return myTargetTypes.get(typeId); } + @NotNull + public FileFilter getModuleBuilderFileFilter() { + return myModuleBuilderFileFilter; + } + public Collection> getTargetTypes() { return myTargetTypes.values(); } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java index 0ce8b2037fca..394ce12e8042 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/ModuleLevelBuilder.java @@ -25,6 +25,7 @@ import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor; import java.io.File; import java.io.IOException; import java.util.Collection; +import java.util.List; import java.util.Map; /** @@ -71,6 +72,15 @@ public abstract class ModuleLevelBuilder extends Builder { return false; } + /** + * DO NOT RETURN {@code null} from implementation of this method. If some of builders returns {@code null} no filtering + * will be performed for compatibility reasons. + * @return list of extensions (without dot) of files which can be compiled by the builder + */ + public List getCompilableFileExtensions() { + return null; + } + public final BuilderCategory getCategory() { return myCategory; } diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/instrumentation/ClassProcessingBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/instrumentation/ClassProcessingBuilder.java index 8131cfd62739..092b002f2384 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/instrumentation/ClassProcessingBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/instrumentation/ClassProcessingBuilder.java @@ -38,6 +38,8 @@ import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.List; /** * @author Eugene Zhuravlev @@ -98,6 +100,11 @@ public abstract class ClassProcessingBuilder extends ModuleLevelBuilder { return exitCode; } + @Override + public List getCompilableFileExtensions() { + return Collections.emptyList(); + } + protected abstract ExitCode performBuild(CompileContext context, ModuleChunk chunk, InstrumentationClassFinder finder, OutputConsumer outputConsumer); diff --git a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java index 8615ea12dcf5..46921cf25856 100644 --- a/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java +++ b/jps/jps-builders/src/org/jetbrains/jps/incremental/java/JavaBuilder.java @@ -74,7 +74,8 @@ import java.util.concurrent.atomic.AtomicReference; public class JavaBuilder extends ModuleLevelBuilder { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.java.JavaBuilder"); public static final String BUILDER_NAME = "java"; - private static final String JAVA_EXTENSION = ".java"; + private static final String JAVA_EXTENSION = "java"; + private static final String DOT_JAVA_EXTENSION = "." + JAVA_EXTENSION; public static final boolean USE_EMBEDDED_JAVAC = System.getProperty(GlobalOptions.USE_EXTERNAL_JAVAC_OPTION) == null; private static final Key JAVA_COMPILER_VERSION_KEY = Key.create("_java_compiler_version_"); private static final Key IS_ENABLED = Key.create("_java_compiler_enabled_"); @@ -91,12 +92,12 @@ public class JavaBuilder extends ModuleLevelBuilder { SystemInfo.isFileSystemCaseSensitive? new FileFilter() { public boolean accept(File file) { - return file.getPath().endsWith(JAVA_EXTENSION); + return file.getPath().endsWith(DOT_JAVA_EXTENSION); } } : new FileFilter() { public boolean accept(File file) { - return StringUtil.endsWithIgnoreCase(file.getPath(), JAVA_EXTENSION); + return StringUtil.endsWithIgnoreCase(file.getPath(), DOT_JAVA_EXTENSION); } }; @@ -146,6 +147,11 @@ public class JavaBuilder extends ModuleLevelBuilder { COMPILER_VERSION_INFO.set(context, new AtomicReference(messageText)); } + @Override + public List getCompilableFileExtensions() { + return Collections.singletonList(JAVA_EXTENSION); + } + public ExitCode build(final CompileContext context, final ModuleChunk chunk, DirtyFilesHolder dirtyFilesHolder, diff --git a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java index 09ff15d306b4..b0805a6a5873 100644 --- a/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java +++ b/plugins/groovy/jps-plugin/src/org/jetbrains/jps/incremental/groovy/GroovyBuilder.java @@ -67,6 +67,8 @@ public class GroovyBuilder extends ModuleLevelBuilder { private static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.incremental.groovy.GroovyBuilder"); private static final Key CHUNK_REBUILD_ORDERED = Key.create("CHUNK_REBUILD_ORDERED"); private static final Key> STUB_TO_SRC = Key.create("STUB_TO_SRC"); + private static final String GROOVY_EXTENSION = "groovy"; + private static final String GPP_EXTENSION = "gpp"; private final boolean myForStubs; private final String myBuilderName; @@ -407,7 +409,12 @@ public class GroovyBuilder extends ModuleLevelBuilder { } public static boolean isGroovyFile(String path) { - return path.endsWith(".groovy") || path.endsWith(".gpp"); + return path.endsWith("." + GROOVY_EXTENSION) || path.endsWith("." + GPP_EXTENSION); + } + + @Override + public List getCompilableFileExtensions() { + return Arrays.asList(GROOVY_EXTENSION, GPP_EXTENSION); } private static Map buildClassToSourceMap(ModuleChunk chunk, CompileContext context, Set toCompilePaths, Map finalOutputs) throws IOException { diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java index 19b8f1e496ce..60ce10a7f051 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBindingManager.java @@ -39,10 +39,7 @@ import org.jetbrains.jps.uiDesigner.model.JpsUiDesignerExtensionService; import java.io.File; import java.io.IOException; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import java.util.*; /** * @author Eugene Zhuravlev @@ -87,6 +84,11 @@ public class FormsBindingManager extends FormsBuilder { return new File(context.getProjectDescriptor().dataManager.getDataPaths().getDataStorageRoot(), "forms_rebuild_required"); } + @Override + public List getCompilableFileExtensions() { + return Arrays.asList(FORM_EXTENSION); + } + @Override public ExitCode build(CompileContext context, ModuleChunk chunk, DirtyFilesHolder dirtyFilesHolder, OutputConsumer outputConsumer) throws ProjectBuildException, IOException { ExitCode exitCode = ExitCode.NOTHING_DONE; diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBuilder.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBuilder.java index ca0631754a9a..f29a8607ae42 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBuilder.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsBuilder.java @@ -37,7 +37,8 @@ public abstract class FormsBuilder extends ModuleLevelBuilder { protected static final Logger LOG = Logger.getInstance("#org.jetbrains.jps.uiDesigner.compiler.FormsInstrumenter"); protected static final Key>> FORMS_TO_COMPILE = Key.create("_forms-to_compile_"); protected static final String JAVA_EXTENSION = ".java"; - protected static final String FORM_EXTENSION = ".form"; + protected static final String FORM_EXTENSION = "form"; + protected static final String DOT_FORM_EXTENSION = "." + FORM_EXTENSION; protected static final FileFilter JAVA_SOURCES_FILTER = SystemInfo.isFileSystemCaseSensitive? new FileFilter() { @@ -55,12 +56,12 @@ public abstract class FormsBuilder extends ModuleLevelBuilder { SystemInfo.isFileSystemCaseSensitive? new FileFilter() { public boolean accept(File file) { - return file.getPath().endsWith(FORM_EXTENSION); + return file.getPath().endsWith(DOT_FORM_EXTENSION); } } : new FileFilter() { public boolean accept(File file) { - return StringUtil.endsWithIgnoreCase(file.getPath(), FORM_EXTENSION); + return StringUtil.endsWithIgnoreCase(file.getPath(), DOT_FORM_EXTENSION); } } ; @@ -86,5 +87,4 @@ public abstract class FormsBuilder extends ModuleLevelBuilder { } forms.add(form); } - } diff --git a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsInstrumenter.java b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsInstrumenter.java index 614c4e3a7491..146354137d0e 100644 --- a/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsInstrumenter.java +++ b/plugins/ui-designer/jps-plugin/src/org/jetbrains/jps/uiDesigner/compiler/FormsInstrumenter.java @@ -128,6 +128,11 @@ public class FormsInstrumenter extends FormsBuilder { return ExitCode.OK; } + @Override + public List getCompilableFileExtensions() { + return Collections.emptyList(); + } + private Map> instrumentForms( CompileContext context, ModuleChunk chunk, final Map chunkSourcePath, final InstrumentationClassFinder finder, Collection forms, OutputConsumer outConsumer ) throws ProjectBuildException {