IDEA-99822 Make: Reload java source in different encoding does not trigger incremental make

This commit is contained in:
Eugene Zhuravlev
2013-03-01 13:43:58 +01:00
parent b17bf92eaf
commit 06114d8984
7 changed files with 29 additions and 17 deletions
@@ -46,7 +46,7 @@ public abstract class BuildTarget<R extends BuildRootDescriptor> {
public abstract Collection<BuildTarget<?>> computeDependencies(BuildTargetRegistry targetRegistry, TargetOutputIndex outputIndex);
public void writeConfiguration(PrintWriter out, BuildDataPaths dataPaths, BuildRootIndex buildRootIndex) {
public void writeConfiguration(CompileContext context, PrintWriter out) {
}
@NotNull
@@ -51,13 +51,13 @@ public class BuildOperations {
if (context.isProjectRebuild()) {
FSOperations.markDirtyFiles(context, target, timestamps, true, null, null);
pd.fsState.markInitialScanPerformed(target);
configuration.save();
configuration.save(context);
}
else if (context.getScope().isRecompilationForced(target) || configuration.isTargetDirty(context) || configuration.outputRootWasDeleted(context)) {
initTargetFSState(context, target, true);
IncProjectBuilder.clearOutputFiles(context, target);
pd.dataManager.cleanTargetStorages(target);
configuration.save();
configuration.save(context);
}
else if (!pd.fsState.isInitialScanPerformed(target)) {
initTargetFSState(context, target, false);
@@ -23,7 +23,10 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.ProjectPaths;
import org.jetbrains.jps.api.GlobalOptions;
import org.jetbrains.jps.builders.*;
import org.jetbrains.jps.builders.BuildTarget;
import org.jetbrains.jps.builders.BuildTargetRegistry;
import org.jetbrains.jps.builders.ModuleBasedTarget;
import org.jetbrains.jps.builders.TargetOutputIndex;
import org.jetbrains.jps.builders.java.ExcludedJavaSourceRootProvider;
import org.jetbrains.jps.builders.java.JavaModuleBuildTargetType;
import org.jetbrains.jps.builders.java.JavaSourceRootDescriptor;
@@ -153,7 +156,7 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget<JavaSourceRoot
}
@Override
public void writeConfiguration(PrintWriter out, BuildDataPaths dataPaths, BuildRootIndex buildRootIndex) {
public void writeConfiguration(CompileContext context, PrintWriter out) {
final JpsModule module = getModule();
int fingerprint = getDependenciesFingerprint();
@@ -169,6 +172,12 @@ public final class ModuleBuildTarget extends JVMModuleBuildTarget<JavaSourceRoot
fingerprint += bytecodeTarget.hashCode();
}
final CompilerEncodingConfiguration encodingConfig = context.getProjectDescriptor().getEncodingConfiguration();
final String encoding = encodingConfig.getPreferredModuleEncoding(module);
if (encoding != null) {
fingerprint += encoding.hashCode();
}
out.write(Integer.toHexString(fingerprint));
}
@@ -116,9 +116,10 @@ public final class ResourcesTarget extends JVMModuleBuildTarget<ResourceRootDesc
}
@Override
public void writeConfiguration(PrintWriter out, BuildDataPaths dataPaths, BuildRootIndex buildRootIndex) {
public void writeConfiguration(CompileContext context, PrintWriter out) {
int fingerprint = 0;
final List<ResourceRootDescriptor> roots = buildRootIndex.getTargetRoots(this, null);
final BuildRootIndex rootIndex = context.getProjectDescriptor().getBuildRootIndex();
final List<ResourceRootDescriptor> roots = rootIndex.getTargetRoots(this, null);
for (ResourceRootDescriptor root : roots) {
fingerprint += FileUtil.fileHashCode(root.getRootFile());
fingerprint += root.getPackagePrefix().hashCode();
@@ -106,9 +106,10 @@ public class ArtifactBuildTarget extends BuildTarget<ArtifactRootDescriptor> {
}
@Override
public void writeConfiguration(PrintWriter out, BuildDataPaths dataPaths, BuildRootIndex buildRootIndex) {
public void writeConfiguration(CompileContext context, PrintWriter out) {
out.println(StringUtil.notNullize(myArtifact.getOutputPath()));
for (ArtifactRootDescriptor descriptor : buildRootIndex.getTargetRoots(this, null)) {
final BuildRootIndex rootIndex = context.getProjectDescriptor().getBuildRootIndex();
for (ArtifactRootDescriptor descriptor : rootIndex.getTargetRoots(this, null)) {
descriptor.writeConfiguration(out);
}
}
@@ -65,7 +65,7 @@ public class BuildTargetConfiguration {
}
public boolean isTargetDirty(CompileContext context) {
final String currentState = getCurrentState();
final String currentState = getCurrentState(context);
if (!currentState.equals(myConfiguration)) {
LOG.debug(myTarget + " configuration was changed:");
LOG.debug("Old:");
@@ -88,13 +88,13 @@ public class BuildTargetConfiguration {
return false;
}
public void save() {
public void save(CompileContext context) {
try {
File configFile = getConfigFile();
FileUtil.createParentDirs(configFile);
Writer out = new BufferedWriter(new FileWriter(configFile));
try {
String current = getCurrentState();
String current = getCurrentState(context);
out.write(current);
myConfiguration = current;
}
@@ -115,18 +115,18 @@ public class BuildTargetConfiguration {
return new File(myTargetsState.getDataPaths().getTargetDataRoot(myTarget), "nonexistent-outputs.dat");
}
private String getCurrentState() {
private String getCurrentState(CompileContext context) {
String state = myCurrentState;
if (state == null) {
myCurrentState = state = saveToString();
myCurrentState = state = saveToString(context);
}
return state;
}
private String saveToString() {
private String saveToString(CompileContext context) {
StringWriter out = new StringWriter();
//noinspection IOResourceOpenedButNotSafelyClosed
myTarget.writeConfiguration(new PrintWriter(out), myTargetsState.getDataPaths(), myTargetsState.getBuildRootIndex());
myTarget.writeConfiguration(context, new PrintWriter(out));
return out.toString();
}
@@ -141,7 +141,8 @@ public class MavenResourcesTarget extends ModuleBasedTarget<MavenResourceRootDes
}
@Override
public void writeConfiguration(PrintWriter out, BuildDataPaths dataPaths, BuildRootIndex buildRootIndex) {
public void writeConfiguration(CompileContext context, PrintWriter out) {
final BuildDataPaths dataPaths = context.getProjectDescriptor().getTargetsState().getDataPaths();
final MavenModuleResourceConfiguration configuration = getModuleResourcesConfiguration(dataPaths);
if (configuration != null) {
out.write(Integer.toHexString(configuration.computeConfigurationHash(isTests())));