From 2113e47139f419c735dfa7405ef76bee3ecec079 Mon Sep 17 00:00:00 2001 From: Eugene Zhuravlev Date: Thu, 13 Nov 2014 00:40:46 +0100 Subject: [PATCH] reset build data for particular project if set of compiler excludes changes (IDEA-129176) --- .../compiler/CompilerConfigurationImpl.java | 80 ++++++++++++++++--- .../impl/ExcludeFromCompileAction.java | 3 +- .../options/ValidationConfiguration.java | 3 +- .../util/InspectionValidatorWrapper.java | 6 +- .../compiler/CompilerConfiguration.java | 4 +- .../options/ExcludedEntriesConfigurable.java | 4 +- .../options/ExcludedEntriesConfiguration.java | 9 ++- .../options/ExcludesConfiguration.java | 36 +++++++++ .../compiler/GroovyCompilerConfigurable.java | 4 +- .../compiler/GroovyCompilerConfiguration.java | 5 +- .../configurers/MavenCompilerConfigurer.java | 4 +- 11 files changed, 132 insertions(+), 26 deletions(-) create mode 100644 java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludesConfiguration.java diff --git a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java index b677df25ac71..87eae631d304 100644 --- a/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java +++ b/java/compiler/impl/src/com/intellij/compiler/CompilerConfigurationImpl.java @@ -30,7 +30,9 @@ import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ApplicationNamesInfo; import com.intellij.openapi.compiler.CompilerBundle; import com.intellij.openapi.compiler.CompilerManager; +import com.intellij.openapi.compiler.options.ExcludeEntryDescription; import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration; +import com.intellij.openapi.compiler.options.ExcludesConfiguration; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.Extensions; @@ -90,7 +92,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements private final List myNegatedCompiledPatterns = new ArrayList(); private boolean myWildcardPatternsInitialized = false; private final Project myProject; - private final ExcludedEntriesConfiguration myExcludedEntriesConfiguration; + private final ExcludesConfigNotificationsWrapper myExcludesConfiguration; private final Collection myRegisteredCompilers = new ArrayList(); private JavacCompiler JAVAC_EXTERNAL_BACKEND; @@ -113,8 +115,8 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements public CompilerConfigurationImpl(Project project) { myProject = project; - myExcludedEntriesConfiguration = new ExcludedEntriesConfiguration(); - Disposer.register(project, myExcludedEntriesConfiguration); + myExcludesConfiguration = new ExcludesConfigNotificationsWrapper(project, new ExcludedEntriesConfiguration()); + Disposer.register(project, myExcludesConfiguration.getDelegate()); MessageBusConnection connection = project.getMessageBus().connect(project); connection.subscribe(ProjectTopics.MODULES, new ModuleAdapter() { @Override @@ -153,8 +155,8 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements JpsJavaCompilerConfigurationSerializer.ENABLED, String.valueOf(myAddNotNullAssertions)); } - if (myExcludedEntriesConfiguration.getExcludeEntryDescriptions().length > 0) { - myExcludedEntriesConfiguration.writeExternal(addChild(state, JpsJavaCompilerConfigurationSerializer.EXCLUDE_FROM_COMPILE)); + if (myExcludesConfiguration.getExcludeEntryDescriptions().length > 0) { + myExcludesConfiguration.getDelegate().writeExternal(addChild(state, JpsJavaCompilerConfigurationSerializer.EXCLUDE_FROM_COMPILE)); } final Element newChild = addChild(state, JpsJavaCompilerConfigurationSerializer.RESOURCE_EXTENSIONS); @@ -390,13 +392,13 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements } @Override - public ExcludedEntriesConfiguration getExcludedEntriesConfiguration() { - return myExcludedEntriesConfiguration; + public ExcludesConfiguration getExcludedEntriesConfiguration() { + return myExcludesConfiguration; } @Override public boolean isExcludedFromCompilation(final VirtualFile virtualFile) { - return myExcludedEntriesConfiguration.isExcluded(virtualFile); + return myExcludesConfiguration.isExcluded(virtualFile); } @Override @@ -661,7 +663,7 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements Element node = parentNode.getChild(JpsJavaCompilerConfigurationSerializer.EXCLUDE_FROM_COMPILE); if (node != null) { - myExcludedEntriesConfiguration.readExternal(node); + myExcludesConfiguration.getDelegate().readExternal(node); } try { @@ -984,4 +986,64 @@ public class CompilerConfigurationImpl extends CompilerConfiguration implements return child; } + private static class ExcludesConfigNotificationsWrapper implements ExcludesConfiguration { + private final Project myProject; + private final T myDelegate; + + public ExcludesConfigNotificationsWrapper(@NotNull Project project, @NotNull T delegate) { + myProject = project; + myDelegate = delegate; + } + + @NotNull + public T getDelegate() { + return myDelegate; + } + + @Override + public ExcludeEntryDescription[] getExcludeEntryDescriptions() { + return myDelegate.getExcludeEntryDescriptions(); + } + + @Override + public void addExcludeEntryDescription(ExcludeEntryDescription description) { + try { + myDelegate.addExcludeEntryDescription(description); + } + finally { + BuildManager.getInstance().clearState(myProject); + } + } + + @Override + public void removeExcludeEntryDescription(ExcludeEntryDescription description) { + try { + myDelegate.removeExcludeEntryDescription(description); + } + finally { + BuildManager.getInstance().clearState(myProject); + } + } + + @Override + public void removeAllExcludeEntryDescriptions() { + try { + myDelegate.removeAllExcludeEntryDescriptions(); + } + finally { + BuildManager.getInstance().clearState(myProject); + } + } + + @Override + public boolean containsExcludeEntryDescription(ExcludeEntryDescription description) { + return myDelegate.containsExcludeEntryDescription(description); + } + + @Override + public boolean isExcluded(VirtualFile virtualFile) { + return myDelegate.isExcluded(virtualFile); + } + } + } \ No newline at end of file diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java b/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java index 91055dbf180a..10dfbb05682f 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/ExcludeFromCompileAction.java @@ -16,7 +16,6 @@ package com.intellij.compiler.impl; import com.intellij.compiler.CompilerConfiguration; -import com.intellij.compiler.CompilerConfigurationImpl; import com.intellij.ide.errorTreeView.ErrorTreeElement; import com.intellij.ide.errorTreeView.ErrorTreeNodeDescriptor; import com.intellij.ide.errorTreeView.GroupingElement; @@ -51,7 +50,7 @@ class ExcludeFromCompileAction extends AnAction { if (file != null && file.isValid()) { ExcludeEntryDescription description = new ExcludeEntryDescription(file, false, true, myProject); - ((CompilerConfigurationImpl) CompilerConfiguration.getInstance(myProject)).getExcludedEntriesConfiguration().addExcludeEntryDescription(description); + CompilerConfiguration.getInstance(myProject).getExcludedEntriesConfiguration().addExcludeEntryDescription(description); FileStatusManager.getInstance(myProject).fileStatusesChanged(); } } diff --git a/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfiguration.java b/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfiguration.java index b6e545c2202a..31c614e9088d 100644 --- a/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfiguration.java +++ b/java/compiler/impl/src/com/intellij/compiler/options/ValidationConfiguration.java @@ -18,6 +18,7 @@ package com.intellij.compiler.options; import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.Compiler; import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration; +import com.intellij.openapi.compiler.options.ExcludesConfiguration; import com.intellij.openapi.components.*; import com.intellij.openapi.project.Project; import com.intellij.util.xmlb.XmlSerializerUtil; @@ -66,7 +67,7 @@ public class ValidationConfiguration implements PersistentStateComponent items = new ReadAction>() { @Override protected void run(final Result> result) { @@ -159,7 +159,7 @@ public class InspectionValidatorWrapper implements Validator { } if (myCompilerManager.isExcludedFromCompilation(file) || - excludedEntriesConfiguration.isExcluded(file)) { + excludesConfiguration.isExcluded(file)) { return true; } diff --git a/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java b/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java index 364379490852..890d25cf1c51 100644 --- a/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java +++ b/java/compiler/openapi/src/com/intellij/compiler/CompilerConfiguration.java @@ -16,7 +16,7 @@ package com.intellij.compiler; -import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration; +import com.intellij.openapi.compiler.options.ExcludesConfiguration; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; @@ -62,5 +62,5 @@ public abstract class CompilerConfiguration { public abstract void setAddNotNullAssertions(boolean enabled); - public abstract ExcludedEntriesConfiguration getExcludedEntriesConfiguration(); + public abstract ExcludesConfiguration getExcludedEntriesConfiguration(); } \ No newline at end of file diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java index 6a2cd877faf8..d58b9b3a540f 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfigurable.java @@ -46,7 +46,7 @@ public class ExcludedEntriesConfigurable implements UnnamedConfigurable { private final Project myProject; private final ArrayList myExcludeEntryDescriptions = new ArrayList(); private final FileChooserDescriptor myDescriptor; - private final ExcludedEntriesConfiguration myConfiguration; + private final ExcludesConfiguration myConfiguration; private ExcludedEntriesPanel myExcludedEntriesPanel; public ExcludedEntriesConfigurable(Project project) { @@ -54,7 +54,7 @@ public class ExcludedEntriesConfigurable implements UnnamedConfigurable { CompilerConfiguration.getInstance(project).getExcludedEntriesConfiguration()); } - public ExcludedEntriesConfigurable(Project project, FileChooserDescriptor descriptor, final ExcludedEntriesConfiguration configuration) { + public ExcludedEntriesConfigurable(Project project, FileChooserDescriptor descriptor, final ExcludesConfiguration configuration) { myDescriptor = descriptor; myConfiguration = configuration; myProject = project; diff --git a/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfiguration.java b/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfiguration.java index 67e87454336d..4baad849bd86 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfiguration.java +++ b/java/compiler/openapi/src/com/intellij/openapi/compiler/options/ExcludedEntriesConfiguration.java @@ -31,7 +31,8 @@ import java.util.LinkedHashSet; /** * @author nik */ -public class ExcludedEntriesConfiguration implements PersistentStateComponent, JDOMExternalizable, Disposable { +public class ExcludedEntriesConfiguration implements PersistentStateComponent, JDOMExternalizable, Disposable, + ExcludesConfiguration { @NonNls private static final String FILE = "file"; @NonNls private static final String DIRECTORY = "directory"; @NonNls private static final String URL = "url"; @@ -39,6 +40,7 @@ public class ExcludedEntriesConfiguration implements PersistentStateComponent myExcludeEntryDescriptions = new LinkedHashSet(); private ExcludeEntryDescription[] myCachedDescriptions = null; + @Override public synchronized ExcludeEntryDescription[] getExcludeEntryDescriptions() { if (myCachedDescriptions == null) { myCachedDescriptions = myExcludeEntryDescriptions.toArray(new ExcludeEntryDescription[myExcludeEntryDescriptions.size()]); @@ -46,21 +48,25 @@ public class ExcludedEntriesConfiguration implements PersistentStateComponent