reset build data for particular project if set of compiler excludes changes (IDEA-129176)

This commit is contained in:
Eugene Zhuravlev
2014-11-13 00:47:30 +01:00
parent 0e6c402a9d
commit 2113e47139
11 changed files with 132 additions and 26 deletions
@@ -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<CompiledPattern> myNegatedCompiledPatterns = new ArrayList<CompiledPattern>();
private boolean myWildcardPatternsInitialized = false;
private final Project myProject;
private final ExcludedEntriesConfiguration myExcludedEntriesConfiguration;
private final ExcludesConfigNotificationsWrapper<ExcludedEntriesConfiguration> myExcludesConfiguration;
private final Collection<BackendCompiler> myRegisteredCompilers = new ArrayList<BackendCompiler>();
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<ExcludedEntriesConfiguration>(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<T extends ExcludesConfiguration> 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);
}
}
}
@@ -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();
}
}
@@ -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<Validat
return ServiceManager.getService(project, ValidationConfiguration.class);
}
public static ExcludedEntriesConfiguration getExcludedEntriesConfiguration(Project project) {
public static ExcludesConfiguration getExcludedEntriesConfiguration(Project project) {
return ServiceManager.getService(project, ExcludedFromValidationConfiguration.class);
}
@@ -33,7 +33,7 @@ import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.application.ReadActionProcessor;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.compiler.*;
import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration;
import com.intellij.openapi.compiler.options.ExcludesConfiguration;
import com.intellij.openapi.editor.Document;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
@@ -142,7 +142,7 @@ public class InspectionValidatorWrapper implements Validator {
if (project.isDefault() || !ValidationConfiguration.shouldValidate(this, context)) {
return ProcessingItem.EMPTY_ARRAY;
}
final ExcludedEntriesConfiguration excludedEntriesConfiguration = ValidationConfiguration.getExcludedEntriesConfiguration(project);
final ExcludesConfiguration excludesConfiguration = ValidationConfiguration.getExcludedEntriesConfiguration(project);
final List<ProcessingItem> items = new ReadAction<List<ProcessingItem>>() {
@Override
protected void run(final Result<List<ProcessingItem>> result) {
@@ -159,7 +159,7 @@ public class InspectionValidatorWrapper implements Validator {
}
if (myCompilerManager.isExcludedFromCompilation(file) ||
excludedEntriesConfiguration.isExcluded(file)) {
excludesConfiguration.isExcluded(file)) {
return true;
}
@@ -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();
}
@@ -46,7 +46,7 @@ public class ExcludedEntriesConfigurable implements UnnamedConfigurable {
private final Project myProject;
private final ArrayList<ExcludeEntryDescription> myExcludeEntryDescriptions = new ArrayList<ExcludeEntryDescription>();
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;
@@ -31,7 +31,8 @@ import java.util.LinkedHashSet;
/**
* @author nik
*/
public class ExcludedEntriesConfiguration implements PersistentStateComponent<ExcludedEntriesConfiguration>, JDOMExternalizable, Disposable {
public class ExcludedEntriesConfiguration implements PersistentStateComponent<ExcludedEntriesConfiguration>, 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<Ex
private final Collection<ExcludeEntryDescription> myExcludeEntryDescriptions = new LinkedHashSet<ExcludeEntryDescription>();
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<Ex
return myCachedDescriptions;
}
@Override
public synchronized void addExcludeEntryDescription(ExcludeEntryDescription description) {
myExcludeEntryDescriptions.add(description);
myCachedDescriptions = null;
}
@Override
public synchronized void removeExcludeEntryDescription(ExcludeEntryDescription description) {
myExcludeEntryDescriptions.remove(description);
myCachedDescriptions = null;
}
@Override
public synchronized void removeAllExcludeEntryDescriptions() {
myExcludeEntryDescriptions.clear();
myCachedDescriptions = null;
}
@Override
public synchronized boolean containsExcludeEntryDescription(ExcludeEntryDescription description) {
return myExcludeEntryDescriptions.contains(description);
}
@@ -98,6 +104,7 @@ public class ExcludedEntriesConfiguration implements PersistentStateComponent<Ex
}
}
@Override
public boolean isExcluded(VirtualFile virtualFile) {
for (final ExcludeEntryDescription entryDescription : getExcludeEntryDescriptions()) {
VirtualFile descriptionFile = entryDescription.getVirtualFile();
@@ -0,0 +1,36 @@
/*
* Copyright 2000-2014 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.compiler.options;
import com.intellij.openapi.vfs.VirtualFile;
/**
* @author Eugene Zhuravlev
* Date: 12-Nov-14
*/
public interface ExcludesConfiguration {
ExcludeEntryDescription[] getExcludeEntryDescriptions();
void addExcludeEntryDescription(ExcludeEntryDescription description);
void removeExcludeEntryDescription(ExcludeEntryDescription description);
void removeAllExcludeEntryDescriptions();
boolean containsExcludeEntryDescription(ExcludeEntryDescription description);
boolean isExcluded(VirtualFile virtualFile);
}
@@ -17,7 +17,7 @@
package org.jetbrains.plugins.groovy.compiler;
import com.intellij.openapi.compiler.options.ExcludedEntriesConfigurable;
import com.intellij.openapi.compiler.options.ExcludedEntriesConfiguration;
import com.intellij.openapi.compiler.options.ExcludesConfiguration;
import com.intellij.openapi.fileChooser.FileChooserDescriptor;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
@@ -62,7 +62,7 @@ public class GroovyCompilerConfigurable implements SearchableConfigurable, Confi
}
private ExcludedEntriesConfigurable createExcludedConfigurable(final Project project) {
final ExcludedEntriesConfiguration configuration = myConfig.getExcludeFromStubGeneration();
final ExcludesConfiguration configuration = myConfig.getExcludeFromStubGeneration();
final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
final FileChooserDescriptor descriptor = new FileChooserDescriptor(true, true, false, false, false, true) {
@Override
@@ -18,6 +18,7 @@ package org.jetbrains.plugins.groovy.compiler;
import com.intellij.openapi.Disposable;
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.openapi.util.Disposer;
@@ -58,11 +59,11 @@ public class GroovyCompilerConfiguration implements PersistentStateComponent<Jps
return bean;
}
public static ExcludedEntriesConfiguration getExcludeConfiguration(Project project) {
public static ExcludesConfiguration getExcludeConfiguration(Project project) {
return getInstance(project).myExcludeFromStubGeneration;
}
public ExcludedEntriesConfiguration getExcludeFromStubGeneration() {
public ExcludesConfiguration getExcludeFromStubGeneration() {
return myExcludeFromStubGeneration;
}
@@ -18,7 +18,7 @@ package org.jetbrains.idea.maven.importing.configurers;
import com.intellij.compiler.CompilerConfiguration;
import com.intellij.compiler.CompilerConfigurationImpl;
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.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VfsUtil;
@@ -50,7 +50,7 @@ public class MavenCompilerConfigurer extends MavenModuleConfigurer {
CompilerConfigurationImpl compilerConfiguration = (CompilerConfigurationImpl)CompilerConfiguration.getInstance(project);
if (!compilerConfiguration.isExcludedFromCompilation(archetypeResourcesDir)) {
ExcludedEntriesConfiguration cfg = compilerConfiguration.getExcludedEntriesConfiguration();
ExcludesConfiguration cfg = compilerConfiguration.getExcludedEntriesConfiguration();
cfg.addExcludeEntryDescription(new ExcludeEntryDescription(archetypeResourcesDir, true, false, project));
}